From db13e38a8d46df814e0852c4b82426937ad82d3a Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sat, 19 Nov 2022 10:10:21 -0500 Subject: [PATCH 01/58] Add option to add custom error handling when Argument parse fails --- .../jorel/commandapi/CommandAPIHandler.java | 2 +- .../jorel/commandapi/arguments/Argument.java | 34 +++++++++++++++++-- .../ArgumentParseExceptionContext.java | 6 ++++ .../ArgumentParseExceptionHandler.java | 8 +++++ .../commandapi/arguments/CustomArgument.java | 2 +- 5 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionContext.java create mode 100644 commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionHandler.java diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIHandler.java b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIHandler.java index 6a7c42e512..273d06ee4d 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIHandler.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIHandler.java @@ -388,7 +388,7 @@ Object[] argsToObjectArr(CommandContext cmdCtx, Argument[ Object parseArgument(CommandContext cmdCtx, String key, Argument value, Object[] previousArgs) throws CommandSyntaxException { if (value.isListed()) { - return value.parseArgument(NMS, cmdCtx, key, previousArgs); + return value.parseArgumentHandleError(NMS, cmdCtx, key, previousArgs); } else { return null; } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java index 6eacbda3e9..8192882610 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java @@ -27,6 +27,7 @@ import java.util.function.Predicate; import dev.jorel.commandapi.ArgumentTree; +import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException; import org.bukkit.command.CommandSender; import com.mojang.brigadier.arguments.ArgumentType; @@ -94,6 +95,21 @@ public final ArgumentType getRawType() { public final String getNodeName() { return this.nodeName; } + + public final T parseArgumentHandleError(NMS nms, + CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { + try { + return parseArgument(nms, cmdCtx, key, previousArgs); + } catch (CommandSyntaxException original) { + try { + return exceptionHandler.handleException(new ArgumentParseExceptionContext( + new WrapperCommandSyntaxException(original) + )); + } catch (WrapperCommandSyntaxException newException) { + throw newException.getException(); + } + } + } /** * Parses an argument, returning the specific Bukkit object that the argument @@ -109,7 +125,7 @@ public final String getNodeName() { * @throws CommandSyntaxException if parsing fails */ public abstract T parseArgument(NMS nms, - CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException; + CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException; ///////////////// // Suggestions // @@ -304,6 +320,21 @@ public Argument setListed(boolean listed) { this.isListed = listed; return this; } + + //////////////////////// + // Exception Handling // + /////////////////////// + + private ArgumentParseExceptionHandler exceptionHandler = context -> {throw context.exception();}; + + public final Argument withExceptionHandler(ArgumentParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + public final ArgumentParseExceptionHandler getExceptionHandler() { + return this.exceptionHandler; + } /////////// // Other // @@ -327,5 +358,4 @@ public List getEntityNames(Object argument) { public String toString() { return this.getNodeName() + "<" + this.getClass().getSimpleName() + ">"; } - } \ No newline at end of file diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionContext.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionContext.java new file mode 100644 index 0000000000..6c05a68981 --- /dev/null +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionContext.java @@ -0,0 +1,6 @@ +package dev.jorel.commandapi.arguments; + +import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException; + +public record ArgumentParseExceptionContext(WrapperCommandSyntaxException exception) { +} diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionHandler.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionHandler.java new file mode 100644 index 0000000000..0c35fc87fb --- /dev/null +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionHandler.java @@ -0,0 +1,8 @@ +package dev.jorel.commandapi.arguments; + +import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException; + +@FunctionalInterface +public interface ArgumentParseExceptionHandler { + T handleException(ArgumentParseExceptionContext context) throws WrapperCommandSyntaxException; +} diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/CustomArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/CustomArgument.java index b90614e87d..b5723fc5a6 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/CustomArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/CustomArgument.java @@ -134,7 +134,7 @@ public T parseArgument(NMS nms, throws CommandSyntaxException { // Get the raw input and parsed input final String customresult = CommandAPIHandler.getRawArgumentInput(cmdCtx, key); - final B parsedInput = base.parseArgument(nms, cmdCtx, key, previousArgs); + final B parsedInput = base.parseArgumentHandleError(nms, cmdCtx, key, previousArgs); try { return infoParser.apply(new CustomArgumentInfo(nms.getCommandSenderFromCSS(cmdCtx.getSource()), From 25b975d095aef82c6657b2e25c87fa8880775552 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sat, 19 Nov 2022 18:55:35 -0500 Subject: [PATCH 02/58] Add Javadocs to new methods and classes --- .../jorel/commandapi/arguments/Argument.java | 93 ++++++++++++------- .../ArgumentParseExceptionContext.java | 5 + .../ArgumentParseExceptionHandler.java | 15 +++ 3 files changed, 81 insertions(+), 32 deletions(-) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java index 8192882610..e46b74c0ab 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java @@ -49,14 +49,14 @@ public abstract class Argument extends ArgumentTree { /** * Returns the primitive type of the current Argument. After executing a * command, this argument should yield an object of this returned class. - * + * * @return the type that this argument yields when the command is run */ public abstract Class getPrimitiveType(); /** * Returns the argument type for this argument. - * + * * @return the argument type for this argument */ public abstract CommandAPIArgumentType getArgumentType(); @@ -70,8 +70,8 @@ public abstract class Argument extends ArgumentTree { /** * Constructs an argument with a given NMS/brigadier type. - * - * @param nodeName the name to assign to this argument node + * + * @param nodeName the name to assign to this argument node * @param rawType the NMS or brigadier type to be used for this argument */ protected Argument(String nodeName, ArgumentType rawType) { @@ -81,13 +81,13 @@ protected Argument(String nodeName, ArgumentType rawType) { /** * Returns the NMS or brigadier type for this argument. - * + * * @return the NMS or brigadier type for this argument */ public final ArgumentType getRawType() { return this.rawType; } - + /** * Returns the name of this argument's node * @return the name of this argument's node @@ -96,8 +96,27 @@ public final String getNodeName() { return this.nodeName; } + /** + * Parses an argument using {@link Argument#parseArgument(NMS, CommandContext, String, Object[])}. + * If the initial parse fails, the exception is passed to + * the active {@link ArgumentParseExceptionHandler} for + * this argument, which can be changed by the developers + * using {@link Argument#withExceptionHandler(ArgumentParseExceptionHandler)}. + * This is intended for use by the internals of the CommandAPI + * and isn't expected to be used outside the CommandAPI + * + * @param the command source type + * @param nms an instance of NMS + * @param cmdCtx the context which ran this command + * @param key the name of the argument node + * @param previousArgs an array of previously declared arguments + * @return the parsed object represented by this argument, or the object returned by + * the active {@link ArgumentParseExceptionHandler} if parsing fails + * @throws CommandSyntaxException if parsing fails and + * the active {@link ArgumentParseExceptionHandler} throws an exception as well + */ public final T parseArgumentHandleError(NMS nms, - CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { + CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { try { return parseArgument(nms, cmdCtx, key, previousArgs); } catch (CommandSyntaxException original) { @@ -110,12 +129,12 @@ public final T parseArgumentHandleError(NMS the command source type * @param nms an instance of NMS * @param cmdCtx the context which ran this command @@ -125,7 +144,7 @@ public final T parseArgumentHandleError(NMS T parseArgument(NMS nms, - CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException; + CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException; ///////////////// // Suggestions // @@ -150,7 +169,7 @@ public Argument includeSuggestions(ArgumentSuggestions suggestions) { /** * Include suggestions to add to the list of default suggestions represented by * this argument. - * + * * @param suggestions a function that takes in SuggestionInfo which includes * information about the current state at the time the * suggestions are run and returns a String[] of suggestions @@ -166,7 +185,7 @@ public Argument includeSuggestions(Function suggest /** * Include suggestions to add to the list of default suggestions represented by * this argument. - * + * * @param suggestions a function that takes in SuggestionInfo which includes * information about the current state at the time the * suggestions are run and returns an IStringTooltip[] of @@ -195,7 +214,7 @@ public Optional getIncludedSuggestions() { * ArgumentSuggestions to create these. * @return the current argument */ - + public Argument replaceSuggestions(ArgumentSuggestions suggestions) { this.suggestions = Optional.of(suggestions); return this; @@ -226,7 +245,7 @@ public Argument replaceSuggestionsT(FunctionOptional.empty() if there * are no overridden suggestions. */ @@ -242,7 +261,7 @@ public final Optional getOverriddenSuggestions() { /** * Assigns the given permission as a requirement to execute this command. - * + * * @param permission the permission required to execute this command * @return this current argument */ @@ -250,10 +269,10 @@ public final Argument withPermission(CommandPermission permission) { this.permission = permission; return this; } - + /** * Assigns the given permission as a requirement to execute this command. - * + * * @param permission the permission required to execute this command * @return this current argument */ @@ -269,13 +288,13 @@ public final Argument withPermission(String permission) { public final CommandPermission getArgumentPermission() { return permission; } - + ////////////////// // Requirements // ////////////////// - + private Predicate requirements = s -> true; - + /** * Returns the requirements required to run this command * @return the requirements required to run this command @@ -283,12 +302,12 @@ public final CommandPermission getArgumentPermission() { public final Predicate getRequirements() { return this.requirements; } - + /** * Adds a requirement that has to be satisfied to use this argument. This method * can be used multiple times and each use of this method will AND its * requirement with the previously declared ones - * + * * @param requirement the predicate that must be satisfied to use this argument * @return this current argument */ @@ -296,13 +315,13 @@ public final Argument withRequirement(Predicate requirement) { this.requirements = this.requirements.and(requirement); return this; } - + ///////////////// // Listability // ///////////////// - + private boolean isListed = true; - + /** * Returns true if this argument will be listed in the Object args[] of the command executor * @return true if this argument will be listed in the Object args[] of the command executor @@ -310,7 +329,7 @@ public final Argument withRequirement(Predicate requirement) { public boolean isListed() { return this.isListed; } - + /** * Sets whether this argument will be listed in the Object args[] of the command executor * @param listed if true, this argument will be included in the Object args[] of the command executor @@ -325,26 +344,36 @@ public Argument setListed(boolean listed) { // Exception Handling // /////////////////////// - private ArgumentParseExceptionHandler exceptionHandler = context -> {throw context.exception();}; + private ArgumentParseExceptionHandler exceptionHandler = context -> { throw context.exception(); }; + /** + * Sets the {@link ArgumentParseExceptionHandler} this Argument should use when it fails to parse its input. + * + * @param exceptionHandler The new {@link ArgumentParseExceptionHandler} this argument should use + * @return this current argument + */ public final Argument withExceptionHandler(ArgumentParseExceptionHandler exceptionHandler) { this.exceptionHandler = exceptionHandler; return this; } + /** + * Returns the {@link ArgumentParseExceptionHandler} this argument is using + * @return The {@link ArgumentParseExceptionHandler} this argument is using + */ public final ArgumentParseExceptionHandler getExceptionHandler() { return this.exceptionHandler; } - + /////////// // Other // /////////// - + /** * Gets a list of entity names for the current provided argument. This is * expected to be implemented by EntitySelectorArgument, see * {@link EntitySelectorArgument#getEntityNames(Object)} - * + * * @param argument a parsed (Bukkit) object representing the entity selector * type. This is either a List, an Entity or a Player * @return a list of strings representing the names of the entity or entities @@ -353,9 +382,9 @@ public final ArgumentParseExceptionHandler getExceptionHandler() { public List getEntityNames(Object argument) { return Arrays.asList(new String[] { null }); } - + @Override public String toString() { return this.getNodeName() + "<" + this.getClass().getSimpleName() + ">"; } -} \ No newline at end of file +} diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionContext.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionContext.java index 6c05a68981..9803c2df34 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionContext.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionContext.java @@ -2,5 +2,10 @@ import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException; +/** + * A record containing information on why an Argument failed to parse. + * + * @param exception The CommandSyntaxException that was thrown when the Argument failed to parse + */ public record ArgumentParseExceptionContext(WrapperCommandSyntaxException exception) { } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionHandler.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionHandler.java index 0c35fc87fb..9d21bdff11 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionHandler.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionHandler.java @@ -2,7 +2,22 @@ import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException; +/** + * A FunctionalInterface for defining custom behavior when an Argument fails to parse. + * See {@link ArgumentParseExceptionHandler#handleException(ArgumentParseExceptionContext)} + * + * @param The class of the object returned by the Argument this object is handling + */ @FunctionalInterface public interface ArgumentParseExceptionHandler { + /** + * A method that handles when an Argument fails to parse. + * It can either return an object or throw a different exception. + * + * @param context a {@link ArgumentParseExceptionContext} record that holds information + * about why and when the Argument failed to parse + * @return A new object in place of the failed parse + * @throws WrapperCommandSyntaxException A new exception to pass on + */ T handleException(ArgumentParseExceptionContext context) throws WrapperCommandSyntaxException; } From e601e746d280e58c4b8f52b74986ea31cceb89d2 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 20 Nov 2022 09:41:58 -0500 Subject: [PATCH 03/58] Add sender and input to ArgumentParseExceptionContext --- .../main/java/dev/jorel/commandapi/arguments/Argument.java | 4 +++- .../commandapi/arguments/ArgumentParseExceptionContext.java | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java index e46b74c0ab..3de97abf1e 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java @@ -122,7 +122,9 @@ public final T parseArgumentHandleError(NMS Date: Sun, 20 Nov 2022 10:59:20 -0500 Subject: [PATCH 04/58] Intercept errors during Brigadier's initial parse revert last commit for now --- .../jorel/commandapi/arguments/Argument.java | 46 +++++++++++++++++-- .../ArgumentParseExceptionContext.java | 5 +- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java index 3de97abf1e..b9c3f60bf4 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java @@ -21,11 +21,16 @@ package dev.jorel.commandapi.arguments; import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.Optional; +import java.util.concurrent.CompletableFuture; import java.util.function.Function; import java.util.function.Predicate; +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; import dev.jorel.commandapi.ArgumentTree; import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException; import org.bukkit.command.CommandSender; @@ -76,7 +81,42 @@ public abstract class Argument extends ArgumentTree { */ protected Argument(String nodeName, ArgumentType rawType) { this.nodeName = nodeName; - this.rawType = rawType; + this.rawType = wrapRawTypeForExceptions(rawType); + } + + private ArgumentType wrapRawTypeForExceptions(ArgumentType rawType) { + return new ArgumentType<>() { + @Override + public RawClass parse(StringReader stringReader) throws CommandSyntaxException { + try { + return rawType.parse(stringReader); + } catch (CommandSyntaxException original) { + try { + // TODO: It would be cool if this part could return a substitute value if the parse failed + // Unfortunately, exceptionHandler cannot do this since T dose not necessarily equal RawClass + // To do this, I think an additional exceptionHandler for RawClass would need to be added + // This measn Argument would need to be parameterized over RawClass , giving it 2 type + // parameters and ruining backwards compatibility :( + exceptionHandler.handleException(new ArgumentParseExceptionContext( + new WrapperCommandSyntaxException(original) + )); + throw original; + } catch (WrapperCommandSyntaxException newException) { + throw newException.getException(); + } + } + } + + @Override + public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { + return rawType.listSuggestions(context, builder); + } + + @Override + public Collection getExamples() { + return rawType.getExamples(); + } + }; } /** @@ -122,9 +162,7 @@ public final T parseArgumentHandleError(NMS Date: Fri, 25 Nov 2022 07:43:17 -0500 Subject: [PATCH 05/58] Attempt serializing custom ArgumentType --- .../java/dev/jorel/commandapi/CommandAPI.java | 1 + .../jorel/commandapi/arguments/Argument.java | 43 +---------- .../ExceptionHandlingArgumentType.java | 50 +++++++++++++ .../java/dev/jorel/commandapi/nms/NMS.java | 1 + .../commandapi/nms/CustomArgumentInfo.java | 71 +++++++++++++++++++ .../jorel/commandapi/nms/NMS_1_19_1_R1.java | 34 +++++++++ .../dev/jorel/commandapi/CommandAPIMain.java | 23 ++++++ 7 files changed, 182 insertions(+), 41 deletions(-) create mode 100644 commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ExceptionHandlingArgumentType.java create mode 100644 commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/CustomArgumentInfo.java diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPI.java b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPI.java index aa596e5fc4..c6b0f641e4 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPI.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPI.java @@ -200,6 +200,7 @@ public static void onEnable(Plugin plugin) { CommandAPIHandler.getInstance().getNMS().reloadDataPacks(); CommandAPIHandler.getInstance().updateHelpForCommands(); }, 0L); + CommandAPIHandler.getInstance().getNMS().registerCustomArgumentType(); // (Re)send command graph packet to players when they join Bukkit.getServer().getPluginManager().registerEvents(new Listener() { diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java index b9c3f60bf4..72ad2bb44b 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java @@ -31,7 +31,7 @@ import com.mojang.brigadier.StringReader; import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; -import dev.jorel.commandapi.ArgumentTree; +import dev.jorel.commandapi.*; import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException; import org.bukkit.command.CommandSender; @@ -39,9 +39,6 @@ import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; -import dev.jorel.commandapi.CommandPermission; -import dev.jorel.commandapi.IStringTooltip; -import dev.jorel.commandapi.SuggestionInfo; import dev.jorel.commandapi.nms.NMS; /** @@ -81,44 +78,8 @@ public abstract class Argument extends ArgumentTree { */ protected Argument(String nodeName, ArgumentType rawType) { this.nodeName = nodeName; - this.rawType = wrapRawTypeForExceptions(rawType); + this.rawType = new ExceptionHandlingArgumentType<>(rawType); } - - private ArgumentType wrapRawTypeForExceptions(ArgumentType rawType) { - return new ArgumentType<>() { - @Override - public RawClass parse(StringReader stringReader) throws CommandSyntaxException { - try { - return rawType.parse(stringReader); - } catch (CommandSyntaxException original) { - try { - // TODO: It would be cool if this part could return a substitute value if the parse failed - // Unfortunately, exceptionHandler cannot do this since T dose not necessarily equal RawClass - // To do this, I think an additional exceptionHandler for RawClass would need to be added - // This measn Argument would need to be parameterized over RawClass , giving it 2 type - // parameters and ruining backwards compatibility :( - exceptionHandler.handleException(new ArgumentParseExceptionContext( - new WrapperCommandSyntaxException(original) - )); - throw original; - } catch (WrapperCommandSyntaxException newException) { - throw newException.getException(); - } - } - } - - @Override - public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { - return rawType.listSuggestions(context, builder); - } - - @Override - public Collection getExamples() { - return rawType.getExamples(); - } - }; - } - /** * Returns the NMS or brigadier type for this argument. * diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ExceptionHandlingArgumentType.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ExceptionHandlingArgumentType.java new file mode 100644 index 0000000000..0796beb3a2 --- /dev/null +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ExceptionHandlingArgumentType.java @@ -0,0 +1,50 @@ +package dev.jorel.commandapi.arguments; + +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; +import dev.jorel.commandapi.CommandAPI; + +import java.util.Collection; +import java.util.concurrent.CompletableFuture; + +public class ExceptionHandlingArgumentType implements ArgumentType { + + private final ArgumentType baseType; + + public ExceptionHandlingArgumentType(ArgumentType baseType) { + this.baseType = baseType; + } + + @Override + public T parse(StringReader stringReader) throws CommandSyntaxException { + try { + return baseType.parse(stringReader); + } catch (CommandSyntaxException original) { + // TODO: It would be cool if this part could return a substitute value if the parse failed + // Unfortunately, exceptionHandler cannot do this since T dose not necessarily equal RawClass + // To do this, I think an additional exceptionHandler for RawClass would need to be added + // This means Argument would need to be parameterized over RawClass, giving it 2 type + // parameters and ruining backwards compatibility :( + CommandAPI.logNormal("Intercepted exception with message: " + original.getMessage()); + throw original; + } + } + + @Override + public Collection getExamples() { + return baseType.getExamples(); + } + + @Override + public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { + return baseType.listSuggestions(context, builder); + } + + public ArgumentType getBaseType() { + return baseType; + } +} diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/nms/NMS.java b/commandapi-core/src/main/java/dev/jorel/commandapi/nms/NMS.java index 3fb4253af0..da28f99090 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/nms/NMS.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/nms/NMS.java @@ -397,4 +397,5 @@ default boolean canUseChatPreview() { return false; } + default void registerCustomArgumentType() { } } diff --git a/commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/CustomArgumentInfo.java b/commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/CustomArgumentInfo.java new file mode 100644 index 0000000000..e605524735 --- /dev/null +++ b/commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/CustomArgumentInfo.java @@ -0,0 +1,71 @@ +package dev.jorel.commandapi.nms; + +import com.google.gson.JsonObject; +import com.mojang.brigadier.arguments.ArgumentType; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import net.minecraft.commands.CommandBuildContext; +import net.minecraft.commands.synchronization.ArgumentTypeInfo; +import net.minecraft.commands.synchronization.ArgumentTypeInfos; +import net.minecraft.core.Registry; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; + +import java.nio.charset.Charset; + +public class CustomArgumentInfo implements ArgumentTypeInfo, CustomArgumentInfo.CustomTemplate> { + + @Override + public void serializeToNetwork(CustomTemplate template, FriendlyByteBuf friendlyByteBuf) { + ArgumentType baseType = template.baseType; + ArgumentTypeInfo baseInfo = ArgumentTypeInfos.byClass(baseType); + String baseKey = Registry.COMMAND_ARGUMENT_TYPE.getKey(baseInfo).toString(); + friendlyByteBuf.writeInt(baseKey.length()); + friendlyByteBuf.writeCharSequence(baseKey, Charset.defaultCharset()); + baseInfo.serializeToNetwork(baseInfo.unpack(baseType), friendlyByteBuf); + } + + @Override + public CustomTemplate deserializeFromNetwork(FriendlyByteBuf friendlyByteBuf) { + int keyLength = friendlyByteBuf.readInt(); + String baseKey = friendlyByteBuf.readCharSequence(keyLength, Charset.defaultCharset()).toString(); + ArgumentTypeInfo baseInfo = Registry.COMMAND_ARGUMENT_TYPE.get(ResourceLocation.of(baseKey, ':')); + Template baseTemplate = baseInfo.deserializeFromNetwork(friendlyByteBuf); + return new CustomTemplate(baseTemplate); + } + + @Override + public void serializeToJson(CustomTemplate template, JsonObject jsonObject) { + jsonObject.addProperty("baseType", "TODO: Set this!"); + } + + @Override + public CustomTemplate unpack(ExceptionHandlingArgumentType exceptionHandlingArgumentType) { + ArgumentType baseType = exceptionHandlingArgumentType.getBaseType(); + return new CustomTemplate(baseType); + } + + public final class CustomTemplate implements ArgumentTypeInfo.Template> { + final ArgumentType baseType; + final Template baseTemplate; + + public CustomTemplate(ArgumentType baseType) { + this.baseType = baseType; + baseTemplate = ArgumentTypeInfos.unpack(baseType); + } + + public CustomTemplate(Template baseTemplate) { + this.baseTemplate = baseTemplate; + baseType = null; + } + + @Override + public ExceptionHandlingArgumentType instantiate(CommandBuildContext commandBuildContext) { + return new ExceptionHandlingArgumentType<>(baseType == null ? baseTemplate.instantiate(commandBuildContext) : baseType); + } + + @Override + public ArgumentTypeInfo, ?> type() { + return CustomArgumentInfo.this; + } + } +} diff --git a/commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_1_R1.java b/commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_1_R1.java index 178bcc5270..7b867fb14e 100644 --- a/commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_1_R1.java +++ b/commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_1_R1.java @@ -20,6 +20,19 @@ *******************************************************************************/ package dev.jorel.commandapi.nms; +import com.google.gson.JsonObject; +import com.mojang.brigadier.arguments.ArgumentType; +import dev.jorel.commandapi.CommandAPI; +import dev.jorel.commandapi.CommandAPIHandler; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import net.minecraft.commands.CommandBuildContext; +import net.minecraft.commands.synchronization.ArgumentTypeInfo; +import net.minecraft.commands.synchronization.ArgumentTypeInfos; +import net.minecraft.commands.synchronization.SingletonArgumentInfo; +import net.minecraft.core.MappedRegistry; +import net.minecraft.core.Registry; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceKey; import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; @@ -35,6 +48,9 @@ import net.minecraft.server.ServerFunctionLibrary; import net.minecraft.world.level.gameevent.EntityPositionSource; +import java.lang.reflect.Field; +import java.util.Map; + // Mojang-Mapped reflection /** * NMS implementation for Minecraft 1.19.1 @@ -59,4 +75,22 @@ public void hookChatPreview(Plugin plugin, Player player) { } } + @Override + public void registerCustomArgumentType() { + try { + System.out.println("Registering custom ArgumentType"); + Field mapField = CommandAPIHandler.getInstance().getField(ArgumentTypeInfos.class, "a"); + Map infoMap = (Map) mapField.get(null); + + CustomArgumentInfo info = new CustomArgumentInfo(); + infoMap.put(ExceptionHandlingArgumentType.class, info); + + Field isFrozen = CommandAPIHandler.getInstance().getField(MappedRegistry.class, "ca"); + isFrozen.set(Registry.COMMAND_ARGUMENT_TYPE, false); + + Registry.>register(Registry.COMMAND_ARGUMENT_TYPE, "commandapi:argument", info); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + } } diff --git a/commandapi-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index 896ace8982..bfa984dc91 100644 --- a/commandapi-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -23,6 +23,11 @@ import java.io.File; import java.util.Map.Entry; +import dev.jorel.commandapi.arguments.ArgumentParseExceptionContext; +import dev.jorel.commandapi.arguments.IntegerArgument; +import dev.jorel.commandapi.arguments.PlayerArgument; +import dev.jorel.commandapi.arguments.StringArgument; +import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException; import org.bukkit.plugin.java.JavaPlugin; import de.tr7zw.changeme.nbtapi.NBTContainer; @@ -67,5 +72,23 @@ public void onLoad() { @Override public void onEnable() { CommandAPI.onEnable(this); + + new CommandAPICommand("test") + .withArguments( + new StringArgument("string").withExceptionHandler(this::printInfo), + new IntegerArgument("int").withExceptionHandler(this::printInfo), + new PlayerArgument("player").withExceptionHandler(this::printInfo) + ) + .executes((sender, args) -> { + sender.sendMessage(args[0].toString()); + sender.sendMessage(args[1].toString()); + sender.sendMessage(args[2].toString()); + }) + .register(); + } + + private T printInfo(ArgumentParseExceptionContext context) throws WrapperCommandSyntaxException { + CommandAPI.logNormal("Intercepted error with message: " + context.exception().getMessage()); + throw CommandAPI.failWithString("Parse failed"); } } \ No newline at end of file From 6aab75dabc7b327143e3c64e0bf5cf9c589b916b Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sat, 26 Nov 2022 09:02:46 -0500 Subject: [PATCH 06/58] Fix ExceptionHandlingArgumentType serialization --- .../java/dev/jorel/commandapi/CommandAPI.java | 3 +- .../ExceptionHandlingArgumentType.java | 2 +- .../commandapi/nms/CustomArgumentInfo.java | 43 +++++++++++-------- .../dev/jorel/commandapi/CommandAPIMain.java | 14 +++--- 4 files changed, 36 insertions(+), 26 deletions(-) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPI.java b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPI.java index c6b0f641e4..acffe65a25 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPI.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPI.java @@ -178,6 +178,7 @@ public static void onLoad(CommandAPIConfig config) { if (!loaded) { CommandAPI.config = new InternalConfig(config); CommandAPIHandler.getInstance().checkDependencies(); + CommandAPIHandler.getInstance().getNMS().registerCustomArgumentType(); loaded = true; } else { getLogger().severe("You've tried to call the CommandAPI's onLoad() method more than once!"); @@ -200,7 +201,6 @@ public static void onEnable(Plugin plugin) { CommandAPIHandler.getInstance().getNMS().reloadDataPacks(); CommandAPIHandler.getInstance().updateHelpForCommands(); }, 0L); - CommandAPIHandler.getInstance().getNMS().registerCustomArgumentType(); // (Re)send command graph packet to players when they join Bukkit.getServer().getPluginManager().registerEvents(new Listener() { @@ -208,6 +208,7 @@ public static void onEnable(Plugin plugin) { // For some reason, any other priority doesn't work @EventHandler(priority = EventPriority.MONITOR) public void onPlayerJoin(PlayerJoinEvent e) { + logInfo("Sending commands to: " + e.getPlayer().getName()); CommandAPIHandler.getInstance().getNMS().resendPackets(e.getPlayer()); } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ExceptionHandlingArgumentType.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ExceptionHandlingArgumentType.java index 0796beb3a2..9a10e33a8d 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ExceptionHandlingArgumentType.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ExceptionHandlingArgumentType.java @@ -30,7 +30,7 @@ public T parse(StringReader stringReader) throws CommandSyntaxException { // This means Argument would need to be parameterized over RawClass, giving it 2 type // parameters and ruining backwards compatibility :( CommandAPI.logNormal("Intercepted exception with message: " + original.getMessage()); - throw original; + throw CommandAPI.failWithString("Haha! Custom Error has intercepted " + original.getMessage()).getException(); } } diff --git a/commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/CustomArgumentInfo.java b/commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/CustomArgumentInfo.java index e605524735..8ec14579e8 100644 --- a/commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/CustomArgumentInfo.java +++ b/commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/CustomArgumentInfo.java @@ -8,9 +8,6 @@ import net.minecraft.commands.synchronization.ArgumentTypeInfos; import net.minecraft.core.Registry; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; - -import java.nio.charset.Charset; public class CustomArgumentInfo implements ArgumentTypeInfo, CustomArgumentInfo.CustomTemplate> { @@ -18,24 +15,39 @@ public class CustomArgumentInfo implements ArgumentTypeInfo 0) { + properties.add("baseProperties", subProperties); + } } @Override @@ -53,11 +65,6 @@ public CustomTemplate(ArgumentType baseType) { baseTemplate = ArgumentTypeInfos.unpack(baseType); } - public CustomTemplate(Template baseTemplate) { - this.baseTemplate = baseTemplate; - baseType = null; - } - @Override public ExceptionHandlingArgumentType instantiate(CommandBuildContext commandBuildContext) { return new ExceptionHandlingArgumentType<>(baseType == null ? baseTemplate.instantiate(commandBuildContext) : baseType); diff --git a/commandapi-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index bfa984dc91..9976ce19c4 100644 --- a/commandapi-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -23,10 +23,7 @@ import java.io.File; import java.util.Map.Entry; -import dev.jorel.commandapi.arguments.ArgumentParseExceptionContext; -import dev.jorel.commandapi.arguments.IntegerArgument; -import dev.jorel.commandapi.arguments.PlayerArgument; -import dev.jorel.commandapi.arguments.StringArgument; +import dev.jorel.commandapi.arguments.*; import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException; import org.bukkit.plugin.java.JavaPlugin; @@ -51,6 +48,7 @@ public void onLoad() { // Check dependencies for CommandAPI CommandAPIHandler.getInstance().checkDependencies(); + CommandAPIHandler.getInstance().getNMS().registerCustomArgumentType(); // Convert all plugins to be converted for (Entry pluginToConvert : CommandAPI.config.getPluginsToConvert()) { @@ -67,6 +65,8 @@ public void onLoad() { for (String commandName : CommandAPI.config.getCommandsToConvert()) { new AdvancedConverter(commandName).convertCommand(); } + + new CommandAPICommand("veryearly").withArguments(new LiteralArgument("Hello")).executes((sender, args) -> {sender.sendMessage("Did I register?");}).register(); } @Override @@ -75,20 +75,22 @@ public void onEnable() { new CommandAPICommand("test") .withArguments( + new MultiLiteralArgument("a", "b", "c"), new StringArgument("string").withExceptionHandler(this::printInfo), - new IntegerArgument("int").withExceptionHandler(this::printInfo), + new IntegerArgument("int", 0, 10).withExceptionHandler(this::printInfo), new PlayerArgument("player").withExceptionHandler(this::printInfo) ) .executes((sender, args) -> { sender.sendMessage(args[0].toString()); sender.sendMessage(args[1].toString()); sender.sendMessage(args[2].toString()); + sender.sendMessage(args[3].toString()); }) .register(); } private T printInfo(ArgumentParseExceptionContext context) throws WrapperCommandSyntaxException { CommandAPI.logNormal("Intercepted error with message: " + context.exception().getMessage()); - throw CommandAPI.failWithString("Parse failed"); + throw CommandAPI.failWithString("Haha! Custom Error has intercepted " + context.exception().getMessage()); } } \ No newline at end of file From 17fa93f405f3382bd552af6d4620b4080dd32be5 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sat, 26 Nov 2022 11:17:28 -0500 Subject: [PATCH 07/58] Clean up code and add API methods --- .../jorel/commandapi/CommandAPIHandler.java | 20 +++++---- .../jorel/commandapi/arguments/Argument.java | 44 +++++++++--------- .../ExceptionHandlingArgumentType.java | 36 +++++++-------- .../InitialParseExceptionArgument.java | 17 +++++++ .../InitialParseExceptionContext.java | 12 +++++ .../InitialParseExceptionHandler.java | 23 ++++++++++ .../commandapi/nms/CustomArgumentInfo.java | 45 ++++++++++--------- .../dev/jorel/commandapi/CommandAPIMain.java | 6 +-- 8 files changed, 129 insertions(+), 74 deletions(-) create mode 100644 commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionArgument.java create mode 100644 commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionContext.java create mode 100644 commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionHandler.java diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIHandler.java b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIHandler.java index 273d06ee4d..a9e0502760 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIHandler.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIHandler.java @@ -38,6 +38,8 @@ import java.util.concurrent.CompletableFuture; import java.util.function.Predicate; +import com.mojang.brigadier.arguments.ArgumentType; +import dev.jorel.commandapi.arguments.*; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.CommandMap; @@ -62,13 +64,6 @@ import com.mojang.brigadier.tree.CommandNode; import com.mojang.brigadier.tree.LiteralCommandNode; -import dev.jorel.commandapi.arguments.Argument; -import dev.jorel.commandapi.arguments.ArgumentSuggestions; -import dev.jorel.commandapi.arguments.ICustomProvidedArgument; -import dev.jorel.commandapi.arguments.IPreviewable; -import dev.jorel.commandapi.arguments.LiteralArgument; -import dev.jorel.commandapi.arguments.MultiLiteralArgument; -import dev.jorel.commandapi.arguments.PreviewInfo; import dev.jorel.commandapi.nms.NMS; import dev.jorel.commandapi.preprocessor.RequireField; import dev.jorel.commandapi.wrappers.PreviewableFunction; @@ -903,12 +898,21 @@ LiteralArgumentBuilder getLiteralArgumentBuilderArgument(Str } RequiredArgumentBuilder requiredArgumentBuilder = RequiredArgumentBuilder - .argument(argument.getNodeName(), argument.getRawType()); + .argument(argument.getNodeName(), wrapArgumentType(argument, argument.getRawType())); return requiredArgumentBuilder.requires(css -> permissionCheck(NMS.getCommandSenderFromCSS(css), argument.getArgumentPermission(), argument.getRequirements())).suggests(newSuggestionsProvider); } + ArgumentType wrapArgumentType(Argument argument, ArgumentType rawType) { + if (!(argument instanceof InitialParseExceptionArgument)) return rawType; + + InitialParseExceptionArgument iPEA = (InitialParseExceptionArgument) argument; + + if (iPEA.getInitialParseExceptionHandler().isEmpty()) return rawType; + return new ExceptionHandlingArgumentType<>(rawType, iPEA.getInitialParseExceptionHandler().get()); + } + Object[] generatePreviousArguments(CommandContext context, Argument[] args, String nodeName) throws CommandSyntaxException { // Populate Object[], which is our previously filled arguments diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java index 72ad2bb44b..e763007794 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java @@ -20,27 +20,23 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; +import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import dev.jorel.commandapi.ArgumentTree; +import dev.jorel.commandapi.CommandPermission; +import dev.jorel.commandapi.IStringTooltip; +import dev.jorel.commandapi.SuggestionInfo; +import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException; +import dev.jorel.commandapi.nms.NMS; +import org.bukkit.command.CommandSender; + import java.util.Arrays; -import java.util.Collection; import java.util.List; import java.util.Optional; -import java.util.concurrent.CompletableFuture; import java.util.function.Function; import java.util.function.Predicate; -import com.mojang.brigadier.StringReader; -import com.mojang.brigadier.suggestion.Suggestions; -import com.mojang.brigadier.suggestion.SuggestionsBuilder; -import dev.jorel.commandapi.*; -import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException; -import org.bukkit.command.CommandSender; - -import com.mojang.brigadier.arguments.ArgumentType; -import com.mojang.brigadier.context.CommandContext; -import com.mojang.brigadier.exceptions.CommandSyntaxException; - -import dev.jorel.commandapi.nms.NMS; - /** * The core abstract class for Command API arguments * @@ -78,8 +74,9 @@ public abstract class Argument extends ArgumentTree { */ protected Argument(String nodeName, ArgumentType rawType) { this.nodeName = nodeName; - this.rawType = new ExceptionHandlingArgumentType<>(rawType); + this.rawType = rawType; } + /** * Returns the NMS or brigadier type for this argument. * @@ -99,12 +96,11 @@ public final String getNodeName() { /** * Parses an argument using {@link Argument#parseArgument(NMS, CommandContext, String, Object[])}. - * If the initial parse fails, the exception is passed to - * the active {@link ArgumentParseExceptionHandler} for - * this argument, which can be changed by the developers - * using {@link Argument#withExceptionHandler(ArgumentParseExceptionHandler)}. - * This is intended for use by the internals of the CommandAPI - * and isn't expected to be used outside the CommandAPI + * If the parse fails and a {@link CommandSyntaxException} is thrown, the exception is passed to + * the active {@link ArgumentParseExceptionHandler} for this argument, which can be defined by + * developer using {@link Argument#withArgumentParseExceptionHandler(ArgumentParseExceptionHandler)}. + * This is intended for use by the internals of the CommandAPI and isn't expected to be used outside + * the CommandAPI * * @param the command source type * @param nms an instance of NMS @@ -353,7 +349,7 @@ public Argument setListed(boolean listed) { * @param exceptionHandler The new {@link ArgumentParseExceptionHandler} this argument should use * @return this current argument */ - public final Argument withExceptionHandler(ArgumentParseExceptionHandler exceptionHandler) { + public final Argument withArgumentParseExceptionHandler(ArgumentParseExceptionHandler exceptionHandler) { this.exceptionHandler = exceptionHandler; return this; } @@ -362,7 +358,7 @@ public final Argument withExceptionHandler(ArgumentParseExceptionHandler e * Returns the {@link ArgumentParseExceptionHandler} this argument is using * @return The {@link ArgumentParseExceptionHandler} this argument is using */ - public final ArgumentParseExceptionHandler getExceptionHandler() { + public final ArgumentParseExceptionHandler getArgumentParseExceptionHandler() { return this.exceptionHandler; } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ExceptionHandlingArgumentType.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ExceptionHandlingArgumentType.java index 9a10e33a8d..9df057e158 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ExceptionHandlingArgumentType.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ExceptionHandlingArgumentType.java @@ -6,31 +6,33 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; -import dev.jorel.commandapi.CommandAPI; +import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException; import java.util.Collection; import java.util.concurrent.CompletableFuture; -public class ExceptionHandlingArgumentType implements ArgumentType { - - private final ArgumentType baseType; - - public ExceptionHandlingArgumentType(ArgumentType baseType) { - this.baseType = baseType; - } +/** + * An {@link ArgumentType} that wraps another {@link ArgumentType} and intercepts any + * {@link CommandSyntaxException} to send to a developer-specified {@link InitialParseExceptionHandler} + * + * @param baseType The {@link ArgumentType} this object is wrapping + * @param errorHandler The {@link InitialParseExceptionHandler} that handles intercepted {@link CommandSyntaxException} + * @param The object returned when the wrapped {@link ArgumentType} is parsed + */ +public record ExceptionHandlingArgumentType(ArgumentType baseType, InitialParseExceptionHandler errorHandler) implements ArgumentType { @Override public T parse(StringReader stringReader) throws CommandSyntaxException { try { return baseType.parse(stringReader); } catch (CommandSyntaxException original) { - // TODO: It would be cool if this part could return a substitute value if the parse failed - // Unfortunately, exceptionHandler cannot do this since T dose not necessarily equal RawClass - // To do this, I think an additional exceptionHandler for RawClass would need to be added - // This means Argument would need to be parameterized over RawClass, giving it 2 type - // parameters and ruining backwards compatibility :( - CommandAPI.logNormal("Intercepted exception with message: " + original.getMessage()); - throw CommandAPI.failWithString("Haha! Custom Error has intercepted " + original.getMessage()).getException(); + try { + return errorHandler.handleException(new InitialParseExceptionContext( + new WrapperCommandSyntaxException(original) + )); + } catch (WrapperCommandSyntaxException newException) { + throw newException.getException(); + } } } @@ -43,8 +45,4 @@ public Collection getExamples() { public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { return baseType.listSuggestions(context, builder); } - - public ArgumentType getBaseType() { - return baseType; - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionArgument.java new file mode 100644 index 0000000000..460ac28ee8 --- /dev/null +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionArgument.java @@ -0,0 +1,17 @@ +package dev.jorel.commandapi.arguments; + +import com.mojang.brigadier.arguments.ArgumentType; + +import java.util.Optional; + +/** + * An interface indicating that an argument can have an + * {@link InitialParseExceptionHandler} attached to it. + * @param The class of the object returned when the {@link ArgumentType} + * used by this Argument parses its raw input + */ +public interface InitialParseExceptionArgument> { + Impl withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler); + + Optional> getInitialParseExceptionHandler(); +} diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionContext.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionContext.java new file mode 100644 index 0000000000..05b6eb437e --- /dev/null +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionContext.java @@ -0,0 +1,12 @@ +package dev.jorel.commandapi.arguments; + +import com.mojang.brigadier.arguments.ArgumentType; +import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException; + +/** + * A record containing information on why a Brigadier {@link ArgumentType} failed to parse its raw input. + * + * @param exception The CommandSyntaxException that was thrown when the {@link ArgumentType} failed to parse + */ +public record InitialParseExceptionContext(WrapperCommandSyntaxException exception) { +} diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionHandler.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionHandler.java new file mode 100644 index 0000000000..0d509c3ebb --- /dev/null +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionHandler.java @@ -0,0 +1,23 @@ +package dev.jorel.commandapi.arguments; + +import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException; + +/** + * A FunctionalInterface for defining custom behavior when a Brigadier ArgumentType fails to parse. + * See {@link InitialParseExceptionHandler#handleException(InitialParseExceptionContext)} + * + * @param The class of the object returned by the ArgumentType this object is handling + */ +@FunctionalInterface +public interface InitialParseExceptionHandler { + /** + * A method that handles when a Brigadier ArgumentType fails to parse. + * It can either return an object or throw a different exception. + * + * @param context a {@link InitialParseExceptionContext} record that holds information + * about why and when the Argument failed to parse + * @return A new object in place of the failed parse + * @throws WrapperCommandSyntaxException A new exception to pass on + */ + T handleException(InitialParseExceptionContext context) throws WrapperCommandSyntaxException; +} diff --git a/commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/CustomArgumentInfo.java b/commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/CustomArgumentInfo.java index 8ec14579e8..7fa83be29a 100644 --- a/commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/CustomArgumentInfo.java +++ b/commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/CustomArgumentInfo.java @@ -9,15 +9,16 @@ import net.minecraft.core.Registry; import net.minecraft.network.FriendlyByteBuf; -public class CustomArgumentInfo implements ArgumentTypeInfo, CustomArgumentInfo.CustomTemplate> { - +public class CustomArgumentInfo implements ArgumentTypeInfo, CustomArgumentInfo.Template> { @Override - public void serializeToNetwork(CustomTemplate template, FriendlyByteBuf friendlyByteBuf) { - ArgumentType baseType = template.baseType; - ArgumentTypeInfo baseInfo = ArgumentTypeInfos.byClass(baseType); + public void serializeToNetwork(Template template, FriendlyByteBuf friendlyByteBuf) { + ArgumentType baseType = template.baseType; + ArgumentTypeInfo, ArgumentTypeInfo.Template>> baseInfo = + (ArgumentTypeInfo, ArgumentTypeInfo.Template>>) ArgumentTypeInfos.byClass(baseType); // Overwrite my id with the base type's. Since there are less than // 128 argument types by default, assume index will always fill 1 byte. + // If you get a garbage packet, check this assumption int baseId = Registry.COMMAND_ARGUMENT_TYPE.getId(baseInfo); friendlyByteBuf.writerIndex(friendlyByteBuf.writerIndex() - 1); friendlyByteBuf.writeVarInt(baseId); @@ -27,7 +28,7 @@ public void serializeToNetwork(CustomTemplate template, FriendlyByteBuf friendly } @Override - public CustomTemplate deserializeFromNetwork(FriendlyByteBuf friendlyByteBuf) { + public Template deserializeFromNetwork(FriendlyByteBuf friendlyByteBuf) { // Since this class overrides its COMMAND_ARGUMENT_TYPE id with the baseType's, // this class's id should never show up in a packet and this method should never // be called to deserialize the ArgumentType info that wasn't put into the packet @@ -39,9 +40,10 @@ public CustomTemplate deserializeFromNetwork(FriendlyByteBuf friendlyByteBuf) { } @Override - public void serializeToJson(CustomTemplate template, JsonObject properties) { - ArgumentType baseType = template.baseType; - ArgumentTypeInfo baseInfo = ArgumentTypeInfos.byClass(baseType); + public void serializeToJson(Template template, JsonObject properties) { + ArgumentType baseType = template.baseType; + ArgumentTypeInfo, ArgumentTypeInfo.Template>> baseInfo = + (ArgumentTypeInfo, ArgumentTypeInfo.Template>>) ArgumentTypeInfos.byClass(baseType); properties.addProperty("baseType", Registry.COMMAND_ARGUMENT_TYPE.getKey(baseInfo).toString()); JsonObject subProperties = new JsonObject(); baseInfo.serializeToJson(baseInfo.unpack(baseType), subProperties); @@ -51,27 +53,30 @@ public void serializeToJson(CustomTemplate template, JsonObject properties) { } @Override - public CustomTemplate unpack(ExceptionHandlingArgumentType exceptionHandlingArgumentType) { - ArgumentType baseType = exceptionHandlingArgumentType.getBaseType(); - return new CustomTemplate(baseType); + public Template unpack(ExceptionHandlingArgumentType exceptionHandlingArgumentType) { + ArgumentType baseType = exceptionHandlingArgumentType.baseType(); + return new Template(baseType); } - public final class CustomTemplate implements ArgumentTypeInfo.Template> { - final ArgumentType baseType; - final Template baseTemplate; + public final class Template implements ArgumentTypeInfo.Template> { + final ArgumentType baseType; - public CustomTemplate(ArgumentType baseType) { + public Template(ArgumentType baseType) { this.baseType = baseType; - baseTemplate = ArgumentTypeInfos.unpack(baseType); } @Override - public ExceptionHandlingArgumentType instantiate(CommandBuildContext commandBuildContext) { - return new ExceptionHandlingArgumentType<>(baseType == null ? baseTemplate.instantiate(commandBuildContext) : baseType); + public ExceptionHandlingArgumentType instantiate(CommandBuildContext commandBuildContext) { + // Same as CustomArgumentInfo#deserializeFromNetwork. An + // ExceptionHandlingArgumentType should never be built + // from a packet, so this method shouldn't be used + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.CustomArgumentInfo.Template#instantiate for more information"); + // Including a mini-stacktrace here in case this exception shows up + // on a client-disconnected screen, which is not very helpful } @Override - public ArgumentTypeInfo, ?> type() { + public ArgumentTypeInfo, ?> type() { return CustomArgumentInfo.this; } } diff --git a/commandapi-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index 9976ce19c4..9bffea1cd4 100644 --- a/commandapi-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -76,9 +76,9 @@ public void onEnable() { new CommandAPICommand("test") .withArguments( new MultiLiteralArgument("a", "b", "c"), - new StringArgument("string").withExceptionHandler(this::printInfo), - new IntegerArgument("int", 0, 10).withExceptionHandler(this::printInfo), - new PlayerArgument("player").withExceptionHandler(this::printInfo) + new StringArgument("string").withArgumentParseExceptionHandler(this::printInfo), + new IntegerArgument("int", 0, 10).withArgumentParseExceptionHandler(this::printInfo), + new PlayerArgument("player").withArgumentParseExceptionHandler(this::printInfo) ) .executes((sender, args) -> { sender.sendMessage(args[0].toString()); From 06aca107afd0205330c4576bd69f13add3eed577 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sat, 26 Nov 2022 12:18:26 -0500 Subject: [PATCH 08/58] Add InitialParseExceptionArgument to testing arguments --- .../InitialParseExceptionArgument.java | 12 ++++++++++++ .../commandapi/arguments/IntegerArgument.java | 18 ++++++++++++++++-- .../commandapi/arguments/PlayerArgument.java | 17 ++++++++++++++++- .../commandapi/arguments/StringArgument.java | 17 ++++++++++++++++- .../dev/jorel/commandapi/CommandAPIMain.java | 17 ++++++++++++++--- 5 files changed, 74 insertions(+), 7 deletions(-) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionArgument.java index 460ac28ee8..8ebc619173 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionArgument.java @@ -11,7 +11,19 @@ * used by this Argument parses its raw input */ public interface InitialParseExceptionArgument> { + + /** + * Sets the {@link InitialParseExceptionHandler} this Argument should + * use when the {@link ArgumentType} it is using fails to parse. + * + * @param exceptionHandler The new {@link InitialParseExceptionHandler} this argument should use + * @return this current argument + */ Impl withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler); + /** + * Returns the {@link InitialParseExceptionHandler} this argument is using + * @return The {@link InitialParseExceptionHandler} this argument is using + */ Optional> getInitialParseExceptionHandler(); } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/IntegerArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/IntegerArgument.java index 430179833d..d4b1c3c88d 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/IntegerArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/IntegerArgument.java @@ -27,10 +27,12 @@ import dev.jorel.commandapi.exceptions.InvalidRangeException; import dev.jorel.commandapi.nms.NMS; +import java.util.Optional; + /** * An argument that represents primitive Java ints */ -public class IntegerArgument extends SafeOverrideableArgument { +public class IntegerArgument extends SafeOverrideableArgument implements InitialParseExceptionArgument> { /** * An integer argument @@ -77,5 +79,17 @@ public Integer parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return cmdCtx.getArgument(key, getPrimitiveType()); } - + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/PlayerArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/PlayerArgument.java index 46aebca556..8f5aefc531 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/PlayerArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/PlayerArgument.java @@ -28,10 +28,12 @@ import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; +import java.util.Optional; + /** * An argument that represents the Bukkit Player object */ -public class PlayerArgument extends SafeOverrideableArgument { +public class PlayerArgument extends SafeOverrideableArgument implements InitialParseExceptionArgument> { /** * A Player argument. Produces a single player, regardless of whether @@ -58,4 +60,17 @@ public Player parseArgument(NMS CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getPlayer(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/StringArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/StringArgument.java index 31a954b42a..4a8a96c321 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/StringArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/StringArgument.java @@ -26,10 +26,12 @@ import dev.jorel.commandapi.nms.NMS; +import java.util.Optional; + /** * An argument that represents a simple String */ -public class StringArgument extends Argument { +public class StringArgument extends Argument implements InitialParseExceptionArgument> { /** * A string argument for one word @@ -54,4 +56,17 @@ public String parseArgument(NMS CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return cmdCtx.getArgument(key, getPrimitiveType()); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index 9bffea1cd4..f500a59114 100644 --- a/commandapi-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -76,9 +76,15 @@ public void onEnable() { new CommandAPICommand("test") .withArguments( new MultiLiteralArgument("a", "b", "c"), - new StringArgument("string").withArgumentParseExceptionHandler(this::printInfo), - new IntegerArgument("int", 0, 10).withArgumentParseExceptionHandler(this::printInfo), - new PlayerArgument("player").withArgumentParseExceptionHandler(this::printInfo) + new StringArgument("string") + .withInitialParseExceptionHandler(this::printInfo) + .withArgumentParseExceptionHandler(this::printInfo), + new IntegerArgument("int", 0, 10) + .withInitialParseExceptionHandler(this::printInfo) + .withArgumentParseExceptionHandler(this::printInfo), + new PlayerArgument("player") + .withInitialParseExceptionHandler(this::printInfo) + .withArgumentParseExceptionHandler(this::printInfo) ) .executes((sender, args) -> { sender.sendMessage(args[0].toString()); @@ -89,6 +95,11 @@ public void onEnable() { .register(); } + private T printInfo(InitialParseExceptionContext context) throws WrapperCommandSyntaxException { + CommandAPI.logNormal("Intercepted error with message: " + context.exception().getMessage()); + throw CommandAPI.failWithString("Haha! Custom Error has intercepted " + context.exception().getMessage()); + } + private T printInfo(ArgumentParseExceptionContext context) throws WrapperCommandSyntaxException { CommandAPI.logNormal("Intercepted error with message: " + context.exception().getMessage()); throw CommandAPI.failWithString("Haha! Custom Error has intercepted " + context.exception().getMessage()); From 417fccb6d5ac885c348fdf4d1ed77a2b223f7823 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sat, 26 Nov 2022 13:55:08 -0500 Subject: [PATCH 09/58] Implement InitialParseExceptionArgument for other applicable arguments --- .../arguments/AdvancementArgument.java | 16 +++++++++++++++- .../arguments/AdventureChatArgument.java | 15 ++++++++++++++- .../AdventureChatComponentArgument.java | 17 ++++++++++++++++- .../commandapi/arguments/AngleArgument.java | 17 ++++++++++++++++- .../commandapi/arguments/AxisArgument.java | 16 +++++++++++++++- .../commandapi/arguments/BiomeArgument.java | 16 +++++++++++++++- .../arguments/BlockPredicateArgument.java | 16 +++++++++++++++- .../arguments/BlockStateArgument.java | 17 ++++++++++++++++- .../commandapi/arguments/BooleanArgument.java | 16 +++++++++++++++- .../commandapi/arguments/ChatArgument.java | 15 ++++++++++++++- .../arguments/ChatColorArgument.java | 16 +++++++++++++++- .../arguments/ChatComponentArgument.java | 17 ++++++++++++++++- .../commandapi/arguments/CustomArgument.java | 1 + .../commandapi/arguments/DoubleArgument.java | 16 +++++++++++++++- .../arguments/EnchantmentArgument.java | 17 ++++++++++++++++- .../arguments/EntitySelectorArgument.java | 16 +++++++++++++++- .../arguments/EntityTypeArgument.java | 17 ++++++++++++++++- .../arguments/EnvironmentArgument.java | 16 +++++++++++++++- .../commandapi/arguments/FloatArgument.java | 17 ++++++++++++++++- .../arguments/FloatRangeArgument.java | 17 ++++++++++++++++- .../commandapi/arguments/FunctionArgument.java | 17 ++++++++++++++++- .../arguments/IntegerRangeArgument.java | 17 ++++++++++++++++- .../arguments/ItemStackArgument.java | 17 ++++++++++++++++- .../arguments/ItemStackPredicateArgument.java | 16 +++++++++++++++- .../commandapi/arguments/ListTextArgument.java | 18 +++++++++++++++++- .../arguments/Location2DArgument.java | 17 ++++++++++++++++- .../commandapi/arguments/LocationArgument.java | 17 ++++++++++++++++- .../commandapi/arguments/LongArgument.java | 17 ++++++++++++++++- .../arguments/LootTableArgument.java | 17 ++++++++++++++++- .../arguments/MathOperationArgument.java | 17 ++++++++++++++++- .../arguments/NBTCompoundArgument.java | 17 ++++++++++++++++- .../arguments/NamespacedKeyArgument.java | 17 ++++++++++++++++- .../arguments/ObjectiveCriteriaArgument.java | 17 ++++++++++++++++- .../arguments/OfflinePlayerArgument.java | 17 ++++++++++++++++- .../commandapi/arguments/ParticleArgument.java | 17 ++++++++++++++++- .../arguments/PotionEffectArgument.java | 17 ++++++++++++++++- .../commandapi/arguments/RecipeArgument.java | 17 ++++++++++++++++- .../commandapi/arguments/RotationArgument.java | 17 ++++++++++++++++- .../arguments/ScoreHolderArgument.java | 16 +++++++++++++++- .../arguments/ScoreboardSlotArgument.java | 17 ++++++++++++++++- .../commandapi/arguments/SoundArgument.java | 17 ++++++++++++++++- .../commandapi/arguments/StringArgument.java | 15 +-------------- .../commandapi/arguments/TextArgument.java | 17 ++++++++++++++++- .../commandapi/arguments/TimeArgument.java | 17 ++++++++++++++++- .../commandapi/arguments/UUIDArgument.java | 16 +++++++++++++++- .../commandapi/arguments/WorldArgument.java | 16 +++++++++++++++- .../java/dev/jorel/commandapi/nms/NMS.java | 2 +- .../dev/jorel/commandapi/nms/NMS_1_13.java | 4 ++++ .../jorel/commandapi/nms/NMS_1_19_1_R1.java | 1 - .../dev/jorel/commandapi/CommandAPIMain.java | 6 +++--- 50 files changed, 698 insertions(+), 63 deletions(-) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AdvancementArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AdvancementArgument.java index a1fc91c688..0313539312 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AdvancementArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AdvancementArgument.java @@ -28,11 +28,13 @@ import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; +import java.util.Optional; + /** * An argument that represents the Bukkit Advancement object * @apiNote Returns an {@link Advancement} object */ -public class AdvancementArgument extends SafeOverrideableArgument implements ICustomProvidedArgument { +public class AdvancementArgument extends SafeOverrideableArgument implements ICustomProvidedArgument, InitialParseExceptionArgument> { /** * Constructs an AdvancementArgument with a given node name @@ -63,4 +65,16 @@ public Advancement parseArgument(NMS exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AdventureChatArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AdventureChatArgument.java index b248e13aad..fa6e66fbfb 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AdventureChatArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AdventureChatArgument.java @@ -40,7 +40,7 @@ * * @apiNote Returns a {@link Component} object */ -public class AdventureChatArgument extends Argument implements IGreedyArgument, IPreviewable { +public class AdventureChatArgument extends Argument implements IGreedyArgument, IPreviewable, InitialParseExceptionArgument> { private PreviewableFunction preview; private boolean usePreview; @@ -113,4 +113,17 @@ public AdventureChatArgument usePreview(boolean usePreview) { return this; } + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } + } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AdventureChatComponentArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AdventureChatComponentArgument.java index b5ed236e84..62cb23f838 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AdventureChatComponentArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AdventureChatComponentArgument.java @@ -28,11 +28,13 @@ import dev.jorel.commandapi.nms.NMS; import net.kyori.adventure.text.Component; +import java.util.Optional; + /** * An argument that represents raw JSON text * @apiNote Returns a {@link Component} object */ -public class AdventureChatComponentArgument extends Argument { +public class AdventureChatComponentArgument extends Argument implements InitialParseExceptionArgument> { /** * Constructs a ChatComponent argument with a given node name. Represents raw JSON text, used in Book MetaData, Chat and other various areas of Minecraft @@ -64,4 +66,17 @@ public Component parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getAdventureChatComponent(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AngleArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AngleArgument.java index 53960b0f91..8477ea46ab 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AngleArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AngleArgument.java @@ -26,6 +26,8 @@ import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; +import java.util.Optional; + /** * An argument that represents a yaw angle, measured in degrees with float * number. -180.0 for due north, -90.0 for due east, 0.0 for due south, 90.0 for @@ -35,7 +37,7 @@ * * @apiNote Returns a {@link float} */ -public class AngleArgument extends SafeOverrideableArgument { +public class AngleArgument extends SafeOverrideableArgument implements InitialParseExceptionArgument> { /** * Constructs an AngleArgument with a given node name @@ -62,4 +64,17 @@ public Float parseArgument(NMS throws CommandSyntaxException { return nms.getAngle(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AxisArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AxisArgument.java index 40e43ba1f0..1027fe4dd8 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AxisArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AxisArgument.java @@ -21,6 +21,7 @@ package dev.jorel.commandapi.arguments; import java.util.EnumSet; +import java.util.Optional; import org.bukkit.Axis; @@ -36,7 +37,7 @@ * @apiNote Returns a {@link EnumSet}{@code <}{@link Axis}{@code >} object */ @SuppressWarnings("rawtypes") -public class AxisArgument extends SafeOverrideableArgument> { +public class AxisArgument extends SafeOverrideableArgument> implements InitialParseExceptionArgument> { /** * Constructs an AxisArgument with a given node name. Represents the axes x, y @@ -65,4 +66,17 @@ public EnumSet parseArgument(NMS exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BiomeArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BiomeArgument.java index 74219d0113..c7d8282847 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BiomeArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BiomeArgument.java @@ -20,6 +20,7 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; +import java.util.Optional; import java.util.function.Function; import org.bukkit.block.Biome; @@ -35,7 +36,7 @@ * * @apiNote Returns a {@link Biome} object */ -public class BiomeArgument extends SafeOverrideableArgument implements ICustomProvidedArgument { +public class BiomeArgument extends SafeOverrideableArgument implements ICustomProvidedArgument, InitialParseExceptionArgument> { /** * Constructs a BiomeArgument with a given node name. @@ -68,4 +69,17 @@ public Biome parseArgument(NMS throws CommandSyntaxException { return nms.getBiome(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BlockPredicateArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BlockPredicateArgument.java index d41d414260..632e5762ba 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BlockPredicateArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BlockPredicateArgument.java @@ -20,6 +20,7 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; +import java.util.Optional; import java.util.function.Predicate; import org.bukkit.block.Block; @@ -36,7 +37,7 @@ * @apiNote Returns a {@link Predicate}{@code <}{@link Block}{@code >} object */ @SuppressWarnings("rawtypes") -public class BlockPredicateArgument extends Argument { +public class BlockPredicateArgument extends Argument implements InitialParseExceptionArgument> { /** * Constructs a BlockPredicateArgument with a given node name. Represents a @@ -64,4 +65,17 @@ public Predicate parseArgument(NMS exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BlockStateArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BlockStateArgument.java index ec70f23a9c..c3bc431b7e 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BlockStateArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BlockStateArgument.java @@ -28,13 +28,15 @@ import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; +import java.util.Optional; + /** * An argument that represents the Bukkit BlockData object * * @apiNote Returns a {@link BlockData} object * */ -public class BlockStateArgument extends Argument { +public class BlockStateArgument extends Argument implements InitialParseExceptionArgument> { /** * Constructs a BlockStateArgument with a given node name. @@ -61,4 +63,17 @@ public BlockData parseArgument(NMS exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BooleanArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BooleanArgument.java index 5104e75e1e..9cf1cd149b 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BooleanArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BooleanArgument.java @@ -26,12 +26,14 @@ import dev.jorel.commandapi.nms.NMS; +import java.util.Optional; + /** * An argument that represents primitive Java booleans * * @apiNote Returns a {@link boolean} */ -public class BooleanArgument extends SafeOverrideableArgument { +public class BooleanArgument extends SafeOverrideableArgument implements InitialParseExceptionArgument> { /** * Constructs a Boolean argument with a given node name @@ -59,4 +61,16 @@ public Boolean parseArgument(NMS exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ChatArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ChatArgument.java index 59b5b55ea5..cea2e19195 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ChatArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ChatArgument.java @@ -40,7 +40,7 @@ * * @apiNote Returns a {@link BaseComponent}{@code []} object */ -public class ChatArgument extends Argument implements IGreedyArgument, IPreviewable { +public class ChatArgument extends Argument implements IGreedyArgument, IPreviewable, InitialParseExceptionArgument> { private PreviewableFunction preview; private boolean usePreview; @@ -113,4 +113,17 @@ public ChatArgument usePreview(boolean usePreview) { this.usePreview = usePreview; return this; } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ChatColorArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ChatColorArgument.java index ef23d81556..f07aba804b 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ChatColorArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ChatColorArgument.java @@ -20,6 +20,7 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; +import java.util.Optional; import java.util.function.Function; import org.bukkit.ChatColor; @@ -35,7 +36,7 @@ * * @apiNote Returns a {@link ChatColor} object */ -public class ChatColorArgument extends SafeOverrideableArgument { +public class ChatColorArgument extends SafeOverrideableArgument implements InitialParseExceptionArgument>{ /** * Constructs a ChatColor argument with a given node name. Represents a color or @@ -62,4 +63,17 @@ public ChatColor parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getChatColor(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ChatComponentArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ChatComponentArgument.java index efcb0eb917..6bdc0be700 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ChatComponentArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ChatComponentArgument.java @@ -28,12 +28,14 @@ import dev.jorel.commandapi.nms.NMS; import net.md_5.bungee.api.chat.BaseComponent; +import java.util.Optional; + /** * An argument that represents raw JSON text * * @apiNote Returns a {@link BaseComponent}{@code []} object */ -public class ChatComponentArgument extends Argument { +public class ChatComponentArgument extends Argument implements InitialParseExceptionArgument> { /** * Constructs a ChatComponent argument with a given node name. Represents raw @@ -69,4 +71,17 @@ public BaseComponent[] parseArgument(NMS exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/CustomArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/CustomArgument.java index b5723fc5a6..24c9c4c27a 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/CustomArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/CustomArgument.java @@ -41,6 +41,7 @@ * {@link IntegerArgument} * @apiNote Returns a {@link T} object */ +// TODO: Can this be an InitialParseExceptionArgument? public class CustomArgument extends Argument { private final CustomArgumentInfoParser infoParser; diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/DoubleArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/DoubleArgument.java index 76ed775f91..8b281c5d93 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/DoubleArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/DoubleArgument.java @@ -27,12 +27,14 @@ import dev.jorel.commandapi.exceptions.InvalidRangeException; import dev.jorel.commandapi.nms.NMS; +import java.util.Optional; + /** * An argument that represents primitive Java doubles * * @apiNote Returns a {@link double} */ -public class DoubleArgument extends SafeOverrideableArgument { +public class DoubleArgument extends SafeOverrideableArgument implements InitialParseExceptionArgument> { /** * A double argument @@ -84,4 +86,16 @@ public Double parseArgument(NMS return cmdCtx.getArgument(key, getPrimitiveType()); } + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return null; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EnchantmentArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EnchantmentArgument.java index 320e369c43..650532cf2c 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EnchantmentArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EnchantmentArgument.java @@ -28,12 +28,14 @@ import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; +import java.util.Optional; + /** * An argument that represents the Bukkit Enchantment object * * @apiNote Returns an {@link Enchantment} object */ -public class EnchantmentArgument extends SafeOverrideableArgument { +public class EnchantmentArgument extends SafeOverrideableArgument implements InitialParseExceptionArgument>{ /** * An Enchantment argument. Represents an enchantment for items @@ -58,4 +60,17 @@ public Enchantment parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getEnchantment(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EntitySelectorArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EntitySelectorArgument.java index 5488fc8c1f..9042cb9d0f 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EntitySelectorArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EntitySelectorArgument.java @@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Optional; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; @@ -38,7 +39,7 @@ * * @apiNote The return type depends on the provided {@link EntitySelector} */ -public class EntitySelectorArgument extends Argument { +public class EntitySelectorArgument extends Argument implements InitialParseExceptionArgument> { private final EntitySelector selector; @@ -125,4 +126,17 @@ public List getEntityNames(Object argument) { throw new IllegalStateException("Invalid selector " + selector.name()); }; } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } \ No newline at end of file diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EntityTypeArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EntityTypeArgument.java index 20c548575d..c2bd74a85a 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EntityTypeArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EntityTypeArgument.java @@ -28,10 +28,12 @@ import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; +import java.util.Optional; + /** * An argument that represents the Bukkit EntityType object */ -public class EntityTypeArgument extends SafeOverrideableArgument implements ICustomProvidedArgument { +public class EntityTypeArgument extends SafeOverrideableArgument implements ICustomProvidedArgument, InitialParseExceptionArgument> { /** * An EntityType argument. Represents the type of an Entity @@ -61,4 +63,17 @@ public EntityType parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getEntityType(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EnvironmentArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EnvironmentArgument.java index 5c95773991..fe4e9f3fef 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EnvironmentArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EnvironmentArgument.java @@ -20,6 +20,7 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; +import java.util.Optional; import java.util.function.Function; import org.bukkit.World.Environment; @@ -36,7 +37,7 @@ * @deprecated Use {@link WorldArgument} instead. */ @Deprecated -public class EnvironmentArgument extends SafeOverrideableArgument { +public class EnvironmentArgument extends SafeOverrideableArgument implements InitialParseExceptionArgument> { /** * An Environment argument. Represents Bukkit's Environment object @@ -64,4 +65,17 @@ public Environment parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getEnvironment(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/FloatArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/FloatArgument.java index 9664e1a9a1..fc80d5e42a 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/FloatArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/FloatArgument.java @@ -27,10 +27,12 @@ import dev.jorel.commandapi.exceptions.InvalidRangeException; import dev.jorel.commandapi.nms.NMS; +import java.util.Optional; + /** * An argument that represents primitive Java floats */ -public class FloatArgument extends SafeOverrideableArgument { +public class FloatArgument extends SafeOverrideableArgument implements InitialParseExceptionArgument> { /** * A float argument @@ -77,4 +79,17 @@ public Float parseArgument(NMS CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return cmdCtx.getArgument(key, getPrimitiveType()); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/FloatRangeArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/FloatRangeArgument.java index c5302affe3..73d1615ac6 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/FloatRangeArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/FloatRangeArgument.java @@ -27,10 +27,12 @@ import dev.jorel.commandapi.nms.NMS; import dev.jorel.commandapi.wrappers.FloatRange; +import java.util.Optional; + /** * An argument that represents a range of float values */ -public class FloatRangeArgument extends SafeOverrideableArgument { +public class FloatRangeArgument extends SafeOverrideableArgument implements InitialParseExceptionArgument> { /** * A FloatRange argument that represents a range of floating-point values @@ -55,4 +57,17 @@ public FloatRange parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getFloatRange(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/FunctionArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/FunctionArgument.java index 8750091a7a..7f969aaa90 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/FunctionArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/FunctionArgument.java @@ -29,10 +29,12 @@ import dev.jorel.commandapi.nms.NMS; import dev.jorel.commandapi.wrappers.FunctionWrapper; +import java.util.Optional; + /** * An argument that represents Minecraft functions and tags */ -public class FunctionArgument extends SafeOverrideableArgument implements ICustomProvidedArgument { +public class FunctionArgument extends SafeOverrideableArgument implements ICustomProvidedArgument, InitialParseExceptionArgument> { /** * A Minecraft function. Plugin commands which plan to be used INSIDE a Minecraft @@ -64,4 +66,17 @@ public FunctionWrapper[] parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getFunction(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/IntegerRangeArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/IntegerRangeArgument.java index 20a6b34445..d23be58774 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/IntegerRangeArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/IntegerRangeArgument.java @@ -27,10 +27,12 @@ import dev.jorel.commandapi.nms.NMS; import dev.jorel.commandapi.wrappers.IntegerRange; +import java.util.Optional; + /** * An argument that represents a range of integer values */ -public class IntegerRangeArgument extends SafeOverrideableArgument { +public class IntegerRangeArgument extends SafeOverrideableArgument implements InitialParseExceptionArgument> { /** * An IntegerRange argument. Represents a range of whole numbers @@ -55,4 +57,17 @@ public IntegerRange parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getIntRange(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ItemStackArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ItemStackArgument.java index 4ae218d59d..5cbab4981c 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ItemStackArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ItemStackArgument.java @@ -28,10 +28,12 @@ import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; +import java.util.Optional; + /** * An argument that represents the Bukkit ItemStack object */ -public class ItemStackArgument extends SafeOverrideableArgument { +public class ItemStackArgument extends SafeOverrideableArgument implements InitialParseExceptionArgument> { /** * An ItemStack argument. Always returns an itemstack of size 1 @@ -56,4 +58,17 @@ public ItemStack parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getItemStack(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ItemStackPredicateArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ItemStackPredicateArgument.java index d992206a44..439e51241c 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ItemStackPredicateArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ItemStackPredicateArgument.java @@ -20,6 +20,7 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; +import java.util.Optional; import java.util.function.Predicate; import org.bukkit.inventory.ItemStack; @@ -34,7 +35,7 @@ * An argument that represents a Predicate<ItemStack> */ @SuppressWarnings("rawtypes") -public class ItemStackPredicateArgument extends Argument { +public class ItemStackPredicateArgument extends Argument implements InitialParseExceptionArgument>{ /** * A ItemStack Predicate argument. Represents a predicate for itemstacks @@ -59,4 +60,17 @@ public Predicate parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getItemStackPredicate(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ListTextArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ListTextArgument.java index 99c6a96015..3dabcd8796 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ListTextArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ListTextArgument.java @@ -24,6 +24,8 @@ import org.bukkit.command.CommandSender; import java.util.Collection; +import java.util.List; +import java.util.Optional; import java.util.function.Function; /** @@ -31,8 +33,22 @@ * * @param the type that this list argument generates a list of. */ -public class ListTextArgument extends ListArgumentCommon { +@SuppressWarnings("rawtypes") +public class ListTextArgument extends ListArgumentCommon implements InitialParseExceptionArgument> { ListTextArgument(String nodeName, String delimiter, boolean allowDuplicates, Function> supplier, Function suggestionsMapper) { super(nodeName, delimiter, allowDuplicates, supplier, suggestionsMapper, true); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Location2DArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Location2DArgument.java index 225d44685f..9ed50f04d2 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Location2DArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Location2DArgument.java @@ -29,11 +29,13 @@ import dev.jorel.commandapi.nms.NMS; import dev.jorel.commandapi.wrappers.Location2D; +import java.util.Optional; + /** * An argument that represents the Bukkit {@link Location} object in x and z directions * @apiNote Returns a {@link Location2D} object */ -public class Location2DArgument extends SafeOverrideableArgument { +public class Location2DArgument extends SafeOverrideableArgument implements InitialParseExceptionArgument> { /** * A Location argument. Represents Minecraft locations in 2D space. Defaults to {@link LocationType#PRECISE_POSITION} @@ -81,4 +83,17 @@ public Location2D parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return isPrecise ? nms.getLocation2DPrecise(cmdCtx, key) : nms.getLocation2DBlock(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/LocationArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/LocationArgument.java index f5b568a390..25de30193c 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/LocationArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/LocationArgument.java @@ -28,11 +28,13 @@ import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; +import java.util.Optional; + /** * An argument that represents the Bukkit {@link Location} object * @apiNote Returns a {@link Location} object */ -public class LocationArgument extends SafeOverrideableArgument { +public class LocationArgument extends SafeOverrideableArgument implements InitialParseExceptionArgument> { /** * A Location argument. Represents Minecraft locations. Defaults to {@link LocationType#PRECISE_POSITION} @@ -81,4 +83,17 @@ public Location parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return isPrecise ? nms.getLocationPrecise(cmdCtx, key) : nms.getLocationBlock(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/LongArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/LongArgument.java index fcdd6cc046..6a98a561e2 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/LongArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/LongArgument.java @@ -27,10 +27,12 @@ import dev.jorel.commandapi.exceptions.InvalidRangeException; import dev.jorel.commandapi.nms.NMS; +import java.util.Optional; + /** * An argument that represents primitive Java longs */ -public class LongArgument extends SafeOverrideableArgument { +public class LongArgument extends SafeOverrideableArgument implements InitialParseExceptionArgument> { /** * A long argument @@ -77,5 +79,18 @@ public Long parseArgument(NMS n CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return cmdCtx.getArgument(key, getPrimitiveType()); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/LootTableArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/LootTableArgument.java index 24dd69a16c..3d83b7d4d8 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/LootTableArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/LootTableArgument.java @@ -29,10 +29,12 @@ import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; +import java.util.Optional; + /** * An argument that represents the Bukkit LootTable object */ -public class LootTableArgument extends SafeOverrideableArgument implements ICustomProvidedArgument { +public class LootTableArgument extends SafeOverrideableArgument implements ICustomProvidedArgument, InitialParseExceptionArgument> { /** * A LootTable argument that represents a Bukkit LootTable. @@ -62,4 +64,17 @@ public LootTable parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getLootTable(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/MathOperationArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/MathOperationArgument.java index feb178796a..93c12c38a2 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/MathOperationArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/MathOperationArgument.java @@ -27,10 +27,12 @@ import dev.jorel.commandapi.nms.NMS; import dev.jorel.commandapi.wrappers.MathOperation; +import java.util.Optional; + /** * An argument that represents Minecraft scoreboard math operations */ -public class MathOperationArgument extends SafeOverrideableArgument { +public class MathOperationArgument extends SafeOverrideableArgument implements InitialParseExceptionArgument> { /** * A MathOperation argument. Represents a math operation (e.g. addition, subtraction etc.) @@ -55,4 +57,17 @@ public MathOperation parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getMathOperation(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/NBTCompoundArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/NBTCompoundArgument.java index f71d584190..0009bda0a2 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/NBTCompoundArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/NBTCompoundArgument.java @@ -27,10 +27,12 @@ import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; +import java.util.Optional; + /** * An argument that represents an NBTContainer from the NBT API */ -public class NBTCompoundArgument extends SafeOverrideableArgument { +public class NBTCompoundArgument extends SafeOverrideableArgument implements InitialParseExceptionArgument> { /** * An NBT Compound Argument. Represents Minecraft's NBT Compound Tag using the @@ -64,4 +66,17 @@ public NBTContainer parseArgument(NMS exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/NamespacedKeyArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/NamespacedKeyArgument.java index a32c177ce1..95f418dd8d 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/NamespacedKeyArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/NamespacedKeyArgument.java @@ -28,6 +28,8 @@ import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; +import java.util.Optional; + /** * An argument that represents a Minecraft resource location (or namespaced key) * in the form namespace:key. The namespace and path can contain characters @@ -35,7 +37,7 @@ * {@code .} (dot). The key can also contain {@code /} (forward slash) * @apiNote Returns a {@link NamespacedKey} object */ -public class NamespacedKeyArgument extends SafeOverrideableArgument { +public class NamespacedKeyArgument extends SafeOverrideableArgument implements InitialParseExceptionArgument> { /** * Constructs a MinecraftKeyArgument with a given node name. @@ -63,4 +65,17 @@ public NamespacedKey parseArgument(NMS exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ObjectiveCriteriaArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ObjectiveCriteriaArgument.java index 1814f56a44..d6b47b38b0 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ObjectiveCriteriaArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ObjectiveCriteriaArgument.java @@ -26,10 +26,12 @@ import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; +import java.util.Optional; + /** * An argument that represents the name of an objective criteria */ -public class ObjectiveCriteriaArgument extends Argument { +public class ObjectiveCriteriaArgument extends Argument implements InitialParseExceptionArgument> { /** * An Objective criteria argument. Represents an objective criteria @@ -54,4 +56,17 @@ public String parseArgument(NMS CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getObjectiveCriteria(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/OfflinePlayerArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/OfflinePlayerArgument.java index c1c3cab716..aafbb75fcd 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/OfflinePlayerArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/OfflinePlayerArgument.java @@ -28,10 +28,12 @@ import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; +import java.util.Optional; + /** * An argument that represents the Bukkit Player object */ -public class OfflinePlayerArgument extends SafeOverrideableArgument { +public class OfflinePlayerArgument extends SafeOverrideableArgument implements InitialParseExceptionArgument> { /** * A Player argument. Produces a single player, regardless of whether @@ -58,4 +60,17 @@ public OfflinePlayer parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getOfflinePlayer(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ParticleArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ParticleArgument.java index cb5a77298e..9ededdd7eb 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ParticleArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ParticleArgument.java @@ -27,11 +27,13 @@ import dev.jorel.commandapi.nms.NMS; import dev.jorel.commandapi.wrappers.ParticleData; +import java.util.Optional; + /** * An argument that represents the Bukkit Particle object */ @SuppressWarnings("rawtypes") -public class ParticleArgument extends SafeOverrideableArgument> { +public class ParticleArgument extends SafeOverrideableArgument> implements InitialParseExceptionArgument> { /** * A Particle argument. Represents Minecraft particles @@ -56,4 +58,17 @@ public ParticleData parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getParticle(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/PotionEffectArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/PotionEffectArgument.java index 56b3738b99..ff2dfd0330 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/PotionEffectArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/PotionEffectArgument.java @@ -28,10 +28,12 @@ import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; +import java.util.Optional; + /** * An argument that represents the Bukkit PotionEffectType object */ -public class PotionEffectArgument extends SafeOverrideableArgument { +public class PotionEffectArgument extends SafeOverrideableArgument implements InitialParseExceptionArgument> { /** * A PotionEffect argument. Represents status/potion effects @@ -56,4 +58,17 @@ public PotionEffectType parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getPotionEffect(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/RecipeArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/RecipeArgument.java index 21c8aab58d..35f0102512 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/RecipeArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/RecipeArgument.java @@ -29,10 +29,12 @@ import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; +import java.util.Optional; + /** * An argument that represents the Bukkit Recipe object */ -public class RecipeArgument extends SafeOverrideableArgument implements ICustomProvidedArgument { +public class RecipeArgument extends SafeOverrideableArgument implements ICustomProvidedArgument, InitialParseExceptionArgument> { /** * A Recipe argument. Represents a Bukkit Recipe or ComplexRecipe @@ -62,5 +64,18 @@ public Recipe parseArgument(NMS CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getRecipe(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/RotationArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/RotationArgument.java index 5b70e082ab..5c58d45808 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/RotationArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/RotationArgument.java @@ -27,10 +27,12 @@ import dev.jorel.commandapi.nms.NMS; import dev.jorel.commandapi.wrappers.Rotation; +import java.util.Optional; + /** * An argument that represents rotation as pitch and yaw */ -public class RotationArgument extends SafeOverrideableArgument { +public class RotationArgument extends SafeOverrideableArgument implements InitialParseExceptionArgument> { /** * A Rotation argument. Represents pitch and yaw @@ -55,4 +57,17 @@ public Rotation parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getRotation(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ScoreHolderArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ScoreHolderArgument.java index 94757d378b..3c51a07698 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ScoreHolderArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ScoreHolderArgument.java @@ -21,6 +21,7 @@ package dev.jorel.commandapi.arguments; import java.util.Collection; +import java.util.Optional; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; @@ -31,7 +32,7 @@ /** * An argument that represents a scoreholder's name, or a collection of scoreholder names */ -public class ScoreHolderArgument extends Argument { +public class ScoreHolderArgument extends Argument implements InitialParseExceptionArgument> { private final boolean single; @@ -94,4 +95,17 @@ public static enum ScoreHolderType { */ MULTIPLE; } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ScoreboardSlotArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ScoreboardSlotArgument.java index ea0193b7fb..5be3c8cb8c 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ScoreboardSlotArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ScoreboardSlotArgument.java @@ -27,10 +27,12 @@ import dev.jorel.commandapi.nms.NMS; import dev.jorel.commandapi.wrappers.ScoreboardSlot; +import java.util.Optional; + /** * An argument that represents the Bukkit ScoreboardSlot object */ -public class ScoreboardSlotArgument extends SafeOverrideableArgument { +public class ScoreboardSlotArgument extends SafeOverrideableArgument implements InitialParseExceptionArgument>{ /** * A Display slot argument. Represents scoreboard slots @@ -55,4 +57,17 @@ public ScoreboardSlot parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getScoreboardSlot(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/SoundArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/SoundArgument.java index 0e40fcc29c..39334f9786 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/SoundArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/SoundArgument.java @@ -28,10 +28,12 @@ import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; +import java.util.Optional; + /** * An argument that represents the Bukkit Sound object */ -public class SoundArgument extends SafeOverrideableArgument implements ICustomProvidedArgument { +public class SoundArgument extends SafeOverrideableArgument implements ICustomProvidedArgument, InitialParseExceptionArgument> { /** * A Sound argument. Represents Bukkit's Sound object @@ -61,4 +63,17 @@ public Sound parseArgument(NMS CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getSound(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/StringArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/StringArgument.java index 4a8a96c321..4ac9eb72f7 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/StringArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/StringArgument.java @@ -31,7 +31,7 @@ /** * An argument that represents a simple String */ -public class StringArgument extends Argument implements InitialParseExceptionArgument> { +public class StringArgument extends Argument { /** * A string argument for one word @@ -56,17 +56,4 @@ public String parseArgument(NMS CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return cmdCtx.getArgument(key, getPrimitiveType()); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/TextArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/TextArgument.java index 75128c6e15..5af6bb7179 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/TextArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/TextArgument.java @@ -26,10 +26,12 @@ import dev.jorel.commandapi.nms.NMS; +import java.util.Optional; + /** * An argument that represents text, encased in quotes */ -public class TextArgument extends Argument { +public class TextArgument extends Argument implements InitialParseExceptionArgument> { /** * A string argument for one word, or multiple words encased in quotes @@ -54,4 +56,17 @@ public String parseArgument(NMS CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return cmdCtx.getArgument(key, getPrimitiveType()); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/TimeArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/TimeArgument.java index a3e1e8da54..e2cb59374a 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/TimeArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/TimeArgument.java @@ -27,10 +27,12 @@ import dev.jorel.commandapi.nms.NMS; import dev.jorel.commandapi.wrappers.Time; +import java.util.Optional; + /** * An argument that represents a duration of time in ticks */ -public class TimeArgument extends SafeOverrideableArgument { +public class TimeArgument extends SafeOverrideableArgument implements InitialParseExceptionArgument> { /** * A Time argument. Represents the number of in game ticks @@ -55,4 +57,17 @@ public Integer parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getTime(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/UUIDArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/UUIDArgument.java index 964538fa92..a87bbc41d3 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/UUIDArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/UUIDArgument.java @@ -20,6 +20,7 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; +import java.util.Optional; import java.util.UUID; import com.mojang.brigadier.context.CommandContext; @@ -31,7 +32,7 @@ /** * An argument that represents a UUID */ -public class UUIDArgument extends SafeOverrideableArgument { +public class UUIDArgument extends SafeOverrideableArgument implements InitialParseExceptionArgument> { /** * A UUID argument. Represents an in-game entity UUID @@ -56,4 +57,17 @@ public UUID parseArgument(NMS n CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getUUID(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/WorldArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/WorldArgument.java index 27c2d34f3c..13c1aed76c 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/WorldArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/WorldArgument.java @@ -20,6 +20,7 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; +import java.util.Optional; import java.util.function.Function; import org.bukkit.World; @@ -33,7 +34,7 @@ /** * An argument that represents the Bukkit World object */ -public class WorldArgument extends SafeOverrideableArgument { +public class WorldArgument extends SafeOverrideableArgument implements InitialParseExceptionArgument> { /** * A World argument. Represents Bukkit's World object @@ -63,4 +64,17 @@ public World parseArgument(NMS CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getDimension(cmdCtx, key); } + + private InitialParseExceptionHandler exceptionHandler; + + @Override + public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + + @Override + public Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable(exceptionHandler); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/nms/NMS.java b/commandapi-core/src/main/java/dev/jorel/commandapi/nms/NMS.java index 35bb3e6ae6..1224282b69 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/nms/NMS.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/nms/NMS.java @@ -401,5 +401,5 @@ default boolean canUseChatPreview() { return false; } - default void registerCustomArgumentType() { } + default void registerCustomArgumentType() {}; } diff --git a/commandapi-nms/commandapi-1.13/src/main/java/dev/jorel/commandapi/nms/NMS_1_13.java b/commandapi-nms/commandapi-1.13/src/main/java/dev/jorel/commandapi/nms/NMS_1_13.java index f6d0b0c631..fbe2d64ada 100644 --- a/commandapi-nms/commandapi-1.13/src/main/java/dev/jorel/commandapi/nms/NMS_1_13.java +++ b/commandapi-nms/commandapi-1.13/src/main/java/dev/jorel/commandapi/nms/NMS_1_13.java @@ -957,4 +957,8 @@ public Message generateMessageFromJson(String json) { return ChatSerializer.a(json); } + @Override + public void registerCustomArgumentType() { + + } } diff --git a/commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_1_R1.java b/commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_1_R1.java index 7b867fb14e..40187e143a 100644 --- a/commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_1_R1.java +++ b/commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_1_R1.java @@ -78,7 +78,6 @@ public void hookChatPreview(Plugin plugin, Player player) { @Override public void registerCustomArgumentType() { try { - System.out.println("Registering custom ArgumentType"); Field mapField = CommandAPIHandler.getInstance().getField(ArgumentTypeInfos.class, "a"); Map infoMap = (Map) mapField.get(null); diff --git a/commandapi-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index f500a59114..0af27a4c92 100644 --- a/commandapi-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -76,7 +76,7 @@ public void onEnable() { new CommandAPICommand("test") .withArguments( new MultiLiteralArgument("a", "b", "c"), - new StringArgument("string") + new TextArgument("string") .withInitialParseExceptionHandler(this::printInfo) .withArgumentParseExceptionHandler(this::printInfo), new IntegerArgument("int", 0, 10) @@ -97,11 +97,11 @@ public void onEnable() { private T printInfo(InitialParseExceptionContext context) throws WrapperCommandSyntaxException { CommandAPI.logNormal("Intercepted error with message: " + context.exception().getMessage()); - throw CommandAPI.failWithString("Haha! Custom Error has intercepted " + context.exception().getMessage()); + throw CommandAPI.failWithString("Haha! InitialParseExceptionHandler has intercepted " + context.exception().getMessage()); } private T printInfo(ArgumentParseExceptionContext context) throws WrapperCommandSyntaxException { CommandAPI.logNormal("Intercepted error with message: " + context.exception().getMessage()); - throw CommandAPI.failWithString("Haha! Custom Error has intercepted " + context.exception().getMessage()); + throw CommandAPI.failWithString("Haha! ArgumentParseExceptionHandler has intercepted " + context.exception().getMessage()); } } \ No newline at end of file From bd5fbf8ae93d561c17c7707bad5f4a2676118ee9 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sat, 26 Nov 2022 16:10:38 -0500 Subject: [PATCH 10/58] Reduce code duplication by storing InitialParseExceptionHandlers in a static map in InitialParseExceptionArgument --- .../arguments/AdvancementArgument.java | 19 +------------ .../arguments/AdventureChatArgument.java | 24 +++------------- .../AdventureChatComponentArgument.java | 16 ----------- .../commandapi/arguments/AngleArgument.java | 16 ----------- .../commandapi/arguments/AxisArgument.java | 22 ++------------- .../commandapi/arguments/BiomeArgument.java | 22 ++------------- .../arguments/BlockPredicateArgument.java | 22 ++------------- .../arguments/BlockStateArgument.java | 19 +------------ .../commandapi/arguments/BooleanArgument.java | 16 ----------- .../commandapi/arguments/ChatArgument.java | 23 +++------------ .../arguments/ChatColorArgument.java | 22 ++------------- .../arguments/ChatComponentArgument.java | 16 ----------- .../commandapi/arguments/DoubleArgument.java | 16 ----------- .../arguments/EnchantmentArgument.java | 19 +------------ .../arguments/EntitySelectorArgument.java | 28 ++++--------------- .../arguments/EntityTypeArgument.java | 19 +------------ .../arguments/EnvironmentArgument.java | 22 ++------------- .../commandapi/arguments/FloatArgument.java | 16 ----------- .../arguments/FloatRangeArgument.java | 16 ----------- .../arguments/FunctionArgument.java | 19 +------------ .../InitialParseExceptionArgument.java | 20 +++++++++++-- .../commandapi/arguments/IntegerArgument.java | 16 ----------- .../arguments/IntegerRangeArgument.java | 16 ----------- .../arguments/ItemStackArgument.java | 19 +------------ .../arguments/ItemStackPredicateArgument.java | 22 ++------------- .../arguments/ListTextArgument.java | 14 ---------- .../arguments/Location2DArgument.java | 19 +------------ .../arguments/LocationArgument.java | 19 +------------ .../commandapi/arguments/LongArgument.java | 17 ----------- .../arguments/LootTableArgument.java | 21 ++------------ .../arguments/MathOperationArgument.java | 16 ----------- .../arguments/NBTCompoundArgument.java | 16 ----------- .../arguments/NamespacedKeyArgument.java | 19 +------------ .../arguments/ObjectiveCriteriaArgument.java | 16 ----------- .../arguments/OfflinePlayerArgument.java | 19 +------------ .../arguments/ParticleArgument.java | 16 ----------- .../commandapi/arguments/PlayerArgument.java | 19 +------------ .../arguments/PotionEffectArgument.java | 19 +------------ .../commandapi/arguments/RecipeArgument.java | 22 ++------------- .../arguments/RotationArgument.java | 16 ----------- .../arguments/ScoreHolderArgument.java | 19 ++----------- .../arguments/ScoreboardSlotArgument.java | 16 ----------- .../commandapi/arguments/SoundArgument.java | 19 +------------ .../commandapi/arguments/TextArgument.java | 16 ----------- .../commandapi/arguments/TimeArgument.java | 16 ----------- .../commandapi/arguments/UUIDArgument.java | 19 ++----------- .../commandapi/arguments/WorldArgument.java | 22 ++------------- 47 files changed, 74 insertions(+), 806 deletions(-) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AdvancementArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AdvancementArgument.java index 0313539312..7b33ce8ac8 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AdvancementArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AdvancementArgument.java @@ -20,15 +20,11 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import org.bukkit.advancement.Advancement; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; - -import java.util.Optional; +import org.bukkit.advancement.Advancement; /** * An argument that represents the Bukkit Advancement object @@ -64,17 +60,4 @@ public Advancement parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getAdvancement(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AdventureChatArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AdventureChatArgument.java index fa6e66fbfb..cc5c52266f 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AdventureChatArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AdventureChatArgument.java @@ -20,20 +20,18 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import java.util.Optional; - -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.exceptions.PaperAdventureNotFoundException; import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException; import dev.jorel.commandapi.nms.NMS; import dev.jorel.commandapi.wrappers.PreviewableFunction; import net.kyori.adventure.text.Component; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.Optional; /** * An argument that represents chat with entity selectors @@ -112,18 +110,4 @@ public AdventureChatArgument usePreview(boolean usePreview) { this.usePreview = usePreview; return this; } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } - } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AdventureChatComponentArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AdventureChatComponentArgument.java index 62cb23f838..0ae004104b 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AdventureChatComponentArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AdventureChatComponentArgument.java @@ -22,14 +22,11 @@ import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.exceptions.PaperAdventureNotFoundException; import dev.jorel.commandapi.nms.NMS; import net.kyori.adventure.text.Component; -import java.util.Optional; - /** * An argument that represents raw JSON text * @apiNote Returns a {@link Component} object @@ -66,17 +63,4 @@ public Component parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getAdventureChatComponent(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AngleArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AngleArgument.java index 8477ea46ab..461d452ab7 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AngleArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AngleArgument.java @@ -22,12 +22,9 @@ import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; -import java.util.Optional; - /** * An argument that represents a yaw angle, measured in degrees with float * number. -180.0 for due north, -90.0 for due east, 0.0 for due south, 90.0 for @@ -64,17 +61,4 @@ public Float parseArgument(NMS throws CommandSyntaxException { return nms.getAngle(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AxisArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AxisArgument.java index 1027fe4dd8..b9783859d7 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AxisArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AxisArgument.java @@ -20,16 +20,13 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import java.util.EnumSet; -import java.util.Optional; - -import org.bukkit.Axis; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; +import org.bukkit.Axis; + +import java.util.EnumSet; /** * An argument that represents x, y and z axes as an EnumSet of Axis @@ -66,17 +63,4 @@ public EnumSet parseArgument(NMS exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BiomeArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BiomeArgument.java index c7d8282847..fac6b6445b 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BiomeArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BiomeArgument.java @@ -20,16 +20,13 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import java.util.Optional; -import java.util.function.Function; - -import org.bukkit.block.Biome; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; +import org.bukkit.block.Biome; + +import java.util.function.Function; /** * An argument that represents the Bukkit Biome object @@ -69,17 +66,4 @@ public Biome parseArgument(NMS throws CommandSyntaxException { return nms.getBiome(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BlockPredicateArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BlockPredicateArgument.java index 632e5762ba..96a4314fb1 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BlockPredicateArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BlockPredicateArgument.java @@ -20,16 +20,13 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import java.util.Optional; -import java.util.function.Predicate; - -import org.bukkit.block.Block; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; +import org.bukkit.block.Block; + +import java.util.function.Predicate; /** * An argument that represents a Predicate<Block> @@ -65,17 +62,4 @@ public Predicate parseArgument(NMS exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BlockStateArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BlockStateArgument.java index c3bc431b7e..c8b00ac86e 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BlockStateArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BlockStateArgument.java @@ -20,15 +20,11 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import org.bukkit.block.data.BlockData; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; - -import java.util.Optional; +import org.bukkit.block.data.BlockData; /** * An argument that represents the Bukkit BlockData object @@ -63,17 +59,4 @@ public BlockData parseArgument(NMS exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BooleanArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BooleanArgument.java index 9cf1cd149b..64cd0dba7e 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BooleanArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/BooleanArgument.java @@ -23,11 +23,8 @@ import com.mojang.brigadier.arguments.BoolArgumentType; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.nms.NMS; -import java.util.Optional; - /** * An argument that represents primitive Java booleans * @@ -60,17 +57,4 @@ public Boolean parseArgument(NMS exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ChatArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ChatArgument.java index cea2e19195..8418345903 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ChatArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ChatArgument.java @@ -20,20 +20,18 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import java.util.Optional; - -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.exceptions.SpigotNotFoundException; import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException; import dev.jorel.commandapi.nms.NMS; import dev.jorel.commandapi.wrappers.PreviewableFunction; import net.md_5.bungee.api.chat.BaseComponent; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.Optional; /** * An argument that represents chat with entity selectors @@ -113,17 +111,4 @@ public ChatArgument usePreview(boolean usePreview) { this.usePreview = usePreview; return this; } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ChatColorArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ChatColorArgument.java index f07aba804b..e5d6722597 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ChatColorArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ChatColorArgument.java @@ -20,16 +20,13 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import java.util.Optional; -import java.util.function.Function; - -import org.bukkit.ChatColor; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; +import org.bukkit.ChatColor; + +import java.util.function.Function; /** * An argument that represents the Bukkit ChatColor object @@ -63,17 +60,4 @@ public ChatColor parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getChatColor(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ChatComponentArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ChatComponentArgument.java index 6bdc0be700..dbcde91778 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ChatComponentArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ChatComponentArgument.java @@ -22,14 +22,11 @@ import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.exceptions.SpigotNotFoundException; import dev.jorel.commandapi.nms.NMS; import net.md_5.bungee.api.chat.BaseComponent; -import java.util.Optional; - /** * An argument that represents raw JSON text * @@ -71,17 +68,4 @@ public BaseComponent[] parseArgument(NMS exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/DoubleArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/DoubleArgument.java index 8b281c5d93..a4f4032dfc 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/DoubleArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/DoubleArgument.java @@ -23,12 +23,9 @@ import com.mojang.brigadier.arguments.DoubleArgumentType; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.exceptions.InvalidRangeException; import dev.jorel.commandapi.nms.NMS; -import java.util.Optional; - /** * An argument that represents primitive Java doubles * @@ -85,17 +82,4 @@ public Double parseArgument(NMS throws CommandSyntaxException { return cmdCtx.getArgument(key, getPrimitiveType()); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return null; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EnchantmentArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EnchantmentArgument.java index 650532cf2c..fc631a695d 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EnchantmentArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EnchantmentArgument.java @@ -20,15 +20,11 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import org.bukkit.enchantments.Enchantment; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; - -import java.util.Optional; +import org.bukkit.enchantments.Enchantment; /** * An argument that represents the Bukkit Enchantment object @@ -60,17 +56,4 @@ public Enchantment parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getEnchantment(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EntitySelectorArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EntitySelectorArgument.java index 9042cb9d0f..b9c522aef1 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EntitySelectorArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EntitySelectorArgument.java @@ -20,19 +20,16 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Optional; - -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; /** * An argument that represents a selection of entities @@ -126,17 +123,4 @@ public List getEntityNames(Object argument) { throw new IllegalStateException("Invalid selector " + selector.name()); }; } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } \ No newline at end of file diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EntityTypeArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EntityTypeArgument.java index c2bd74a85a..368aa1453f 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EntityTypeArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EntityTypeArgument.java @@ -20,15 +20,11 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import org.bukkit.entity.EntityType; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; - -import java.util.Optional; +import org.bukkit.entity.EntityType; /** * An argument that represents the Bukkit EntityType object @@ -63,17 +59,4 @@ public EntityType parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getEntityType(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EnvironmentArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EnvironmentArgument.java index fe4e9f3fef..8a15e08fac 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EnvironmentArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/EnvironmentArgument.java @@ -20,16 +20,13 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import java.util.Optional; -import java.util.function.Function; - -import org.bukkit.World.Environment; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; +import org.bukkit.World.Environment; + +import java.util.function.Function; /** * An argument that represents the Bukkit Environment object @@ -65,17 +62,4 @@ public Environment parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getEnvironment(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/FloatArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/FloatArgument.java index fc80d5e42a..613ffa1d31 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/FloatArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/FloatArgument.java @@ -23,12 +23,9 @@ import com.mojang.brigadier.arguments.FloatArgumentType; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.exceptions.InvalidRangeException; import dev.jorel.commandapi.nms.NMS; -import java.util.Optional; - /** * An argument that represents primitive Java floats */ @@ -79,17 +76,4 @@ public Float parseArgument(NMS CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return cmdCtx.getArgument(key, getPrimitiveType()); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/FloatRangeArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/FloatRangeArgument.java index 73d1615ac6..f0417dbc70 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/FloatRangeArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/FloatRangeArgument.java @@ -22,13 +22,10 @@ import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; import dev.jorel.commandapi.wrappers.FloatRange; -import java.util.Optional; - /** * An argument that represents a range of float values */ @@ -57,17 +54,4 @@ public FloatRange parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getFloatRange(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/FunctionArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/FunctionArgument.java index 7f969aaa90..b63a30ca46 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/FunctionArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/FunctionArgument.java @@ -20,16 +20,12 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import org.bukkit.NamespacedKey; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; import dev.jorel.commandapi.wrappers.FunctionWrapper; - -import java.util.Optional; +import org.bukkit.NamespacedKey; /** * An argument that represents Minecraft functions and tags @@ -66,17 +62,4 @@ public FunctionWrapper[] parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getFunction(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionArgument.java index 8ebc619173..51a424f74c 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionArgument.java @@ -2,6 +2,8 @@ import com.mojang.brigadier.arguments.ArgumentType; +import java.util.HashMap; +import java.util.Map; import java.util.Optional; /** @@ -11,6 +13,15 @@ * used by this Argument parses its raw input */ public interface InitialParseExceptionArgument> { + /** + * A map that links Arguments to their ExceptionHandlers. This is basically + * equivalent to putting one instance variable in this interface, but Java + * doesn't let you put instance variables in interfaces, so we have to do + * this instead if we want to provide default implementations of the methods, + * overall avoiding the code duplication that comes from implementing these + * methods in the inheriting classes. + */ + Map, InitialParseExceptionHandler> exceptionHandlers = new HashMap<>(); /** * Sets the {@link InitialParseExceptionHandler} this Argument should @@ -19,11 +30,16 @@ public interface InitialParseExceptionArgument> { * @param exceptionHandler The new {@link InitialParseExceptionHandler} this argument should use * @return this current argument */ - Impl withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler); + default Impl withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { + exceptionHandlers.put(this, exceptionHandler); + return (Impl) this; + } /** * Returns the {@link InitialParseExceptionHandler} this argument is using * @return The {@link InitialParseExceptionHandler} this argument is using */ - Optional> getInitialParseExceptionHandler(); + default Optional> getInitialParseExceptionHandler() { + return Optional.ofNullable((InitialParseExceptionHandler) exceptionHandlers.get(this)); + } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/IntegerArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/IntegerArgument.java index d4b1c3c88d..cf8debb4db 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/IntegerArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/IntegerArgument.java @@ -23,12 +23,9 @@ import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.exceptions.InvalidRangeException; import dev.jorel.commandapi.nms.NMS; -import java.util.Optional; - /** * An argument that represents primitive Java ints */ @@ -79,17 +76,4 @@ public Integer parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return cmdCtx.getArgument(key, getPrimitiveType()); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/IntegerRangeArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/IntegerRangeArgument.java index d23be58774..f6ec877132 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/IntegerRangeArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/IntegerRangeArgument.java @@ -22,13 +22,10 @@ import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; import dev.jorel.commandapi.wrappers.IntegerRange; -import java.util.Optional; - /** * An argument that represents a range of integer values */ @@ -57,17 +54,4 @@ public IntegerRange parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getIntRange(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ItemStackArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ItemStackArgument.java index 5cbab4981c..758cc76708 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ItemStackArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ItemStackArgument.java @@ -20,15 +20,11 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import org.bukkit.inventory.ItemStack; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; - -import java.util.Optional; +import org.bukkit.inventory.ItemStack; /** * An argument that represents the Bukkit ItemStack object @@ -58,17 +54,4 @@ public ItemStack parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getItemStack(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ItemStackPredicateArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ItemStackPredicateArgument.java index 439e51241c..2233de40ba 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ItemStackPredicateArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ItemStackPredicateArgument.java @@ -20,16 +20,13 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import java.util.Optional; -import java.util.function.Predicate; - -import org.bukkit.inventory.ItemStack; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; +import org.bukkit.inventory.ItemStack; + +import java.util.function.Predicate; /** * An argument that represents a Predicate<ItemStack> @@ -60,17 +57,4 @@ public Predicate parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getItemStackPredicate(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ListTextArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ListTextArgument.java index 3dabcd8796..18fcfb99b8 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ListTextArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ListTextArgument.java @@ -25,7 +25,6 @@ import java.util.Collection; import java.util.List; -import java.util.Optional; import java.util.function.Function; /** @@ -38,17 +37,4 @@ public class ListTextArgument extends ListArgumentCommon implements Initia ListTextArgument(String nodeName, String delimiter, boolean allowDuplicates, Function> supplier, Function suggestionsMapper) { super(nodeName, delimiter, allowDuplicates, supplier, suggestionsMapper, true); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Location2DArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Location2DArgument.java index 9ed50f04d2..1822b614f0 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Location2DArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Location2DArgument.java @@ -20,16 +20,12 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import org.bukkit.Location; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; import dev.jorel.commandapi.wrappers.Location2D; - -import java.util.Optional; +import org.bukkit.Location; /** * An argument that represents the Bukkit {@link Location} object in x and z directions @@ -83,17 +79,4 @@ public Location2D parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return isPrecise ? nms.getLocation2DPrecise(cmdCtx, key) : nms.getLocation2DBlock(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/LocationArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/LocationArgument.java index 25de30193c..6e08b7fc96 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/LocationArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/LocationArgument.java @@ -20,15 +20,11 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import org.bukkit.Location; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; - -import java.util.Optional; +import org.bukkit.Location; /** * An argument that represents the Bukkit {@link Location} object @@ -83,17 +79,4 @@ public Location parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return isPrecise ? nms.getLocationPrecise(cmdCtx, key) : nms.getLocationBlock(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/LongArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/LongArgument.java index 6a98a561e2..a684dc054a 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/LongArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/LongArgument.java @@ -23,12 +23,9 @@ import com.mojang.brigadier.arguments.LongArgumentType; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.exceptions.InvalidRangeException; import dev.jorel.commandapi.nms.NMS; -import java.util.Optional; - /** * An argument that represents primitive Java longs */ @@ -79,18 +76,4 @@ public Long parseArgument(NMS n CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return cmdCtx.getArgument(key, getPrimitiveType()); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } - } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/LootTableArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/LootTableArgument.java index 3d83b7d4d8..cb27b6d2c0 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/LootTableArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/LootTableArgument.java @@ -20,16 +20,12 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import org.bukkit.Keyed; -import org.bukkit.loot.LootTable; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; - -import java.util.Optional; +import org.bukkit.Keyed; +import org.bukkit.loot.LootTable; /** * An argument that represents the Bukkit LootTable object @@ -64,17 +60,4 @@ public LootTable parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getLootTable(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/MathOperationArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/MathOperationArgument.java index 93c12c38a2..2313e6a2c0 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/MathOperationArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/MathOperationArgument.java @@ -22,13 +22,10 @@ import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; import dev.jorel.commandapi.wrappers.MathOperation; -import java.util.Optional; - /** * An argument that represents Minecraft scoreboard math operations */ @@ -57,17 +54,4 @@ public MathOperation parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getMathOperation(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/NBTCompoundArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/NBTCompoundArgument.java index 0009bda0a2..3d3ce4276c 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/NBTCompoundArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/NBTCompoundArgument.java @@ -22,13 +22,10 @@ import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPI; import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; -import java.util.Optional; - /** * An argument that represents an NBTContainer from the NBT API */ @@ -66,17 +63,4 @@ public NBTContainer parseArgument(NMS exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/NamespacedKeyArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/NamespacedKeyArgument.java index 95f418dd8d..80a6989a56 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/NamespacedKeyArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/NamespacedKeyArgument.java @@ -20,15 +20,11 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import org.bukkit.NamespacedKey; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; - -import java.util.Optional; +import org.bukkit.NamespacedKey; /** * An argument that represents a Minecraft resource location (or namespaced key) @@ -65,17 +61,4 @@ public NamespacedKey parseArgument(NMS exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ObjectiveCriteriaArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ObjectiveCriteriaArgument.java index d6b47b38b0..09143f76ba 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ObjectiveCriteriaArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ObjectiveCriteriaArgument.java @@ -22,12 +22,9 @@ import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; -import java.util.Optional; - /** * An argument that represents the name of an objective criteria */ @@ -56,17 +53,4 @@ public String parseArgument(NMS CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getObjectiveCriteria(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/OfflinePlayerArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/OfflinePlayerArgument.java index aafbb75fcd..568dcdca39 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/OfflinePlayerArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/OfflinePlayerArgument.java @@ -20,15 +20,11 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import org.bukkit.OfflinePlayer; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; - -import java.util.Optional; +import org.bukkit.OfflinePlayer; /** * An argument that represents the Bukkit Player object @@ -60,17 +56,4 @@ public OfflinePlayer parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getOfflinePlayer(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ParticleArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ParticleArgument.java index 9ededdd7eb..a11cac2bb2 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ParticleArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ParticleArgument.java @@ -22,13 +22,10 @@ import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; import dev.jorel.commandapi.wrappers.ParticleData; -import java.util.Optional; - /** * An argument that represents the Bukkit Particle object */ @@ -58,17 +55,4 @@ public ParticleData parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getParticle(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/PlayerArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/PlayerArgument.java index 8f5aefc531..6fa5770303 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/PlayerArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/PlayerArgument.java @@ -20,15 +20,11 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import org.bukkit.entity.Player; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; - -import java.util.Optional; +import org.bukkit.entity.Player; /** * An argument that represents the Bukkit Player object @@ -60,17 +56,4 @@ public Player parseArgument(NMS CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getPlayer(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/PotionEffectArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/PotionEffectArgument.java index ff2dfd0330..49896acb77 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/PotionEffectArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/PotionEffectArgument.java @@ -20,15 +20,11 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import org.bukkit.potion.PotionEffectType; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; - -import java.util.Optional; +import org.bukkit.potion.PotionEffectType; /** * An argument that represents the Bukkit PotionEffectType object @@ -58,17 +54,4 @@ public PotionEffectType parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getPotionEffect(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/RecipeArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/RecipeArgument.java index 35f0102512..94e1e0d9bd 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/RecipeArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/RecipeArgument.java @@ -20,16 +20,12 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import org.bukkit.Keyed; -import org.bukkit.inventory.Recipe; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; - -import java.util.Optional; +import org.bukkit.Keyed; +import org.bukkit.inventory.Recipe; /** * An argument that represents the Bukkit Recipe object @@ -64,18 +60,4 @@ public Recipe parseArgument(NMS CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getRecipe(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } - } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/RotationArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/RotationArgument.java index 5c58d45808..30b9cac28a 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/RotationArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/RotationArgument.java @@ -22,13 +22,10 @@ import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; import dev.jorel.commandapi.wrappers.Rotation; -import java.util.Optional; - /** * An argument that represents rotation as pitch and yaw */ @@ -57,17 +54,4 @@ public Rotation parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getRotation(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ScoreHolderArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ScoreHolderArgument.java index 3c51a07698..07f54b4a24 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ScoreHolderArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ScoreHolderArgument.java @@ -20,15 +20,13 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import java.util.Collection; -import java.util.Optional; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; +import java.util.Collection; + /** * An argument that represents a scoreholder's name, or a collection of scoreholder names */ @@ -95,17 +93,4 @@ public static enum ScoreHolderType { */ MULTIPLE; } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ScoreboardSlotArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ScoreboardSlotArgument.java index 5be3c8cb8c..6567155aa8 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ScoreboardSlotArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ScoreboardSlotArgument.java @@ -22,13 +22,10 @@ import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; import dev.jorel.commandapi.wrappers.ScoreboardSlot; -import java.util.Optional; - /** * An argument that represents the Bukkit ScoreboardSlot object */ @@ -57,17 +54,4 @@ public ScoreboardSlot parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getScoreboardSlot(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/SoundArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/SoundArgument.java index 39334f9786..93b5817a45 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/SoundArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/SoundArgument.java @@ -20,15 +20,11 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import org.bukkit.Sound; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; - -import java.util.Optional; +import org.bukkit.Sound; /** * An argument that represents the Bukkit Sound object @@ -63,17 +59,4 @@ public Sound parseArgument(NMS CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getSound(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/TextArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/TextArgument.java index 5af6bb7179..a065d09ace 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/TextArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/TextArgument.java @@ -23,11 +23,8 @@ import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.nms.NMS; -import java.util.Optional; - /** * An argument that represents text, encased in quotes */ @@ -56,17 +53,4 @@ public String parseArgument(NMS CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return cmdCtx.getArgument(key, getPrimitiveType()); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/TimeArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/TimeArgument.java index e2cb59374a..0462671e40 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/TimeArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/TimeArgument.java @@ -22,13 +22,10 @@ import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; import dev.jorel.commandapi.wrappers.Time; -import java.util.Optional; - /** * An argument that represents a duration of time in ticks */ @@ -57,17 +54,4 @@ public Integer parseArgument(NMS cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getTime(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/UUIDArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/UUIDArgument.java index a87bbc41d3..1816c2deeb 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/UUIDArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/UUIDArgument.java @@ -20,15 +20,13 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import java.util.Optional; -import java.util.UUID; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; +import java.util.UUID; + /** * An argument that represents a UUID */ @@ -57,17 +55,4 @@ public UUID parseArgument(NMS n CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getUUID(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/WorldArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/WorldArgument.java index 13c1aed76c..9f7668c8d4 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/WorldArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/WorldArgument.java @@ -20,16 +20,13 @@ *******************************************************************************/ package dev.jorel.commandapi.arguments; -import java.util.Optional; -import java.util.function.Function; - -import org.bukkit.World; - import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.nms.NMS; +import org.bukkit.World; + +import java.util.function.Function; /** * An argument that represents the Bukkit World object @@ -64,17 +61,4 @@ public World parseArgument(NMS CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { return nms.getDimension(cmdCtx, key); } - - private InitialParseExceptionHandler exceptionHandler; - - @Override - public Argument withInitialParseExceptionHandler(InitialParseExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - return this; - } - - @Override - public Optional> getInitialParseExceptionHandler() { - return Optional.ofNullable(exceptionHandler); - } } From d5918950976be93d92e572d502954d52b40252a1 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sat, 26 Nov 2022 17:16:39 -0500 Subject: [PATCH 11/58] Implement NMS#registerCustomArgumentType --- .../java/dev/jorel/commandapi/nms/NMS.java | 4 +- commandapi-nms/commandapi-1.13.1/pom.xml | 6 -- ...tionHandlingArgumentSerializer_1_13_1.java | 82 +++++++++++++++++++ .../dev/jorel/commandapi/nms/NMS_1_13_1.java | 64 ++------------- ...eptionHandlingArgumentSerializer_1_13.java | 82 +++++++++++++++++++ .../dev/jorel/commandapi/nms/NMS_1_13.java | 58 +------------ ...eptionHandlingArgumentSerializer_1_14.java | 82 +++++++++++++++++++ .../dev/jorel/commandapi/nms/NMS_1_14.java | 7 ++ ...eptionHandlingArgumentSerializer_1_15.java | 82 +++++++++++++++++++ .../dev/jorel/commandapi/nms/NMS_1_15.java | 6 ++ ...ionHandlingArgumentSerializer_1_16_R1.java | 82 +++++++++++++++++++ .../dev/jorel/commandapi/nms/NMS_1_16_R1.java | 6 ++ ...ionHandlingArgumentSerializer_1_16_R2.java | 82 +++++++++++++++++++ .../dev/jorel/commandapi/nms/NMS_1_16_R2.java | 6 ++ ...nHandlingArgumentSerializer_1_16_4_R3.java | 82 +++++++++++++++++++ .../jorel/commandapi/nms/NMS_1_16_4_R3.java | 6 ++ .../jorel/commandapi/nms/NMS_1_19_1_R1.java | 42 +--------- ...ExceptionHandlingArgumentInfo_Common.java} | 8 +- .../dev/jorel/commandapi/nms/NMS_Common.java | 24 ++++++ .../dev/jorel/commandapi/test/MockNMS.java | 7 ++ 20 files changed, 655 insertions(+), 163 deletions(-) create mode 100644 commandapi-nms/commandapi-1.13.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13_1.java create mode 100644 commandapi-nms/commandapi-1.13/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13.java create mode 100644 commandapi-nms/commandapi-1.14/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_14.java create mode 100644 commandapi-nms/commandapi-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java create mode 100644 commandapi-nms/commandapi-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java create mode 100644 commandapi-nms/commandapi-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java create mode 100644 commandapi-nms/commandapi-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java rename commandapi-nms/{commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/CustomArgumentInfo.java => commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_Common.java} (89%) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/nms/NMS.java b/commandapi-core/src/main/java/dev/jorel/commandapi/nms/NMS.java index 1224282b69..2b45ecfdec 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/nms/NMS.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/nms/NMS.java @@ -386,6 +386,8 @@ String getScoreHolderSingle(CommandContext cmdCtx, Strin */ void resendPackets(Player player); + void registerCustomArgumentType(); + HelpTopic generateHelpTopic(String commandName, String shortDescription, String fullDescription, String permission); void addToHelpMap(Map helpTopicsToAdd); @@ -400,6 +402,4 @@ String getScoreHolderSingle(CommandContext cmdCtx, Strin default boolean canUseChatPreview() { return false; } - - default void registerCustomArgumentType() {}; } diff --git a/commandapi-nms/commandapi-1.13.1/pom.xml b/commandapi-nms/commandapi-1.13.1/pom.xml index 1659ff0407..9f384f20ee 100644 --- a/commandapi-nms/commandapi-1.13.1/pom.xml +++ b/commandapi-nms/commandapi-1.13.1/pom.xml @@ -66,11 +66,5 @@ ${project.version} compile - - dev.jorel - commandapi-1.13 - ${project.version} - compile - \ No newline at end of file diff --git a/commandapi-nms/commandapi-1.13.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13_1.java b/commandapi-nms/commandapi-1.13.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13_1.java new file mode 100644 index 0000000000..34b1f4fb9c --- /dev/null +++ b/commandapi-nms/commandapi-1.13.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13_1.java @@ -0,0 +1,82 @@ +package dev.jorel.commandapi.nms; + +import com.google.gson.JsonObject; +import com.mojang.brigadier.arguments.ArgumentType; +import dev.jorel.commandapi.CommandAPIHandler; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import net.minecraft.server.v1_13_R2.ArgumentRegistry; +import net.minecraft.server.v1_13_R2.ArgumentSerializer; +import net.minecraft.server.v1_13_R2.PacketDataSerializer; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.nio.charset.StandardCharsets; + +public class ExceptionHandlingArgumentSerializer_1_13_1 implements ArgumentSerializer> { + + private static Method getInfo = null; + + @Override + public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { + try { + // Remove this key from packet + if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + Object myInfo = getInfo.invoke(null, argument); + + Field keyField = CommandAPIHandler.getInstance().getField(myInfo.getClass(), "c"); + String myKey = keyField.get(myInfo).toString(); + byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); + // Removing length and size of string, assuming length is always written as 1 byte + packetDataSerializer.writerIndex(packetDataSerializer.writerIndex() - myKeyBytes.length - 1); + + // Add baseType key instead + ArgumentType baseType = argument.baseType(); + Object baseInfo = getInfo.invoke(null, baseType); + String baseKey = keyField.get(baseInfo).toString(); + packetDataSerializer.a(baseKey); + + // Serialize baseType + Field subSerializerField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "b"); + ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + subSerializer.a(baseType, packetDataSerializer); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + } + + @Override + public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { + // Since this class overrides its ArgumentRegistry key with the baseType's, + // this class's key should never show up in a packet and this method should never + // be called to deserialize the ArgumentType info that wasn't put into the packet + // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands + // either. If this method ever gets called, either you or I are doing something very wrong! + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_13_1#deserializeFromNetwork for more information"); + // Including a mini-stacktrace here in case this exception shows up + // on a client-disconnected screen, which is not very helpful + } + + @Override + public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { + try { + ArgumentType baseType = argument.baseType(); + + if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + Object baseInfo = getInfo.invoke(null, baseType); + + Field keyField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "c"); + properties.addProperty("baseType", keyField.get(baseInfo).toString()); + + Field subSerializerField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "b"); + ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + + JsonObject subProperties = new JsonObject(); + subSerializer.a(baseType, subProperties); + if (subProperties.size() > 0) { + properties.add("baseProperties", subProperties); + } + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + } +} diff --git a/commandapi-nms/commandapi-1.13.1/src/main/java/dev/jorel/commandapi/nms/NMS_1_13_1.java b/commandapi-nms/commandapi-1.13.1/src/main/java/dev/jorel/commandapi/nms/NMS_1_13_1.java index b02d0539ab..18d187adbf 100644 --- a/commandapi-nms/commandapi-1.13.1/src/main/java/dev/jorel/commandapi/nms/NMS_1_13_1.java +++ b/commandapi-nms/commandapi-1.13.1/src/main/java/dev/jorel/commandapi/nms/NMS_1_13_1.java @@ -16,6 +16,8 @@ import java.util.function.Predicate; import java.util.function.ToIntFunction; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import net.minecraft.server.v1_13_R2.*; import org.bukkit.Axis; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -93,66 +95,9 @@ import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.chat.ComponentSerializer; -import net.minecraft.server.v1_13_R2.Advancement; -import net.minecraft.server.v1_13_R2.ArgumentBlockPredicate; -import net.minecraft.server.v1_13_R2.ArgumentChat; -import net.minecraft.server.v1_13_R2.ArgumentChatComponent; -import net.minecraft.server.v1_13_R2.ArgumentChatFormat; -import net.minecraft.server.v1_13_R2.ArgumentCriterionValue; -import net.minecraft.server.v1_13_R2.ArgumentDimension; -import net.minecraft.server.v1_13_R2.ArgumentEnchantment; -import net.minecraft.server.v1_13_R2.ArgumentEntity; -import net.minecraft.server.v1_13_R2.ArgumentEntitySummon; -import net.minecraft.server.v1_13_R2.ArgumentItemPredicate; -import net.minecraft.server.v1_13_R2.ArgumentItemStack; -import net.minecraft.server.v1_13_R2.ArgumentMathOperation; -import net.minecraft.server.v1_13_R2.ArgumentMinecraftKeyRegistered; -import net.minecraft.server.v1_13_R2.ArgumentMobEffect; -import net.minecraft.server.v1_13_R2.ArgumentNBTTag; -import net.minecraft.server.v1_13_R2.ArgumentParticle; -import net.minecraft.server.v1_13_R2.ArgumentPosition; -import net.minecraft.server.v1_13_R2.ArgumentProfile; -import net.minecraft.server.v1_13_R2.ArgumentRotation; -import net.minecraft.server.v1_13_R2.ArgumentRotationAxis; -import net.minecraft.server.v1_13_R2.ArgumentScoreboardCriteria; -import net.minecraft.server.v1_13_R2.ArgumentScoreboardObjective; -import net.minecraft.server.v1_13_R2.ArgumentScoreboardSlot; -import net.minecraft.server.v1_13_R2.ArgumentScoreboardTeam; -import net.minecraft.server.v1_13_R2.ArgumentScoreholder; -import net.minecraft.server.v1_13_R2.ArgumentTag; -import net.minecraft.server.v1_13_R2.ArgumentTile; -import net.minecraft.server.v1_13_R2.ArgumentVec2; -import net.minecraft.server.v1_13_R2.ArgumentVec2I; -import net.minecraft.server.v1_13_R2.ArgumentVec3; -import net.minecraft.server.v1_13_R2.BlockPosition; -import net.minecraft.server.v1_13_R2.CommandListenerWrapper; -import net.minecraft.server.v1_13_R2.CompletionProviders; -import net.minecraft.server.v1_13_R2.CriterionConditionValue; import net.minecraft.server.v1_13_R2.CriterionConditionValue.c; -import net.minecraft.server.v1_13_R2.CustomFunction; -import net.minecraft.server.v1_13_R2.CustomFunctionData; -import net.minecraft.server.v1_13_R2.DedicatedServer; -import net.minecraft.server.v1_13_R2.DimensionManager; -import net.minecraft.server.v1_13_R2.Entity; -import net.minecraft.server.v1_13_R2.EntityPlayer; -import net.minecraft.server.v1_13_R2.EntitySelector; import net.minecraft.server.v1_13_R2.EnumDirection.EnumAxis; -import net.minecraft.server.v1_13_R2.IBlockData; import net.minecraft.server.v1_13_R2.IChatBaseComponent.ChatSerializer; -import net.minecraft.server.v1_13_R2.ICompletionProvider; -import net.minecraft.server.v1_13_R2.IRegistry; -import net.minecraft.server.v1_13_R2.ItemStack; -import net.minecraft.server.v1_13_R2.LootTable; -import net.minecraft.server.v1_13_R2.LootTableRegistry; -import net.minecraft.server.v1_13_R2.MinecraftKey; -import net.minecraft.server.v1_13_R2.MinecraftServer; -import net.minecraft.server.v1_13_R2.ParticleParam; -import net.minecraft.server.v1_13_R2.ParticleParamBlock; -import net.minecraft.server.v1_13_R2.ParticleParamItem; -import net.minecraft.server.v1_13_R2.ParticleParamRedstone; -import net.minecraft.server.v1_13_R2.ShapeDetectorBlock; -import net.minecraft.server.v1_13_R2.Vec2F; -import net.minecraft.server.v1_13_R2.Vec3D; abstract class NMSWrapper_1_13_1 implements NMS {} @@ -972,6 +917,11 @@ public void resendPackets(Player player) { MINECRAFT_SERVER.getCommandDispatcher().a(((CraftPlayer) player).getHandle()); } + @Override + public void registerCustomArgumentType() { + ArgumentRegistry.a(new MinecraftKey("commandapi:exception_handler"), ExceptionHandlingArgumentType.class, new ExceptionHandlingArgumentSerializer_1_13_1()); + } + @Override public Message generateMessageFromJson(String json) { return ChatSerializer.a(json); diff --git a/commandapi-nms/commandapi-1.13/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13.java b/commandapi-nms/commandapi-1.13/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13.java new file mode 100644 index 0000000000..9ea59f148a --- /dev/null +++ b/commandapi-nms/commandapi-1.13/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13.java @@ -0,0 +1,82 @@ +package dev.jorel.commandapi.nms; + +import com.google.gson.JsonObject; +import com.mojang.brigadier.arguments.ArgumentType; +import dev.jorel.commandapi.CommandAPIHandler; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import net.minecraft.server.v1_13_R1.ArgumentRegistry; +import net.minecraft.server.v1_13_R1.ArgumentSerializer; +import net.minecraft.server.v1_13_R1.PacketDataSerializer; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.nio.charset.StandardCharsets; + +public class ExceptionHandlingArgumentSerializer_1_13 implements ArgumentSerializer> { + + private static Method getInfo = null; + + @Override + public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { + try { + // Remove this key from packet + if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + Object myInfo = getInfo.invoke(null, argument); + + Field keyField = CommandAPIHandler.getInstance().getField(myInfo.getClass(), "c"); + String myKey = keyField.get(myInfo).toString(); + byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); + // Removing length and size of string, assuming length is always written as 1 byte + packetDataSerializer.writerIndex(packetDataSerializer.writerIndex() - myKeyBytes.length - 1); + + // Add baseType key instead + ArgumentType baseType = argument.baseType(); + Object baseInfo = getInfo.invoke(null, baseType); + String baseKey = keyField.get(baseInfo).toString(); + packetDataSerializer.a(baseKey); + + // Serialize baseType + Field subSerializerField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "b"); + ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + subSerializer.a(baseType, packetDataSerializer); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + } + + @Override + public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { + // Since this class overrides its ArgumentRegistry key with the baseType's, + // this class's key should never show up in a packet and this method should never + // be called to deserialize the ArgumentType info that wasn't put into the packet + // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands + // either. If this method ever gets called, either you or I are doing something very wrong! + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_13#b for more information"); + // Including a mini-stacktrace here in case this exception shows up + // on a client-disconnected screen, which is not very helpful + } + + @Override + public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { + try { + ArgumentType baseType = argument.baseType(); + + if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + Object baseInfo = getInfo.invoke(null, baseType); + + Field keyField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "c"); + properties.addProperty("baseType", keyField.get(baseInfo).toString()); + + Field subSerializerField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "b"); + ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + + JsonObject subProperties = new JsonObject(); + subSerializer.a(baseType, subProperties); + if (subProperties.size() > 0) { + properties.add("baseProperties", subProperties); + } + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + } +} diff --git a/commandapi-nms/commandapi-1.13/src/main/java/dev/jorel/commandapi/nms/NMS_1_13.java b/commandapi-nms/commandapi-1.13/src/main/java/dev/jorel/commandapi/nms/NMS_1_13.java index fbe2d64ada..cb01e19fbf 100644 --- a/commandapi-nms/commandapi-1.13/src/main/java/dev/jorel/commandapi/nms/NMS_1_13.java +++ b/commandapi-nms/commandapi-1.13/src/main/java/dev/jorel/commandapi/nms/NMS_1_13.java @@ -16,6 +16,8 @@ import java.util.function.Predicate; import java.util.function.ToIntFunction; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import net.minecraft.server.v1_13_R1.*; import org.bukkit.Axis; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -93,63 +95,9 @@ import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.chat.ComponentSerializer; -import net.minecraft.server.v1_13_R1.Advancement; -import net.minecraft.server.v1_13_R1.ArgumentBlockPredicate; -import net.minecraft.server.v1_13_R1.ArgumentChat; -import net.minecraft.server.v1_13_R1.ArgumentChatComponent; -import net.minecraft.server.v1_13_R1.ArgumentChatFormat; -import net.minecraft.server.v1_13_R1.ArgumentCriterionValue; -import net.minecraft.server.v1_13_R1.ArgumentEnchantment; -import net.minecraft.server.v1_13_R1.ArgumentEntity; -import net.minecraft.server.v1_13_R1.ArgumentEntitySummon; -import net.minecraft.server.v1_13_R1.ArgumentItemPredicate; -import net.minecraft.server.v1_13_R1.ArgumentItemStack; -import net.minecraft.server.v1_13_R1.ArgumentMathOperation; -import net.minecraft.server.v1_13_R1.ArgumentMinecraftKeyRegistered; -import net.minecraft.server.v1_13_R1.ArgumentMobEffect; -import net.minecraft.server.v1_13_R1.ArgumentNBTTag; -import net.minecraft.server.v1_13_R1.ArgumentParticle; -import net.minecraft.server.v1_13_R1.ArgumentPosition; -import net.minecraft.server.v1_13_R1.ArgumentProfile; -import net.minecraft.server.v1_13_R1.ArgumentRotation; -import net.minecraft.server.v1_13_R1.ArgumentRotationAxis; -import net.minecraft.server.v1_13_R1.ArgumentScoreboardCriteria; -import net.minecraft.server.v1_13_R1.ArgumentScoreboardObjective; -import net.minecraft.server.v1_13_R1.ArgumentScoreboardSlot; -import net.minecraft.server.v1_13_R1.ArgumentScoreboardTeam; -import net.minecraft.server.v1_13_R1.ArgumentScoreholder; -import net.minecraft.server.v1_13_R1.ArgumentTag; -import net.minecraft.server.v1_13_R1.ArgumentTile; -import net.minecraft.server.v1_13_R1.ArgumentVec2; -import net.minecraft.server.v1_13_R1.ArgumentVec3; -import net.minecraft.server.v1_13_R1.BlockPosition; -import net.minecraft.server.v1_13_R1.CommandListenerWrapper; -import net.minecraft.server.v1_13_R1.CompletionProviders; -import net.minecraft.server.v1_13_R1.CriterionConditionValue; import net.minecraft.server.v1_13_R1.CriterionConditionValue.c; -import net.minecraft.server.v1_13_R1.CustomFunction; -import net.minecraft.server.v1_13_R1.CustomFunctionData; -import net.minecraft.server.v1_13_R1.DedicatedServer; -import net.minecraft.server.v1_13_R1.Entity; -import net.minecraft.server.v1_13_R1.EntityPlayer; -import net.minecraft.server.v1_13_R1.EntitySelector; -import net.minecraft.server.v1_13_R1.EntityTypes; import net.minecraft.server.v1_13_R1.EnumDirection.EnumAxis; -import net.minecraft.server.v1_13_R1.IBlockData; import net.minecraft.server.v1_13_R1.IChatBaseComponent.ChatSerializer; -import net.minecraft.server.v1_13_R1.ICompletionProvider; -import net.minecraft.server.v1_13_R1.ItemStack; -import net.minecraft.server.v1_13_R1.LootTable; -import net.minecraft.server.v1_13_R1.LootTableRegistry; -import net.minecraft.server.v1_13_R1.MinecraftKey; -import net.minecraft.server.v1_13_R1.MinecraftServer; -import net.minecraft.server.v1_13_R1.ParticleParam; -import net.minecraft.server.v1_13_R1.ParticleParamBlock; -import net.minecraft.server.v1_13_R1.ParticleParamItem; -import net.minecraft.server.v1_13_R1.ParticleParamRedstone; -import net.minecraft.server.v1_13_R1.ShapeDetectorBlock; -import net.minecraft.server.v1_13_R1.Vec2F; -import net.minecraft.server.v1_13_R1.Vec3D; /** * NMS implementation for Minecraft 1.13 @@ -959,6 +907,6 @@ public Message generateMessageFromJson(String json) { @Override public void registerCustomArgumentType() { - + ArgumentRegistry.a(new MinecraftKey("commandapi:exception_handler"), ExceptionHandlingArgumentType.class, new ExceptionHandlingArgumentSerializer_1_13()); } } diff --git a/commandapi-nms/commandapi-1.14/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_14.java b/commandapi-nms/commandapi-1.14/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_14.java new file mode 100644 index 0000000000..4a2b278706 --- /dev/null +++ b/commandapi-nms/commandapi-1.14/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_14.java @@ -0,0 +1,82 @@ +package dev.jorel.commandapi.nms; + +import com.google.gson.JsonObject; +import com.mojang.brigadier.arguments.ArgumentType; +import dev.jorel.commandapi.CommandAPIHandler; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import net.minecraft.server.v1_14_R1.ArgumentRegistry; +import net.minecraft.server.v1_14_R1.ArgumentSerializer; +import net.minecraft.server.v1_14_R1.PacketDataSerializer; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.nio.charset.StandardCharsets; + +public class ExceptionHandlingArgumentSerializer_1_14 implements ArgumentSerializer> { + + private static Method getInfo = null; + + @Override + public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { + try { + // Remove this key from packet + if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + Object myInfo = getInfo.invoke(null, argument); + + Field keyField = CommandAPIHandler.getInstance().getField(myInfo.getClass(), "c"); + String myKey = keyField.get(myInfo).toString(); + byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); + // Removing length and size of string, assuming length is always written as 1 byte + packetDataSerializer.writerIndex(packetDataSerializer.writerIndex() - myKeyBytes.length - 1); + + // Add baseType key instead + ArgumentType baseType = argument.baseType(); + Object baseInfo = getInfo.invoke(null, baseType); + String baseKey = keyField.get(baseInfo).toString(); + packetDataSerializer.a(baseKey); + + // Serialize baseType + Field subSerializerField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "b"); + ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + subSerializer.a(baseType, packetDataSerializer); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + } + + @Override + public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { + // Since this class overrides its ArgumentRegistry key with the baseType's, + // this class's key should never show up in a packet and this method should never + // be called to deserialize the ArgumentType info that wasn't put into the packet + // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands + // either. If this method ever gets called, either you or I are doing something very wrong! + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_14#b for more information"); + // Including a mini-stacktrace here in case this exception shows up + // on a client-disconnected screen, which is not very helpful + } + + @Override + public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { + try { + ArgumentType baseType = argument.baseType(); + + if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + Object baseInfo = getInfo.invoke(null, baseType); + + Field keyField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "c"); + properties.addProperty("baseType", keyField.get(baseInfo).toString()); + + Field subSerializerField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "b"); + ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + + JsonObject subProperties = new JsonObject(); + subSerializer.a(baseType, subProperties); + if (subProperties.size() > 0) { + properties.add("baseProperties", subProperties); + } + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + } +} diff --git a/commandapi-nms/commandapi-1.14/src/main/java/dev/jorel/commandapi/nms/NMS_1_14.java b/commandapi-nms/commandapi-1.14/src/main/java/dev/jorel/commandapi/nms/NMS_1_14.java index 11327ce2f8..8007b139ef 100644 --- a/commandapi-nms/commandapi-1.14/src/main/java/dev/jorel/commandapi/nms/NMS_1_14.java +++ b/commandapi-nms/commandapi-1.14/src/main/java/dev/jorel/commandapi/nms/NMS_1_14.java @@ -18,6 +18,7 @@ import java.util.function.Predicate; import java.util.function.ToIntFunction; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; import org.bukkit.Axis; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -947,6 +948,12 @@ public void resendPackets(Player player) { MINECRAFT_SERVER.getCommandDispatcher().a(((CraftPlayer) player).getHandle()); } + @Override + @Differs(from = {"1.13", "1.13.1", "1.13.2"}, by = "String is now wrapped into MinecraftKey inside ArgumentRegistry#a") + public void registerCustomArgumentType() { + ArgumentRegistry.a("commandapi:exception_handler", ExceptionHandlingArgumentType.class, new ExceptionHandlingArgumentSerializer_1_14()); + } + @Override public Message generateMessageFromJson(String json) { return ChatSerializer.a(json); diff --git a/commandapi-nms/commandapi-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java b/commandapi-nms/commandapi-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java new file mode 100644 index 0000000000..2cc9c9571d --- /dev/null +++ b/commandapi-nms/commandapi-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java @@ -0,0 +1,82 @@ +package dev.jorel.commandapi.nms; + +import com.google.gson.JsonObject; +import com.mojang.brigadier.arguments.ArgumentType; +import dev.jorel.commandapi.CommandAPIHandler; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import net.minecraft.server.v1_15_R1.ArgumentRegistry; +import net.minecraft.server.v1_15_R1.ArgumentSerializer; +import net.minecraft.server.v1_15_R1.PacketDataSerializer; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.nio.charset.StandardCharsets; + +public class ExceptionHandlingArgumentSerializer_1_15 implements ArgumentSerializer> { + + private static Method getInfo = null; + + @Override + public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { + try { + // Remove this key from packet + if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + Object myInfo = getInfo.invoke(null, argument); + + Field keyField = CommandAPIHandler.getInstance().getField(myInfo.getClass(), "c"); + String myKey = keyField.get(myInfo).toString(); + byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); + // Removing length and size of string, assuming length is always written as 1 byte + packetDataSerializer.writerIndex(packetDataSerializer.writerIndex() - myKeyBytes.length - 1); + + // Add baseType key instead + ArgumentType baseType = argument.baseType(); + Object baseInfo = getInfo.invoke(null, baseType); + String baseKey = keyField.get(baseInfo).toString(); + packetDataSerializer.a(baseKey); + + // Serialize baseType + Field subSerializerField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "b"); + ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + subSerializer.a(baseType, packetDataSerializer); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + } + + @Override + public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { + // Since this class overrides its ArgumentRegistry key with the baseType's, + // this class's key should never show up in a packet and this method should never + // be called to deserialize the ArgumentType info that wasn't put into the packet + // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands + // either. If this method ever gets called, either you or I are doing something very wrong! + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_15#b for more information"); + // Including a mini-stacktrace here in case this exception shows up + // on a client-disconnected screen, which is not very helpful + } + + @Override + public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { + try { + ArgumentType baseType = argument.baseType(); + + if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + Object baseInfo = getInfo.invoke(null, baseType); + + Field keyField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "c"); + properties.addProperty("baseType", keyField.get(baseInfo).toString()); + + Field subSerializerField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "b"); + ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + + JsonObject subProperties = new JsonObject(); + subSerializer.a(baseType, subProperties); + if (subProperties.size() > 0) { + properties.add("baseProperties", subProperties); + } + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + } +} diff --git a/commandapi-nms/commandapi-1.15/src/main/java/dev/jorel/commandapi/nms/NMS_1_15.java b/commandapi-nms/commandapi-1.15/src/main/java/dev/jorel/commandapi/nms/NMS_1_15.java index 2e4eb1bf1c..0655d7f64e 100644 --- a/commandapi-nms/commandapi-1.15/src/main/java/dev/jorel/commandapi/nms/NMS_1_15.java +++ b/commandapi-nms/commandapi-1.15/src/main/java/dev/jorel/commandapi/nms/NMS_1_15.java @@ -18,6 +18,7 @@ import java.util.function.Predicate; import java.util.function.ToIntFunction; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; import org.bukkit.Axis; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -948,6 +949,11 @@ public void resendPackets(Player player) { MINECRAFT_SERVER.getCommandDispatcher().a(((CraftPlayer) player).getHandle()); } + @Override + public void registerCustomArgumentType() { + ArgumentRegistry.a("commandapi:exception_handler", ExceptionHandlingArgumentType.class, new ExceptionHandlingArgumentSerializer_1_15()); + } + @Override public Message generateMessageFromJson(String json) { return ChatSerializer.a(json); diff --git a/commandapi-nms/commandapi-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java b/commandapi-nms/commandapi-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java new file mode 100644 index 0000000000..b8a968a4bb --- /dev/null +++ b/commandapi-nms/commandapi-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java @@ -0,0 +1,82 @@ +package dev.jorel.commandapi.nms; + +import com.google.gson.JsonObject; +import com.mojang.brigadier.arguments.ArgumentType; +import dev.jorel.commandapi.CommandAPIHandler; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import net.minecraft.server.v1_16_R1.ArgumentRegistry; +import net.minecraft.server.v1_16_R1.ArgumentSerializer; +import net.minecraft.server.v1_16_R1.PacketDataSerializer; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.nio.charset.StandardCharsets; + +public class ExceptionHandlingArgumentSerializer_1_16_R1 implements ArgumentSerializer> { + + private static Method getInfo = null; + + @Override + public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { + try { + // Remove this key from packet + if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + Object myInfo = getInfo.invoke(null, argument); + + Field keyField = CommandAPIHandler.getInstance().getField(myInfo.getClass(), "c"); + String myKey = keyField.get(myInfo).toString(); + byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); + // Removing length and size of string, assuming length is always written as 1 byte + packetDataSerializer.writerIndex(packetDataSerializer.writerIndex() - myKeyBytes.length - 1); + + // Add baseType key instead + ArgumentType baseType = argument.baseType(); + Object baseInfo = getInfo.invoke(null, baseType); + String baseKey = keyField.get(baseInfo).toString(); + packetDataSerializer.a(baseKey); + + // Serialize baseType + Field subSerializerField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "b"); + ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + subSerializer.a(baseType, packetDataSerializer); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + } + + @Override + public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { + // Since this class overrides its ArgumentRegistry key with the baseType's, + // this class's key should never show up in a packet and this method should never + // be called to deserialize the ArgumentType info that wasn't put into the packet + // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands + // either. If this method ever gets called, either you or I are doing something very wrong! + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_16_R1#b for more information"); + // Including a mini-stacktrace here in case this exception shows up + // on a client-disconnected screen, which is not very helpful + } + + @Override + public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { + try { + ArgumentType baseType = argument.baseType(); + + if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + Object baseInfo = getInfo.invoke(null, baseType); + + Field keyField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "c"); + properties.addProperty("baseType", keyField.get(baseInfo).toString()); + + Field subSerializerField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "b"); + ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + + JsonObject subProperties = new JsonObject(); + subSerializer.a(baseType, subProperties); + if (subProperties.size() > 0) { + properties.add("baseProperties", subProperties); + } + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + } +} diff --git a/commandapi-nms/commandapi-1.16.1/src/main/java/dev/jorel/commandapi/nms/NMS_1_16_R1.java b/commandapi-nms/commandapi-1.16.1/src/main/java/dev/jorel/commandapi/nms/NMS_1_16_R1.java index 5aa009cdd3..567ae3cbe3 100644 --- a/commandapi-nms/commandapi-1.16.1/src/main/java/dev/jorel/commandapi/nms/NMS_1_16_R1.java +++ b/commandapi-nms/commandapi-1.16.1/src/main/java/dev/jorel/commandapi/nms/NMS_1_16_R1.java @@ -22,6 +22,7 @@ import java.util.function.Predicate; import java.util.function.ToIntFunction; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; import org.bukkit.Axis; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -1032,6 +1033,11 @@ public void resendPackets(Player player) { MINECRAFT_SERVER.getCommandDispatcher().a(((CraftPlayer) player).getHandle()); } + @Override + public void registerCustomArgumentType() { + ArgumentRegistry.a("commandapi:exception_handler", ExceptionHandlingArgumentType.class, new ExceptionHandlingArgumentSerializer_1_16_R1()); + } + @Override public Message generateMessageFromJson(String json) { return ChatSerializer.a(json); diff --git a/commandapi-nms/commandapi-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java b/commandapi-nms/commandapi-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java new file mode 100644 index 0000000000..6bab6fa80f --- /dev/null +++ b/commandapi-nms/commandapi-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java @@ -0,0 +1,82 @@ +package dev.jorel.commandapi.nms; + +import com.google.gson.JsonObject; +import com.mojang.brigadier.arguments.ArgumentType; +import dev.jorel.commandapi.CommandAPIHandler; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import net.minecraft.server.v1_16_R2.ArgumentRegistry; +import net.minecraft.server.v1_16_R2.ArgumentSerializer; +import net.minecraft.server.v1_16_R2.PacketDataSerializer; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.nio.charset.StandardCharsets; + +public class ExceptionHandlingArgumentSerializer_1_16_R2 implements ArgumentSerializer> { + + private static Method getInfo = null; + + @Override + public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { + try { + // Remove this key from packet + if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + Object myInfo = getInfo.invoke(null, argument); + + Field keyField = CommandAPIHandler.getInstance().getField(myInfo.getClass(), "c"); + String myKey = keyField.get(myInfo).toString(); + byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); + // Removing length and size of string, assuming length is always written as 1 byte + packetDataSerializer.writerIndex(packetDataSerializer.writerIndex() - myKeyBytes.length - 1); + + // Add baseType key instead + ArgumentType baseType = argument.baseType(); + Object baseInfo = getInfo.invoke(null, baseType); + String baseKey = keyField.get(baseInfo).toString(); + packetDataSerializer.a(baseKey); + + // Serialize baseType + Field subSerializerField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "b"); + ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + subSerializer.a(baseType, packetDataSerializer); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + } + + @Override + public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { + // Since this class overrides its ArgumentRegistry key with the baseType's, + // this class's key should never show up in a packet and this method should never + // be called to deserialize the ArgumentType info that wasn't put into the packet + // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands + // either. If this method ever gets called, either you or I are doing something very wrong! + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_15#deserializeFromNetwork for more information"); + // Including a mini-stacktrace here in case this exception shows up + // on a client-disconnected screen, which is not very helpful + } + + @Override + public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { + try { + ArgumentType baseType = argument.baseType(); + + if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + Object baseInfo = getInfo.invoke(null, baseType); + + Field keyField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "c"); + properties.addProperty("baseType", keyField.get(baseInfo).toString()); + + Field subSerializerField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "b"); + ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + + JsonObject subProperties = new JsonObject(); + subSerializer.a(baseType, subProperties); + if (subProperties.size() > 0) { + properties.add("baseProperties", subProperties); + } + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + } +} diff --git a/commandapi-nms/commandapi-1.16.2/src/main/java/dev/jorel/commandapi/nms/NMS_1_16_R2.java b/commandapi-nms/commandapi-1.16.2/src/main/java/dev/jorel/commandapi/nms/NMS_1_16_R2.java index 492f789040..44d61e9351 100644 --- a/commandapi-nms/commandapi-1.16.2/src/main/java/dev/jorel/commandapi/nms/NMS_1_16_R2.java +++ b/commandapi-nms/commandapi-1.16.2/src/main/java/dev/jorel/commandapi/nms/NMS_1_16_R2.java @@ -23,6 +23,7 @@ import java.util.function.ToIntFunction; import com.mojang.brigadier.Message; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; import org.bukkit.Axis; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -1019,6 +1020,11 @@ public void resendPackets(Player player) { MINECRAFT_SERVER.getCommandDispatcher().a(((CraftPlayer) player).getHandle()); } + @Override + public void registerCustomArgumentType() { + ArgumentRegistry.a("commandapi:exception_handler", ExceptionHandlingArgumentType.class, new ExceptionHandlingArgumentSerializer_1_16_R2()); + } + @Override public Message generateMessageFromJson(String json) { return ChatSerializer.a(json); diff --git a/commandapi-nms/commandapi-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java b/commandapi-nms/commandapi-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java new file mode 100644 index 0000000000..2e4c04e0ed --- /dev/null +++ b/commandapi-nms/commandapi-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java @@ -0,0 +1,82 @@ +package dev.jorel.commandapi.nms; + +import com.google.gson.JsonObject; +import com.mojang.brigadier.arguments.ArgumentType; +import dev.jorel.commandapi.CommandAPIHandler; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import net.minecraft.server.v1_16_R3.ArgumentRegistry; +import net.minecraft.server.v1_16_R3.ArgumentSerializer; +import net.minecraft.server.v1_16_R3.PacketDataSerializer; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.nio.charset.StandardCharsets; + +public class ExceptionHandlingArgumentSerializer_1_16_4_R3 implements ArgumentSerializer> { + + private static Method getInfo = null; + + @Override + public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { + try { + // Remove this key from packet + if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + Object myInfo = getInfo.invoke(null, argument); + + Field keyField = CommandAPIHandler.getInstance().getField(myInfo.getClass(), "c"); + String myKey = keyField.get(myInfo).toString(); + byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); + // Removing length and size of string, assuming length is always written as 1 byte + packetDataSerializer.writerIndex(packetDataSerializer.writerIndex() - myKeyBytes.length - 1); + + // Add baseType key instead + ArgumentType baseType = argument.baseType(); + Object baseInfo = getInfo.invoke(null, baseType); + String baseKey = keyField.get(baseInfo).toString(); + packetDataSerializer.a(baseKey); + + // Serialize baseType + Field subSerializerField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "b"); + ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + subSerializer.a(baseType, packetDataSerializer); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + } + + @Override + public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { + // Since this class overrides its ArgumentRegistry key with the baseType's, + // this class's key should never show up in a packet and this method should never + // be called to deserialize the ArgumentType info that wasn't put into the packet + // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands + // either. If this method ever gets called, either you or I are doing something very wrong! + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_15#deserializeFromNetwork for more information"); + // Including a mini-stacktrace here in case this exception shows up + // on a client-disconnected screen, which is not very helpful + } + + @Override + public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { + try { + ArgumentType baseType = argument.baseType(); + + if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + Object baseInfo = getInfo.invoke(null, baseType); + + Field keyField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "c"); + properties.addProperty("baseType", keyField.get(baseInfo).toString()); + + Field subSerializerField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "b"); + ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + + JsonObject subProperties = new JsonObject(); + subSerializer.a(baseType, subProperties); + if (subProperties.size() > 0) { + properties.add("baseProperties", subProperties); + } + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + } +} diff --git a/commandapi-nms/commandapi-1.16.4/src/main/java/dev/jorel/commandapi/nms/NMS_1_16_4_R3.java b/commandapi-nms/commandapi-1.16.4/src/main/java/dev/jorel/commandapi/nms/NMS_1_16_4_R3.java index a005f60170..44bf9a24bd 100644 --- a/commandapi-nms/commandapi-1.16.4/src/main/java/dev/jorel/commandapi/nms/NMS_1_16_4_R3.java +++ b/commandapi-nms/commandapi-1.16.4/src/main/java/dev/jorel/commandapi/nms/NMS_1_16_4_R3.java @@ -43,6 +43,7 @@ import java.util.function.ToIntFunction; import com.mojang.brigadier.Message; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; import org.bukkit.Axis; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -1032,6 +1033,11 @@ public void resendPackets(Player player) { MINECRAFT_SERVER.getCommandDispatcher().a(((CraftPlayer) player).getHandle()); } + @Override + public void registerCustomArgumentType() { + ArgumentRegistry.a("commandapi:exception_handler", ExceptionHandlingArgumentType.class, new ExceptionHandlingArgumentSerializer_1_16_4_R3()); + } + @Override public Message generateMessageFromJson(String json) { return ChatSerializer.a(json); diff --git a/commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_1_R1.java b/commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_1_R1.java index 40187e143a..7616905336 100644 --- a/commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_1_R1.java +++ b/commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_1_R1.java @@ -20,26 +20,8 @@ *******************************************************************************/ package dev.jorel.commandapi.nms; -import com.google.gson.JsonObject; -import com.mojang.brigadier.arguments.ArgumentType; -import dev.jorel.commandapi.CommandAPI; -import dev.jorel.commandapi.CommandAPIHandler; -import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; -import net.minecraft.commands.CommandBuildContext; -import net.minecraft.commands.synchronization.ArgumentTypeInfo; -import net.minecraft.commands.synchronization.ArgumentTypeInfos; -import net.minecraft.commands.synchronization.SingletonArgumentInfo; -import net.minecraft.core.MappedRegistry; -import net.minecraft.core.Registry; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceKey; -import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - import com.mojang.brigadier.CommandDispatcher; import com.mojang.datafixers.util.Either; - import dev.jorel.commandapi.preprocessor.Differs; import dev.jorel.commandapi.preprocessor.NMSMeta; import dev.jorel.commandapi.preprocessor.RequireField; @@ -47,9 +29,9 @@ import net.minecraft.commands.arguments.selector.EntitySelector; import net.minecraft.server.ServerFunctionLibrary; import net.minecraft.world.level.gameevent.EntityPositionSource; - -import java.lang.reflect.Field; -import java.util.Map; +import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; // Mojang-Mapped reflection /** @@ -74,22 +56,4 @@ public void hookChatPreview(Plugin plugin, Player player) { playerChannel.pipeline().addBefore("packet_handler", "CommandAPI_" + player.getName(), new NMS_1_19_1_R1_ChatPreviewHandler(this, plugin, player)); } } - - @Override - public void registerCustomArgumentType() { - try { - Field mapField = CommandAPIHandler.getInstance().getField(ArgumentTypeInfos.class, "a"); - Map infoMap = (Map) mapField.get(null); - - CustomArgumentInfo info = new CustomArgumentInfo(); - infoMap.put(ExceptionHandlingArgumentType.class, info); - - Field isFrozen = CommandAPIHandler.getInstance().getField(MappedRegistry.class, "ca"); - isFrozen.set(Registry.COMMAND_ARGUMENT_TYPE, false); - - Registry.>register(Registry.COMMAND_ARGUMENT_TYPE, "commandapi:argument", info); - } catch (ReflectiveOperationException e) { - e.printStackTrace(); - } - } } diff --git a/commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/CustomArgumentInfo.java b/commandapi-nms/commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_Common.java similarity index 89% rename from commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/CustomArgumentInfo.java rename to commandapi-nms/commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_Common.java index 7fa83be29a..d82ef186b4 100644 --- a/commandapi-nms/commandapi-1.19.1/src/main/java/dev/jorel/commandapi/nms/CustomArgumentInfo.java +++ b/commandapi-nms/commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_Common.java @@ -9,7 +9,7 @@ import net.minecraft.core.Registry; import net.minecraft.network.FriendlyByteBuf; -public class CustomArgumentInfo implements ArgumentTypeInfo, CustomArgumentInfo.Template> { +public class ExceptionHandlingArgumentInfo_Common implements ArgumentTypeInfo, ExceptionHandlingArgumentInfo_Common.Template> { @Override public void serializeToNetwork(Template template, FriendlyByteBuf friendlyByteBuf) { ArgumentType baseType = template.baseType; @@ -34,7 +34,7 @@ public Template deserializeFromNetwork(FriendlyByteBuf friendlyByteBuf) { // be called to deserialize the ArgumentType info that wasn't put into the packet // anyway. Also, the server shouldn't ever deserialize a *ClientBound*CommandPacket // either. If this method ever gets called, either you or I are doing something very wrong! - throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.CustomArgumentInfo#deserializeFromNetwork for more information"); + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentInfo_Common#deserializeFromNetwork for more information"); // Including a mini-stacktrace here in case this exception shows up // on a client-disconnected screen, which is not very helpful } @@ -70,14 +70,14 @@ public ExceptionHandlingArgumentType instantiate(CommandBuildContext commandB // Same as CustomArgumentInfo#deserializeFromNetwork. An // ExceptionHandlingArgumentType should never be built // from a packet, so this method shouldn't be used - throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.CustomArgumentInfo.Template#instantiate for more information"); + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentInfo_Common.Template#instantiate for more information"); // Including a mini-stacktrace here in case this exception shows up // on a client-disconnected screen, which is not very helpful } @Override public ArgumentTypeInfo, ?> type() { - return CustomArgumentInfo.this; + return ExceptionHandlingArgumentInfo_Common.this; } } } diff --git a/commandapi-nms/commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/NMS_Common.java b/commandapi-nms/commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/NMS_Common.java index f4cac1b0fa..ed131a8182 100644 --- a/commandapi-nms/commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/NMS_Common.java +++ b/commandapi-nms/commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/NMS_Common.java @@ -27,6 +27,7 @@ import java.io.File; import java.io.IOException; +import java.lang.reflect.Field; import java.util.Collection; import java.util.EnumSet; import java.util.HashSet; @@ -38,6 +39,10 @@ import java.util.function.Predicate; import java.util.function.ToIntFunction; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import net.minecraft.commands.synchronization.ArgumentTypeInfo; +import net.minecraft.commands.synchronization.ArgumentTypeInfos; +import net.minecraft.core.MappedRegistry; import org.bukkit.Axis; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -721,4 +726,23 @@ public final UUID getUUID(CommandContext cmdCtx, String key) @Override @Unimplemented(because = REQUIRES_CRAFTBUKKIT, classNamed = "CraftPlayer") public abstract void resendPackets(Player player); + + @Override + @Differs(from = {"1.14, 1.15, 1.16"}, by = "Using ArgumentTypeInfos and Registry.COMMAND_ARGUMENT_TYPE instead of ArgumentRegistry") + public void registerCustomArgumentType() { + try { + Field mapField = CommandAPIHandler.getInstance().getField(ArgumentTypeInfos.class, "a"); + Map infoMap = (Map) mapField.get(null); + + ExceptionHandlingArgumentInfo_Common info = new ExceptionHandlingArgumentInfo_Common(); + infoMap.put(ExceptionHandlingArgumentType.class, info); + + Field isFrozen = CommandAPIHandler.getInstance().getField(MappedRegistry.class, "ca"); + isFrozen.set(Registry.COMMAND_ARGUMENT_TYPE, false); + + Registry.>register(Registry.COMMAND_ARGUMENT_TYPE, "commandapi:exception_handler", info); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + } } diff --git a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/MockNMS.java b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/MockNMS.java index 8eb9684efe..d96cbb9a6a 100644 --- a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/MockNMS.java +++ b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/MockNMS.java @@ -16,6 +16,8 @@ import java.util.function.Supplier; import be.seeseemelk.mockbukkit.ServerMock; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import dev.jorel.commandapi.nms.ExceptionHandlingArgumentInfo_Common; import org.bukkit.*; import org.bukkit.command.CommandSender; import org.bukkit.command.SimpleCommandMap; @@ -423,6 +425,7 @@ private void initializeArgumentsInArgumentTypeInfos() throws ReflectiveOperation map.put(TemplateMirrorArgument.class, SingletonArgumentInfo.a(TemplateMirrorArgument::a)); map.put(TemplateRotationArgument.class, SingletonArgumentInfo.a(TemplateRotationArgument::a)); map.put(ArgumentUUID.class, SingletonArgumentInfo.a(ArgumentUUID::a)); + map.put(ExceptionHandlingArgumentType.class, new ExceptionHandlingArgumentInfo_Common()); } @Override @@ -436,4 +439,8 @@ public void resendPackets(Player player) { return; } + @Override + public void registerCustomArgumentType() { + // Already done by initializeArgumentsInArgumentTypeInfos + } } From c2de33ab528fbab8b02da86d43c1c380361635b9 Mon Sep 17 00:00:00 2001 From: BuildTools <46540330+willkroboth@users.noreply.github.com> Date: Sun, 27 Nov 2022 08:21:12 -0500 Subject: [PATCH 12/58] Clean up code --- .../java/dev/jorel/commandapi/CommandAPI.java | 1 - .../jorel/commandapi/CommandAPIHandler.java | 5 +++ .../commandapi/arguments/CustomArgument.java | 5 ++- .../commandapi/arguments/StringArgument.java | 3 -- .../dev/jorel/commandapi/CommandAPIMain.java | 37 +------------------ 5 files changed, 10 insertions(+), 41 deletions(-) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPI.java b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPI.java index acffe65a25..9280b852fc 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPI.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPI.java @@ -208,7 +208,6 @@ public static void onEnable(Plugin plugin) { // For some reason, any other priority doesn't work @EventHandler(priority = EventPriority.MONITOR) public void onPlayerJoin(PlayerJoinEvent e) { - logInfo("Sending commands to: " + e.getPlayer().getName()); CommandAPIHandler.getInstance().getNMS().resendPackets(e.getPlayer()); } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIHandler.java b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIHandler.java index a9e0502760..51a5b06d9f 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIHandler.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIHandler.java @@ -905,6 +905,11 @@ LiteralArgumentBuilder getLiteralArgumentBuilderArgument(Str } ArgumentType wrapArgumentType(Argument argument, ArgumentType rawType) { + if (argument instanceof CustomArgument ca) { + argument = ca.getBaseArgument(); + // CustomArgument sets its raw type to baseArgument's raw type, so that is already correct + } + if (!(argument instanceof InitialParseExceptionArgument)) return rawType; InitialParseExceptionArgument iPEA = (InitialParseExceptionArgument) argument; diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/CustomArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/CustomArgument.java index 24c9c4c27a..ebb797fb6a 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/CustomArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/CustomArgument.java @@ -41,7 +41,6 @@ * {@link IntegerArgument} * @apiNote Returns a {@link T} object */ -// TODO: Can this be an InitialParseExceptionArgument? public class CustomArgument extends Argument { private final CustomArgumentInfoParser infoParser; @@ -129,6 +128,10 @@ public CommandAPIArgumentType getArgumentType() { return CommandAPIArgumentType.CUSTOM; } + public Argument getBaseArgument() { + return base; + } + @Override public T parseArgument(NMS nms, CommandContext cmdCtx, String key, Object[] previousArgs) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/StringArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/StringArgument.java index 4ac9eb72f7..63eba70f8e 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/StringArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/StringArgument.java @@ -23,11 +23,8 @@ import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.nms.NMS; -import java.util.Optional; - /** * An argument that represents a simple String */ diff --git a/commandapi-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index 0af27a4c92..56dfed07ef 100644 --- a/commandapi-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -23,8 +23,6 @@ import java.io.File; import java.util.Map.Entry; -import dev.jorel.commandapi.arguments.*; -import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException; import org.bukkit.plugin.java.JavaPlugin; import de.tr7zw.changeme.nbtapi.NBTContainer; @@ -65,43 +63,10 @@ public void onLoad() { for (String commandName : CommandAPI.config.getCommandsToConvert()) { new AdvancedConverter(commandName).convertCommand(); } - - new CommandAPICommand("veryearly").withArguments(new LiteralArgument("Hello")).executes((sender, args) -> {sender.sendMessage("Did I register?");}).register(); } @Override public void onEnable() { CommandAPI.onEnable(this); - - new CommandAPICommand("test") - .withArguments( - new MultiLiteralArgument("a", "b", "c"), - new TextArgument("string") - .withInitialParseExceptionHandler(this::printInfo) - .withArgumentParseExceptionHandler(this::printInfo), - new IntegerArgument("int", 0, 10) - .withInitialParseExceptionHandler(this::printInfo) - .withArgumentParseExceptionHandler(this::printInfo), - new PlayerArgument("player") - .withInitialParseExceptionHandler(this::printInfo) - .withArgumentParseExceptionHandler(this::printInfo) - ) - .executes((sender, args) -> { - sender.sendMessage(args[0].toString()); - sender.sendMessage(args[1].toString()); - sender.sendMessage(args[2].toString()); - sender.sendMessage(args[3].toString()); - }) - .register(); - } - - private T printInfo(InitialParseExceptionContext context) throws WrapperCommandSyntaxException { - CommandAPI.logNormal("Intercepted error with message: " + context.exception().getMessage()); - throw CommandAPI.failWithString("Haha! InitialParseExceptionHandler has intercepted " + context.exception().getMessage()); - } - - private T printInfo(ArgumentParseExceptionContext context) throws WrapperCommandSyntaxException { - CommandAPI.logNormal("Intercepted error with message: " + context.exception().getMessage()); - throw CommandAPI.failWithString("Haha! ArgumentParseExceptionHandler has intercepted " + context.exception().getMessage()); } -} \ No newline at end of file +} From cfc1be4e31d938f3bb52c44dc41f4f32cbdeb339 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 27 Nov 2022 11:42:06 -0500 Subject: [PATCH 13/58] Make CodeFactor happier (and me a little) by reordering methods in the ExceptionHandlingArgumentType serializer --- ...tionHandlingArgumentSerializer_1_13_1.java | 24 ++++++------- ...eptionHandlingArgumentSerializer_1_13.java | 24 ++++++------- ...eptionHandlingArgumentSerializer_1_14.java | 24 ++++++------- ...eptionHandlingArgumentSerializer_1_15.java | 24 ++++++------- ...ionHandlingArgumentSerializer_1_16_R1.java | 24 ++++++------- ...ionHandlingArgumentSerializer_1_16_R2.java | 24 ++++++------- ...nHandlingArgumentSerializer_1_16_4_R3.java | 24 ++++++------- .../ExceptionHandlingArgumentInfo_Common.java | 34 +++++++++---------- 8 files changed, 101 insertions(+), 101 deletions(-) diff --git a/commandapi-nms/commandapi-1.13.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13_1.java b/commandapi-nms/commandapi-1.13.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13_1.java index 34b1f4fb9c..d72c4935da 100644 --- a/commandapi-nms/commandapi-1.13.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13_1.java +++ b/commandapi-nms/commandapi-1.13.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13_1.java @@ -44,18 +44,6 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa } } - @Override - public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { - // Since this class overrides its ArgumentRegistry key with the baseType's, - // this class's key should never show up in a packet and this method should never - // be called to deserialize the ArgumentType info that wasn't put into the packet - // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands - // either. If this method ever gets called, either you or I are doing something very wrong! - throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_13_1#deserializeFromNetwork for more information"); - // Including a mini-stacktrace here in case this exception shows up - // on a client-disconnected screen, which is not very helpful - } - @Override public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { try { @@ -79,4 +67,16 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) e.printStackTrace(); } } + + @Override + public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { + // Since this class overrides its ArgumentRegistry key with the baseType's, + // this class's key should never show up in a packet and this method should never + // be called to deserialize the ArgumentType info that wasn't put into the packet + // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands + // either. If this method ever gets called, either you or I are doing something very wrong! + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_13_1#b for more information"); + // Including a mini-stacktrace here in case this exception shows up + // on a client-disconnected screen, which is not very helpful + } } diff --git a/commandapi-nms/commandapi-1.13/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13.java b/commandapi-nms/commandapi-1.13/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13.java index 9ea59f148a..c60e8e24e5 100644 --- a/commandapi-nms/commandapi-1.13/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13.java +++ b/commandapi-nms/commandapi-1.13/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13.java @@ -44,18 +44,6 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa } } - @Override - public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { - // Since this class overrides its ArgumentRegistry key with the baseType's, - // this class's key should never show up in a packet and this method should never - // be called to deserialize the ArgumentType info that wasn't put into the packet - // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands - // either. If this method ever gets called, either you or I are doing something very wrong! - throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_13#b for more information"); - // Including a mini-stacktrace here in case this exception shows up - // on a client-disconnected screen, which is not very helpful - } - @Override public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { try { @@ -79,4 +67,16 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) e.printStackTrace(); } } + + @Override + public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { + // Since this class overrides its ArgumentRegistry key with the baseType's, + // this class's key should never show up in a packet and this method should never + // be called to deserialize the ArgumentType info that wasn't put into the packet + // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands + // either. If this method ever gets called, either you or I are doing something very wrong! + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_13#b for more information"); + // Including a mini-stacktrace here in case this exception shows up + // on a client-disconnected screen, which is not very helpful + } } diff --git a/commandapi-nms/commandapi-1.14/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_14.java b/commandapi-nms/commandapi-1.14/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_14.java index 4a2b278706..76ff244f28 100644 --- a/commandapi-nms/commandapi-1.14/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_14.java +++ b/commandapi-nms/commandapi-1.14/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_14.java @@ -44,18 +44,6 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa } } - @Override - public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { - // Since this class overrides its ArgumentRegistry key with the baseType's, - // this class's key should never show up in a packet and this method should never - // be called to deserialize the ArgumentType info that wasn't put into the packet - // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands - // either. If this method ever gets called, either you or I are doing something very wrong! - throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_14#b for more information"); - // Including a mini-stacktrace here in case this exception shows up - // on a client-disconnected screen, which is not very helpful - } - @Override public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { try { @@ -79,4 +67,16 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) e.printStackTrace(); } } + + @Override + public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { + // Since this class overrides its ArgumentRegistry key with the baseType's, + // this class's key should never show up in a packet and this method should never + // be called to deserialize the ArgumentType info that wasn't put into the packet + // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands + // either. If this method ever gets called, either you or I are doing something very wrong! + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_14#b for more information"); + // Including a mini-stacktrace here in case this exception shows up + // on a client-disconnected screen, which is not very helpful + } } diff --git a/commandapi-nms/commandapi-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java b/commandapi-nms/commandapi-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java index 2cc9c9571d..b34e5eccbb 100644 --- a/commandapi-nms/commandapi-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java +++ b/commandapi-nms/commandapi-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java @@ -44,18 +44,6 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa } } - @Override - public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { - // Since this class overrides its ArgumentRegistry key with the baseType's, - // this class's key should never show up in a packet and this method should never - // be called to deserialize the ArgumentType info that wasn't put into the packet - // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands - // either. If this method ever gets called, either you or I are doing something very wrong! - throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_15#b for more information"); - // Including a mini-stacktrace here in case this exception shows up - // on a client-disconnected screen, which is not very helpful - } - @Override public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { try { @@ -79,4 +67,16 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) e.printStackTrace(); } } + + @Override + public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { + // Since this class overrides its ArgumentRegistry key with the baseType's, + // this class's key should never show up in a packet and this method should never + // be called to deserialize the ArgumentType info that wasn't put into the packet + // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands + // either. If this method ever gets called, either you or I are doing something very wrong! + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_15#b for more information"); + // Including a mini-stacktrace here in case this exception shows up + // on a client-disconnected screen, which is not very helpful + } } diff --git a/commandapi-nms/commandapi-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java b/commandapi-nms/commandapi-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java index b8a968a4bb..93540319c8 100644 --- a/commandapi-nms/commandapi-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java +++ b/commandapi-nms/commandapi-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java @@ -44,18 +44,6 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa } } - @Override - public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { - // Since this class overrides its ArgumentRegistry key with the baseType's, - // this class's key should never show up in a packet and this method should never - // be called to deserialize the ArgumentType info that wasn't put into the packet - // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands - // either. If this method ever gets called, either you or I are doing something very wrong! - throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_16_R1#b for more information"); - // Including a mini-stacktrace here in case this exception shows up - // on a client-disconnected screen, which is not very helpful - } - @Override public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { try { @@ -79,4 +67,16 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) e.printStackTrace(); } } + + @Override + public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { + // Since this class overrides its ArgumentRegistry key with the baseType's, + // this class's key should never show up in a packet and this method should never + // be called to deserialize the ArgumentType info that wasn't put into the packet + // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands + // either. If this method ever gets called, either you or I are doing something very wrong! + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_16_R1#b for more information"); + // Including a mini-stacktrace here in case this exception shows up + // on a client-disconnected screen, which is not very helpful + } } diff --git a/commandapi-nms/commandapi-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java b/commandapi-nms/commandapi-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java index 6bab6fa80f..0fc5960af0 100644 --- a/commandapi-nms/commandapi-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java +++ b/commandapi-nms/commandapi-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java @@ -44,18 +44,6 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa } } - @Override - public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { - // Since this class overrides its ArgumentRegistry key with the baseType's, - // this class's key should never show up in a packet and this method should never - // be called to deserialize the ArgumentType info that wasn't put into the packet - // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands - // either. If this method ever gets called, either you or I are doing something very wrong! - throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_15#deserializeFromNetwork for more information"); - // Including a mini-stacktrace here in case this exception shows up - // on a client-disconnected screen, which is not very helpful - } - @Override public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { try { @@ -79,4 +67,16 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) e.printStackTrace(); } } + + @Override + public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { + // Since this class overrides its ArgumentRegistry key with the baseType's, + // this class's key should never show up in a packet and this method should never + // be called to deserialize the ArgumentType info that wasn't put into the packet + // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands + // either. If this method ever gets called, either you or I are doing something very wrong! + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_16_R2#b for more information"); + // Including a mini-stacktrace here in case this exception shows up + // on a client-disconnected screen, which is not very helpful + } } diff --git a/commandapi-nms/commandapi-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java b/commandapi-nms/commandapi-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java index 2e4c04e0ed..1fdc11eb8b 100644 --- a/commandapi-nms/commandapi-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java +++ b/commandapi-nms/commandapi-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java @@ -44,18 +44,6 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa } } - @Override - public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { - // Since this class overrides its ArgumentRegistry key with the baseType's, - // this class's key should never show up in a packet and this method should never - // be called to deserialize the ArgumentType info that wasn't put into the packet - // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands - // either. If this method ever gets called, either you or I are doing something very wrong! - throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_15#deserializeFromNetwork for more information"); - // Including a mini-stacktrace here in case this exception shows up - // on a client-disconnected screen, which is not very helpful - } - @Override public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { try { @@ -79,4 +67,16 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) e.printStackTrace(); } } + + @Override + public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { + // Since this class overrides its ArgumentRegistry key with the baseType's, + // this class's key should never show up in a packet and this method should never + // be called to deserialize the ArgumentType info that wasn't put into the packet + // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands + // either. If this method ever gets called, either you or I are doing something very wrong! + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_16_4_R3#b for more information"); + // Including a mini-stacktrace here in case this exception shows up + // on a client-disconnected screen, which is not very helpful + } } diff --git a/commandapi-nms/commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_Common.java b/commandapi-nms/commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_Common.java index d82ef186b4..ebee6d6cf2 100644 --- a/commandapi-nms/commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_Common.java +++ b/commandapi-nms/commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_Common.java @@ -27,18 +27,6 @@ public void serializeToNetwork(Template template, FriendlyByteBuf friendlyByteBu baseInfo.serializeToNetwork(baseInfo.unpack(baseType), friendlyByteBuf); } - @Override - public Template deserializeFromNetwork(FriendlyByteBuf friendlyByteBuf) { - // Since this class overrides its COMMAND_ARGUMENT_TYPE id with the baseType's, - // this class's id should never show up in a packet and this method should never - // be called to deserialize the ArgumentType info that wasn't put into the packet - // anyway. Also, the server shouldn't ever deserialize a *ClientBound*CommandPacket - // either. If this method ever gets called, either you or I are doing something very wrong! - throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentInfo_Common#deserializeFromNetwork for more information"); - // Including a mini-stacktrace here in case this exception shows up - // on a client-disconnected screen, which is not very helpful - } - @Override public void serializeToJson(Template template, JsonObject properties) { ArgumentType baseType = template.baseType; @@ -58,6 +46,18 @@ public Template unpack(ExceptionHandlingArgumentType exceptionHandlingArgumen return new Template(baseType); } + @Override + public Template deserializeFromNetwork(FriendlyByteBuf friendlyByteBuf) { + // Since this class overrides its COMMAND_ARGUMENT_TYPE id with the baseType's, + // this class's id should never show up in a packet and this method should never + // be called to deserialize the ArgumentType info that wasn't put into the packet + // anyway. Also, the server shouldn't ever deserialize a *ClientBound*CommandPacket + // either. If this method ever gets called, either you or I are doing something very wrong! + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentInfo_Common#deserializeFromNetwork for more information"); + // Including a mini-stacktrace here in case this exception shows up + // on a client-disconnected screen, which is not very helpful + } + public final class Template implements ArgumentTypeInfo.Template> { final ArgumentType baseType; @@ -65,6 +65,11 @@ public Template(ArgumentType baseType) { this.baseType = baseType; } + @Override + public ArgumentTypeInfo, ?> type() { + return ExceptionHandlingArgumentInfo_Common.this; + } + @Override public ExceptionHandlingArgumentType instantiate(CommandBuildContext commandBuildContext) { // Same as CustomArgumentInfo#deserializeFromNetwork. An @@ -74,10 +79,5 @@ public ExceptionHandlingArgumentType instantiate(CommandBuildContext commandB // Including a mini-stacktrace here in case this exception shows up // on a client-disconnected screen, which is not very helpful } - - @Override - public ArgumentTypeInfo, ?> type() { - return ExceptionHandlingArgumentInfo_Common.this; - } } } From ad658920d9c699b8db94f8507aef8e308364b5dd Mon Sep 17 00:00:00 2001 From: BuildTools <46540330+willkroboth@users.noreply.github.com> Date: Sun, 27 Nov 2022 12:49:47 -0500 Subject: [PATCH 14/58] Fix 1.16.2-3 & 1.16.4-5 ExceptionHandlingArgumentSerializer method reflection --- .../nms/ExceptionHandlingArgumentSerializer_1_16_R2.java | 7 +++++-- .../nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java | 4 ++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/commandapi-nms/commandapi-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java b/commandapi-nms/commandapi-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java index 0fc5960af0..f4f3af0687 100644 --- a/commandapi-nms/commandapi-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java +++ b/commandapi-nms/commandapi-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java @@ -4,6 +4,7 @@ import com.mojang.brigadier.arguments.ArgumentType; import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import dev.jorel.commandapi.preprocessor.Differs; import net.minecraft.server.v1_16_R2.ArgumentRegistry; import net.minecraft.server.v1_16_R2.ArgumentSerializer; import net.minecraft.server.v1_16_R2.PacketDataSerializer; @@ -17,10 +18,11 @@ public class ExceptionHandlingArgumentSerializer_1_16_R2 implements ArgumentS private static Method getInfo = null; @Override + @Differs(from = {"1.13", "1.14", "1.15", "1.16.1"}, by = "ArgumentRegistry.a -> ArgumentRegistry.b") public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { try { // Remove this key from packet - if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("b", ArgumentType.class); Object myInfo = getInfo.invoke(null, argument); Field keyField = CommandAPIHandler.getInstance().getField(myInfo.getClass(), "c"); @@ -45,11 +47,12 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa } @Override + @Differs(from = {"1.13", "1.14", "1.15", "1.16.1"}, by = "ArgumentRegistry.a -> ArgumentRegistry.b") public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { try { ArgumentType baseType = argument.baseType(); - if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("b", ArgumentType.class); Object baseInfo = getInfo.invoke(null, baseType); Field keyField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "c"); diff --git a/commandapi-nms/commandapi-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java b/commandapi-nms/commandapi-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java index 1fdc11eb8b..da2603e9ec 100644 --- a/commandapi-nms/commandapi-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java +++ b/commandapi-nms/commandapi-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java @@ -20,7 +20,7 @@ public class ExceptionHandlingArgumentSerializer_1_16_4_R3 implements Argumen public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { try { // Remove this key from packet - if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("b", ArgumentType.class); Object myInfo = getInfo.invoke(null, argument); Field keyField = CommandAPIHandler.getInstance().getField(myInfo.getClass(), "c"); @@ -49,7 +49,7 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) try { ArgumentType baseType = argument.baseType(); - if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("b", ArgumentType.class); Object baseInfo = getInfo.invoke(null, baseType); Field keyField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "c"); From fea28da0d9f7fb4f7a15711e482ac1512876bd9d Mon Sep 17 00:00:00 2001 From: BuildTools <46540330+willkroboth@users.noreply.github.com> Date: Sun, 27 Nov 2022 13:07:17 -0500 Subject: [PATCH 15/58] Fix 1.13-1.16 method reflection --- .../ExceptionHandlingArgumentSerializer_1_13_1.java | 10 ++++++++-- .../nms/ExceptionHandlingArgumentSerializer_1_13.java | 10 ++++++++-- .../nms/ExceptionHandlingArgumentSerializer_1_14.java | 10 ++++++++-- .../nms/ExceptionHandlingArgumentSerializer_1_15.java | 10 ++++++++-- .../ExceptionHandlingArgumentSerializer_1_16_R1.java | 10 ++++++++-- .../ExceptionHandlingArgumentSerializer_1_16_R2.java | 10 ++++++++-- .../ExceptionHandlingArgumentSerializer_1_16_4_R3.java | 10 ++++++++-- 7 files changed, 56 insertions(+), 14 deletions(-) diff --git a/commandapi-nms/commandapi-1.13.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13_1.java b/commandapi-nms/commandapi-1.13.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13_1.java index d72c4935da..17b5276969 100644 --- a/commandapi-nms/commandapi-1.13.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13_1.java +++ b/commandapi-nms/commandapi-1.13.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13_1.java @@ -20,7 +20,10 @@ public class ExceptionHandlingArgumentSerializer_1_13_1 implements ArgumentSe public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { try { // Remove this key from packet - if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + if(getInfo == null) { + getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + getInfo.setAccessible(true); + } Object myInfo = getInfo.invoke(null, argument); Field keyField = CommandAPIHandler.getInstance().getField(myInfo.getClass(), "c"); @@ -49,7 +52,10 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) try { ArgumentType baseType = argument.baseType(); - if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + if(getInfo == null) { + getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + getInfo.setAccessible(true); + } Object baseInfo = getInfo.invoke(null, baseType); Field keyField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "c"); diff --git a/commandapi-nms/commandapi-1.13/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13.java b/commandapi-nms/commandapi-1.13/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13.java index c60e8e24e5..25f7d8fb20 100644 --- a/commandapi-nms/commandapi-1.13/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13.java +++ b/commandapi-nms/commandapi-1.13/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13.java @@ -20,7 +20,10 @@ public class ExceptionHandlingArgumentSerializer_1_13 implements ArgumentSeri public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { try { // Remove this key from packet - if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + if(getInfo == null) { + getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + getInfo.setAccessible(true); + } Object myInfo = getInfo.invoke(null, argument); Field keyField = CommandAPIHandler.getInstance().getField(myInfo.getClass(), "c"); @@ -49,7 +52,10 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) try { ArgumentType baseType = argument.baseType(); - if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + if(getInfo == null) { + getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + getInfo.setAccessible(true); + } Object baseInfo = getInfo.invoke(null, baseType); Field keyField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "c"); diff --git a/commandapi-nms/commandapi-1.14/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_14.java b/commandapi-nms/commandapi-1.14/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_14.java index 76ff244f28..706451bb79 100644 --- a/commandapi-nms/commandapi-1.14/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_14.java +++ b/commandapi-nms/commandapi-1.14/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_14.java @@ -20,7 +20,10 @@ public class ExceptionHandlingArgumentSerializer_1_14 implements ArgumentSeri public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { try { // Remove this key from packet - if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + if(getInfo == null) { + getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + getInfo.setAccessible(true); + } Object myInfo = getInfo.invoke(null, argument); Field keyField = CommandAPIHandler.getInstance().getField(myInfo.getClass(), "c"); @@ -49,7 +52,10 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) try { ArgumentType baseType = argument.baseType(); - if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + if(getInfo == null) { + getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + getInfo.setAccessible(true); + } Object baseInfo = getInfo.invoke(null, baseType); Field keyField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "c"); diff --git a/commandapi-nms/commandapi-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java b/commandapi-nms/commandapi-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java index b34e5eccbb..d9308f5eda 100644 --- a/commandapi-nms/commandapi-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java +++ b/commandapi-nms/commandapi-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java @@ -20,7 +20,10 @@ public class ExceptionHandlingArgumentSerializer_1_15 implements ArgumentSeri public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { try { // Remove this key from packet - if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + if(getInfo == null) { + getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + getInfo.setAccessible(true); + } Object myInfo = getInfo.invoke(null, argument); Field keyField = CommandAPIHandler.getInstance().getField(myInfo.getClass(), "c"); @@ -49,7 +52,10 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) try { ArgumentType baseType = argument.baseType(); - if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + if(getInfo == null) { + getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + getInfo.setAccessible(true); + } Object baseInfo = getInfo.invoke(null, baseType); Field keyField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "c"); diff --git a/commandapi-nms/commandapi-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java b/commandapi-nms/commandapi-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java index 93540319c8..98fd63f820 100644 --- a/commandapi-nms/commandapi-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java +++ b/commandapi-nms/commandapi-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java @@ -20,7 +20,10 @@ public class ExceptionHandlingArgumentSerializer_1_16_R1 implements ArgumentS public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { try { // Remove this key from packet - if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + if(getInfo == null) { + getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + getInfo.setAccessible(true); + } Object myInfo = getInfo.invoke(null, argument); Field keyField = CommandAPIHandler.getInstance().getField(myInfo.getClass(), "c"); @@ -49,7 +52,10 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) try { ArgumentType baseType = argument.baseType(); - if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + if(getInfo == null) { + getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); + getInfo.setAccessible(true); + } Object baseInfo = getInfo.invoke(null, baseType); Field keyField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "c"); diff --git a/commandapi-nms/commandapi-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java b/commandapi-nms/commandapi-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java index f4f3af0687..2b78e9d809 100644 --- a/commandapi-nms/commandapi-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java +++ b/commandapi-nms/commandapi-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java @@ -22,7 +22,10 @@ public class ExceptionHandlingArgumentSerializer_1_16_R2 implements ArgumentS public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { try { // Remove this key from packet - if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("b", ArgumentType.class); + if(getInfo == null) { + getInfo = ArgumentRegistry.class.getDeclaredMethod("b", ArgumentType.class); + getInfo.setAccessible(true); + } Object myInfo = getInfo.invoke(null, argument); Field keyField = CommandAPIHandler.getInstance().getField(myInfo.getClass(), "c"); @@ -52,7 +55,10 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) try { ArgumentType baseType = argument.baseType(); - if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("b", ArgumentType.class); + if(getInfo == null) { + getInfo = ArgumentRegistry.class.getDeclaredMethod("b", ArgumentType.class); + getInfo.setAccessible(true); + } Object baseInfo = getInfo.invoke(null, baseType); Field keyField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "c"); diff --git a/commandapi-nms/commandapi-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java b/commandapi-nms/commandapi-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java index da2603e9ec..f9f65dd911 100644 --- a/commandapi-nms/commandapi-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java +++ b/commandapi-nms/commandapi-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java @@ -20,7 +20,10 @@ public class ExceptionHandlingArgumentSerializer_1_16_4_R3 implements Argumen public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { try { // Remove this key from packet - if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("b", ArgumentType.class); + if(getInfo == null) { + getInfo = ArgumentRegistry.class.getDeclaredMethod("b", ArgumentType.class); + getInfo.setAccessible(true); + } Object myInfo = getInfo.invoke(null, argument); Field keyField = CommandAPIHandler.getInstance().getField(myInfo.getClass(), "c"); @@ -49,7 +52,10 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) try { ArgumentType baseType = argument.baseType(); - if(getInfo == null) getInfo = ArgumentRegistry.class.getDeclaredMethod("b", ArgumentType.class); + if(getInfo == null) { + getInfo = ArgumentRegistry.class.getDeclaredMethod("b", ArgumentType.class); + getInfo.setAccessible(true); + } Object baseInfo = getInfo.invoke(null, baseType); Field keyField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "c"); From 84e0f39c1d2b5d4aa54384bd0f76b1678419508e Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 27 Nov 2022 14:20:15 -0500 Subject: [PATCH 16/58] Make GitHub Actions check NMS Common builds on all versions it is supposed to --- .github/workflows/build.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 16f70bdab4..7d0d63547b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -29,6 +29,12 @@ jobs: cache: maven - name: build CommandAPI using maven run: mvn clean install --batch-mode + - name: check NMS Common works on all versions + run: | + mvn clean package -pl :commandapi-nms-common -P Spigot_1_17_R1 + mvn clean package -pl :commandapi-nms-common -P Spigot_1_18_R1 + mvn clean package -pl :commandapi-nms-common -P Spigot_1_18_2_R2 + mvn clean package -pl :commandapi-nms-common -P Spigot_1_19_R1; - name: CommandAPI plugin artifact if: ${{ runner.os == 'Linux' && matrix.java == '17' }} # Only upload artifacts built from latest java on one OS uses: actions/upload-artifact@v2 From 15f2b3a1bcc092fba037509b6891d120195fbd60 Mon Sep 17 00:00:00 2001 From: BuildTools <46540330+willkroboth@users.noreply.github.com> Date: Sun, 27 Nov 2022 16:54:16 -0500 Subject: [PATCH 17/58] Fix 1.17 registerCustomArgumentType --- ...andlingArgumentSerializer_1_17_Common.java | 87 +++++++++++++++++++ .../jorel/commandapi/nms/NMS_1_17_Common.java | 9 +- ...tionHandlingArgumentInfo_1_19_Common.java} | 14 +-- .../jorel/commandapi/nms/NMS_1_19_Common.java | 25 ++++++ .../dev/jorel/commandapi/nms/NMS_Common.java | 18 +--- .../dev/jorel/commandapi/test/MockNMS.java | 4 +- 6 files changed, 130 insertions(+), 27 deletions(-) create mode 100644 commandapi-nms/commandapi-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java rename commandapi-nms/{commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_Common.java => commandapi-1.19-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_1_19_Common.java} (84%) diff --git a/commandapi-nms/commandapi-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java b/commandapi-nms/commandapi-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java new file mode 100644 index 0000000000..af3b2d7808 --- /dev/null +++ b/commandapi-nms/commandapi-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java @@ -0,0 +1,87 @@ +package dev.jorel.commandapi.nms; + +import com.google.gson.JsonObject; +import com.mojang.brigadier.arguments.ArgumentType; +import dev.jorel.commandapi.CommandAPIHandler; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import net.minecraft.commands.synchronization.ArgumentSerializer; +import net.minecraft.commands.synchronization.ArgumentTypes; +import net.minecraft.network.FriendlyByteBuf; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.nio.charset.StandardCharsets; + +public class ExceptionHandlingArgumentSerializer_1_17_Common implements ArgumentSerializer> { + private static Method getInfo = null; + + @Override + public void serializeToNetwork(ExceptionHandlingArgumentType argument, FriendlyByteBuf friendlyByteBuf) { + try { + // Remove this key from packet + if(getInfo == null) { + getInfo = ArgumentTypes.class.getDeclaredMethod("b", ArgumentType.class); + getInfo.setAccessible(true); + } + Object myInfo = getInfo.invoke(null, argument); + + Field keyField = CommandAPIHandler.getInstance().getField(myInfo.getClass(), "c"); + String myKey = keyField.get(myInfo).toString(); + byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); + // Removing length and size of string, assuming length is always written as 1 byte + friendlyByteBuf.writerIndex(friendlyByteBuf.writerIndex() - myKeyBytes.length - 1); + + // Add baseType key instead + ArgumentType baseType = argument.baseType(); + Object baseInfo = getInfo.invoke(null, baseType); + String baseKey = keyField.get(baseInfo).toString(); + friendlyByteBuf.writeUtf(baseKey); + + // Serialize baseType + Field subSerializerField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "b"); + ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + subSerializer.serializeToNetwork(baseType, friendlyByteBuf); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + } + + @Override + public void serializeToJson(ExceptionHandlingArgumentType argument, JsonObject properties) { + try { + ArgumentType baseType = argument.baseType(); + + if(getInfo == null) { + getInfo = ArgumentTypes.class.getDeclaredMethod("b", ArgumentType.class); + getInfo.setAccessible(true); + } + Object baseInfo = getInfo.invoke(null, baseType); + + Field keyField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "c"); + properties.addProperty("baseType", keyField.get(baseInfo).toString()); + + Field subSerializerField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "b"); + ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + + JsonObject subProperties = new JsonObject(); + subSerializer.serializeToJson(baseType, subProperties); + if (subProperties.size() > 0) { + properties.add("baseProperties", subProperties); + } + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + } + + @Override + public ExceptionHandlingArgumentType deserializeFromNetwork(FriendlyByteBuf friendlyByteBuf) { + // Since this class overrides its ArgumentRegistry key with the baseType's, + // this class's key should never show up in a packet and this method should never + // be called to deserialize the ArgumentType info that wasn't put into the packet + // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands + // either. If this method ever gets called, either you or I are doing something very wrong! + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_17_Common#deserializeFromNetwork for more information"); + // Including a mini-stacktrace here in case this exception shows up + // on a client-disconnected screen, which is not very helpful + } +} diff --git a/commandapi-nms/commandapi-1.17-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_17_Common.java b/commandapi-nms/commandapi-1.17-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_17_Common.java index a8400e5d46..040d30fc8a 100644 --- a/commandapi-nms/commandapi-1.17-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_17_Common.java +++ b/commandapi-nms/commandapi-1.17-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_17_Common.java @@ -32,6 +32,7 @@ import java.util.function.Predicate; import java.util.function.ToIntFunction; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; import org.bukkit.Bukkit; import org.bukkit.Color; import org.bukkit.Location; @@ -519,14 +520,18 @@ public void resendPackets(Player player) { MINECRAFT_SERVER.getCommands().sendCommands(((CraftPlayer) player).getHandle()); } + @Override + public void registerCustomArgumentType() { + ArgumentTypes.register("commandapi:exception_handler", ExceptionHandlingArgumentType.class, new ExceptionHandlingArgumentSerializer_1_17_Common()); + } + @Override public Message generateMessageFromJson(String json) { return Serializer.fromJson(json); } - @Override + @Override public MinecraftServer getMinecraftServer() { return MINECRAFT_SERVER; } - } diff --git a/commandapi-nms/commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_Common.java b/commandapi-nms/commandapi-1.19-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_1_19_Common.java similarity index 84% rename from commandapi-nms/commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_Common.java rename to commandapi-nms/commandapi-1.19-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_1_19_Common.java index ebee6d6cf2..7c28bfadf7 100644 --- a/commandapi-nms/commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_Common.java +++ b/commandapi-nms/commandapi-1.19-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_1_19_Common.java @@ -9,7 +9,7 @@ import net.minecraft.core.Registry; import net.minecraft.network.FriendlyByteBuf; -public class ExceptionHandlingArgumentInfo_Common implements ArgumentTypeInfo, ExceptionHandlingArgumentInfo_Common.Template> { +public class ExceptionHandlingArgumentInfo_1_19_Common implements ArgumentTypeInfo, ExceptionHandlingArgumentInfo_1_19_Common.Template> { @Override public void serializeToNetwork(Template template, FriendlyByteBuf friendlyByteBuf) { ArgumentType baseType = template.baseType; @@ -53,7 +53,7 @@ public Template deserializeFromNetwork(FriendlyByteBuf friendlyByteBuf) { // be called to deserialize the ArgumentType info that wasn't put into the packet // anyway. Also, the server shouldn't ever deserialize a *ClientBound*CommandPacket // either. If this method ever gets called, either you or I are doing something very wrong! - throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentInfo_Common#deserializeFromNetwork for more information"); + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentInfo_1_19_Common#deserializeFromNetwork for more information"); // Including a mini-stacktrace here in case this exception shows up // on a client-disconnected screen, which is not very helpful } @@ -67,15 +67,15 @@ public Template(ArgumentType baseType) { @Override public ArgumentTypeInfo, ?> type() { - return ExceptionHandlingArgumentInfo_Common.this; + return ExceptionHandlingArgumentInfo_1_19_Common.this; } @Override public ExceptionHandlingArgumentType instantiate(CommandBuildContext commandBuildContext) { - // Same as CustomArgumentInfo#deserializeFromNetwork. An - // ExceptionHandlingArgumentType should never be built - // from a packet, so this method shouldn't be used - throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentInfo_Common.Template#instantiate for more information"); + // Same as ExceptionHandlingArgumentInfo_1_19_Common#deserializeFromNetwork. + // An ExceptionHandlingArgumentType should never be built from a packet, + // so this method shouldn't be used + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentInfo_1_19_Common.Template#instantiate for more information"); // Including a mini-stacktrace here in case this exception shows up // on a client-disconnected screen, which is not very helpful } diff --git a/commandapi-nms/commandapi-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java b/commandapi-nms/commandapi-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java index d230b7744d..b3ca10a040 100644 --- a/commandapi-nms/commandapi-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java +++ b/commandapi-nms/commandapi-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java @@ -26,6 +26,8 @@ import java.io.StringWriter; import java.lang.invoke.MethodHandles; import java.lang.invoke.VarHandle; +import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collection; @@ -38,6 +40,10 @@ import java.util.function.Predicate; import java.util.function.ToIntFunction; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import net.minecraft.commands.synchronization.ArgumentTypeInfo; +import net.minecraft.commands.synchronization.ArgumentTypeInfos; +import net.minecraft.core.MappedRegistry; import org.bukkit.Bukkit; import org.bukkit.Color; import org.bukkit.Keyed; @@ -764,6 +770,25 @@ public final void resendPackets(Player player) { MINECRAFT_SERVER.getCommands().sendCommands(((CraftPlayer) player).getHandle()); } + @Override + public void registerCustomArgumentType() { + try { + // Unfreeze registry + Field isFrozen = CommandAPIHandler.getInstance().getField(MappedRegistry.class, "ca"); + isFrozen.set(Registry.COMMAND_ARGUMENT_TYPE, false); + + // Register argument + Method registerArgument = ArgumentTypeInfos.class.getDeclaredMethod("a", Registry.class, String.class, + Class.class, ArgumentTypeInfo.class); + registerArgument.setAccessible(true); + + registerArgument.invoke(null, Registry.COMMAND_ARGUMENT_TYPE, "commandapi:exception_handler", + ExceptionHandlingArgumentType.class, new ExceptionHandlingArgumentInfo_1_19_Common<>()); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + } + @Override public final void unhookChatPreview(Player player) { final Channel channel = ((CraftPlayer) player).getHandle().connection.connection.channel; diff --git a/commandapi-nms/commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/NMS_Common.java b/commandapi-nms/commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/NMS_Common.java index ed131a8182..abe03fba03 100644 --- a/commandapi-nms/commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/NMS_Common.java +++ b/commandapi-nms/commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/NMS_Common.java @@ -729,20 +729,6 @@ public final UUID getUUID(CommandContext cmdCtx, String key) @Override @Differs(from = {"1.14, 1.15, 1.16"}, by = "Using ArgumentTypeInfos and Registry.COMMAND_ARGUMENT_TYPE instead of ArgumentRegistry") - public void registerCustomArgumentType() { - try { - Field mapField = CommandAPIHandler.getInstance().getField(ArgumentTypeInfos.class, "a"); - Map infoMap = (Map) mapField.get(null); - - ExceptionHandlingArgumentInfo_Common info = new ExceptionHandlingArgumentInfo_Common(); - infoMap.put(ExceptionHandlingArgumentType.class, info); - - Field isFrozen = CommandAPIHandler.getInstance().getField(MappedRegistry.class, "ca"); - isFrozen.set(Registry.COMMAND_ARGUMENT_TYPE, false); - - Registry.>register(Registry.COMMAND_ARGUMENT_TYPE, "commandapi:exception_handler", info); - } catch (ReflectiveOperationException e) { - e.printStackTrace(); - } - } + @Unimplemented(because = VERSION_SPECIFIC_IMPLEMENTATION) + public void registerCustomArgumentType() {}; // TODO: Make abstract } diff --git a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/MockNMS.java b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/MockNMS.java index d96cbb9a6a..672fcccec0 100644 --- a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/MockNMS.java +++ b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/MockNMS.java @@ -17,7 +17,7 @@ import be.seeseemelk.mockbukkit.ServerMock; import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; -import dev.jorel.commandapi.nms.ExceptionHandlingArgumentInfo_Common; +import dev.jorel.commandapi.nms.ExceptionHandlingArgumentInfo_1_19_Common; import org.bukkit.*; import org.bukkit.command.CommandSender; import org.bukkit.command.SimpleCommandMap; @@ -425,7 +425,7 @@ private void initializeArgumentsInArgumentTypeInfos() throws ReflectiveOperation map.put(TemplateMirrorArgument.class, SingletonArgumentInfo.a(TemplateMirrorArgument::a)); map.put(TemplateRotationArgument.class, SingletonArgumentInfo.a(TemplateRotationArgument::a)); map.put(ArgumentUUID.class, SingletonArgumentInfo.a(ArgumentUUID::a)); - map.put(ExceptionHandlingArgumentType.class, new ExceptionHandlingArgumentInfo_Common()); + map.put(ExceptionHandlingArgumentType.class, new ExceptionHandlingArgumentInfo_1_19_Common()); } @Override From 537cf5af4642bb06770de0035c2af29b35e1f802 Mon Sep 17 00:00:00 2001 From: BuildTools <46540330+willkroboth@users.noreply.github.com> Date: Sun, 27 Nov 2022 17:41:39 -0500 Subject: [PATCH 18/58] Fix 1.18 registerCustomArgumentType --- ...ionHandlingArgumentSerializer_1_18_R2.java | 92 +++++++++++++++++++ .../dev/jorel/commandapi/nms/NMS_1_18_R2.java | 8 +- ...ionHandlingArgumentSerializer_1_18_R1.java | 87 ++++++++++++++++++ .../dev/jorel/commandapi/nms/NMS_1_18_R1.java | 6 ++ .../jorel/commandapi/nms/NMS_1_19_Common.java | 2 + .../dev/jorel/commandapi/nms/NMS_Common.java | 3 +- 6 files changed, 194 insertions(+), 4 deletions(-) create mode 100644 commandapi-nms/commandapi-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java create mode 100644 commandapi-nms/commandapi-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java diff --git a/commandapi-nms/commandapi-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java b/commandapi-nms/commandapi-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java new file mode 100644 index 0000000000..405ee61d2d --- /dev/null +++ b/commandapi-nms/commandapi-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java @@ -0,0 +1,92 @@ +package dev.jorel.commandapi.nms; + +import com.google.gson.JsonObject; +import com.mojang.brigadier.arguments.ArgumentType; +import dev.jorel.commandapi.CommandAPIHandler; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import dev.jorel.commandapi.preprocessor.Differs; +import net.minecraft.commands.synchronization.ArgumentSerializer; +import net.minecraft.commands.synchronization.ArgumentTypes; +import net.minecraft.network.FriendlyByteBuf; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.nio.charset.StandardCharsets; + +public class ExceptionHandlingArgumentSerializer_1_18_R2 implements ArgumentSerializer> { + private static Method getInfo = null; + + @Override + @Differs(from = {"1.13", "1.14", "1.15", "1.16", "1.17", "1.18", "1.18.1"}, + by = "ArgumentType.Entry.c -> ArgumentType.Entry.b, ArgumentType.Entry.b -> ArgumentType.Entry.a") + public void serializeToNetwork(ExceptionHandlingArgumentType argument, FriendlyByteBuf friendlyByteBuf) { + try { + // Remove this key from packet + if(getInfo == null) { + getInfo = ArgumentTypes.class.getDeclaredMethod("b", ArgumentType.class); + getInfo.setAccessible(true); + } + Object myInfo = getInfo.invoke(null, argument); + + Field keyField = CommandAPIHandler.getInstance().getField(myInfo.getClass(), "b"); + String myKey = keyField.get(myInfo).toString(); + byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); + // Removing length and size of string, assuming length is always written as 1 byte + friendlyByteBuf.writerIndex(friendlyByteBuf.writerIndex() - myKeyBytes.length - 1); + + // Add baseType key instead + ArgumentType baseType = argument.baseType(); + Object baseInfo = getInfo.invoke(null, baseType); + String baseKey = keyField.get(baseInfo).toString(); + friendlyByteBuf.writeUtf(baseKey); + + // Serialize baseType + Field subSerializerField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "a"); + ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + subSerializer.serializeToNetwork(baseType, friendlyByteBuf); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + } + + @Override + @Differs(from = {"1.13", "1.14", "1.15", "1.16", "1.17", "1.18", "1.18.1"}, + by = "ArgumentType.Entry.c -> ArgumentType.Entry.b, ArgumentType.Entry.b -> ArgumentType.Entry.a") + public void serializeToJson(ExceptionHandlingArgumentType argument, JsonObject properties) { + try { + ArgumentType baseType = argument.baseType(); + + if(getInfo == null) { + getInfo = ArgumentTypes.class.getDeclaredMethod("b", ArgumentType.class); + getInfo.setAccessible(true); + } + Object baseInfo = getInfo.invoke(null, baseType); + + Field keyField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "b"); + properties.addProperty("baseType", keyField.get(baseInfo).toString()); + + Field subSerializerField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "a"); + ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + + JsonObject subProperties = new JsonObject(); + subSerializer.serializeToJson(baseType, subProperties); + if (subProperties.size() > 0) { + properties.add("baseProperties", subProperties); + } + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + } + + @Override + public ExceptionHandlingArgumentType deserializeFromNetwork(FriendlyByteBuf friendlyByteBuf) { + // Since this class overrides its ArgumentRegistry key with the baseType's, + // this class's key should never show up in a packet and this method should never + // be called to deserialize the ArgumentType info that wasn't put into the packet + // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands + // either. If this method ever gets called, either you or I are doing something very wrong! + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_18_R2#deserializeFromNetwork for more information"); + // Including a mini-stacktrace here in case this exception shows up + // on a client-disconnected screen, which is not very helpful + } +} diff --git a/commandapi-nms/commandapi-1.18.2/src/main/java/dev/jorel/commandapi/nms/NMS_1_18_R2.java b/commandapi-nms/commandapi-1.18.2/src/main/java/dev/jorel/commandapi/nms/NMS_1_18_R2.java index 55dd476b6d..bc9a8b7013 100644 --- a/commandapi-nms/commandapi-1.18.2/src/main/java/dev/jorel/commandapi/nms/NMS_1_18_R2.java +++ b/commandapi-nms/commandapi-1.18.2/src/main/java/dev/jorel/commandapi/nms/NMS_1_18_R2.java @@ -39,8 +39,7 @@ import java.util.function.ToIntFunction; import com.mojang.brigadier.Message; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.chat.ComponentSerializer; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; import org.bukkit.Bukkit; import org.bukkit.Color; import org.bukkit.Keyed; @@ -708,6 +707,11 @@ public void resendPackets(Player player) { MINECRAFT_SERVER.getCommands().sendCommands(((CraftPlayer) player).getHandle()); } + @Override + public void registerCustomArgumentType() { + ArgumentTypes.register("commandapi:exception_handler", ExceptionHandlingArgumentType.class, new ExceptionHandlingArgumentSerializer_1_18_R2()); + } + @Override public Message generateMessageFromJson(String json) { return Serializer.fromJson(json); diff --git a/commandapi-nms/commandapi-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java b/commandapi-nms/commandapi-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java new file mode 100644 index 0000000000..bbf67ef64d --- /dev/null +++ b/commandapi-nms/commandapi-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java @@ -0,0 +1,87 @@ +package dev.jorel.commandapi.nms; + +import com.google.gson.JsonObject; +import com.mojang.brigadier.arguments.ArgumentType; +import dev.jorel.commandapi.CommandAPIHandler; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import net.minecraft.commands.synchronization.ArgumentSerializer; +import net.minecraft.commands.synchronization.ArgumentTypes; +import net.minecraft.network.FriendlyByteBuf; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.nio.charset.StandardCharsets; + +public class ExceptionHandlingArgumentSerializer_1_18_R1 implements ArgumentSerializer> { + private static Method getInfo = null; + + @Override + public void serializeToNetwork(ExceptionHandlingArgumentType argument, FriendlyByteBuf friendlyByteBuf) { + try { + // Remove this key from packet + if(getInfo == null) { + getInfo = ArgumentTypes.class.getDeclaredMethod("b", ArgumentType.class); + getInfo.setAccessible(true); + } + Object myInfo = getInfo.invoke(null, argument); + + Field keyField = CommandAPIHandler.getInstance().getField(myInfo.getClass(), "c"); + String myKey = keyField.get(myInfo).toString(); + byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); + // Removing length and size of string, assuming length is always written as 1 byte + friendlyByteBuf.writerIndex(friendlyByteBuf.writerIndex() - myKeyBytes.length - 1); + + // Add baseType key instead + ArgumentType baseType = argument.baseType(); + Object baseInfo = getInfo.invoke(null, baseType); + String baseKey = keyField.get(baseInfo).toString(); + friendlyByteBuf.writeUtf(baseKey); + + // Serialize baseType + Field subSerializerField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "b"); + ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + subSerializer.serializeToNetwork(baseType, friendlyByteBuf); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + } + + @Override + public void serializeToJson(ExceptionHandlingArgumentType argument, JsonObject properties) { + try { + ArgumentType baseType = argument.baseType(); + + if(getInfo == null) { + getInfo = ArgumentTypes.class.getDeclaredMethod("b", ArgumentType.class); + getInfo.setAccessible(true); + } + Object baseInfo = getInfo.invoke(null, baseType); + + Field keyField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "c"); + properties.addProperty("baseType", keyField.get(baseInfo).toString()); + + Field subSerializerField = CommandAPIHandler.getInstance().getField(baseInfo.getClass(), "b"); + ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + + JsonObject subProperties = new JsonObject(); + subSerializer.serializeToJson(baseType, subProperties); + if (subProperties.size() > 0) { + properties.add("baseProperties", subProperties); + } + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + } + + @Override + public ExceptionHandlingArgumentType deserializeFromNetwork(FriendlyByteBuf friendlyByteBuf) { + // Since this class overrides its ArgumentRegistry key with the baseType's, + // this class's key should never show up in a packet and this method should never + // be called to deserialize the ArgumentType info that wasn't put into the packet + // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands + // either. If this method ever gets called, either you or I are doing something very wrong! + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_18_R1#deserializeFromNetwork for more information"); + // Including a mini-stacktrace here in case this exception shows up + // on a client-disconnected screen, which is not very helpful + } +} diff --git a/commandapi-nms/commandapi-1.18/src/main/java/dev/jorel/commandapi/nms/NMS_1_18_R1.java b/commandapi-nms/commandapi-1.18/src/main/java/dev/jorel/commandapi/nms/NMS_1_18_R1.java index a11f4ef3f2..df1561908a 100644 --- a/commandapi-nms/commandapi-1.18/src/main/java/dev/jorel/commandapi/nms/NMS_1_18_R1.java +++ b/commandapi-nms/commandapi-1.18/src/main/java/dev/jorel/commandapi/nms/NMS_1_18_R1.java @@ -37,6 +37,7 @@ import java.util.function.ToIntFunction; import com.mojang.brigadier.Message; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.chat.ComponentSerializer; import org.bukkit.Bukkit; @@ -585,6 +586,11 @@ public void resendPackets(Player player) { MINECRAFT_SERVER.getCommands().sendCommands(((CraftPlayer) player).getHandle()); } + @Override + public void registerCustomArgumentType() { + ArgumentTypes.register("commandapi:exception_handler", ExceptionHandlingArgumentType.class, new ExceptionHandlingArgumentSerializer_1_18_R1()); + } + @Override public Message generateMessageFromJson(String json) { return Serializer.fromJson(json); diff --git a/commandapi-nms/commandapi-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java b/commandapi-nms/commandapi-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java index b3ca10a040..b8ac9a4d45 100644 --- a/commandapi-nms/commandapi-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java +++ b/commandapi-nms/commandapi-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java @@ -771,6 +771,8 @@ public final void resendPackets(Player player) { } @Override + @Differs(from = {"1.14, 1.15, 1.16", "1.17", "1.18"}, + by = "Using ArgumentTypeInfos and Registry.COMMAND_ARGUMENT_TYPE instead of ArgumentRegistry") public void registerCustomArgumentType() { try { // Unfreeze registry diff --git a/commandapi-nms/commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/NMS_Common.java b/commandapi-nms/commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/NMS_Common.java index abe03fba03..c3257e086e 100644 --- a/commandapi-nms/commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/NMS_Common.java +++ b/commandapi-nms/commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/NMS_Common.java @@ -728,7 +728,6 @@ public final UUID getUUID(CommandContext cmdCtx, String key) public abstract void resendPackets(Player player); @Override - @Differs(from = {"1.14, 1.15, 1.16"}, by = "Using ArgumentTypeInfos and Registry.COMMAND_ARGUMENT_TYPE instead of ArgumentRegistry") @Unimplemented(because = VERSION_SPECIFIC_IMPLEMENTATION) - public void registerCustomArgumentType() {}; // TODO: Make abstract + public abstract void registerCustomArgumentType(); } From e5cc28b8fa4026e4c9e7168802b7889fbb38cbd6 Mon Sep 17 00:00:00 2001 From: BuildTools <46540330+willkroboth@users.noreply.github.com> Date: Sun, 27 Nov 2022 17:48:22 -0500 Subject: [PATCH 19/58] Remove unused (and sometimes invalid) imports from NMS_Common --- .../src/main/java/dev/jorel/commandapi/nms/NMS_Common.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/commandapi-nms/commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/NMS_Common.java b/commandapi-nms/commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/NMS_Common.java index c3257e086e..ff02ccd481 100644 --- a/commandapi-nms/commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/NMS_Common.java +++ b/commandapi-nms/commandapi-nms-common/src/main/java/dev/jorel/commandapi/nms/NMS_Common.java @@ -27,7 +27,6 @@ import java.io.File; import java.io.IOException; -import java.lang.reflect.Field; import java.util.Collection; import java.util.EnumSet; import java.util.HashSet; @@ -39,10 +38,6 @@ import java.util.function.Predicate; import java.util.function.ToIntFunction; -import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; -import net.minecraft.commands.synchronization.ArgumentTypeInfo; -import net.minecraft.commands.synchronization.ArgumentTypeInfos; -import net.minecraft.core.MappedRegistry; import org.bukkit.Axis; import org.bukkit.Bukkit; import org.bukkit.ChatColor; From eab34669ecf038e897b83e6990a113694f4468d4 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Mon, 28 Nov 2022 08:14:48 -0500 Subject: [PATCH 20/58] Clean up after merge --- .../jorel/commandapi/nms/NMS_1_17_Common.java | 106 +++++++--------- .../dev/jorel/commandapi/nms/NMS_1_18_R2.java | 117 +++++++----------- .../jorel/commandapi/nms/NMS_1_19_Common.java | 1 - 3 files changed, 86 insertions(+), 138 deletions(-) diff --git a/commandapi-nms/commandapi-1.17-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_17_Common.java b/commandapi-nms/commandapi-1.17-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_17_Common.java index 51e7f98fe3..91c2ef5d1a 100644 --- a/commandapi-nms/commandapi-1.17-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_17_Common.java +++ b/commandapi-nms/commandapi-1.17-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_17_Common.java @@ -20,54 +20,6 @@ *******************************************************************************/ package dev.jorel.commandapi.nms; -import java.io.File; -import java.io.IOException; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.VarHandle; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.function.Predicate; -import java.util.function.ToIntFunction; - -import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; -import net.minecraft.commands.arguments.*; -import org.bukkit.Bukkit; -import org.bukkit.Color; -import org.bukkit.Location; -import org.bukkit.NamespacedKey; -import org.bukkit.Particle; -import org.bukkit.Particle.DustOptions; -import org.bukkit.Particle.DustTransition; -import org.bukkit.Sound; -import org.bukkit.Vibration; -import org.bukkit.World; -import org.bukkit.Vibration.Destination; -import org.bukkit.Vibration.Destination.BlockDestination; -import org.bukkit.Vibration.Destination.EntityDestination; -import org.bukkit.block.Biome; -import org.bukkit.block.Block; -import org.bukkit.block.data.BlockData; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.SimpleCommandMap; -import org.bukkit.craftbukkit.v1_17_R1.CraftLootTable; -import org.bukkit.craftbukkit.v1_17_R1.CraftParticle; -import org.bukkit.craftbukkit.v1_17_R1.CraftServer; -import org.bukkit.craftbukkit.v1_17_R1.CraftSound; -import org.bukkit.craftbukkit.v1_17_R1.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_17_R1.command.VanillaCommandWrapper; -import org.bukkit.craftbukkit.v1_17_R1.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_17_R1.help.CustomHelpTopic; -import org.bukkit.craftbukkit.v1_17_R1.help.SimpleHelpMap; -import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.help.HelpTopic; - import com.google.common.io.Files; import com.google.gson.GsonBuilder; import com.mojang.brigadier.CommandDispatcher; @@ -75,22 +27,17 @@ import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPI; import dev.jorel.commandapi.CommandAPIHandler; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; import dev.jorel.commandapi.preprocessor.RequireField; -import dev.jorel.commandapi.wrappers.FunctionWrapper; -import dev.jorel.commandapi.wrappers.Location2D; -import dev.jorel.commandapi.wrappers.NativeProxyCommandSender; -import dev.jorel.commandapi.wrappers.ParticleData; -import dev.jorel.commandapi.wrappers.SimpleFunctionWrapper; +import dev.jorel.commandapi.wrappers.*; import io.papermc.paper.text.PaperComponents; import net.kyori.adventure.text.Component; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.chat.ComponentSerializer; import net.minecraft.commands.CommandFunction; import net.minecraft.commands.CommandFunction.Entry; import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.*; import net.minecraft.commands.arguments.blocks.BlockPredicateArgument; import net.minecraft.commands.arguments.blocks.BlockStateArgument; import net.minecraft.commands.arguments.coordinates.BlockPosArgument; @@ -104,13 +51,7 @@ import net.minecraft.commands.synchronization.ArgumentTypes; import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; -import net.minecraft.core.particles.BlockParticleOption; -import net.minecraft.core.particles.DustColorTransitionOptions; -import net.minecraft.core.particles.DustParticleOptions; -import net.minecraft.core.particles.ItemParticleOption; -import net.minecraft.core.particles.ParticleOptions; -import net.minecraft.core.particles.SimpleParticleType; -import net.minecraft.core.particles.VibrationParticleOption; +import net.minecraft.core.particles.*; import net.minecraft.network.chat.Component.Serializer; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; @@ -125,8 +66,45 @@ import net.minecraft.world.level.gameevent.EntityPositionSource; import net.minecraft.world.phys.Vec2; import net.minecraft.world.phys.Vec3; +import org.bukkit.*; +import org.bukkit.Particle.DustOptions; +import org.bukkit.Particle.DustTransition; +import org.bukkit.Vibration.Destination; +import org.bukkit.Vibration.Destination.BlockDestination; +import org.bukkit.Vibration.Destination.EntityDestination; +import org.bukkit.block.Biome; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.SimpleCommandMap; +import org.bukkit.craftbukkit.v1_17_R1.CraftLootTable; +import org.bukkit.craftbukkit.v1_17_R1.CraftParticle; +import org.bukkit.craftbukkit.v1_17_R1.CraftServer; +import org.bukkit.craftbukkit.v1_17_R1.CraftSound; +import org.bukkit.craftbukkit.v1_17_R1.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_17_R1.command.VanillaCommandWrapper; +import org.bukkit.craftbukkit.v1_17_R1.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_17_R1.help.CustomHelpTopic; +import org.bukkit.craftbukkit.v1_17_R1.help.SimpleHelpMap; +import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.help.HelpTopic; import org.bukkit.potion.PotionEffectType; -// TODO: Make sure imports merged correctly + +import java.io.File; +import java.io.IOException; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Predicate; +import java.util.function.ToIntFunction; // Mojang-Mapped reflection /** diff --git a/commandapi-nms/commandapi-1.18.2/src/main/java/dev/jorel/commandapi/nms/NMS_1_18_R2.java b/commandapi-nms/commandapi-1.18.2/src/main/java/dev/jorel/commandapi/nms/NMS_1_18_R2.java index db4f3f781c..c49383247c 100644 --- a/commandapi-nms/commandapi-1.18.2/src/main/java/dev/jorel/commandapi/nms/NMS_1_18_R2.java +++ b/commandapi-nms/commandapi-1.18.2/src/main/java/dev/jorel/commandapi/nms/NMS_1_18_R2.java @@ -20,90 +20,29 @@ *******************************************************************************/ package dev.jorel.commandapi.nms; -import java.io.File; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.VarHandle; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.function.Predicate; -import java.util.function.ToIntFunction; - -import com.mojang.brigadier.Message; -import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.chat.ComponentSerializer; -import net.minecraft.commands.arguments.*; -import org.bukkit.Bukkit; -import org.bukkit.Color; -import org.bukkit.Keyed; -import org.bukkit.Location; -import org.bukkit.NamespacedKey; -import org.bukkit.Particle; -import org.bukkit.Particle.DustOptions; -import org.bukkit.Particle.DustTransition; -import org.bukkit.Sound; -import org.bukkit.Vibration; -import org.bukkit.World; -import org.bukkit.Vibration.Destination; -import org.bukkit.Vibration.Destination.BlockDestination; -import org.bukkit.Vibration.Destination.EntityDestination; -import org.bukkit.block.Biome; -import org.bukkit.block.Block; -import org.bukkit.block.data.BlockData; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.SimpleCommandMap; -import org.bukkit.craftbukkit.v1_18_R2.CraftLootTable; -import org.bukkit.craftbukkit.v1_18_R2.CraftParticle; -import org.bukkit.craftbukkit.v1_18_R2.CraftServer; -import org.bukkit.craftbukkit.v1_18_R2.CraftSound; -import org.bukkit.craftbukkit.v1_18_R2.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_18_R2.command.VanillaCommandWrapper; -import org.bukkit.craftbukkit.v1_18_R2.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_18_R2.help.CustomHelpTopic; -import org.bukkit.craftbukkit.v1_18_R2.help.SimpleHelpMap; -import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.help.HelpTopic; -import org.bukkit.inventory.Recipe; - import com.google.common.collect.ImmutableList; import com.google.common.io.Files; import com.google.gson.GsonBuilder; import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.Message; import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; import com.mojang.logging.LogUtils; - import dev.jorel.commandapi.CommandAPI; import dev.jorel.commandapi.CommandAPIHandler; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; import dev.jorel.commandapi.preprocessor.Differs; import dev.jorel.commandapi.preprocessor.NMSMeta; import dev.jorel.commandapi.preprocessor.RequireField; -import dev.jorel.commandapi.wrappers.FunctionWrapper; -import dev.jorel.commandapi.wrappers.Location2D; -import dev.jorel.commandapi.wrappers.NativeProxyCommandSender; -import dev.jorel.commandapi.wrappers.ParticleData; -import dev.jorel.commandapi.wrappers.SimpleFunctionWrapper; +import dev.jorel.commandapi.wrappers.*; import io.papermc.paper.text.PaperComponents; import net.kyori.adventure.text.Component; import net.minecraft.commands.CommandFunction; import net.minecraft.commands.CommandFunction.Entry; import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.*; import net.minecraft.commands.arguments.ResourceOrTagLocationArgument.Result; import net.minecraft.commands.arguments.blocks.BlockPredicateArgument; import net.minecraft.commands.arguments.blocks.BlockStateArgument; @@ -119,13 +58,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; import net.minecraft.core.RegistryAccess.Frozen; -import net.minecraft.core.particles.BlockParticleOption; -import net.minecraft.core.particles.DustColorTransitionOptions; -import net.minecraft.core.particles.DustParticleOptions; -import net.minecraft.core.particles.ItemParticleOption; -import net.minecraft.core.particles.ParticleOptions; -import net.minecraft.core.particles.SimpleParticleType; -import net.minecraft.core.particles.VibrationParticleOption; +import net.minecraft.core.particles.*; import net.minecraft.network.chat.Component.Serializer; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; @@ -150,8 +83,46 @@ import net.minecraft.world.level.gameevent.EntityPositionSource; import net.minecraft.world.phys.Vec2; import net.minecraft.world.phys.Vec3; +import org.bukkit.*; +import org.bukkit.Particle.DustOptions; +import org.bukkit.Particle.DustTransition; +import org.bukkit.Vibration.Destination; +import org.bukkit.Vibration.Destination.BlockDestination; +import org.bukkit.Vibration.Destination.EntityDestination; +import org.bukkit.block.Biome; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.SimpleCommandMap; +import org.bukkit.craftbukkit.v1_18_R2.CraftLootTable; +import org.bukkit.craftbukkit.v1_18_R2.CraftParticle; +import org.bukkit.craftbukkit.v1_18_R2.CraftServer; +import org.bukkit.craftbukkit.v1_18_R2.CraftSound; +import org.bukkit.craftbukkit.v1_18_R2.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_18_R2.command.VanillaCommandWrapper; +import org.bukkit.craftbukkit.v1_18_R2.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_18_R2.help.CustomHelpTopic; +import org.bukkit.craftbukkit.v1_18_R2.help.SimpleHelpMap; +import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.help.HelpTopic; +import org.bukkit.inventory.Recipe; import org.bukkit.potion.PotionEffectType; -// TODO: Make sure imports merged correctly + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.function.Predicate; +import java.util.function.ToIntFunction; // Mojang-Mapped reflection /** diff --git a/commandapi-nms/commandapi-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java b/commandapi-nms/commandapi-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java index 980422e9d6..44666d499e 100644 --- a/commandapi-nms/commandapi-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java +++ b/commandapi-nms/commandapi-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java @@ -160,7 +160,6 @@ import net.minecraft.world.phys.Vec2; import net.minecraft.world.phys.Vec3; import org.bukkit.potion.PotionEffectType; -// TODO: Make sure imports merged correctly // Mojang-Mapped reflection /** From f5bef67e1008a9fa3a4c3a8eed7e3f9f3f712e5e Mon Sep 17 00:00:00 2001 From: BuildTools Date: Fri, 2 Dec 2022 12:10:09 -0500 Subject: [PATCH 21/58] Add WrapperStringReader to InitialParseExceptionContext --- .../ExceptionHandlingArgumentType.java | 4 +- .../InitialParseExceptionContext.java | 9 +- .../wrappers/WrapperStringReader.java | 180 ++++++++++++++++++ 3 files changed, 190 insertions(+), 3 deletions(-) create mode 100644 commandapi-core/src/main/java/dev/jorel/commandapi/wrappers/WrapperStringReader.java diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ExceptionHandlingArgumentType.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ExceptionHandlingArgumentType.java index 9df057e158..7a50162fda 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ExceptionHandlingArgumentType.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ExceptionHandlingArgumentType.java @@ -7,6 +7,7 @@ import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException; +import dev.jorel.commandapi.wrappers.WrapperStringReader; import java.util.Collection; import java.util.concurrent.CompletableFuture; @@ -28,7 +29,8 @@ public T parse(StringReader stringReader) throws CommandSyntaxException { } catch (CommandSyntaxException original) { try { return errorHandler.handleException(new InitialParseExceptionContext( - new WrapperCommandSyntaxException(original) + new WrapperCommandSyntaxException(original), + new WrapperStringReader(stringReader) )); } catch (WrapperCommandSyntaxException newException) { throw newException.getException(); diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionContext.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionContext.java index 05b6eb437e..e6bb65793a 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionContext.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionContext.java @@ -1,12 +1,17 @@ package dev.jorel.commandapi.arguments; +import com.mojang.brigadier.StringReader; import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.exceptions.CommandSyntaxException; import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException; +import dev.jorel.commandapi.wrappers.WrapperStringReader; /** * A record containing information on why a Brigadier {@link ArgumentType} failed to parse its raw input. * - * @param exception The CommandSyntaxException that was thrown when the {@link ArgumentType} failed to parse + * @param exception The {@link CommandSyntaxException} that was thrown when the ArgumentType failed to parse. + * @param stringReader The {@link StringReader} used for reading in the command. + * The cursor is at the beginning of the argument. */ -public record InitialParseExceptionContext(WrapperCommandSyntaxException exception) { +public record InitialParseExceptionContext(WrapperCommandSyntaxException exception, WrapperStringReader stringReader) { } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/wrappers/WrapperStringReader.java b/commandapi-core/src/main/java/dev/jorel/commandapi/wrappers/WrapperStringReader.java new file mode 100644 index 0000000000..e46bd42b85 --- /dev/null +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/wrappers/WrapperStringReader.java @@ -0,0 +1,180 @@ +package dev.jorel.commandapi.wrappers; + +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException; + +/** + * A wrapper for the StringReader so other developers don't have to import Mojang's Brigadier + */ +public class WrapperStringReader { + + /** + * The Brigadier StringReader this class wraps + */ + private final StringReader stringReader; + + /** + * Creates a WrapperStringReader + * + * @param stringReader the StringReader to wrap + */ + public WrapperStringReader(StringReader stringReader) { + this.stringReader = stringReader; + } + + /** + * Returns the wrapped StringReader + * + * @return the wrapped StringReader + */ + public StringReader getException() { + return this.stringReader; + } + + // Overrides - Pass everything to the wrapped StringReader + // Also wrap CommandSyntaxExceptions in WrapperCommandSyntaxExceptions + public String getString() { + return stringReader.getString(); + } + + public void setCursor(int cursor) { + stringReader.setCursor(cursor); + } + + public int getRemainingLength() { + return stringReader.getRemainingLength(); + } + + public int getTotalLength() { + return stringReader.getTotalLength(); + } + + public int getCursor() { + return stringReader.getCursor(); + } + + public String getRead() { + return stringReader.getRead(); + } + + public String getRemaining() { + return stringReader.getRemaining(); + } + + public boolean canRead(int length) { + return stringReader.canRead(length); + } + + public boolean canRead() { + return stringReader.canRead(); + } + + public char peek() { + return stringReader.peek(); + } + + public char peek(int offset) { + return stringReader.peek(offset); + } + + public char read() { + return stringReader.read(); + } + + public void skip() { + stringReader.skip(); + } + + public static boolean isAllowedNumber(char c) { + return StringReader.isAllowedNumber(c); + } + + public static boolean isQuotedStringStart(char c) { + return StringReader.isQuotedStringStart(c); + } + + public void skipWhitespace() { + stringReader.skipWhitespace(); + } + + public int readInt() throws WrapperCommandSyntaxException { + try { + return stringReader.readInt(); + } catch (CommandSyntaxException e) { + throw new WrapperCommandSyntaxException(e); + } + } + + public long readLong() throws WrapperCommandSyntaxException { + try { + return stringReader.readLong(); + } catch (CommandSyntaxException e) { + throw new WrapperCommandSyntaxException(e); + } + } + + public double readDouble() throws WrapperCommandSyntaxException { + try { + return stringReader.readDouble(); + } catch (CommandSyntaxException e) { + throw new WrapperCommandSyntaxException(e); + } + } + + public float readFloat() throws WrapperCommandSyntaxException { + try { + return stringReader.readFloat(); + } catch (CommandSyntaxException e) { + throw new WrapperCommandSyntaxException(e); + } + } + + public static boolean isAllowedInUnquotedString(char c) { + return StringReader.isAllowedInUnquotedString(c); + } + + public String readUnquotedString() { + return stringReader.readUnquotedString(); + } + + public String readQuotedString() throws WrapperCommandSyntaxException { + try { + return stringReader.readQuotedString(); + } catch (CommandSyntaxException e) { + throw new WrapperCommandSyntaxException(e); + } + } + + public String readStringUntil(char terminator) throws WrapperCommandSyntaxException { + try { + return stringReader.readStringUntil(terminator); + } catch (CommandSyntaxException e) { + throw new WrapperCommandSyntaxException(e); + } + } + + public String readString() throws WrapperCommandSyntaxException { + try { + return stringReader.readString(); + } catch (CommandSyntaxException e) { + throw new WrapperCommandSyntaxException(e); + } + } + + public boolean readBoolean() throws WrapperCommandSyntaxException { + try { + return stringReader.readBoolean(); + } catch (CommandSyntaxException e) { + throw new WrapperCommandSyntaxException(e); + } + } + + public void expect(char c) throws WrapperCommandSyntaxException { + try { + stringReader.expect(c); + } catch (CommandSyntaxException e) { + throw new WrapperCommandSyntaxException(e); + } + } +} From 5e1f02dd93338e85161a7042898d3caa74732989 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sat, 3 Dec 2022 13:56:44 -0500 Subject: [PATCH 22/58] Add sender, input, and previousArguments to ArgumentParseExceptionContext --- .../main/java/dev/jorel/commandapi/arguments/Argument.java | 5 ++++- .../commandapi/arguments/ArgumentParseExceptionContext.java | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java index e763007794..61b115ee81 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/Argument.java @@ -119,7 +119,10 @@ public final T parseArgumentHandleError(NMS Date: Sun, 4 Dec 2022 11:19:45 -0500 Subject: [PATCH 23/58] Clean up imports after merging --- .../jorel/commandapi/nms/NMS_1_17_Common.java | 53 -------- .../dev/jorel/commandapi/nms/NMS_1_18_R2.java | 62 --------- .../dev/jorel/commandapi/nms/NMS_1_18_R1.java | 121 +++++++----------- .../jorel/commandapi/nms/NMS_1_19_Common.java | 1 - 4 files changed, 44 insertions(+), 193 deletions(-) diff --git a/commandapi-nms/commandapi-1.17-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_17_Common.java b/commandapi-nms/commandapi-1.17-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_17_Common.java index 578620f221..fecf28e0fb 100644 --- a/commandapi-nms/commandapi-1.17-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_17_Common.java +++ b/commandapi-nms/commandapi-1.17-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_17_Common.java @@ -20,52 +20,6 @@ *******************************************************************************/ package dev.jorel.commandapi.nms; -import java.io.File; -import java.io.IOException; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.VarHandle; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.function.Predicate; -import java.util.function.ToIntFunction; - -import org.bukkit.Bukkit; -import org.bukkit.Color; -import org.bukkit.Location; -import org.bukkit.NamespacedKey; -import org.bukkit.Particle; -import org.bukkit.Particle.DustOptions; -import org.bukkit.Particle.DustTransition; -import org.bukkit.Vibration; -import org.bukkit.Vibration.Destination; -import org.bukkit.Vibration.Destination.BlockDestination; -import org.bukkit.Vibration.Destination.EntityDestination; -import org.bukkit.World; -import org.bukkit.block.Biome; -import org.bukkit.block.Block; -import org.bukkit.block.data.BlockData; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.SimpleCommandMap; -import org.bukkit.craftbukkit.v1_17_R1.CraftLootTable; -import org.bukkit.craftbukkit.v1_17_R1.CraftParticle; -import org.bukkit.craftbukkit.v1_17_R1.CraftServer; -import org.bukkit.craftbukkit.v1_17_R1.CraftSound; -import org.bukkit.craftbukkit.v1_17_R1.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_17_R1.command.VanillaCommandWrapper; -import org.bukkit.craftbukkit.v1_17_R1.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_17_R1.help.CustomHelpTopic; -import org.bukkit.craftbukkit.v1_17_R1.help.SimpleHelpMap; -import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.help.HelpTopic; -import org.bukkit.potion.PotionEffectType; - import com.google.common.io.Files; import com.google.gson.GsonBuilder; import com.mojang.brigadier.CommandDispatcher; @@ -84,12 +38,6 @@ import net.minecraft.commands.CommandFunction.Entry; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.*; -import net.minecraft.commands.arguments.ComponentArgument; -import net.minecraft.commands.arguments.EntityArgument; -import net.minecraft.commands.arguments.EntitySummonArgument; -import net.minecraft.commands.arguments.MobEffectArgument; -import net.minecraft.commands.arguments.ParticleArgument; -import net.minecraft.commands.arguments.ResourceLocationArgument; import net.minecraft.commands.arguments.blocks.BlockPredicateArgument; import net.minecraft.commands.arguments.blocks.BlockStateArgument; import net.minecraft.commands.arguments.coordinates.BlockPosArgument; @@ -159,7 +107,6 @@ import java.util.function.Predicate; import java.util.function.ToIntFunction; -// TODO: Clean up import merge // Mojang-Mapped reflection /** * NMS implementation for Minecraft 1.17 and 1.17.1 diff --git a/commandapi-nms/commandapi-1.18.2/src/main/java/dev/jorel/commandapi/nms/NMS_1_18_R2.java b/commandapi-nms/commandapi-1.18.2/src/main/java/dev/jorel/commandapi/nms/NMS_1_18_R2.java index 7beedba294..1633845dbf 100644 --- a/commandapi-nms/commandapi-1.18.2/src/main/java/dev/jorel/commandapi/nms/NMS_1_18_R2.java +++ b/commandapi-nms/commandapi-1.18.2/src/main/java/dev/jorel/commandapi/nms/NMS_1_18_R2.java @@ -20,60 +20,6 @@ *******************************************************************************/ package dev.jorel.commandapi.nms; -import java.io.File; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.VarHandle; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.function.Predicate; -import java.util.function.ToIntFunction; - -import org.bukkit.Bukkit; -import org.bukkit.Color; -import org.bukkit.Keyed; -import org.bukkit.Location; -import org.bukkit.NamespacedKey; -import org.bukkit.Particle; -import org.bukkit.Particle.DustOptions; -import org.bukkit.Particle.DustTransition; -import org.bukkit.Vibration; -import org.bukkit.Vibration.Destination; -import org.bukkit.Vibration.Destination.BlockDestination; -import org.bukkit.Vibration.Destination.EntityDestination; -import org.bukkit.World; -import org.bukkit.block.Biome; -import org.bukkit.block.Block; -import org.bukkit.block.data.BlockData; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.SimpleCommandMap; -import org.bukkit.craftbukkit.v1_18_R2.CraftLootTable; -import org.bukkit.craftbukkit.v1_18_R2.CraftParticle; -import org.bukkit.craftbukkit.v1_18_R2.CraftServer; -import org.bukkit.craftbukkit.v1_18_R2.CraftSound; -import org.bukkit.craftbukkit.v1_18_R2.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_18_R2.command.VanillaCommandWrapper; -import org.bukkit.craftbukkit.v1_18_R2.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_18_R2.help.CustomHelpTopic; -import org.bukkit.craftbukkit.v1_18_R2.help.SimpleHelpMap; -import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.help.HelpTopic; -import org.bukkit.inventory.Recipe; -import org.bukkit.potion.PotionEffectType; - import com.google.common.collect.ImmutableList; import com.google.common.io.Files; import com.google.gson.GsonBuilder; @@ -97,13 +43,6 @@ import net.minecraft.commands.CommandFunction.Entry; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.*; -import net.minecraft.commands.arguments.ComponentArgument; -import net.minecraft.commands.arguments.EntityArgument; -import net.minecraft.commands.arguments.EntitySummonArgument; -import net.minecraft.commands.arguments.MobEffectArgument; -import net.minecraft.commands.arguments.ParticleArgument; -import net.minecraft.commands.arguments.ResourceLocationArgument; -import net.minecraft.commands.arguments.ResourceOrTagLocationArgument; import net.minecraft.commands.arguments.ResourceOrTagLocationArgument.Result; import net.minecraft.commands.arguments.blocks.BlockPredicateArgument; import net.minecraft.commands.arguments.blocks.BlockStateArgument; @@ -185,7 +124,6 @@ import java.util.concurrent.CompletableFuture; import java.util.function.Predicate; import java.util.function.ToIntFunction; -// TODO: Clean up import merge // Mojang-Mapped reflection /** diff --git a/commandapi-nms/commandapi-1.18/src/main/java/dev/jorel/commandapi/nms/NMS_1_18_R1.java b/commandapi-nms/commandapi-1.18/src/main/java/dev/jorel/commandapi/nms/NMS_1_18_R1.java index f822b20895..5379713d00 100644 --- a/commandapi-nms/commandapi-1.18/src/main/java/dev/jorel/commandapi/nms/NMS_1_18_R1.java +++ b/commandapi-nms/commandapi-1.18/src/main/java/dev/jorel/commandapi/nms/NMS_1_18_R1.java @@ -20,63 +20,6 @@ *******************************************************************************/ package dev.jorel.commandapi.nms; -import java.io.File; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.VarHandle; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.function.Predicate; -import java.util.function.ToIntFunction; - -import com.mojang.brigadier.Message; -import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.chat.ComponentSerializer; -import net.minecraft.commands.arguments.*; -import org.bukkit.Bukkit; -import org.bukkit.Color; -import org.bukkit.Keyed; -import org.bukkit.Location; -import org.bukkit.NamespacedKey; -import org.bukkit.Particle; -import org.bukkit.Particle.DustOptions; -import org.bukkit.Particle.DustTransition; -import org.bukkit.Vibration; -import org.bukkit.Vibration.Destination; -import org.bukkit.Vibration.Destination.BlockDestination; -import org.bukkit.Vibration.Destination.EntityDestination; -import org.bukkit.World; -import org.bukkit.block.Biome; -import org.bukkit.block.Block; -import org.bukkit.block.data.BlockData; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.SimpleCommandMap; -import org.bukkit.craftbukkit.v1_18_R1.CraftLootTable; -import org.bukkit.craftbukkit.v1_18_R1.CraftParticle; -import org.bukkit.craftbukkit.v1_18_R1.CraftServer; -import org.bukkit.craftbukkit.v1_18_R1.CraftSound; -import org.bukkit.craftbukkit.v1_18_R1.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_18_R1.command.VanillaCommandWrapper; -import org.bukkit.craftbukkit.v1_18_R1.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_18_R1.help.CustomHelpTopic; -import org.bukkit.craftbukkit.v1_18_R1.help.SimpleHelpMap; -import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.help.HelpTopic; -import org.bukkit.inventory.Recipe; -import org.bukkit.potion.PotionEffectType; - import com.google.common.io.Files; import com.google.gson.GsonBuilder; import com.mojang.brigadier.CommandDispatcher; @@ -84,29 +27,20 @@ import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import dev.jorel.commandapi.CommandAPI; import dev.jorel.commandapi.CommandAPIHandler; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; import dev.jorel.commandapi.preprocessor.Differs; import dev.jorel.commandapi.preprocessor.NMSMeta; import dev.jorel.commandapi.preprocessor.RequireField; -import dev.jorel.commandapi.wrappers.FunctionWrapper; -import dev.jorel.commandapi.wrappers.Location2D; -import dev.jorel.commandapi.wrappers.NativeProxyCommandSender; -import dev.jorel.commandapi.wrappers.ParticleData; -import dev.jorel.commandapi.wrappers.SimpleFunctionWrapper; +import dev.jorel.commandapi.wrappers.*; import io.papermc.paper.text.PaperComponents; import net.kyori.adventure.text.Component; import net.minecraft.Util; import net.minecraft.commands.CommandFunction; import net.minecraft.commands.CommandFunction.Entry; import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.arguments.ComponentArgument; -import net.minecraft.commands.arguments.EntityArgument; -import net.minecraft.commands.arguments.EntitySummonArgument; -import net.minecraft.commands.arguments.MobEffectArgument; -import net.minecraft.commands.arguments.ParticleArgument; -import net.minecraft.commands.arguments.ResourceLocationArgument; +import net.minecraft.commands.arguments.*; import net.minecraft.commands.arguments.blocks.BlockPredicateArgument; import net.minecraft.commands.arguments.blocks.BlockStateArgument; import net.minecraft.commands.arguments.coordinates.BlockPosArgument; @@ -120,13 +54,7 @@ import net.minecraft.commands.synchronization.ArgumentTypes; import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; -import net.minecraft.core.particles.BlockParticleOption; -import net.minecraft.core.particles.DustColorTransitionOptions; -import net.minecraft.core.particles.DustParticleOptions; -import net.minecraft.core.particles.ItemParticleOption; -import net.minecraft.core.particles.ParticleOptions; -import net.minecraft.core.particles.SimpleParticleType; -import net.minecraft.core.particles.VibrationParticleOption; +import net.minecraft.core.particles.*; import net.minecraft.network.chat.Component.Serializer; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; @@ -144,7 +72,46 @@ import net.minecraft.world.level.gameevent.EntityPositionSource; import net.minecraft.world.phys.Vec2; import net.minecraft.world.phys.Vec3; -// TODO: Clean up import merge +import org.bukkit.*; +import org.bukkit.Particle.DustOptions; +import org.bukkit.Particle.DustTransition; +import org.bukkit.Vibration.Destination; +import org.bukkit.Vibration.Destination.BlockDestination; +import org.bukkit.Vibration.Destination.EntityDestination; +import org.bukkit.block.Biome; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.SimpleCommandMap; +import org.bukkit.craftbukkit.v1_18_R1.CraftLootTable; +import org.bukkit.craftbukkit.v1_18_R1.CraftParticle; +import org.bukkit.craftbukkit.v1_18_R1.CraftServer; +import org.bukkit.craftbukkit.v1_18_R1.CraftSound; +import org.bukkit.craftbukkit.v1_18_R1.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_18_R1.command.VanillaCommandWrapper; +import org.bukkit.craftbukkit.v1_18_R1.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_18_R1.help.CustomHelpTopic; +import org.bukkit.craftbukkit.v1_18_R1.help.SimpleHelpMap; +import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.help.HelpTopic; +import org.bukkit.inventory.Recipe; +import org.bukkit.potion.PotionEffectType; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.function.Predicate; +import java.util.function.ToIntFunction; // Mojang-Mapped reflection /** diff --git a/commandapi-nms/commandapi-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java b/commandapi-nms/commandapi-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java index a0a6b9978d..592fa4c78f 100644 --- a/commandapi-nms/commandapi-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java +++ b/commandapi-nms/commandapi-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java @@ -167,7 +167,6 @@ import net.minecraft.world.level.gameevent.EntityPositionSource; import net.minecraft.world.phys.Vec2; import net.minecraft.world.phys.Vec3; -// TODO: Clean up import merge // Mojang-Mapped reflection /** From 5a7f377998dc783b1f18171e0e50c5d682168dc8 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Tue, 3 Jan 2023 12:25:59 -0500 Subject: [PATCH 24/58] Fix registerCustomArgumentType in 1.19.3 --- .../commandapi-bukkit-1.19.3/pom.xml | 8 -- .../ExceptionHandlingArgumentInfo_1_19_3.java | 86 +++++++++++++++++++ .../jorel/commandapi/nms/NMS_1_19_3_R2.java | 7 +- .../commandapi/preprocessor/Differs.java | 2 +- 4 files changed, 91 insertions(+), 12 deletions(-) create mode 100644 commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_1_19_3.java diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/pom.xml b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/pom.xml index 1ebe25356e..0eff2847ea 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/pom.xml +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/pom.xml @@ -87,14 +87,6 @@ mojang-mapped provided - - - dev.jorel - commandapi-bukkit-1.19-common - ${project.version} - mojang-mapped - provided - diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_1_19_3.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_1_19_3.java new file mode 100644 index 0000000000..5ca9ff9620 --- /dev/null +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_1_19_3.java @@ -0,0 +1,86 @@ +package dev.jorel.commandapi.nms; + +import com.google.gson.JsonObject; +import com.mojang.brigadier.arguments.ArgumentType; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import dev.jorel.commandapi.preprocessor.Differs; +import net.minecraft.commands.CommandBuildContext; +import net.minecraft.commands.synchronization.ArgumentTypeInfo; +import net.minecraft.commands.synchronization.ArgumentTypeInfos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.FriendlyByteBuf; + +@Differs(from = {"1.19", "1.19.1", "1.19.2"}, + by = "Registry.COMMAND_ARGUMENT_TYPE renamed to BuiltInRegistries.COMMAND_ARGUMENT_TYPE") +public class ExceptionHandlingArgumentInfo_1_19_3 implements ArgumentTypeInfo, ExceptionHandlingArgumentInfo_1_19_3.Template> { + @Override + public void serializeToNetwork(Template template, FriendlyByteBuf friendlyByteBuf) { + ArgumentType baseType = template.baseType; + ArgumentTypeInfo, ArgumentTypeInfo.Template>> baseInfo = + (ArgumentTypeInfo, ArgumentTypeInfo.Template>>) ArgumentTypeInfos.byClass(baseType); + + // Overwrite my id with the base type's. Since there are less than + // 128 argument types by default, assume index will always fill 1 byte. + // If you get a garbage packet, check this assumption + int baseId = BuiltInRegistries.COMMAND_ARGUMENT_TYPE.getId(baseInfo); + friendlyByteBuf.writerIndex(friendlyByteBuf.writerIndex() - 1); + friendlyByteBuf.writeVarInt(baseId); + + // Add the base type to the packet + baseInfo.serializeToNetwork(baseInfo.unpack(baseType), friendlyByteBuf); + } + + @Override + public void serializeToJson(Template template, JsonObject properties) { + ArgumentType baseType = template.baseType; + ArgumentTypeInfo, ArgumentTypeInfo.Template>> baseInfo = + (ArgumentTypeInfo, ArgumentTypeInfo.Template>>) ArgumentTypeInfos.byClass(baseType); + properties.addProperty("baseType", BuiltInRegistries.COMMAND_ARGUMENT_TYPE.getKey(baseInfo).toString()); + JsonObject subProperties = new JsonObject(); + baseInfo.serializeToJson(baseInfo.unpack(baseType), subProperties); + if(subProperties.size() > 0) { + properties.add("baseProperties", subProperties); + } + } + + @Override + public Template unpack(ExceptionHandlingArgumentType exceptionHandlingArgumentType) { + ArgumentType baseType = exceptionHandlingArgumentType.baseType(); + return new Template(baseType); + } + + @Override + public Template deserializeFromNetwork(FriendlyByteBuf friendlyByteBuf) { + // Since this class overrides its COMMAND_ARGUMENT_TYPE id with the baseType's, + // this class's id should never show up in a packet and this method should never + // be called to deserialize the ArgumentType info that wasn't put into the packet + // anyway. Also, the server shouldn't ever deserialize a *ClientBound*CommandPacket + // either. If this method ever gets called, either you or I are doing something very wrong! + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentInfo_1_19_3#deserializeFromNetwork for more information"); + // Including a mini-stacktrace here in case this exception shows up + // on a client-disconnected screen, which is not very helpful + } + + public final class Template implements ArgumentTypeInfo.Template> { + final ArgumentType baseType; + + public Template(ArgumentType baseType) { + this.baseType = baseType; + } + + @Override + public ArgumentTypeInfo, ?> type() { + return ExceptionHandlingArgumentInfo_1_19_3.this; + } + + @Override + public ExceptionHandlingArgumentType instantiate(CommandBuildContext commandBuildContext) { + // Same as ExceptionHandlingArgumentInfo_1_19_3#deserializeFromNetwork. + // An ExceptionHandlingArgumentType should never be built from a packet, + // so this method shouldn't be used + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentInfo_1_19_3.Template#instantiate for more information"); + // Including a mini-stacktrace here in case this exception shows up + // on a client-disconnected screen, which is not very helpful + } + } +} diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java index fb69942716..631ed9427c 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java @@ -782,11 +782,12 @@ public final void resendPackets(Player player) { @Override @Differs(from = {"1.19", "1.19.1", "1.19.2"}, - by = "Registry.CommandArgumentType renamed to BuiltInRegistries.COMMAND_ARGUMENT_TYPE") + by = "Registry.COMMAND_ARGUMENT_TYPE renamed to BuiltInRegistries.COMMAND_ARGUMENT_TYPE" + + " MappedRegistry#ca -> MappedRegistry#l (Registries frozen)") public void registerCustomArgumentType() { try { // Unfreeze registry - Field isFrozen = CommandAPIHandler.getField(MappedRegistry.class, "ca"); + Field isFrozen = CommandAPIHandler.getField(MappedRegistry.class, "l"); isFrozen.set(BuiltInRegistries.COMMAND_ARGUMENT_TYPE, false); @@ -796,7 +797,7 @@ public void registerCustomArgumentType() { registerArgument.setAccessible(true); registerArgument.invoke(null, BuiltInRegistries.COMMAND_ARGUMENT_TYPE, "commandapi:exception_handler", - ExceptionHandlingArgumentType.class, new ExceptionHandlingArgumentInfo_1_19_Common<>()); + ExceptionHandlingArgumentType.class, new ExceptionHandlingArgumentInfo_1_19_3<>()); } catch (ReflectiveOperationException e) { e.printStackTrace(); } diff --git a/commandapi-preprocessor/src/main/java/dev/jorel/commandapi/preprocessor/Differs.java b/commandapi-preprocessor/src/main/java/dev/jorel/commandapi/preprocessor/Differs.java index ee2e081430..f3678053df 100644 --- a/commandapi-preprocessor/src/main/java/dev/jorel/commandapi/preprocessor/Differs.java +++ b/commandapi-preprocessor/src/main/java/dev/jorel/commandapi/preprocessor/Differs.java @@ -29,7 +29,7 @@ * Literally just a fancy comment that I can put next to stuff to know how it * differs from previous versions */ -@Target(ElementType.METHOD) +@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.SOURCE) public @interface Differs { From a62ddc33ee42cf9c0f7aef634a9e37c157dd21fc Mon Sep 17 00:00:00 2001 From: BuildTools Date: Tue, 3 Jan 2023 12:26:48 -0500 Subject: [PATCH 25/58] Add example command for standard testing (Bukkit) --- .../dev/jorel/commandapi/CommandAPIMain.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index b4a2d109a7..fe7b299d75 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -26,6 +26,8 @@ import java.util.Map; import java.util.Map.Entry; +import dev.jorel.commandapi.arguments.GreedyStringArgument; +import dev.jorel.commandapi.arguments.IntegerArgument; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.plugin.InvalidPluginException; @@ -119,6 +121,29 @@ public void onLoad() { for (String commandName : fileConfig.getStringList("other-commands-to-convert")) { new AdvancedConverter(commandName).convertCommand(); } + + // TODO: Finish testing, remove this and clean up imports + new CommandAPICommand("rate") + .withArguments( + new IntegerArgument("rating", 0, 10) + .withInitialParseExceptionHandler(context -> { + String message = context.exception().getMessage(); + if(message.startsWith("Integer must not be less than")) { + context.stringReader().readInt(); + return 0; // Integer too low, move to 0 + } else if(message.startsWith("Integer must not be more than")) { + context.stringReader().readInt(); + return 10; // Integer too high, cap to 10 + } else { + throw context.exception(); // Integer wasn't entered, use original exception + } + }), + new GreedyStringArgument("message") + ).executes((sender, args) -> { + sender.sendMessage("Thanks for rating " + args.get(0) + "/10"); + sender.sendMessage("We will consider your feedback: \"" + args.get(1) + "\""); + }) + .register(); } @Override From a35913f6ff4be34ec5770986e16aecdb90b65e34 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Tue, 3 Jan 2023 12:46:31 -0500 Subject: [PATCH 26/58] Clean up after merge --- .../jorel/commandapi/CommandAPIHandler.java | 2 +- .../dev/jorel/commandapi/nms/NMS_1_13_1.java | 112 ++++-------- .../dev/jorel/commandapi/nms/NMS_1_13.java | 110 ++++-------- .../dev/jorel/commandapi/nms/NMS_1_14.java | 168 +++++------------ .../dev/jorel/commandapi/nms/NMS_1_15.java | 170 +++++------------- .../jorel/commandapi/nms/NMS_1_19_3_R2.java | 62 ------- 6 files changed, 160 insertions(+), 464 deletions(-) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIHandler.java b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIHandler.java index 95cc3a34c4..38de7723af 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIHandler.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIHandler.java @@ -35,8 +35,8 @@ import com.mojang.brigadier.tree.LiteralCommandNode; import dev.jorel.commandapi.arguments.*; import dev.jorel.commandapi.commandsenders.AbstractCommandSender; -import dev.jorel.commandapi.executors.ExecutionInfo; import dev.jorel.commandapi.executors.CommandArguments; +import dev.jorel.commandapi.executors.ExecutionInfo; import dev.jorel.commandapi.preprocessor.RequireField; import dev.jorel.commandapi.wrappers.PreviewableFunction; diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.13.1/src/main/java/dev/jorel/commandapi/nms/NMS_1_13_1.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.13.1/src/main/java/dev/jorel/commandapi/nms/NMS_1_13_1.java index e2d27169bc..4791b0ef3d 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.13.1/src/main/java/dev/jorel/commandapi/nms/NMS_1_13_1.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.13.1/src/main/java/dev/jorel/commandapi/nms/NMS_1_13_1.java @@ -1,50 +1,43 @@ package dev.jorel.commandapi.nms; -import java.io.File; -import java.io.IOException; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.VarHandle; -import java.util.ArrayList; -import java.util.Collection; -import java.util.EnumSet; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.function.ToIntFunction; - +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.Message; +import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.suggestion.SuggestionProvider; +import com.mojang.brigadier.suggestion.Suggestions; +import dev.jorel.commandapi.CommandAPI; +import dev.jorel.commandapi.CommandAPIHandler; +import dev.jorel.commandapi.arguments.ArgumentSubType; import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import dev.jorel.commandapi.arguments.SuggestionProviders; +import dev.jorel.commandapi.commandsenders.AbstractCommandSender; +import dev.jorel.commandapi.commandsenders.BukkitCommandSender; +import dev.jorel.commandapi.commandsenders.BukkitNativeProxyCommandSender; +import dev.jorel.commandapi.exceptions.UnimplementedArgumentException; +import dev.jorel.commandapi.preprocessor.Differs; +import dev.jorel.commandapi.preprocessor.NMSMeta; +import dev.jorel.commandapi.preprocessor.RequireField; +import dev.jorel.commandapi.wrappers.Rotation; +import dev.jorel.commandapi.wrappers.*; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.chat.ComponentSerializer; import net.minecraft.server.v1_13_R2.*; -import com.mojang.brigadier.CommandDispatcher; -import com.mojang.brigadier.CommandDispatcher; -import org.bukkit.Axis; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Color; -import org.bukkit.Location; -import org.bukkit.NamespacedKey; -import org.bukkit.OfflinePlayer; +import net.minecraft.server.v1_13_R2.CriterionConditionValue.c; +import net.minecraft.server.v1_13_R2.EnumDirection.EnumAxis; +import net.minecraft.server.v1_13_R2.IChatBaseComponent.ChatSerializer; import org.bukkit.Particle; -import org.bukkit.Particle.DustOptions; -import org.bukkit.Sound; +import org.bukkit.*; import org.bukkit.World; +import org.bukkit.Particle.DustOptions; import org.bukkit.World.Environment; import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.command.RemoteConsoleCommandSender; -import org.bukkit.command.SimpleCommandMap; -import org.bukkit.craftbukkit.v1_13_R2.CraftLootTable; -import org.bukkit.craftbukkit.v1_13_R2.CraftParticle; -import org.bukkit.craftbukkit.v1_13_R2.CraftServer; -import org.bukkit.craftbukkit.v1_13_R2.CraftSound; -import org.bukkit.craftbukkit.v1_13_R2.CraftWorld; +import org.bukkit.command.*; +import org.bukkit.craftbukkit.v1_13_R2.*; import org.bukkit.craftbukkit.v1_13_R2.block.data.CraftBlockData; import org.bukkit.craftbukkit.v1_13_R2.command.CraftBlockCommandSender; import org.bukkit.craftbukkit.v1_13_R2.command.ProxiedNativeCommandSender; @@ -65,41 +58,14 @@ import org.bukkit.inventory.Recipe; import org.bukkit.potion.PotionEffectType; -import com.mojang.brigadier.Message; -import com.mojang.brigadier.arguments.ArgumentType; -import com.mojang.brigadier.context.CommandContext; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.mojang.brigadier.suggestion.SuggestionProvider; -import com.mojang.brigadier.suggestion.Suggestions; - -import dev.jorel.commandapi.CommandAPI; -import dev.jorel.commandapi.CommandAPIHandler; -import dev.jorel.commandapi.arguments.ArgumentSubType; -import dev.jorel.commandapi.arguments.SuggestionProviders; -import dev.jorel.commandapi.commandsenders.AbstractCommandSender; -import dev.jorel.commandapi.commandsenders.BukkitCommandSender; -import dev.jorel.commandapi.commandsenders.BukkitNativeProxyCommandSender; -import dev.jorel.commandapi.exceptions.UnimplementedArgumentException; -import dev.jorel.commandapi.preprocessor.Differs; -import dev.jorel.commandapi.preprocessor.NMSMeta; -import dev.jorel.commandapi.preprocessor.RequireField; -import dev.jorel.commandapi.wrappers.FloatRange; -import dev.jorel.commandapi.wrappers.FunctionWrapper; -import dev.jorel.commandapi.wrappers.IntegerRange; -import dev.jorel.commandapi.wrappers.Location2D; -import dev.jorel.commandapi.wrappers.MathOperation; -import dev.jorel.commandapi.wrappers.NativeProxyCommandSender; -import dev.jorel.commandapi.wrappers.ParticleData; -import dev.jorel.commandapi.wrappers.Rotation; -import dev.jorel.commandapi.wrappers.ScoreboardSlot; -import dev.jorel.commandapi.wrappers.SimpleFunctionWrapper; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.chat.ComponentSerializer; -import net.minecraft.server.v1_13_R2.CriterionConditionValue.c; -import net.minecraft.server.v1_13_R2.EnumDirection.EnumAxis; -import net.minecraft.server.v1_13_R2.IChatBaseComponent.ChatSerializer; +import java.io.File; +import java.io.IOException; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; +import java.util.*; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.ToIntFunction; /** * NMS implementation for Minecraft 1.13.1 diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.13/src/main/java/dev/jorel/commandapi/nms/NMS_1_13.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.13/src/main/java/dev/jorel/commandapi/nms/NMS_1_13.java index e76369ce73..cc822184bc 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.13/src/main/java/dev/jorel/commandapi/nms/NMS_1_13.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.13/src/main/java/dev/jorel/commandapi/nms/NMS_1_13.java @@ -1,50 +1,42 @@ package dev.jorel.commandapi.nms; -import java.io.File; -import java.io.IOException; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.VarHandle; -import java.util.ArrayList; -import java.util.Collection; -import java.util.EnumSet; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.function.ToIntFunction; - +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.Message; +import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.suggestion.SuggestionProvider; +import com.mojang.brigadier.suggestion.Suggestions; +import dev.jorel.commandapi.CommandAPI; +import dev.jorel.commandapi.CommandAPIHandler; +import dev.jorel.commandapi.arguments.ArgumentSubType; import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import dev.jorel.commandapi.arguments.SuggestionProviders; +import dev.jorel.commandapi.commandsenders.AbstractCommandSender; +import dev.jorel.commandapi.commandsenders.BukkitCommandSender; +import dev.jorel.commandapi.commandsenders.BukkitNativeProxyCommandSender; +import dev.jorel.commandapi.exceptions.UnimplementedArgumentException; +import dev.jorel.commandapi.preprocessor.NMSMeta; +import dev.jorel.commandapi.preprocessor.RequireField; +import dev.jorel.commandapi.wrappers.Rotation; +import dev.jorel.commandapi.wrappers.*; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.chat.ComponentSerializer; import net.minecraft.server.v1_13_R1.*; -import com.mojang.brigadier.CommandDispatcher; -import net.minecraft.server.v1_13_R1.Advancement; -import org.bukkit.Axis; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Color; -import org.bukkit.Location; -import org.bukkit.NamespacedKey; -import org.bukkit.OfflinePlayer; +import net.minecraft.server.v1_13_R1.CriterionConditionValue.c; +import net.minecraft.server.v1_13_R1.EnumDirection.EnumAxis; +import net.minecraft.server.v1_13_R1.IChatBaseComponent.ChatSerializer; import org.bukkit.Particle; -import org.bukkit.Particle.DustOptions; -import org.bukkit.Sound; +import org.bukkit.*; import org.bukkit.World; +import org.bukkit.Particle.DustOptions; import org.bukkit.World.Environment; import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.command.RemoteConsoleCommandSender; -import org.bukkit.command.SimpleCommandMap; -import org.bukkit.craftbukkit.v1_13_R1.CraftLootTable; -import org.bukkit.craftbukkit.v1_13_R1.CraftParticle; -import org.bukkit.craftbukkit.v1_13_R1.CraftServer; -import org.bukkit.craftbukkit.v1_13_R1.CraftSound; -import org.bukkit.craftbukkit.v1_13_R1.CraftWorld; +import org.bukkit.command.*; +import org.bukkit.craftbukkit.v1_13_R1.*; import org.bukkit.craftbukkit.v1_13_R1.block.data.CraftBlockData; import org.bukkit.craftbukkit.v1_13_R1.command.CraftBlockCommandSender; import org.bukkit.craftbukkit.v1_13_R1.command.ProxiedNativeCommandSender; @@ -65,40 +57,14 @@ import org.bukkit.inventory.Recipe; import org.bukkit.potion.PotionEffectType; -import com.mojang.brigadier.Message; -import com.mojang.brigadier.arguments.ArgumentType; -import com.mojang.brigadier.context.CommandContext; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.mojang.brigadier.suggestion.SuggestionProvider; -import com.mojang.brigadier.suggestion.Suggestions; - -import dev.jorel.commandapi.CommandAPI; -import dev.jorel.commandapi.CommandAPIHandler; -import dev.jorel.commandapi.arguments.ArgumentSubType; -import dev.jorel.commandapi.arguments.SuggestionProviders; -import dev.jorel.commandapi.commandsenders.AbstractCommandSender; -import dev.jorel.commandapi.commandsenders.BukkitCommandSender; -import dev.jorel.commandapi.commandsenders.BukkitNativeProxyCommandSender; -import dev.jorel.commandapi.exceptions.UnimplementedArgumentException; -import dev.jorel.commandapi.preprocessor.NMSMeta; -import dev.jorel.commandapi.preprocessor.RequireField; -import dev.jorel.commandapi.wrappers.FloatRange; -import dev.jorel.commandapi.wrappers.FunctionWrapper; -import dev.jorel.commandapi.wrappers.IntegerRange; -import dev.jorel.commandapi.wrappers.Location2D; -import dev.jorel.commandapi.wrappers.MathOperation; -import dev.jorel.commandapi.wrappers.NativeProxyCommandSender; -import dev.jorel.commandapi.wrappers.ParticleData; -import dev.jorel.commandapi.wrappers.Rotation; -import dev.jorel.commandapi.wrappers.ScoreboardSlot; -import dev.jorel.commandapi.wrappers.SimpleFunctionWrapper; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.chat.ComponentSerializer; -import net.minecraft.server.v1_13_R1.CriterionConditionValue.c; -import net.minecraft.server.v1_13_R1.EnumDirection.EnumAxis; -import net.minecraft.server.v1_13_R1.IChatBaseComponent.ChatSerializer; +import java.io.File; +import java.io.IOException; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; +import java.util.*; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.ToIntFunction; /** * NMS implementation for Minecraft 1.13 diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.14/src/main/java/dev/jorel/commandapi/nms/NMS_1_14.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.14/src/main/java/dev/jorel/commandapi/nms/NMS_1_14.java index 55ea1f9499..e49666f568 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.14/src/main/java/dev/jorel/commandapi/nms/NMS_1_14.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.14/src/main/java/dev/jorel/commandapi/nms/NMS_1_14.java @@ -1,77 +1,18 @@ package dev.jorel.commandapi.nms; -import java.io.File; -import java.io.IOException; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.VarHandle; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Collection; -import java.util.EnumSet; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.function.ToIntFunction; - -import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; -import com.mojang.brigadier.CommandDispatcher; -import com.mojang.brigadier.CommandDispatcher; -import org.bukkit.Axis; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Color; -import org.bukkit.Location; -import org.bukkit.NamespacedKey; -import org.bukkit.OfflinePlayer; -import org.bukkit.Particle; -import org.bukkit.Particle.DustOptions; -import org.bukkit.Sound; -import org.bukkit.World; -import org.bukkit.World.Environment; -import org.bukkit.block.Block; -import org.bukkit.block.data.BlockData; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.SimpleCommandMap; -import org.bukkit.craftbukkit.v1_14_R1.CraftLootTable; -import org.bukkit.craftbukkit.v1_14_R1.CraftParticle; -import org.bukkit.craftbukkit.v1_14_R1.CraftServer; -import org.bukkit.craftbukkit.v1_14_R1.CraftSound; -import org.bukkit.craftbukkit.v1_14_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_14_R1.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_14_R1.command.VanillaCommandWrapper; -import org.bukkit.craftbukkit.v1_14_R1.enchantments.CraftEnchantment; -import org.bukkit.craftbukkit.v1_14_R1.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_14_R1.help.CustomHelpTopic; -import org.bukkit.craftbukkit.v1_14_R1.help.SimpleHelpMap; -import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_14_R1.potion.CraftPotionEffectType; -import org.bukkit.craftbukkit.v1_14_R1.util.CraftChatMessage; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.help.HelpTopic; -import org.bukkit.inventory.Recipe; -import org.bukkit.potion.PotionEffectType; - import com.google.common.io.Files; import com.google.gson.GsonBuilder; +import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.Message; import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.suggestion.SuggestionProvider; import com.mojang.brigadier.suggestion.Suggestions; - import dev.jorel.commandapi.CommandAPI; import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.arguments.ArgumentSubType; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; import dev.jorel.commandapi.arguments.SuggestionProviders; import dev.jorel.commandapi.commandsenders.AbstractCommandSender; import dev.jorel.commandapi.commandsenders.BukkitCommandSender; @@ -80,79 +21,52 @@ import dev.jorel.commandapi.preprocessor.Differs; import dev.jorel.commandapi.preprocessor.NMSMeta; import dev.jorel.commandapi.preprocessor.RequireField; -import dev.jorel.commandapi.wrappers.FloatRange; -import dev.jorel.commandapi.wrappers.FunctionWrapper; -import dev.jorel.commandapi.wrappers.IntegerRange; -import dev.jorel.commandapi.wrappers.Location2D; -import dev.jorel.commandapi.wrappers.MathOperation; -import dev.jorel.commandapi.wrappers.NativeProxyCommandSender; -import dev.jorel.commandapi.wrappers.ParticleData; import dev.jorel.commandapi.wrappers.Rotation; -import dev.jorel.commandapi.wrappers.ScoreboardSlot; -import dev.jorel.commandapi.wrappers.SimpleFunctionWrapper; +import dev.jorel.commandapi.wrappers.*; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.chat.ComponentSerializer; -import net.minecraft.server.v1_14_R1.Advancement; -import net.minecraft.server.v1_14_R1.ArgumentBlockPredicate; -import net.minecraft.server.v1_14_R1.ArgumentChat; -import net.minecraft.server.v1_14_R1.ArgumentChatComponent; -import net.minecraft.server.v1_14_R1.ArgumentChatFormat; -import net.minecraft.server.v1_14_R1.ArgumentCriterionValue; -import net.minecraft.server.v1_14_R1.ArgumentDimension; -import net.minecraft.server.v1_14_R1.ArgumentEnchantment; -import net.minecraft.server.v1_14_R1.ArgumentEntity; -import net.minecraft.server.v1_14_R1.ArgumentEntitySummon; -import net.minecraft.server.v1_14_R1.ArgumentItemPredicate; -import net.minecraft.server.v1_14_R1.ArgumentItemStack; -import net.minecraft.server.v1_14_R1.ArgumentMathOperation; -import net.minecraft.server.v1_14_R1.ArgumentMinecraftKeyRegistered; -import net.minecraft.server.v1_14_R1.ArgumentMobEffect; -import net.minecraft.server.v1_14_R1.ArgumentNBTTag; -import net.minecraft.server.v1_14_R1.ArgumentParticle; -import net.minecraft.server.v1_14_R1.ArgumentPosition; -import net.minecraft.server.v1_14_R1.ArgumentProfile; -import net.minecraft.server.v1_14_R1.ArgumentRegistry; -import net.minecraft.server.v1_14_R1.ArgumentRotation; -import net.minecraft.server.v1_14_R1.ArgumentRotationAxis; -import net.minecraft.server.v1_14_R1.ArgumentScoreboardCriteria; -import net.minecraft.server.v1_14_R1.ArgumentScoreboardObjective; -import net.minecraft.server.v1_14_R1.ArgumentScoreboardSlot; -import net.minecraft.server.v1_14_R1.ArgumentScoreboardTeam; -import net.minecraft.server.v1_14_R1.ArgumentScoreholder; -import net.minecraft.server.v1_14_R1.ArgumentTag; -import net.minecraft.server.v1_14_R1.ArgumentTile; -import net.minecraft.server.v1_14_R1.ArgumentTime; -import net.minecraft.server.v1_14_R1.ArgumentVec2; -import net.minecraft.server.v1_14_R1.ArgumentVec2I; -import net.minecraft.server.v1_14_R1.ArgumentVec3; -import net.minecraft.server.v1_14_R1.BlockPosition; -import net.minecraft.server.v1_14_R1.BlockPosition2D; -import net.minecraft.server.v1_14_R1.CommandListenerWrapper; -import net.minecraft.server.v1_14_R1.CompletionProviders; -import net.minecraft.server.v1_14_R1.CriterionConditionValue; -import net.minecraft.server.v1_14_R1.CustomFunction; -import net.minecraft.server.v1_14_R1.CustomFunctionData; -import net.minecraft.server.v1_14_R1.DimensionManager; -import net.minecraft.server.v1_14_R1.Entity; -import net.minecraft.server.v1_14_R1.EntityPlayer; -import net.minecraft.server.v1_14_R1.EntitySelector; +import net.minecraft.server.v1_14_R1.*; import net.minecraft.server.v1_14_R1.EnumDirection.EnumAxis; -import net.minecraft.server.v1_14_R1.IBlockData; import net.minecraft.server.v1_14_R1.IChatBaseComponent.ChatSerializer; -import net.minecraft.server.v1_14_R1.ICompletionProvider; -import net.minecraft.server.v1_14_R1.IRegistry; -import net.minecraft.server.v1_14_R1.ItemStack; -import net.minecraft.server.v1_14_R1.MinecraftKey; -import net.minecraft.server.v1_14_R1.MinecraftServer; -import net.minecraft.server.v1_14_R1.ParticleParam; -import net.minecraft.server.v1_14_R1.ParticleParamBlock; -import net.minecraft.server.v1_14_R1.ParticleParamItem; -import net.minecraft.server.v1_14_R1.ParticleParamRedstone; -import net.minecraft.server.v1_14_R1.ShapeDetectorBlock; -import net.minecraft.server.v1_14_R1.Vec2F; -import net.minecraft.server.v1_14_R1.Vec3D; +import org.bukkit.Particle; +import org.bukkit.*; +import org.bukkit.World; +import org.bukkit.Particle.DustOptions; +import org.bukkit.World.Environment; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.SimpleCommandMap; +import org.bukkit.craftbukkit.v1_14_R1.*; +import org.bukkit.craftbukkit.v1_14_R1.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_14_R1.command.VanillaCommandWrapper; +import org.bukkit.craftbukkit.v1_14_R1.enchantments.CraftEnchantment; +import org.bukkit.craftbukkit.v1_14_R1.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_14_R1.help.CustomHelpTopic; +import org.bukkit.craftbukkit.v1_14_R1.help.SimpleHelpMap; +import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_14_R1.potion.CraftPotionEffectType; +import org.bukkit.craftbukkit.v1_14_R1.util.CraftChatMessage; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.help.HelpTopic; +import org.bukkit.inventory.Recipe; +import org.bukkit.potion.PotionEffectType; + +import java.io.File; +import java.io.IOException; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.ToIntFunction; /** * NMS implementation for Minecraft 1.14, 1.14.1 and 1.14.2 diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/NMS_1_15.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/NMS_1_15.java index d505d18a08..958825bc5c 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/NMS_1_15.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/NMS_1_15.java @@ -1,77 +1,18 @@ package dev.jorel.commandapi.nms; -import java.io.File; -import java.io.IOException; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.VarHandle; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Collection; -import java.util.EnumSet; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.function.ToIntFunction; - -import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; -import com.mojang.brigadier.CommandDispatcher; -import com.mojang.brigadier.CommandDispatcher; -import org.bukkit.Axis; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Color; -import org.bukkit.Location; -import org.bukkit.NamespacedKey; -import org.bukkit.OfflinePlayer; -import org.bukkit.Particle; -import org.bukkit.Particle.DustOptions; -import org.bukkit.Sound; -import org.bukkit.World; -import org.bukkit.World.Environment; -import org.bukkit.block.Block; -import org.bukkit.block.data.BlockData; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.SimpleCommandMap; -import org.bukkit.craftbukkit.v1_15_R1.CraftLootTable; -import org.bukkit.craftbukkit.v1_15_R1.CraftParticle; -import org.bukkit.craftbukkit.v1_15_R1.CraftServer; -import org.bukkit.craftbukkit.v1_15_R1.CraftSound; -import org.bukkit.craftbukkit.v1_15_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_15_R1.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_15_R1.command.VanillaCommandWrapper; -import org.bukkit.craftbukkit.v1_15_R1.enchantments.CraftEnchantment; -import org.bukkit.craftbukkit.v1_15_R1.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_15_R1.help.CustomHelpTopic; -import org.bukkit.craftbukkit.v1_15_R1.help.SimpleHelpMap; -import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_15_R1.potion.CraftPotionEffectType; -import org.bukkit.craftbukkit.v1_15_R1.util.CraftChatMessage; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.help.HelpTopic; -import org.bukkit.inventory.ComplexRecipe; -import org.bukkit.potion.PotionEffectType; - import com.google.common.io.Files; import com.google.gson.GsonBuilder; +import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.Message; import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.suggestion.SuggestionProvider; import com.mojang.brigadier.suggestion.Suggestions; - import dev.jorel.commandapi.CommandAPI; import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.arguments.ArgumentSubType; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; import dev.jorel.commandapi.arguments.SuggestionProviders; import dev.jorel.commandapi.commandsenders.AbstractCommandSender; import dev.jorel.commandapi.commandsenders.BukkitCommandSender; @@ -80,81 +21,52 @@ import dev.jorel.commandapi.preprocessor.Differs; import dev.jorel.commandapi.preprocessor.NMSMeta; import dev.jorel.commandapi.preprocessor.RequireField; -import dev.jorel.commandapi.wrappers.ComplexRecipeImpl; -import dev.jorel.commandapi.wrappers.FloatRange; -import dev.jorel.commandapi.wrappers.FunctionWrapper; -import dev.jorel.commandapi.wrappers.IntegerRange; -import dev.jorel.commandapi.wrappers.Location2D; -import dev.jorel.commandapi.wrappers.MathOperation; -import dev.jorel.commandapi.wrappers.NativeProxyCommandSender; -import dev.jorel.commandapi.wrappers.ParticleData; import dev.jorel.commandapi.wrappers.Rotation; -import dev.jorel.commandapi.wrappers.ScoreboardSlot; -import dev.jorel.commandapi.wrappers.SimpleFunctionWrapper; +import dev.jorel.commandapi.wrappers.*; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.chat.ComponentSerializer; -import net.minecraft.server.v1_15_R1.Advancement; -import net.minecraft.server.v1_15_R1.ArgumentBlockPredicate; -import net.minecraft.server.v1_15_R1.ArgumentChat; -import net.minecraft.server.v1_15_R1.ArgumentChatComponent; -import net.minecraft.server.v1_15_R1.ArgumentChatFormat; -import net.minecraft.server.v1_15_R1.ArgumentCriterionValue; -import net.minecraft.server.v1_15_R1.ArgumentDimension; -import net.minecraft.server.v1_15_R1.ArgumentEnchantment; -import net.minecraft.server.v1_15_R1.ArgumentEntity; -import net.minecraft.server.v1_15_R1.ArgumentEntitySummon; -import net.minecraft.server.v1_15_R1.ArgumentItemPredicate; -import net.minecraft.server.v1_15_R1.ArgumentItemStack; -import net.minecraft.server.v1_15_R1.ArgumentMathOperation; -import net.minecraft.server.v1_15_R1.ArgumentMinecraftKeyRegistered; -import net.minecraft.server.v1_15_R1.ArgumentMobEffect; -import net.minecraft.server.v1_15_R1.ArgumentNBTTag; -import net.minecraft.server.v1_15_R1.ArgumentParticle; -import net.minecraft.server.v1_15_R1.ArgumentPosition; -import net.minecraft.server.v1_15_R1.ArgumentProfile; -import net.minecraft.server.v1_15_R1.ArgumentRegistry; -import net.minecraft.server.v1_15_R1.ArgumentRotation; -import net.minecraft.server.v1_15_R1.ArgumentRotationAxis; -import net.minecraft.server.v1_15_R1.ArgumentScoreboardCriteria; -import net.minecraft.server.v1_15_R1.ArgumentScoreboardObjective; -import net.minecraft.server.v1_15_R1.ArgumentScoreboardSlot; -import net.minecraft.server.v1_15_R1.ArgumentScoreboardTeam; -import net.minecraft.server.v1_15_R1.ArgumentScoreholder; -import net.minecraft.server.v1_15_R1.ArgumentTag; -import net.minecraft.server.v1_15_R1.ArgumentTile; -import net.minecraft.server.v1_15_R1.ArgumentTime; -import net.minecraft.server.v1_15_R1.ArgumentVec2; -import net.minecraft.server.v1_15_R1.ArgumentVec2I; -import net.minecraft.server.v1_15_R1.ArgumentVec3; -import net.minecraft.server.v1_15_R1.BlockPosition; -import net.minecraft.server.v1_15_R1.BlockPosition2D; -import net.minecraft.server.v1_15_R1.CommandListenerWrapper; -import net.minecraft.server.v1_15_R1.CompletionProviders; -import net.minecraft.server.v1_15_R1.CriterionConditionValue; -import net.minecraft.server.v1_15_R1.CustomFunction; -import net.minecraft.server.v1_15_R1.CustomFunctionData; -import net.minecraft.server.v1_15_R1.DimensionManager; -import net.minecraft.server.v1_15_R1.Entity; -import net.minecraft.server.v1_15_R1.EntityPlayer; -import net.minecraft.server.v1_15_R1.EntitySelector; +import net.minecraft.server.v1_15_R1.*; import net.minecraft.server.v1_15_R1.EnumDirection.EnumAxis; -import net.minecraft.server.v1_15_R1.IBlockData; import net.minecraft.server.v1_15_R1.IChatBaseComponent.ChatSerializer; -import net.minecraft.server.v1_15_R1.ICompletionProvider; -import net.minecraft.server.v1_15_R1.IRecipe; -import net.minecraft.server.v1_15_R1.IRegistry; -import net.minecraft.server.v1_15_R1.ItemStack; -import net.minecraft.server.v1_15_R1.MinecraftKey; -import net.minecraft.server.v1_15_R1.MinecraftServer; -import net.minecraft.server.v1_15_R1.ParticleParam; -import net.minecraft.server.v1_15_R1.ParticleParamBlock; -import net.minecraft.server.v1_15_R1.ParticleParamItem; -import net.minecraft.server.v1_15_R1.ParticleParamRedstone; -import net.minecraft.server.v1_15_R1.ShapeDetectorBlock; -import net.minecraft.server.v1_15_R1.Vec2F; -import net.minecraft.server.v1_15_R1.Vec3D; +import org.bukkit.Particle; +import org.bukkit.*; +import org.bukkit.World; +import org.bukkit.Particle.DustOptions; +import org.bukkit.World.Environment; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.SimpleCommandMap; +import org.bukkit.craftbukkit.v1_15_R1.*; +import org.bukkit.craftbukkit.v1_15_R1.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_15_R1.command.VanillaCommandWrapper; +import org.bukkit.craftbukkit.v1_15_R1.enchantments.CraftEnchantment; +import org.bukkit.craftbukkit.v1_15_R1.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_15_R1.help.CustomHelpTopic; +import org.bukkit.craftbukkit.v1_15_R1.help.SimpleHelpMap; +import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_15_R1.potion.CraftPotionEffectType; +import org.bukkit.craftbukkit.v1_15_R1.util.CraftChatMessage; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.help.HelpTopic; +import org.bukkit.inventory.ComplexRecipe; +import org.bukkit.potion.PotionEffectType; + +import java.io.File; +import java.io.IOException; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.ToIntFunction; /** * NMS implementation for Minecraft 1.15, 1.15.1 and 1.15.2 diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java index bdb1e911e5..a775e8886d 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java @@ -20,63 +20,6 @@ *******************************************************************************/ package dev.jorel.commandapi.nms; -import java.io.File; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.VarHandle; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.CompletableFuture; -import java.util.function.Predicate; -import java.util.function.ToIntFunction; - -import dev.jorel.commandapi.commandsenders.AbstractCommandSender; -import dev.jorel.commandapi.commandsenders.BukkitCommandSender; -import dev.jorel.commandapi.commandsenders.BukkitNativeProxyCommandSender; -import org.bukkit.Bukkit; -import org.bukkit.Color; -import org.bukkit.Keyed; -import org.bukkit.Location; -import org.bukkit.NamespacedKey; -import org.bukkit.Particle; -import org.bukkit.Particle.DustOptions; -import org.bukkit.Particle.DustTransition; -import org.bukkit.Vibration; -import org.bukkit.Vibration.Destination; -import org.bukkit.Vibration.Destination.BlockDestination; -import org.bukkit.Vibration.Destination.EntityDestination; -import org.bukkit.World; -import org.bukkit.block.Biome; -import org.bukkit.block.Block; -import org.bukkit.block.data.BlockData; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.SimpleCommandMap; -import org.bukkit.craftbukkit.v1_19_R2.CraftLootTable; -import org.bukkit.craftbukkit.v1_19_R2.CraftParticle; -import org.bukkit.craftbukkit.v1_19_R2.CraftServer; -import org.bukkit.craftbukkit.v1_19_R2.CraftSound; -import org.bukkit.craftbukkit.v1_19_R2.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_19_R2.command.VanillaCommandWrapper; -import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_19_R2.help.CustomHelpTopic; -import org.bukkit.craftbukkit.v1_19_R2.help.SimpleHelpMap; -import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.help.HelpTopic; -import org.bukkit.inventory.Recipe; -import org.bukkit.potion.PotionEffectType; - import com.google.common.collect.ImmutableList; import com.google.common.io.Files; import com.google.gson.GsonBuilder; @@ -99,11 +42,6 @@ import dev.jorel.commandapi.preprocessor.NMSMeta; import dev.jorel.commandapi.preprocessor.RequireField; import dev.jorel.commandapi.wrappers.*; -import dev.jorel.commandapi.wrappers.FunctionWrapper; -import dev.jorel.commandapi.wrappers.Location2D; -import dev.jorel.commandapi.wrappers.NativeProxyCommandSender; -import dev.jorel.commandapi.wrappers.ParticleData; -import dev.jorel.commandapi.wrappers.SimpleFunctionWrapper; import io.papermc.paper.text.PaperComponents; import net.kyori.adventure.text.Component; import net.minecraft.commands.CommandBuildContext; From d3d8c343300283a64a662cf393c77f98c728dc1f Mon Sep 17 00:00:00 2001 From: BuildTools Date: Thu, 5 Jan 2023 09:31:22 -0500 Subject: [PATCH 27/58] Fix parameterization of ArgumentParseExceptionHandler --- .../dev/jorel/commandapi/arguments/AbstractArgument.java | 8 ++++---- .../arguments/ArgumentParseExceptionHandler.java | 5 +++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AbstractArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AbstractArgument.java index 43dabe5518..d0d55df86c 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AbstractArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AbstractArgument.java @@ -116,7 +116,7 @@ public final T parseArgumentHandleError(CommandContext( + return exceptionHandler.handleException(new ArgumentParseExceptionContext<>( new WrapperCommandSyntaxException(original), CommandAPIHandler.getInstance().getPlatform() .getCommandSenderFromCommandSource(cmdCtx.getSource()).getSource(), @@ -318,7 +318,7 @@ public Impl setOptional(boolean optional) { // Exception Handling // /////////////////////// - private ArgumentParseExceptionHandler exceptionHandler = context -> { throw context.exception(); }; + private ArgumentParseExceptionHandler exceptionHandler = context -> { throw context.exception(); }; /** * Sets the {@link ArgumentParseExceptionHandler} this Argument should use when it fails to parse its input. @@ -326,7 +326,7 @@ public Impl setOptional(boolean optional) { * @param exceptionHandler The new {@link ArgumentParseExceptionHandler} this argument should use * @return this current argument */ - public final Impl withArgumentParseExceptionHandler(ArgumentParseExceptionHandler exceptionHandler) { + public final Impl withArgumentParseExceptionHandler(ArgumentParseExceptionHandler exceptionHandler) { this.exceptionHandler = exceptionHandler; return instance(); } @@ -335,7 +335,7 @@ public final Impl withArgumentParseExceptionHandler(ArgumentParseExceptionHandle * Returns the {@link ArgumentParseExceptionHandler} this argument is using * @return The {@link ArgumentParseExceptionHandler} this argument is using */ - public final ArgumentParseExceptionHandler getArgumentParseExceptionHandler() { + public final ArgumentParseExceptionHandler getArgumentParseExceptionHandler() { return this.exceptionHandler; } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionHandler.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionHandler.java index 9d21bdff11..36565c5d8e 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionHandler.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionHandler.java @@ -7,9 +7,10 @@ * See {@link ArgumentParseExceptionHandler#handleException(ArgumentParseExceptionContext)} * * @param The class of the object returned by the Argument this object is handling + * @param The CommandSender class being used */ @FunctionalInterface -public interface ArgumentParseExceptionHandler { +public interface ArgumentParseExceptionHandler { /** * A method that handles when an Argument fails to parse. * It can either return an object or throw a different exception. @@ -19,5 +20,5 @@ public interface ArgumentParseExceptionHandler { * @return A new object in place of the failed parse * @throws WrapperCommandSyntaxException A new exception to pass on */ - T handleException(ArgumentParseExceptionContext context) throws WrapperCommandSyntaxException; + T handleException(ArgumentParseExceptionContext context) throws WrapperCommandSyntaxException; } From ab3d4e0de8a3fd5184d7a22975834b3f91c4be07 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Thu, 5 Jan 2023 11:36:44 -0500 Subject: [PATCH 28/58] Hotfix tab-complete for provided suggestions in 1.19.3 --- .../jorel/commandapi/nms/NMS_1_19_3_R2.java | 29 +++++++++++++++++++ .../dev/jorel/commandapi/nms/NMS_Common.java | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java index a775e8886d..acdb714419 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java @@ -29,12 +29,15 @@ import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; +import com.mojang.brigadier.suggestion.SuggestionProvider; +import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.datafixers.util.Either; import com.mojang.logging.LogUtils; import dev.jorel.commandapi.CommandAPI; import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.arguments.ArgumentSubType; import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import dev.jorel.commandapi.arguments.SuggestionProviders; import dev.jorel.commandapi.commandsenders.AbstractCommandSender; import dev.jorel.commandapi.commandsenders.BukkitCommandSender; import dev.jorel.commandapi.commandsenders.BukkitNativeProxyCommandSender; @@ -48,6 +51,7 @@ import net.minecraft.commands.CommandFunction; import net.minecraft.commands.CommandFunction.Entry; import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.SharedSuggestionProvider; import net.minecraft.commands.arguments.*; import net.minecraft.commands.arguments.ResourceOrTagArgument.Result; import net.minecraft.commands.arguments.blocks.BlockPredicateArgument; @@ -75,6 +79,7 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer.ReloadableResources; import net.minecraft.server.ServerFunctionLibrary; +import net.minecraft.server.ServerFunctionManager; import net.minecraft.server.level.ColumnPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; @@ -627,6 +632,30 @@ public final Object getSound(CommandContext cmdCtx, String k }; } + @Override + @Differs(from = {"NMS_Common"}, by = "Many MinecraftServer#get methods mapped to different names") + public SuggestionProvider getSuggestionProvider(SuggestionProviders provider) { + return switch (provider) { + case FUNCTION -> (context, builder) -> { + ServerFunctionManager functionData = getMinecraftServer().getFunctions(); + SharedSuggestionProvider.suggestResource(functionData.getTagNames(), builder, "#"); + return SharedSuggestionProvider.suggestResource(functionData.getFunctionNames(), builder); + }; + case RECIPES -> net.minecraft.commands.synchronization.SuggestionProviders.ALL_RECIPES; + case SOUNDS -> net.minecraft.commands.synchronization.SuggestionProviders.AVAILABLE_SOUNDS; + case ADVANCEMENTS -> (cmdCtx, builder) -> { + return SharedSuggestionProvider.suggestResource(getMinecraftServer().getAdvancements().getAllAdvancements() + .stream().map(net.minecraft.advancements.Advancement::getId), builder); + }; + case LOOT_TABLES -> (cmdCtx, builder) -> { + return SharedSuggestionProvider.suggestResource(getMinecraftServer().getLootTables().getIds(), builder); + }; + case BIOMES -> _ArgumentSyntheticBiome()::listSuggestions; + case ENTITIES -> net.minecraft.commands.synchronization.SuggestionProviders.SUMMONABLE_ENTITIES; + default -> (context, builder) -> Suggestions.empty(); + }; + } + @Override public final SimpleFunctionWrapper[] getTag(NamespacedKey key) { Collection customFunctions = MINECRAFT_SERVER.getFunctions().getTag(new ResourceLocation(key.getNamespace(), key.getKey())); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-nms-common/src/main/java/dev/jorel/commandapi/nms/NMS_Common.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-nms-common/src/main/java/dev/jorel/commandapi/nms/NMS_Common.java index cfa89ab4bb..c6dd9679fe 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-nms-common/src/main/java/dev/jorel/commandapi/nms/NMS_Common.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-nms-common/src/main/java/dev/jorel/commandapi/nms/NMS_Common.java @@ -647,7 +647,7 @@ public final String getScoreHolderSingle(CommandContext cmdC // this doesn't blow up, but it should be covered by the default case (empty) @Override @Differs(from = "1.18", by = "Use of argument synthetic biome's listSuggestions method") - public final SuggestionProvider getSuggestionProvider(SuggestionProviders provider) { + public SuggestionProvider getSuggestionProvider(SuggestionProviders provider) { return switch (provider) { case FUNCTION -> (context, builder) -> { ServerFunctionManager functionData = getMinecraftServer().getFunctions(); From c8c527b1b01367cfd0f0bd118ffa00c38a189e52 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Fri, 13 Jan 2023 10:15:40 -0500 Subject: [PATCH 29/58] Fix ArgumentParseExceptionHandlers not getting processed (Not really sure when or why this broke) --- .../src/main/java/dev/jorel/commandapi/CommandAPIHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIHandler.java b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIHandler.java index bdf2f5f2d4..b43a4dffc7 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIHandler.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIHandler.java @@ -289,7 +289,7 @@ CommandArguments argsToCommandArgs(CommandContext cmdCtx, Argument[] arg */ Object parseArgument(CommandContext cmdCtx, String key, Argument value, Object[] previousArgs) throws CommandSyntaxException { if (value.isListed()) { - return value.parseArgument(cmdCtx, key, previousArgs); + return value.parseArgumentHandleError(cmdCtx, key, previousArgs); } else { return null; } From faf5c4e7a3941611104b1a5a0813922aff1195a0 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Wed, 1 Feb 2023 17:29:35 -0500 Subject: [PATCH 30/58] Refreeze COMMAND_ARGUMENT_TYPE registry after adding custom argument type --- .../main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java | 3 +++ .../src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java index 18b0dac6e6..84380984c3 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java @@ -914,6 +914,9 @@ public void registerCustomArgumentType() { registerArgument.invoke(null, Registry.COMMAND_ARGUMENT_TYPE, "commandapi:exception_handler", ExceptionHandlingArgumentType.class, new ExceptionHandlingArgumentInfo_1_19_Common<>()); + + // Refreeze registry + isFrozen.set(Registry.COMMAND_ARGUMENT_TYPE, true); } catch (ReflectiveOperationException e) { e.printStackTrace(); } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java index f568c17270..9b40f9ad63 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java @@ -808,6 +808,9 @@ public void registerCustomArgumentType() { registerArgument.invoke(null, BuiltInRegistries.COMMAND_ARGUMENT_TYPE, "commandapi:exception_handler", ExceptionHandlingArgumentType.class, new ExceptionHandlingArgumentInfo_1_19_3<>()); + + // Refreeze registry + isFrozen.set(BuiltInRegistries.COMMAND_ARGUMENT_TYPE, true); } catch (ReflectiveOperationException e) { e.printStackTrace(); } From a187f86a92bedc34afc0bb21bb8483732ff0897c Mon Sep 17 00:00:00 2001 From: BuildTools Date: Wed, 1 Feb 2023 18:12:03 -0500 Subject: [PATCH 31/58] Implement equals, hashCode, toString for WrapperStringReader --- .../wrappers/WrapperStringReader.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/wrappers/WrapperStringReader.java b/commandapi-core/src/main/java/dev/jorel/commandapi/wrappers/WrapperStringReader.java index e46bd42b85..0b8c6df150 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/wrappers/WrapperStringReader.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/wrappers/WrapperStringReader.java @@ -177,4 +177,22 @@ public void expect(char c) throws WrapperCommandSyntaxException { throw new WrapperCommandSyntaxException(e); } } + + // Comparison methods + @Override + public boolean equals(Object other) { + if (this == other) return true; + if (!(other instanceof WrapperStringReader wsr)) return false; + return this.stringReader.equals(wsr.stringReader); + } + + @Override + public int hashCode() { + return stringReader.hashCode(); + } + + @Override + public String toString() { + return stringReader.toString(); + } } From 08e159206cf5df60f078daa5b550a69880a2f928 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Wed, 1 Feb 2023 18:27:08 -0500 Subject: [PATCH 32/58] Add @RequireField for 1.19 NMS --- .../src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java | 1 + .../src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java | 1 + 2 files changed, 2 insertions(+) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java index 84380984c3..99ef4766a8 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java @@ -162,6 +162,7 @@ @RequireField(in = EntitySelector.class, name = "usesSelector", ofType = boolean.class) @RequireField(in = EntityPositionSource.class, name = "entityOrUuidOrId", ofType = Either.class) @RequireField(in = ItemInput.class, name = "tag", ofType = CompoundTag.class) +@RequireField(in = MappedRegistry.class, name = "ca", ofType = boolean.class) @Differs(from = {"1.13", "1.14", "1.15", "1.16", "1.17", "1.18"}, by = "Added chat preview") @SuppressWarnings("resource") public abstract class NMS_1_19_Common extends NMS_Common { diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java index 9b40f9ad63..eb2b488195 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java @@ -154,6 +154,7 @@ @RequireField(in = EntitySelector.class, name = "usesSelector", ofType = boolean.class) @RequireField(in = EntityPositionSource.class, name = "entityOrUuidOrId", ofType = Either.class) @RequireField(in = ItemInput.class, name = "tag", ofType = CompoundTag.class) +@RequireField(in = MappedRegistry.class, name = "l", ofType = boolean.class) @Differs(from = "1.19.2", by = "Chat preview removed") public class NMS_1_19_3_R2 extends NMS_Common { From 29d82d5306bc1dc2e03c2dc033c09d00db9b97bc Mon Sep 17 00:00:00 2001 From: BuildTools Date: Wed, 1 Feb 2023 18:27:44 -0500 Subject: [PATCH 33/58] Remove classes for 1.13 and 1.14 --- ...tionHandlingArgumentSerializer_1_13_1.java | 88 ------------------- ...eptionHandlingArgumentSerializer_1_13.java | 88 ------------------- ...eptionHandlingArgumentSerializer_1_14.java | 88 ------------------- 3 files changed, 264 deletions(-) delete mode 100644 commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.13.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13_1.java delete mode 100644 commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.13/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13.java delete mode 100644 commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.14/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_14.java diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.13.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13_1.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.13.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13_1.java deleted file mode 100644 index d556075624..0000000000 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.13.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13_1.java +++ /dev/null @@ -1,88 +0,0 @@ -package dev.jorel.commandapi.nms; - -import com.google.gson.JsonObject; -import com.mojang.brigadier.arguments.ArgumentType; -import dev.jorel.commandapi.CommandAPIHandler; -import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; -import net.minecraft.server.v1_13_R2.ArgumentRegistry; -import net.minecraft.server.v1_13_R2.ArgumentSerializer; -import net.minecraft.server.v1_13_R2.PacketDataSerializer; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.nio.charset.StandardCharsets; - -public class ExceptionHandlingArgumentSerializer_1_13_1 implements ArgumentSerializer> { - - private static Method getInfo = null; - - @Override - public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { - try { - // Remove this key from packet - if(getInfo == null) { - getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); - getInfo.setAccessible(true); - } - Object myInfo = getInfo.invoke(null, argument); - - Field keyField = CommandAPIHandler.getField(myInfo.getClass(), "c"); - String myKey = keyField.get(myInfo).toString(); - byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); - // Removing length and size of string, assuming length is always written as 1 byte - packetDataSerializer.writerIndex(packetDataSerializer.writerIndex() - myKeyBytes.length - 1); - - // Add baseType key instead - ArgumentType baseType = argument.baseType(); - Object baseInfo = getInfo.invoke(null, baseType); - String baseKey = keyField.get(baseInfo).toString(); - packetDataSerializer.a(baseKey); - - // Serialize baseType - Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); - ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); - subSerializer.a(baseType, packetDataSerializer); - } catch (ReflectiveOperationException e) { - e.printStackTrace(); - } - } - - @Override - public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { - try { - ArgumentType baseType = argument.baseType(); - - if(getInfo == null) { - getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); - getInfo.setAccessible(true); - } - Object baseInfo = getInfo.invoke(null, baseType); - - Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); - properties.addProperty("baseType", keyField.get(baseInfo).toString()); - - Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); - ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); - - JsonObject subProperties = new JsonObject(); - subSerializer.a(baseType, subProperties); - if (subProperties.size() > 0) { - properties.add("baseProperties", subProperties); - } - } catch (ReflectiveOperationException e) { - e.printStackTrace(); - } - } - - @Override - public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { - // Since this class overrides its ArgumentRegistry key with the baseType's, - // this class's key should never show up in a packet and this method should never - // be called to deserialize the ArgumentType info that wasn't put into the packet - // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands - // either. If this method ever gets called, either you or I are doing something very wrong! - throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_13_1#b for more information"); - // Including a mini-stacktrace here in case this exception shows up - // on a client-disconnected screen, which is not very helpful - } -} diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.13/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.13/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13.java deleted file mode 100644 index 7677db740d..0000000000 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.13/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_13.java +++ /dev/null @@ -1,88 +0,0 @@ -package dev.jorel.commandapi.nms; - -import com.google.gson.JsonObject; -import com.mojang.brigadier.arguments.ArgumentType; -import dev.jorel.commandapi.CommandAPIHandler; -import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; -import net.minecraft.server.v1_13_R1.ArgumentRegistry; -import net.minecraft.server.v1_13_R1.ArgumentSerializer; -import net.minecraft.server.v1_13_R1.PacketDataSerializer; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.nio.charset.StandardCharsets; - -public class ExceptionHandlingArgumentSerializer_1_13 implements ArgumentSerializer> { - - private static Method getInfo = null; - - @Override - public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { - try { - // Remove this key from packet - if(getInfo == null) { - getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); - getInfo.setAccessible(true); - } - Object myInfo = getInfo.invoke(null, argument); - - Field keyField = CommandAPIHandler.getField(myInfo.getClass(), "c"); - String myKey = keyField.get(myInfo).toString(); - byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); - // Removing length and size of string, assuming length is always written as 1 byte - packetDataSerializer.writerIndex(packetDataSerializer.writerIndex() - myKeyBytes.length - 1); - - // Add baseType key instead - ArgumentType baseType = argument.baseType(); - Object baseInfo = getInfo.invoke(null, baseType); - String baseKey = keyField.get(baseInfo).toString(); - packetDataSerializer.a(baseKey); - - // Serialize baseType - Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); - ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); - subSerializer.a(baseType, packetDataSerializer); - } catch (ReflectiveOperationException e) { - e.printStackTrace(); - } - } - - @Override - public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { - try { - ArgumentType baseType = argument.baseType(); - - if(getInfo == null) { - getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); - getInfo.setAccessible(true); - } - Object baseInfo = getInfo.invoke(null, baseType); - - Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); - properties.addProperty("baseType", keyField.get(baseInfo).toString()); - - Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); - ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); - - JsonObject subProperties = new JsonObject(); - subSerializer.a(baseType, subProperties); - if (subProperties.size() > 0) { - properties.add("baseProperties", subProperties); - } - } catch (ReflectiveOperationException e) { - e.printStackTrace(); - } - } - - @Override - public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { - // Since this class overrides its ArgumentRegistry key with the baseType's, - // this class's key should never show up in a packet and this method should never - // be called to deserialize the ArgumentType info that wasn't put into the packet - // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands - // either. If this method ever gets called, either you or I are doing something very wrong! - throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_13#b for more information"); - // Including a mini-stacktrace here in case this exception shows up - // on a client-disconnected screen, which is not very helpful - } -} diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.14/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_14.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.14/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_14.java deleted file mode 100644 index a708004f69..0000000000 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.14/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_14.java +++ /dev/null @@ -1,88 +0,0 @@ -package dev.jorel.commandapi.nms; - -import com.google.gson.JsonObject; -import com.mojang.brigadier.arguments.ArgumentType; -import dev.jorel.commandapi.CommandAPIHandler; -import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; -import net.minecraft.server.v1_14_R1.ArgumentRegistry; -import net.minecraft.server.v1_14_R1.ArgumentSerializer; -import net.minecraft.server.v1_14_R1.PacketDataSerializer; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.nio.charset.StandardCharsets; - -public class ExceptionHandlingArgumentSerializer_1_14 implements ArgumentSerializer> { - - private static Method getInfo = null; - - @Override - public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { - try { - // Remove this key from packet - if(getInfo == null) { - getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); - getInfo.setAccessible(true); - } - Object myInfo = getInfo.invoke(null, argument); - - Field keyField = CommandAPIHandler.getField(myInfo.getClass(), "c"); - String myKey = keyField.get(myInfo).toString(); - byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); - // Removing length and size of string, assuming length is always written as 1 byte - packetDataSerializer.writerIndex(packetDataSerializer.writerIndex() - myKeyBytes.length - 1); - - // Add baseType key instead - ArgumentType baseType = argument.baseType(); - Object baseInfo = getInfo.invoke(null, baseType); - String baseKey = keyField.get(baseInfo).toString(); - packetDataSerializer.a(baseKey); - - // Serialize baseType - Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); - ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); - subSerializer.a(baseType, packetDataSerializer); - } catch (ReflectiveOperationException e) { - e.printStackTrace(); - } - } - - @Override - public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { - try { - ArgumentType baseType = argument.baseType(); - - if(getInfo == null) { - getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); - getInfo.setAccessible(true); - } - Object baseInfo = getInfo.invoke(null, baseType); - - Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); - properties.addProperty("baseType", keyField.get(baseInfo).toString()); - - Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); - ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); - - JsonObject subProperties = new JsonObject(); - subSerializer.a(baseType, subProperties); - if (subProperties.size() > 0) { - properties.add("baseProperties", subProperties); - } - } catch (ReflectiveOperationException e) { - e.printStackTrace(); - } - } - - @Override - public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { - // Since this class overrides its ArgumentRegistry key with the baseType's, - // this class's key should never show up in a packet and this method should never - // be called to deserialize the ArgumentType info that wasn't put into the packet - // anyway. Also, the server shouldn't ever deserialize a PacketPlay*Out*Commands - // either. If this method ever gets called, either you or I are doing something very wrong! - throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentSerializer_1_14#b for more information"); - // Including a mini-stacktrace here in case this exception shows up - // on a client-disconnected screen, which is not very helpful - } -} From 5ba3dbd567a8098f719ef9c47ebd15ede782b575 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Thu, 2 Feb 2023 07:30:22 -0500 Subject: [PATCH 34/58] Fix 1.19 NMS @RequireField annotations --- .../src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java | 2 +- .../src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java index 99ef4766a8..db362d8940 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java @@ -162,7 +162,7 @@ @RequireField(in = EntitySelector.class, name = "usesSelector", ofType = boolean.class) @RequireField(in = EntityPositionSource.class, name = "entityOrUuidOrId", ofType = Either.class) @RequireField(in = ItemInput.class, name = "tag", ofType = CompoundTag.class) -@RequireField(in = MappedRegistry.class, name = "ca", ofType = boolean.class) +@RequireField(in = MappedRegistry.class, name = "frozen", ofType = boolean.class) @Differs(from = {"1.13", "1.14", "1.15", "1.16", "1.17", "1.18"}, by = "Added chat preview") @SuppressWarnings("resource") public abstract class NMS_1_19_Common extends NMS_Common { diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java index eb2b488195..359eeb3c59 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java @@ -154,7 +154,7 @@ @RequireField(in = EntitySelector.class, name = "usesSelector", ofType = boolean.class) @RequireField(in = EntityPositionSource.class, name = "entityOrUuidOrId", ofType = Either.class) @RequireField(in = ItemInput.class, name = "tag", ofType = CompoundTag.class) -@RequireField(in = MappedRegistry.class, name = "l", ofType = boolean.class) +@RequireField(in = MappedRegistry.class, name = "frozen", ofType = boolean.class) @Differs(from = "1.19.2", by = "Chat preview removed") public class NMS_1_19_3_R2 extends NMS_Common { From 4073c1ddd2481f0da059808336c983d5a104fe54 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Thu, 2 Feb 2023 08:58:03 -0500 Subject: [PATCH 35/58] Make Sonarcloud a bit happier --- .../main/java/dev/jorel/commandapi/CommandAPIHandler.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIHandler.java b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIHandler.java index c170393610..7c49c926aa 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIHandler.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIHandler.java @@ -40,7 +40,6 @@ import dev.jorel.commandapi.preprocessor.RequireField; import dev.jorel.commandapi.wrappers.PreviewableFunction; -import java.awt.*; import java.io.File; import java.io.IOException; import java.lang.invoke.MethodHandles; @@ -797,8 +796,9 @@ ArgumentType wrapArgumentType(Argument argument, ArgumentType rawType) InitialParseExceptionArgument iPEA = (InitialParseExceptionArgument) argument.instance(); - if (iPEA.getInitialParseExceptionHandler().isEmpty()) return rawType; - return new ExceptionHandlingArgumentType<>(rawType, iPEA.getInitialParseExceptionHandler().get()); + Optional> handler = iPEA.getInitialParseExceptionHandler(); + if (handler.isEmpty()) return rawType; + return new ExceptionHandlingArgumentType<>(rawType, handler.get()); } Object[] generatePreviousArguments(CommandContext context, Argument[] args, String nodeName) @@ -856,7 +856,7 @@ SuggestionProvider toSuggestions(Argument theArgument, Argument[] args, * @param path a list of Strings representing the path (names of command nodes) * to (and including) the previewable argument * @return a function that takes in a {@link PreviewInfo} and returns a - * {@link Component}. If such a function is not available, this will + * Component representing the preview. If such a function is not available, this will * return a function that always returns null. */ @SuppressWarnings("unchecked") From 4cae8935b316bda116c0e969204e8fad238dfb9f Mon Sep 17 00:00:00 2001 From: BuildTools Date: Thu, 2 Feb 2023 09:06:56 -0500 Subject: [PATCH 36/58] Add comments naming obfuscated method names --- .../nms/ExceptionHandlingArgumentSerializer_1_15.java | 3 +++ .../nms/ExceptionHandlingArgumentSerializer_1_16_R1.java | 3 +++ .../nms/ExceptionHandlingArgumentSerializer_1_16_R2.java | 3 +++ .../nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java | 3 +++ 4 files changed, 12 insertions(+) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java index 305ba40798..7562e42a78 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java @@ -17,6 +17,7 @@ public class ExceptionHandlingArgumentSerializer_1_15 implements ArgumentSeri private static Method getInfo = null; @Override + // serializeToNetwork public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { try { // Remove this key from packet @@ -48,6 +49,7 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa } @Override + // serializeToJson public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { try { ArgumentType baseType = argument.baseType(); @@ -75,6 +77,7 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) } @Override + // deserializeFromNetwork public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { // Since this class overrides its ArgumentRegistry key with the baseType's, // this class's key should never show up in a packet and this method should never diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java index 5bbb3b5580..8dc5ff1134 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java @@ -17,6 +17,7 @@ public class ExceptionHandlingArgumentSerializer_1_16_R1 implements ArgumentS private static Method getInfo = null; @Override + // serializeToNetwork public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { try { // Remove this key from packet @@ -48,6 +49,7 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa } @Override + // serializeToJson public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { try { ArgumentType baseType = argument.baseType(); @@ -75,6 +77,7 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) } @Override + // deserializeFromNetwork public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { // Since this class overrides its ArgumentRegistry key with the baseType's, // this class's key should never show up in a packet and this method should never diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java index 0bdab0ea95..7eaabcfaac 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java @@ -19,6 +19,7 @@ public class ExceptionHandlingArgumentSerializer_1_16_R2 implements ArgumentS @Override @Differs(from = {"1.13", "1.14", "1.15", "1.16.1"}, by = "ArgumentRegistry.a -> ArgumentRegistry.b") + // serializeToNetwork public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { try { // Remove this key from packet @@ -51,6 +52,7 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa @Override @Differs(from = {"1.13", "1.14", "1.15", "1.16.1"}, by = "ArgumentRegistry.a -> ArgumentRegistry.b") + // serializeToJson public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { try { ArgumentType baseType = argument.baseType(); @@ -78,6 +80,7 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) } @Override + // deserializeFromNetwork public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { // Since this class overrides its ArgumentRegistry key with the baseType's, // this class's key should never show up in a packet and this method should never diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java index 4dce35d75e..f017781580 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java @@ -17,6 +17,7 @@ public class ExceptionHandlingArgumentSerializer_1_16_4_R3 implements Argumen private static Method getInfo = null; @Override + // serializeToNetwork public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { try { // Remove this key from packet @@ -48,6 +49,7 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa } @Override + // serializeToJson public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { try { ArgumentType baseType = argument.baseType(); @@ -75,6 +77,7 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) } @Override + // deserializeFromNetwork public ExceptionHandlingArgumentType b(PacketDataSerializer packetDataSerializer) { // Since this class overrides its ArgumentRegistry key with the baseType's, // this class's key should never show up in a packet and this method should never From 5b8339eba20b492d7e32e2870f3567fd874928ac Mon Sep 17 00:00:00 2001 From: BuildTools Date: Thu, 2 Feb 2023 09:19:59 -0500 Subject: [PATCH 37/58] Add TODOs explaining why Field reflection is not yet checked at compile time --- .../nms/ExceptionHandlingArgumentSerializer_1_15.java | 3 +++ .../nms/ExceptionHandlingArgumentSerializer_1_16_R1.java | 3 +++ .../nms/ExceptionHandlingArgumentSerializer_1_16_R2.java | 3 +++ .../nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java | 3 +++ .../nms/ExceptionHandlingArgumentSerializer_1_17_Common.java | 3 +++ .../nms/ExceptionHandlingArgumentSerializer_1_18_R2.java | 3 +++ .../nms/ExceptionHandlingArgumentSerializer_1_18_R1.java | 3 +++ 7 files changed, 21 insertions(+) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java index 7562e42a78..4099ff1f36 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java @@ -27,6 +27,9 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa } Object myInfo = getInfo.invoke(null, argument); + // TODO: This Field reflection (and others in this class) acts on the class ArgumentRegistry.a. This inner + // class is package-private, and the @RequireField annotation doesn't currently support that. We would like + // to check this reflection at compile-time though, but the preprocess needs to be expanded first Field keyField = CommandAPIHandler.getField(myInfo.getClass(), "c"); String myKey = keyField.get(myInfo).toString(); byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java index 8dc5ff1134..8fdfcfc748 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java @@ -27,6 +27,9 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa } Object myInfo = getInfo.invoke(null, argument); + // TODO: This Field reflection (and others in this class) acts on the class ArgumentRegistry.a. This inner + // class is package-private, and the @RequireField annotation doesn't currently support that. We would like + // to check this reflection at compile-time though, but the preprocess needs to be expanded first Field keyField = CommandAPIHandler.getField(myInfo.getClass(), "c"); String myKey = keyField.get(myInfo).toString(); byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java index 7eaabcfaac..73e6818ae4 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java @@ -29,6 +29,9 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa } Object myInfo = getInfo.invoke(null, argument); + // TODO: This Field reflection (and others in this class) acts on the class ArgumentRegistry.a. This inner + // class is package-private, and the @RequireField annotation doesn't currently support that. We would like + // to check this reflection at compile-time though, but the preprocess needs to be expanded first Field keyField = CommandAPIHandler.getField(myInfo.getClass(), "c"); String myKey = keyField.get(myInfo).toString(); byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java index f017781580..26e2a4307f 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java @@ -27,6 +27,9 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa } Object myInfo = getInfo.invoke(null, argument); + // TODO: This Field reflection (and others in this class) acts on the class ArgumentRegistry.a. This inner + // class is package-private, and the @RequireField annotation doesn't currently support that. We would like + // to check this reflection at compile-time though, but the preprocess needs to be expanded first Field keyField = CommandAPIHandler.getField(myInfo.getClass(), "c"); String myKey = keyField.get(myInfo).toString(); byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java index 4f9febb320..af8d620cb9 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java @@ -25,6 +25,9 @@ public void serializeToNetwork(ExceptionHandlingArgumentType argument, Friend } Object myInfo = getInfo.invoke(null, argument); + // TODO: This Field reflection (and others in this class) acts on the class ArgumentTypes.Entry. This inner + // class is private, and the @RequireField annotation doesn't currently support that. We would like + // to check this reflection at compile-time though, but the preprocess needs to be expanded first Field keyField = CommandAPIHandler.getField(myInfo.getClass(), "c"); String myKey = keyField.get(myInfo).toString(); byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java index 60d8c7f151..79d385277e 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java @@ -28,6 +28,9 @@ public void serializeToNetwork(ExceptionHandlingArgumentType argument, Friend } Object myInfo = getInfo.invoke(null, argument); + // TODO: This Field reflection (and others in this class) acts on the class ArgumentTypes.Entry. This inner + // class is private, and the @RequireField annotation doesn't currently support that. We would like + // to check this reflection at compile-time though, but the preprocess needs to be expanded first Field keyField = CommandAPIHandler.getField(myInfo.getClass(), "b"); String myKey = keyField.get(myInfo).toString(); byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java index 0f3097ee1a..852e9581e3 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java @@ -25,6 +25,9 @@ public void serializeToNetwork(ExceptionHandlingArgumentType argument, Friend } Object myInfo = getInfo.invoke(null, argument); + // TODO: This Field reflection (and others in this class) acts on the class ArgumentTypes.Entry. This inner + // class is private, and the @RequireField annotation doesn't currently support that. We would like + // to check this reflection at compile-time though, but the preprocess needs to be expanded first Field keyField = CommandAPIHandler.getField(myInfo.getClass(), "c"); String myKey = keyField.get(myInfo).toString(); byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); From 40866941f0a1fee8a6bce99dcc76294410f92d30 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Thu, 2 Feb 2023 09:27:26 -0500 Subject: [PATCH 38/58] 'fix' (?) javadoc format for added records --- .../ArgumentParseExceptionContext.java | 18 +++++++++++++++++- .../ExceptionHandlingArgumentType.java | 11 ++++++++++- .../InitialParseExceptionContext.java | 13 +++++++++++-- 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionContext.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionContext.java index 29528d7ac9..edcbcab310 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionContext.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionContext.java @@ -10,5 +10,21 @@ * @param input The raw object returned by the initial Brigadier parse for the Argument * @param previousArguments The previously parsed arguments that came before this argument */ -public record ArgumentParseExceptionContext(WrapperCommandSyntaxException exception, CommandSender sender, Object input, Object[] previousArguments) { +public record ArgumentParseExceptionContext( + /** + * @param exception The CommandSyntaxException that was thrown when the Argument failed to parse + */ + WrapperCommandSyntaxException exception, + /** + * @param sender The CommandSender who sent the command that caused the exception + */ + CommandSender sender, + /** + * @param input The raw object returned by the initial Brigadier parse for the Argument + */ + Object input, + /** + * @param previousArguments The previously parsed arguments that came before this argument + */ + Object[] previousArguments) { } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ExceptionHandlingArgumentType.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ExceptionHandlingArgumentType.java index 7a50162fda..e67e9c4c56 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ExceptionHandlingArgumentType.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ExceptionHandlingArgumentType.java @@ -20,7 +20,16 @@ * @param errorHandler The {@link InitialParseExceptionHandler} that handles intercepted {@link CommandSyntaxException} * @param The object returned when the wrapped {@link ArgumentType} is parsed */ -public record ExceptionHandlingArgumentType(ArgumentType baseType, InitialParseExceptionHandler errorHandler) implements ArgumentType { +public record ExceptionHandlingArgumentType( + /** + * @param baseType The {@link ArgumentType} this object is wrapping + */ + ArgumentType baseType, + /** + * @param errorHandler The {@link InitialParseExceptionHandler} that handles intercepted {@link CommandSyntaxException} + */ + InitialParseExceptionHandler errorHandler) + implements ArgumentType { @Override public T parse(StringReader stringReader) throws CommandSyntaxException { diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionContext.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionContext.java index e6bb65793a..ac805fd61e 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionContext.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/InitialParseExceptionContext.java @@ -11,7 +11,16 @@ * * @param exception The {@link CommandSyntaxException} that was thrown when the ArgumentType failed to parse. * @param stringReader The {@link StringReader} used for reading in the command. - * The cursor is at the beginning of the argument. + * The cursor will be at the beginning of the argument. */ -public record InitialParseExceptionContext(WrapperCommandSyntaxException exception, WrapperStringReader stringReader) { +public record InitialParseExceptionContext( + /** + * @param exception The {@link CommandSyntaxException} that was thrown when the ArgumentType failed to parse. + */ + WrapperCommandSyntaxException exception, + /** + * @param stringReader The {@link StringReader} used for reading in the command. + * The cursor will be at the beginning of the argument. + */ + WrapperStringReader stringReader) { } From 54b538d1c44ef081284f44a4b49e5a8bf86bf063 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Thu, 2 Feb 2023 09:32:36 -0500 Subject: [PATCH 39/58] Implement equals, hashCode, toString for WrapperCommandSyntaxException --- .../WrapperCommandSyntaxException.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/exceptions/WrapperCommandSyntaxException.java b/commandapi-core/src/main/java/dev/jorel/commandapi/exceptions/WrapperCommandSyntaxException.java index 3642228740..930e8d5aac 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/exceptions/WrapperCommandSyntaxException.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/exceptions/WrapperCommandSyntaxException.java @@ -164,4 +164,21 @@ public int getCursor() { return this.exception.getCursor(); } + // Comparison methods + @Override + public boolean equals(Object obj) { + if(this == obj) return true; + if(!(obj instanceof WrapperCommandSyntaxException wCSE)) return false; + return this.exception.equals(wCSE.exception); + } + + @Override + public int hashCode() { + return exception.hashCode(); + } + + @Override + public String toString() { + return exception.toString(); + } } From 245f969085bcfcc71c98f81d2cd6b069f9d3631e Mon Sep 17 00:00:00 2001 From: BuildTools Date: Thu, 2 Feb 2023 10:05:23 -0500 Subject: [PATCH 40/58] Use VarHandles instead of static Method reflection --- ...eptionHandlingArgumentSerializer_1_15.java | 30 ++++++++++-------- ...ionHandlingArgumentSerializer_1_16_R1.java | 31 ++++++++++--------- ...ionHandlingArgumentSerializer_1_16_R2.java | 31 +++++++++++-------- ...nHandlingArgumentSerializer_1_16_4_R3.java | 30 ++++++++++-------- ...andlingArgumentSerializer_1_17_Common.java | 31 +++++++++++-------- ...ionHandlingArgumentSerializer_1_18_R2.java | 31 +++++++++++-------- ...ionHandlingArgumentSerializer_1_18_R1.java | 31 +++++++++++-------- 7 files changed, 123 insertions(+), 92 deletions(-) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java index 4099ff1f36..b936283689 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java @@ -8,24 +8,32 @@ import net.minecraft.server.v1_15_R1.ArgumentSerializer; import net.minecraft.server.v1_15_R1.PacketDataSerializer; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; import java.lang.reflect.Field; -import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; public class ExceptionHandlingArgumentSerializer_1_15 implements ArgumentSerializer> { + private static final VarHandle ArgumentRegistry_getInfo; - private static Method getInfo = null; + // Compute all var handles all in one go so we don't do this during main server runtime + static { + VarHandle ar_a = null; + try { + ar_a = MethodHandles.privateLookupIn(ArgumentRegistry.class, MethodHandles.lookup()) + .findVarHandle(ArgumentRegistry.class, "a", ArgumentType.class); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + ArgumentRegistry_getInfo = ar_a; + } @Override // serializeToNetwork public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { try { // Remove this key from packet - if(getInfo == null) { - getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); - getInfo.setAccessible(true); - } - Object myInfo = getInfo.invoke(null, argument); + Object myInfo = ArgumentRegistry_getInfo.get(argument); // TODO: This Field reflection (and others in this class) acts on the class ArgumentRegistry.a. This inner // class is package-private, and the @RequireField annotation doesn't currently support that. We would like @@ -38,7 +46,7 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa // Add baseType key instead ArgumentType baseType = argument.baseType(); - Object baseInfo = getInfo.invoke(null, baseType); + Object baseInfo = ArgumentRegistry_getInfo.get(argument); String baseKey = keyField.get(baseInfo).toString(); packetDataSerializer.a(baseKey); @@ -57,11 +65,7 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) try { ArgumentType baseType = argument.baseType(); - if(getInfo == null) { - getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); - getInfo.setAccessible(true); - } - Object baseInfo = getInfo.invoke(null, baseType); + Object baseInfo = ArgumentRegistry_getInfo.get(baseType); Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); properties.addProperty("baseType", keyField.get(baseInfo).toString()); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java index 8fdfcfc748..c5f9484623 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java @@ -8,24 +8,31 @@ import net.minecraft.server.v1_16_R1.ArgumentSerializer; import net.minecraft.server.v1_16_R1.PacketDataSerializer; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; import java.lang.reflect.Field; -import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; public class ExceptionHandlingArgumentSerializer_1_16_R1 implements ArgumentSerializer> { + private static final VarHandle ArgumentRegistry_getInfo; - private static Method getInfo = null; + // Compute all var handles all in one go so we don't do this during main server runtime + static { + VarHandle ar_a = null; + try { + ar_a = MethodHandles.privateLookupIn(ArgumentRegistry.class, MethodHandles.lookup()) + .findVarHandle(ArgumentRegistry.class, "a", ArgumentType.class); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + ArgumentRegistry_getInfo = ar_a; + } @Override // serializeToNetwork public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { try { - // Remove this key from packet - if(getInfo == null) { - getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); - getInfo.setAccessible(true); - } - Object myInfo = getInfo.invoke(null, argument); + Object myInfo = ArgumentRegistry_getInfo.get(argument); // TODO: This Field reflection (and others in this class) acts on the class ArgumentRegistry.a. This inner // class is package-private, and the @RequireField annotation doesn't currently support that. We would like @@ -38,7 +45,7 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa // Add baseType key instead ArgumentType baseType = argument.baseType(); - Object baseInfo = getInfo.invoke(null, baseType); + Object baseInfo = ArgumentRegistry_getInfo.get(baseType); String baseKey = keyField.get(baseInfo).toString(); packetDataSerializer.a(baseKey); @@ -57,11 +64,7 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) try { ArgumentType baseType = argument.baseType(); - if(getInfo == null) { - getInfo = ArgumentRegistry.class.getDeclaredMethod("a", ArgumentType.class); - getInfo.setAccessible(true); - } - Object baseInfo = getInfo.invoke(null, baseType); + Object baseInfo = ArgumentRegistry_getInfo.get(baseType); Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); properties.addProperty("baseType", keyField.get(baseInfo).toString()); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java index 73e6818ae4..608c1cd200 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java @@ -9,13 +9,26 @@ import net.minecraft.server.v1_16_R2.ArgumentSerializer; import net.minecraft.server.v1_16_R2.PacketDataSerializer; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; import java.lang.reflect.Field; -import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; +@Differs(from = {"1.15", "1.16.2"}, by = "Renamed ArgumentRegistry#a(ArgumentType) to ArgumentRegistry#b(ArgumentType)") public class ExceptionHandlingArgumentSerializer_1_16_R2 implements ArgumentSerializer> { + private static final VarHandle ArgumentRegistry_getInfo; - private static Method getInfo = null; + // Compute all var handles all in one go so we don't do this during main server runtime + static { + VarHandle ar_b = null; + try { + ar_b = MethodHandles.privateLookupIn(ArgumentRegistry.class, MethodHandles.lookup()) + .findVarHandle(ArgumentRegistry.class, "b", ArgumentType.class); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + ArgumentRegistry_getInfo = ar_b; + } @Override @Differs(from = {"1.13", "1.14", "1.15", "1.16.1"}, by = "ArgumentRegistry.a -> ArgumentRegistry.b") @@ -23,11 +36,7 @@ public class ExceptionHandlingArgumentSerializer_1_16_R2 implements ArgumentS public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { try { // Remove this key from packet - if(getInfo == null) { - getInfo = ArgumentRegistry.class.getDeclaredMethod("b", ArgumentType.class); - getInfo.setAccessible(true); - } - Object myInfo = getInfo.invoke(null, argument); + Object myInfo = ArgumentRegistry_getInfo.get(argument); // TODO: This Field reflection (and others in this class) acts on the class ArgumentRegistry.a. This inner // class is package-private, and the @RequireField annotation doesn't currently support that. We would like @@ -40,7 +49,7 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa // Add baseType key instead ArgumentType baseType = argument.baseType(); - Object baseInfo = getInfo.invoke(null, baseType); + Object baseInfo = ArgumentRegistry_getInfo.get(baseType); String baseKey = keyField.get(baseInfo).toString(); packetDataSerializer.a(baseKey); @@ -60,11 +69,7 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) try { ArgumentType baseType = argument.baseType(); - if(getInfo == null) { - getInfo = ArgumentRegistry.class.getDeclaredMethod("b", ArgumentType.class); - getInfo.setAccessible(true); - } - Object baseInfo = getInfo.invoke(null, baseType); + Object baseInfo = ArgumentRegistry_getInfo.get(baseType); Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); properties.addProperty("baseType", keyField.get(baseInfo).toString()); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java index 26e2a4307f..fa47b35f5d 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java @@ -8,24 +8,32 @@ import net.minecraft.server.v1_16_R3.ArgumentSerializer; import net.minecraft.server.v1_16_R3.PacketDataSerializer; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; import java.lang.reflect.Field; -import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; public class ExceptionHandlingArgumentSerializer_1_16_4_R3 implements ArgumentSerializer> { + private static final VarHandle ArgumentRegistry_getInfo; - private static Method getInfo = null; + // Compute all var handles all in one go so we don't do this during main server runtime + static { + VarHandle ar_b = null; + try { + ar_b = MethodHandles.privateLookupIn(ArgumentRegistry.class, MethodHandles.lookup()) + .findVarHandle(ArgumentRegistry.class, "b", ArgumentType.class); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + ArgumentRegistry_getInfo = ar_b; + } @Override // serializeToNetwork public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { try { // Remove this key from packet - if(getInfo == null) { - getInfo = ArgumentRegistry.class.getDeclaredMethod("b", ArgumentType.class); - getInfo.setAccessible(true); - } - Object myInfo = getInfo.invoke(null, argument); + Object myInfo = ArgumentRegistry_getInfo.get(argument); // TODO: This Field reflection (and others in this class) acts on the class ArgumentRegistry.a. This inner // class is package-private, and the @RequireField annotation doesn't currently support that. We would like @@ -38,7 +46,7 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa // Add baseType key instead ArgumentType baseType = argument.baseType(); - Object baseInfo = getInfo.invoke(null, baseType); + Object baseInfo = ArgumentRegistry_getInfo.get(baseType); String baseKey = keyField.get(baseInfo).toString(); packetDataSerializer.a(baseKey); @@ -57,11 +65,7 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) try { ArgumentType baseType = argument.baseType(); - if(getInfo == null) { - getInfo = ArgumentRegistry.class.getDeclaredMethod("b", ArgumentType.class); - getInfo.setAccessible(true); - } - Object baseInfo = getInfo.invoke(null, baseType); + Object baseInfo = ArgumentRegistry_getInfo.get(baseType); Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); properties.addProperty("baseType", keyField.get(baseInfo).toString()); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java index af8d620cb9..edd03a66d3 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java @@ -8,22 +8,31 @@ import net.minecraft.commands.synchronization.ArgumentTypes; import net.minecraft.network.FriendlyByteBuf; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; import java.lang.reflect.Field; -import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; public class ExceptionHandlingArgumentSerializer_1_17_Common implements ArgumentSerializer> { - private static Method getInfo = null; + private static final VarHandle ArgumentTypes_getInfo; + + // Compute all var handles all in one go so we don't do this during main server runtime + static { + VarHandle ar_b = null; + try { + ar_b = MethodHandles.privateLookupIn(ArgumentTypes.class, MethodHandles.lookup()) + .findVarHandle(ArgumentTypes.class, "b", ArgumentType.class); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + ArgumentTypes_getInfo = ar_b; + } @Override public void serializeToNetwork(ExceptionHandlingArgumentType argument, FriendlyByteBuf friendlyByteBuf) { try { // Remove this key from packet - if(getInfo == null) { - getInfo = ArgumentTypes.class.getDeclaredMethod("b", ArgumentType.class); - getInfo.setAccessible(true); - } - Object myInfo = getInfo.invoke(null, argument); + Object myInfo = ArgumentTypes_getInfo.get(argument); // TODO: This Field reflection (and others in this class) acts on the class ArgumentTypes.Entry. This inner // class is private, and the @RequireField annotation doesn't currently support that. We would like @@ -36,7 +45,7 @@ public void serializeToNetwork(ExceptionHandlingArgumentType argument, Friend // Add baseType key instead ArgumentType baseType = argument.baseType(); - Object baseInfo = getInfo.invoke(null, baseType); + Object baseInfo = ArgumentTypes_getInfo.get(baseType); String baseKey = keyField.get(baseInfo).toString(); friendlyByteBuf.writeUtf(baseKey); @@ -54,11 +63,7 @@ public void serializeToJson(ExceptionHandlingArgumentType argument, JsonObjec try { ArgumentType baseType = argument.baseType(); - if(getInfo == null) { - getInfo = ArgumentTypes.class.getDeclaredMethod("b", ArgumentType.class); - getInfo.setAccessible(true); - } - Object baseInfo = getInfo.invoke(null, baseType); + Object baseInfo = ArgumentTypes_getInfo.get(baseType); Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); properties.addProperty("baseType", keyField.get(baseInfo).toString()); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java index 79d385277e..506458bdfd 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java @@ -9,12 +9,25 @@ import net.minecraft.commands.synchronization.ArgumentTypes; import net.minecraft.network.FriendlyByteBuf; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; import java.lang.reflect.Field; -import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; public class ExceptionHandlingArgumentSerializer_1_18_R2 implements ArgumentSerializer> { - private static Method getInfo = null; + private static final VarHandle ArgumentTypes_getInfo; + + // Compute all var handles all in one go so we don't do this during main server runtime + static { + VarHandle ar_b = null; + try { + ar_b = MethodHandles.privateLookupIn(ArgumentTypes.class, MethodHandles.lookup()) + .findVarHandle(ArgumentTypes.class, "b", ArgumentType.class); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + ArgumentTypes_getInfo = ar_b; + } @Override @Differs(from = {"1.13", "1.14", "1.15", "1.16", "1.17", "1.18", "1.18.1"}, @@ -22,11 +35,7 @@ public class ExceptionHandlingArgumentSerializer_1_18_R2 implements ArgumentS public void serializeToNetwork(ExceptionHandlingArgumentType argument, FriendlyByteBuf friendlyByteBuf) { try { // Remove this key from packet - if(getInfo == null) { - getInfo = ArgumentTypes.class.getDeclaredMethod("b", ArgumentType.class); - getInfo.setAccessible(true); - } - Object myInfo = getInfo.invoke(null, argument); + Object myInfo = ArgumentTypes_getInfo.get(argument); // TODO: This Field reflection (and others in this class) acts on the class ArgumentTypes.Entry. This inner // class is private, and the @RequireField annotation doesn't currently support that. We would like @@ -39,7 +48,7 @@ public void serializeToNetwork(ExceptionHandlingArgumentType argument, Friend // Add baseType key instead ArgumentType baseType = argument.baseType(); - Object baseInfo = getInfo.invoke(null, baseType); + Object baseInfo = ArgumentTypes_getInfo.get(baseType); String baseKey = keyField.get(baseInfo).toString(); friendlyByteBuf.writeUtf(baseKey); @@ -59,11 +68,7 @@ public void serializeToJson(ExceptionHandlingArgumentType argument, JsonObjec try { ArgumentType baseType = argument.baseType(); - if(getInfo == null) { - getInfo = ArgumentTypes.class.getDeclaredMethod("b", ArgumentType.class); - getInfo.setAccessible(true); - } - Object baseInfo = getInfo.invoke(null, baseType); + Object baseInfo = ArgumentTypes_getInfo.get(baseType); Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); properties.addProperty("baseType", keyField.get(baseInfo).toString()); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java index 852e9581e3..1d52a52cf2 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java @@ -8,22 +8,31 @@ import net.minecraft.commands.synchronization.ArgumentTypes; import net.minecraft.network.FriendlyByteBuf; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; import java.lang.reflect.Field; -import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; public class ExceptionHandlingArgumentSerializer_1_18_R1 implements ArgumentSerializer> { - private static Method getInfo = null; + private static final VarHandle ArgumentTypes_getInfo; + + // Compute all var handles all in one go so we don't do this during main server runtime + static { + VarHandle ar_b = null; + try { + ar_b = MethodHandles.privateLookupIn(ArgumentTypes.class, MethodHandles.lookup()) + .findVarHandle(ArgumentTypes.class, "b", ArgumentType.class); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + ArgumentTypes_getInfo = ar_b; + } @Override public void serializeToNetwork(ExceptionHandlingArgumentType argument, FriendlyByteBuf friendlyByteBuf) { try { // Remove this key from packet - if(getInfo == null) { - getInfo = ArgumentTypes.class.getDeclaredMethod("b", ArgumentType.class); - getInfo.setAccessible(true); - } - Object myInfo = getInfo.invoke(null, argument); + Object myInfo = ArgumentTypes_getInfo.get(argument); // TODO: This Field reflection (and others in this class) acts on the class ArgumentTypes.Entry. This inner // class is private, and the @RequireField annotation doesn't currently support that. We would like @@ -36,7 +45,7 @@ public void serializeToNetwork(ExceptionHandlingArgumentType argument, Friend // Add baseType key instead ArgumentType baseType = argument.baseType(); - Object baseInfo = getInfo.invoke(null, baseType); + Object baseInfo = ArgumentTypes_getInfo.get(baseType); String baseKey = keyField.get(baseInfo).toString(); friendlyByteBuf.writeUtf(baseKey); @@ -54,11 +63,7 @@ public void serializeToJson(ExceptionHandlingArgumentType argument, JsonObjec try { ArgumentType baseType = argument.baseType(); - if(getInfo == null) { - getInfo = ArgumentTypes.class.getDeclaredMethod("b", ArgumentType.class); - getInfo.setAccessible(true); - } - Object baseInfo = getInfo.invoke(null, baseType); + Object baseInfo = ArgumentTypes_getInfo.get(baseType); Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); properties.addProperty("baseType", keyField.get(baseInfo).toString()); From 6b27ebfa2d9f596c3962b1f3fa30c08413a6ed2f Mon Sep 17 00:00:00 2001 From: BuildTools Date: Thu, 2 Feb 2023 21:26:56 -0500 Subject: [PATCH 41/58] Switch dev/argument-exceptions to use CommandArguments instead of Object[] --- .../dev/jorel/commandapi/arguments/AbstractArgument.java | 6 +++--- .../arguments/ArgumentParseExceptionContext.java | 9 ++++++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AbstractArgument.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AbstractArgument.java index 5d777c98a8..d9c2bd19a6 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AbstractArgument.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/AbstractArgument.java @@ -96,7 +96,7 @@ public final String getNodeName() { } /** - * Parses an argument using {@link Argument#parseArgument(CommandContext, String, Object[])}. + * Parses an argument using {@link Argument#parseArgument(CommandContext, String, CommandArguments)}. * If the parse fails and a {@link CommandSyntaxException} is thrown, the exception is passed to * the active {@link ArgumentParseExceptionHandler} for this argument, which can be defined by * developer using {@link Argument#withArgumentParseExceptionHandler(ArgumentParseExceptionHandler)}. @@ -106,13 +106,13 @@ public final String getNodeName() { * @param the command source type * @param cmdCtx the context which ran this command * @param key the name of the argument node - * @param previousArgs an array of previously declared arguments + * @param previousArgs a {@link CommandArguments} object holding previous parsed arguments * @return the parsed object represented by this argument, or the object returned by * the active {@link ArgumentParseExceptionHandler} if parsing fails * @throws CommandSyntaxException if parsing fails and * the active {@link ArgumentParseExceptionHandler} throws an exception as well */ - public final T parseArgumentHandleError(CommandContext cmdCtx, String key, Object[] previousArgs) throws CommandSyntaxException { + public final T parseArgumentHandleError(CommandContext cmdCtx, String key, CommandArguments previousArgs) throws CommandSyntaxException { try { return parseArgument(cmdCtx, key, previousArgs); } catch (CommandSyntaxException original) { diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionContext.java b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionContext.java index edcbcab310..2d8105ec98 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionContext.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/arguments/ArgumentParseExceptionContext.java @@ -1,6 +1,7 @@ package dev.jorel.commandapi.arguments; import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException; +import dev.jorel.commandapi.executors.CommandArguments; /** * A record containing information on why an Argument failed to parse. @@ -8,7 +9,8 @@ * @param exception The CommandSyntaxException that was thrown when the Argument failed to parse * @param sender The CommandSender who sent the command that caused the exception * @param input The raw object returned by the initial Brigadier parse for the Argument - * @param previousArguments The previously parsed arguments that came before this argument + * @param previousArguments - a {@link CommandArguments} object holding previously declared (and parsed) arguments. This can + * be used as if it were arguments in a command executor method */ public record ArgumentParseExceptionContext( /** @@ -24,7 +26,8 @@ public record ArgumentParseExceptionContext( */ Object input, /** - * @param previousArguments The previously parsed arguments that came before this argument + * @param previousArguments - a {@link CommandArguments} object holding previously declared (and parsed) arguments. + * This can be used as if it were arguments in a command executor method */ - Object[] previousArguments) { + CommandArguments previousArguments) { } From 97438e05c06d6f752609b085e659bfdf78b13a41 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Mon, 20 Feb 2023 07:43:13 -0500 Subject: [PATCH 42/58] Add simple InitialParseExceptionArgumentTest --- .../dev/jorel/commandapi/CommandAPIMain.java | 46 ++--- .../jorel/commandapi/test/ArgumentNMS.java | 4 + .../dev/jorel/commandapi/test/MockNMS.java | 6 - .../jorel/commandapi/test/ArgumentNMS.java | 5 + .../dev/jorel/commandapi/test/MockNMS.java | 6 - .../jorel/commandapi/test/ArgumentNMS.java | 5 + .../dev/jorel/commandapi/test/MockNMS.java | 6 - .../jorel/commandapi/test/ArgumentNMS.java | 4 + .../dev/jorel/commandapi/test/MockNMS.java | 193 ------------------ .../InitialParseExceptionArgumentTest.java | 117 +++++++++++ 10 files changed, 158 insertions(+), 234 deletions(-) create mode 100644 commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-tests/src/test/java/dev/jorel/commandapi/test/InitialParseExceptionArgumentTest.java diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index 9b0e681ecb..3c6f97e15b 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -85,6 +85,29 @@ public void onLoad() { } convertCommands(fileConfig); + + // TODO: Finish testing, remove this and clean up imports + new CommandAPICommand("rate") + .withArguments( + new IntegerArgument("rating", 0, 10) + .withInitialParseExceptionHandler(context -> { + String message = context.exception().getMessage(); + if(message.startsWith("Integer must not be less than")) { + context.stringReader().readInt(); + return 0; // Integer too low, move to 0 + } else if(message.startsWith("Integer must not be more than")) { + context.stringReader().readInt(); + return 10; // Integer too high, cap to 10 + } else { + throw context.exception(); // Integer wasn't entered, use original exception + } + }), + new GreedyStringArgument("message") + ).executes((sender, args) -> { + sender.sendMessage("Thanks for rating " + args.get(0) + "/10"); + sender.sendMessage("We will consider your feedback: \"" + args.get(1) + "\""); + }) + .register(); } private void convertCommands(FileConfiguration fileConfig) { @@ -123,29 +146,6 @@ private void convertCommands(FileConfiguration fileConfig) { for (String commandName : fileConfig.getStringList("other-commands-to-convert")) { new AdvancedConverter(commandName).convertCommand(); } - - // TODO: Finish testing, remove this and clean up imports - new CommandAPICommand("rate") - .withArguments( - new IntegerArgument("rating", 0, 10) - .withInitialParseExceptionHandler(context -> { - String message = context.exception().getMessage(); - if(message.startsWith("Integer must not be less than")) { - context.stringReader().readInt(); - return 0; // Integer too low, move to 0 - } else if(message.startsWith("Integer must not be more than")) { - context.stringReader().readInt(); - return 10; // Integer too high, cap to 10 - } else { - throw context.exception(); // Integer wasn't entered, use original exception - } - }), - new GreedyStringArgument("message") - ).executes((sender, args) -> { - sender.sendMessage("Thanks for rating " + args.get(0) + "/10"); - sender.sendMessage("We will consider your feedback: \"" + args.get(1) + "\""); - }) - .register(); } private JavaPlugin getAndValidatePlugin(String pluginName) { diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.16.5/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.16.5/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java index 26d928b28f..6eaea69f39 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.16.5/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.16.5/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java @@ -488,4 +488,8 @@ public UUID getUUID(CommandContext cmdCtx, String key) { return baseNMS.getUUID(cmdCtx, key); } + @Override + public void registerCustomArgumentType() { + baseNMS.registerCustomArgumentType(); + } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.16.5/src/main/java/dev/jorel/commandapi/test/MockNMS.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.16.5/src/main/java/dev/jorel/commandapi/test/MockNMS.java index c76e143a1c..21905168a9 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.16.5/src/main/java/dev/jorel/commandapi/test/MockNMS.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.16.5/src/main/java/dev/jorel/commandapi/test/MockNMS.java @@ -467,10 +467,4 @@ public BukkitCommandSender getCommandSenderFromCommandS public HelpTopic generateHelpTopic(String commandName, String shortDescription, String fullDescription, String permission) { return baseNMS.generateHelpTopic(commandName, shortDescription, fullDescription, permission); } - - @Override - public void registerCustomArgumentType() { - // TODO: Make sure this works - // Skepter needs to fix ArgumentTypes in this version first? - } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.17/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.17/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java index 2c546be898..b81e4a4b92 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.17/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.17/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java @@ -488,4 +488,9 @@ public UUID getUUID(CommandContext cmdCtx, String key) { return baseNMS.getUUID(cmdCtx, key); } + + @Override + public void registerCustomArgumentType() { + baseNMS.registerCustomArgumentType(); + } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.17/src/main/java/dev/jorel/commandapi/test/MockNMS.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.17/src/main/java/dev/jorel/commandapi/test/MockNMS.java index 2d4bec17e0..a3c05978cf 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.17/src/main/java/dev/jorel/commandapi/test/MockNMS.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.17/src/main/java/dev/jorel/commandapi/test/MockNMS.java @@ -447,10 +447,4 @@ public BukkitCommandSender getCommandSenderFromCommandS public HelpTopic generateHelpTopic(String commandName, String shortDescription, String fullDescription, String permission) { return baseNMS.generateHelpTopic(commandName, shortDescription, fullDescription, permission); } - - @Override - public void registerCustomArgumentType() { - // TODO: Make sure this works - // Skepter needs to fix ArgumentTypes in this version first? - } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.18/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.18/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java index de583c0203..d8975ea93c 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.18/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.18/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java @@ -488,4 +488,9 @@ public UUID getUUID(CommandContext cmdCtx, String key) { return baseNMS.getUUID(cmdCtx, key); } + + @Override + public void registerCustomArgumentType() { + baseNMS.registerCustomArgumentType(); + } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.18/src/main/java/dev/jorel/commandapi/test/MockNMS.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.18/src/main/java/dev/jorel/commandapi/test/MockNMS.java index d5c53b0238..ebf67c94d8 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.18/src/main/java/dev/jorel/commandapi/test/MockNMS.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.18/src/main/java/dev/jorel/commandapi/test/MockNMS.java @@ -478,10 +478,4 @@ public BukkitCommandSender getCommandSenderFromCommandS public HelpTopic generateHelpTopic(String commandName, String shortDescription, String fullDescription, String permission) { return baseNMS.generateHelpTopic(commandName, shortDescription, fullDescription, permission); } - - @Override - public void registerCustomArgumentType() { - // TODO: Make sure this works - // Skepter needs to fix ArgumentTypes in this version first? - } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.19.2/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.19.2/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java index 2d36ccc822..cfefabc880 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.19.2/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.19.2/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java @@ -510,4 +510,8 @@ public UUID getUUID(CommandContext cmdCtx, String key) { return baseNMS.getUUID(cmdCtx, key); } + @Override + public void registerCustomArgumentType() { + baseNMS.registerCustomArgumentType(); + } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.19.2/src/main/java/dev/jorel/commandapi/test/MockNMS.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.19.2/src/main/java/dev/jorel/commandapi/test/MockNMS.java index ae27333169..5ad6881b39 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.19.2/src/main/java/dev/jorel/commandapi/test/MockNMS.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.19.2/src/main/java/dev/jorel/commandapi/test/MockNMS.java @@ -88,8 +88,6 @@ public MockNMS(CommandAPIBukkit baseNMS) { Mockito.when(nms.getMinecraftServer()).thenAnswer(i -> getMinecraftServer()); super.baseNMS = nms; -// initializeArgumentsInArgumentTypeInfos(); - // Initialize WorldVersion (game version) SharedConstants.tryDetectVersion(); @@ -475,199 +473,8 @@ public BukkitCommandSender getCommandSenderFromCommandS } } -// @Override -// public void createDispatcherFile(File file, CommandDispatcher dispatcher) -// throws IOException { -// Files -// .asCharSink(file, StandardCharsets.UTF_8) -// .write(new GsonBuilder() -// .setPrettyPrinting() -// .create() -// .toJson(DispatcherUtil.toJSON(dispatcher, dispatcher.getRoot()))); -// } -// -// @SuppressWarnings("rawtypes") -// private void initializeArgumentsInArgumentTypeInfos() { -// @SuppressWarnings("unchecked") -// Map, ArgumentTypeInfo> map = getFieldAs(ArgumentTypeInfos.class, "a", null, Map.class); -// map.put(BoolArgumentType.class, SingletonArgumentInfo.contextFree(BoolArgumentType::bool)); -// map.put(FloatArgumentType.class, new FloatArgumentInfo()); -// map.put(DoubleArgumentType.class, new DoubleArgumentInfo()); -// map.put(IntegerArgumentType.class, new IntegerArgumentInfo()); -// map.put(LongArgumentType.class, new LongArgumentInfo()); -// map.put(StringArgumentType.class, new StringArgumentSerializer()); -// map.put(EntityArgument.class, new EntityArgument.Info()); -// map.put(GameProfileArgument.class, SingletonArgumentInfo.contextFree(GameProfileArgument::gameProfile)); -// map.put(BlockPosArgument.class, SingletonArgumentInfo.contextFree(BlockPosArgument::blockPos)); -// map.put(ColumnPosArgument.class, SingletonArgumentInfo.contextFree(ColumnPosArgument::columnPos)); -// map.put(Vec3Argument.class, SingletonArgumentInfo.contextFree(Vec3Argument::vec3)); -// map.put(Vec2Argument.class, SingletonArgumentInfo.contextFree(Vec2Argument::vec2)); -// map.put(BlockStateArgument.class, SingletonArgumentInfo.contextAware(BlockStateArgument::block)); -// map.put(BlockPredicateArgument.class, SingletonArgumentInfo.contextAware(BlockPredicateArgument::blockPredicate)); -// map.put(ItemArgument.class, SingletonArgumentInfo.contextAware(ItemArgument::item)); -// map.put(ItemPredicateArgument.class, SingletonArgumentInfo.contextAware(ItemPredicateArgument::itemPredicate)); -// map.put(ColorArgument.class, SingletonArgumentInfo.contextFree(ColorArgument::color)); -// map.put(ComponentArgument.class, SingletonArgumentInfo.contextFree(ComponentArgument::textComponent)); -// map.put(MessageArgument.class, SingletonArgumentInfo.contextFree(MessageArgument::message)); -// map.put(CompoundTagArgument.class, SingletonArgumentInfo.contextFree(CompoundTagArgument::compoundTag)); -// map.put(NbtTagArgument.class, SingletonArgumentInfo.contextFree(NbtTagArgument::nbtTag)); -// map.put(NbtPathArgument.class, SingletonArgumentInfo.contextFree(NbtPathArgument::nbtPath)); -// map.put(ObjectiveArgument.class, SingletonArgumentInfo.contextFree(ObjectiveArgument::objective)); -// map.put(ObjectiveCriteriaArgument.class, SingletonArgumentInfo.contextFree(ObjectiveCriteriaArgument::criteria)); -// map.put(OperationArgument.class, SingletonArgumentInfo.contextFree(OperationArgument::operation)); -// map.put(ParticleArgument.class, SingletonArgumentInfo.contextFree(ParticleArgument::particle)); -// map.put(AngleArgument.class, SingletonArgumentInfo.contextFree(AngleArgument::angle)); -// map.put(RotationArgument.class, SingletonArgumentInfo.contextFree(RotationArgument::rotation)); -// map.put(ScoreboardSlotArgument.class, SingletonArgumentInfo.contextFree(ScoreboardSlotArgument::displaySlot)); -// map.put(ScoreHolderArgument.class, new ScoreHolderArgument.Info()); -// map.put(SwizzleArgument.class, SingletonArgumentInfo.contextFree(SwizzleArgument::swizzle)); -// map.put(TeamArgument.class, SingletonArgumentInfo.contextFree(TeamArgument::team)); -// map.put(SlotArgument.class, SingletonArgumentInfo.contextFree(SlotArgument::slot)); -// map.put(ResourceLocationArgument.class, SingletonArgumentInfo.contextFree(ResourceLocationArgument::id)); -// map.put(MobEffectArgument.class, SingletonArgumentInfo.contextFree(MobEffectArgument::effect)); -// map.put(FunctionArgument.class, SingletonArgumentInfo.contextFree(FunctionArgument::functions)); -// map.put(EntityAnchorArgument.class, SingletonArgumentInfo.contextFree(EntityAnchorArgument::anchor)); -// map.put(RangeArgument.Ints.class, SingletonArgumentInfo.contextFree(RangeArgument::intRange)); -// map.put(RangeArgument.Floats.class, SingletonArgumentInfo.contextFree(RangeArgument::floatRange)); -// map.put(ItemEnchantmentArgument.class, SingletonArgumentInfo.contextFree(ItemEnchantmentArgument::enchantment)); -// map.put(EntitySummonArgument.class, SingletonArgumentInfo.contextFree(EntitySummonArgument::id)); -// map.put(DimensionArgument.class, SingletonArgumentInfo.contextFree(DimensionArgument::dimension)); -// map.put(TimeArgument.class, SingletonArgumentInfo.contextFree(TimeArgument::time)); -// map.put(ResourceOrTagLocationArgument.class, new ResourceOrTagLocationArgument.Info()); -// map.put(ResourceKeyArgument.class, new ResourceKeyArgument.Info()); -// map.put(TemplateMirrorArgument.class, SingletonArgumentInfo.contextFree(TemplateMirrorArgument::templateMirror)); -// map.put(TemplateRotationArgument.class, SingletonArgumentInfo.contextFree(TemplateRotationArgument::templateRotation)); -// map.put(UuidArgument.class, SingletonArgumentInfo.contextFree(UuidArgument::uuid)); -// } -// -// /** -// * An implementation of {@link ArgumentUtils} which produces JSON from a command -// * dispatcher and its root node. We have to avoid accessing IRegistry because it -// * isn't mock-able and cannot be instantiated through normal means -// */ -// private static class DispatcherUtil { -// -// static Map, String> argumentParsers = new HashMap<>(); -// -// static { -// argumentParsers.put(BoolArgumentType.class, "brigadier:bool"); -// argumentParsers.put(FloatArgumentType.class, "brigadier:float"); -// argumentParsers.put(DoubleArgumentType.class, "brigadier:double"); -// argumentParsers.put(IntegerArgumentType.class, "brigadier:integer"); -// argumentParsers.put(LongArgumentType.class, "brigadier:long"); -// argumentParsers.put(StringArgumentType.class, "brigadier:string"); -// argumentParsers.put(EntityArgument.class, "entity"); -// argumentParsers.put(GameProfileArgument.class, "game_profile"); -// argumentParsers.put(BlockPosArgument.class, "block_pos"); -// argumentParsers.put(ColumnPosArgument.class, "column_pos"); -// argumentParsers.put(Vec3Argument.class, "vec3"); -// argumentParsers.put(Vec2Argument.class, "vec2"); -// argumentParsers.put(BlockStateArgument.class, "block_state"); -// argumentParsers.put(BlockPredicateArgument.class, "block_predicate"); -// argumentParsers.put(ItemArgument.class, "item_stack"); -// argumentParsers.put(ItemPredicateArgument.class, "item_predicate"); -// argumentParsers.put(ColorArgument.class, "color"); -// argumentParsers.put(ComponentArgument.class, "component"); -// argumentParsers.put(MessageArgument.class, "message"); -// argumentParsers.put(CompoundTagArgument.class, "nbt_compound_tag"); -// argumentParsers.put(NbtTagArgument.class, "nbt_tag"); -// argumentParsers.put(NbtPathArgument.class, "nbt_path"); -// argumentParsers.put(ObjectiveArgument.class, "objective"); -// argumentParsers.put(ObjectiveCriteriaArgument.class, "objective_criteria"); -// argumentParsers.put(OperationArgument.class, "operation"); -// argumentParsers.put(ParticleArgument.class, "particle"); -// argumentParsers.put(AngleArgument.class, "angle"); -// argumentParsers.put(RotationArgument.class, "rotation"); -// argumentParsers.put(ScoreboardSlotArgument.class, "scoreboard_slot"); -// argumentParsers.put(ScoreHolderArgument.class, "score_holder"); -// argumentParsers.put(SwizzleArgument.class, "swizzle"); -// argumentParsers.put(TeamArgument.class, "team"); -// argumentParsers.put(SlotArgument.class, "item_slot"); -// argumentParsers.put(ResourceLocationArgument.class, "resource_location"); -// argumentParsers.put(MobEffectArgument.class, "mob_effect"); -// argumentParsers.put(FunctionArgument.class, "function"); -// argumentParsers.put(EntityAnchorArgument.class, "entity_anchor"); -// argumentParsers.put(RangeArgument.Ints.class, "int_range"); -// argumentParsers.put(RangeArgument.Floats.class, "float_range"); -// argumentParsers.put(ItemEnchantmentArgument.class, "item_enchantment"); -// argumentParsers.put(EntitySummonArgument.class, "entity_summon"); -// argumentParsers.put(DimensionArgument.class, "dimension"); -// argumentParsers.put(TimeArgument.class, "time"); -// argumentParsers.put(ResourceOrTagLocationArgument.class, "resource_or_tag"); -// argumentParsers.put(ResourceKeyArgument.class, "resource"); -// argumentParsers.put(TemplateMirrorArgument.class, "template_mirror"); -// argumentParsers.put(TemplateRotationArgument.class, "template_rotation"); -// argumentParsers.put(UuidArgument.class, "uuid"); -// } -// -// public static JsonObject toJSON(CommandDispatcher dispatcher, CommandNode node) { -// JsonObject jsonObject = new JsonObject(); -// -// // Unpack nodes -// if (node instanceof RootCommandNode) { -// jsonObject.addProperty("type", "root"); -// } else if (node instanceof LiteralCommandNode) { -// jsonObject.addProperty("type", "literal"); -// } else if (node instanceof ArgumentCommandNode) { -// ArgumentCommandNode argumentCommandNode = (ArgumentCommandNode) node; -// argToJSON(jsonObject, argumentCommandNode.getType()); -// } else { -// jsonObject.addProperty("type", "unknown"); -// } -// -// // Write children -// JsonObject children = new JsonObject(); -// for (CommandNode child : node.getChildren()) { -// children.add(child.getName(), (JsonElement) toJSON(dispatcher, child)); -// } -// if (children.size() > 0) { -// jsonObject.add("children", (JsonElement) children); -// } -// -// // Write whether the command is executable -// if (node.getCommand() != null) { -// jsonObject.addProperty("executable", Boolean.valueOf(true)); -// } -// if (node.getRedirect() != null) { -// Collection redirectPaths = dispatcher.getPath(node.getRedirect()); -// if (!redirectPaths.isEmpty()) { -// JsonArray redirects = new JsonArray(); -// for (String redirectPath : redirectPaths) { -// redirects.add(redirectPath); -// } -// jsonObject.add("redirect", (JsonElement) redirects); -// } -// } -// return jsonObject; -// } -// -// @SuppressWarnings("unchecked") -// private static > void argToJSON(JsonObject jsonObject, T argument) { -// ArgumentTypeInfo.Template argumentInfo = ArgumentTypeInfos.unpack(argument); -// jsonObject.addProperty("type", "argument"); -// jsonObject.addProperty("parser", argumentParsers.get(argument.getClass())); -// -// // Properties -// JsonObject properties = new JsonObject(); -// @SuppressWarnings("rawtypes") -// ArgumentTypeInfo argumentTypeInfo = argumentInfo.type(); -// argumentTypeInfo.serializeToJson(argumentInfo, properties); -// if (properties.size() > 0) { -// jsonObject.add("properties", (JsonElement) properties); -// } -// } -// } - @Override public HelpTopic generateHelpTopic(String commandName, String shortDescription, String fullDescription, String permission) { return baseNMS.generateHelpTopic(commandName, shortDescription, fullDescription, permission); } - - - @Override - public void registerCustomArgumentType() { - // Already done, see - // Our custom argument - // comments - } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-tests/src/test/java/dev/jorel/commandapi/test/InitialParseExceptionArgumentTest.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-tests/src/test/java/dev/jorel/commandapi/test/InitialParseExceptionArgumentTest.java new file mode 100644 index 0000000000..21f6dcb661 --- /dev/null +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-tests/src/test/java/dev/jorel/commandapi/test/InitialParseExceptionArgumentTest.java @@ -0,0 +1,117 @@ +package dev.jorel.commandapi.test; + +import dev.jorel.commandapi.CommandAPICommand; +import dev.jorel.commandapi.arguments.GreedyStringArgument; +import dev.jorel.commandapi.arguments.IntegerArgument; +import org.bukkit.entity.Player; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class InitialParseExceptionArgumentTest extends TestBase { + + /********* + * Setup * + *********/ + + @BeforeEach + public void setUp() { + super.setUp(); + } + + @AfterEach + public void tearDown() { + super.tearDown(); + } + + /********* + * Tests * + *********/ + + @Test + void test() { + Mut ints = Mut.of(); + Mut messages = Mut.of(); + + new CommandAPICommand("rate") + .withArguments( + new IntegerArgument("rating", 0, 10) + .withInitialParseExceptionHandler(context -> { + String message = context.exception().getMessage(); + if(message.startsWith("Integer must not be less than")) { + context.stringReader().readInt(); + return 0; // Integer too low, move to 0 + } else if(message.startsWith("Integer must not be more than")) { + context.stringReader().readInt(); + return 10; // Integer too high, cap to 10 + } else { + throw context.exception(); // Integer wasn't entered, use original exception + } + }), + new GreedyStringArgument("message") + ).executes((sender, args) -> { + ints.set(args.getUnchecked(0)); + messages.set(args.getUnchecked(1)); + }) + .register(); + + assertEquals(""" + { + "type": "root", + "children": { + "rate": { + "type": "literal", + "children": { + "rating": { + "type": "argument", + "parser": "commandapi:exception_handler", + "properties": { + "baseType": "brigadier:integer", + "baseProperties": { + "min": 0, + "max": 10 + } + }, + "children": { + "message": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "greedy" + }, + "executable": true + } + } + } + } + } + } + }""", getDispatcherString()); + + Player player = server.addPlayer("APlayer"); + + // /rate 5 Final message + server.dispatchCommand(player, "rate 5 Final message"); + assertEquals(5, ints.get()); + assertEquals("Final message", messages.get()); + + // /rate -10 Final message + server.dispatchCommand(player, "rate -10 Final message"); + assertEquals(0, ints.get()); + assertEquals("Final message", messages.get()); + + // /rate 20 Final message + server.dispatchCommand(player, "rate 20 Final message"); + assertEquals(10, ints.get()); + assertEquals("Final message", messages.get()); + + // /rate not an integer + assertCommandFailsWith(player, "rate not an integer", "Expected integer at position 5: rate <--[HERE]"); + + + assertNoMoreResults(ints); + assertNoMoreResults(messages); + } +} From 80b828e443948b125889200aefbf93a6d38dee3a Mon Sep 17 00:00:00 2001 From: BuildTools Date: Mon, 20 Feb 2023 08:15:47 -0500 Subject: [PATCH 43/58] Only mock register ExceptionHandlingArgumentType if it is not already registered --- .../main/java/dev/jorel/commandapi/test/ArgumentNMS.java | 6 +++++- .../main/java/dev/jorel/commandapi/test/ArgumentNMS.java | 6 +++++- .../main/java/dev/jorel/commandapi/test/ArgumentNMS.java | 6 +++++- .../main/java/dev/jorel/commandapi/test/ArgumentNMS.java | 6 +++++- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.16.5/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.16.5/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java index 6eaea69f39..dceb5f0b3a 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.16.5/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.16.5/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java @@ -7,6 +7,8 @@ import java.util.function.Function; import java.util.function.Predicate; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import net.minecraft.server.v1_16_R3.ArgumentRegistry; import org.bukkit.Axis; import org.bukkit.ChatColor; import org.bukkit.Location; @@ -490,6 +492,8 @@ public UUID getUUID(CommandContext cmdCtx, String key) { @Override public void registerCustomArgumentType() { - baseNMS.registerCustomArgumentType(); + if(!ArgumentRegistry.a(new ExceptionHandlingArgumentType<>(null, null))) { + baseNMS.registerCustomArgumentType(); + } } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.17/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.17/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java index b81e4a4b92..9c484ea2ec 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.17/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.17/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java @@ -7,6 +7,8 @@ import java.util.function.Function; import java.util.function.Predicate; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import net.minecraft.commands.synchronization.ArgumentTypes; import org.bukkit.Axis; import org.bukkit.ChatColor; import org.bukkit.Location; @@ -491,6 +493,8 @@ public UUID getUUID(CommandContext cmdCtx, String key) { @Override public void registerCustomArgumentType() { - baseNMS.registerCustomArgumentType(); + if(!ArgumentTypes.isTypeRegistered(new ExceptionHandlingArgumentType<>(null, null))) { + baseNMS.registerCustomArgumentType(); + } } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.18/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.18/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java index d8975ea93c..c391ae5446 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.18/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.18/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java @@ -7,6 +7,8 @@ import java.util.function.Function; import java.util.function.Predicate; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import net.minecraft.commands.synchronization.ArgumentTypes; import org.bukkit.Axis; import org.bukkit.ChatColor; import org.bukkit.Location; @@ -491,6 +493,8 @@ public UUID getUUID(CommandContext cmdCtx, String key) { @Override public void registerCustomArgumentType() { - baseNMS.registerCustomArgumentType(); + if(!ArgumentTypes.isTypeRegistered(new ExceptionHandlingArgumentType<>(null, null))) { + baseNMS.registerCustomArgumentType(); + } } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.19.2/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.19.2/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java index cfefabc880..d474042f7d 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.19.2/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.19.2/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java @@ -9,6 +9,8 @@ import java.util.function.Function; import java.util.function.Predicate; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import net.minecraft.commands.synchronization.ArgumentTypeInfos; import org.bukkit.Axis; import org.bukkit.ChatColor; import org.bukkit.Location; @@ -512,6 +514,8 @@ public UUID getUUID(CommandContext cmdCtx, String key) { @Override public void registerCustomArgumentType() { - baseNMS.registerCustomArgumentType(); + if(!ArgumentTypeInfos.isClassRecognized(ExceptionHandlingArgumentType.class)) { + baseNMS.registerCustomArgumentType(); + } } } From 677ec3caa24c43d5b013432b501696af41033a07 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Mon, 20 Feb 2023 09:53:30 -0500 Subject: [PATCH 44/58] Fix MethodHandle reflection for 1_18_R1 --- ...ionHandlingArgumentSerializer_1_18_R1.java | 37 ++++++++++++++----- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java index 1d52a52cf2..97b6c0ca03 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java @@ -7,32 +7,49 @@ import net.minecraft.commands.synchronization.ArgumentSerializer; import net.minecraft.commands.synchronization.ArgumentTypes; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.lang.invoke.VarHandle; import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; public class ExceptionHandlingArgumentSerializer_1_18_R1 implements ArgumentSerializer> { - private static final VarHandle ArgumentTypes_getInfo; + private static final MethodHandle ArgumentTypes_getInfo; // Compute all var handles all in one go so we don't do this during main server runtime static { - VarHandle ar_b = null; + // We need a reference to the class object for ArgumentTypes.Entry, but that inner class is private + // We can get an object from ArgumentTypes#get(ResourceLocation), then take its class + Class entryClass = null; try { - ar_b = MethodHandles.privateLookupIn(ArgumentTypes.class, MethodHandles.lookup()) - .findVarHandle(ArgumentTypes.class, "b", ArgumentType.class); + Method getInfoByResourceLocation = ArgumentTypes.class.getDeclaredMethod("a", ResourceLocation.class); + getInfoByResourceLocation.setAccessible(true); + Object entryObject = getInfoByResourceLocation.invoke(null, new ResourceLocation("entity")); + entryClass = entryObject.getClass(); } catch (ReflectiveOperationException e) { e.printStackTrace(); } - ArgumentTypes_getInfo = ar_b; + + MethodHandle at_b = null; + try { + at_b = MethodHandles.privateLookupIn(ArgumentTypes.class, MethodHandles.lookup()) + .findStatic(ArgumentTypes.class, "b", MethodType.methodType(entryClass, ArgumentType.class)); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + ArgumentTypes_getInfo = at_b; } @Override public void serializeToNetwork(ExceptionHandlingArgumentType argument, FriendlyByteBuf friendlyByteBuf) { try { // Remove this key from packet - Object myInfo = ArgumentTypes_getInfo.get(argument); + Object myInfo = ArgumentTypes_getInfo.invoke(argument); // TODO: This Field reflection (and others in this class) acts on the class ArgumentTypes.Entry. This inner // class is private, and the @RequireField annotation doesn't currently support that. We would like @@ -45,7 +62,7 @@ public void serializeToNetwork(ExceptionHandlingArgumentType argument, Friend // Add baseType key instead ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentTypes_getInfo.get(baseType); + Object baseInfo = ArgumentTypes_getInfo.invoke(baseType); String baseKey = keyField.get(baseInfo).toString(); friendlyByteBuf.writeUtf(baseKey); @@ -53,7 +70,7 @@ public void serializeToNetwork(ExceptionHandlingArgumentType argument, Friend Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); subSerializer.serializeToNetwork(baseType, friendlyByteBuf); - } catch (ReflectiveOperationException e) { + } catch (Throwable e) { e.printStackTrace(); } } @@ -63,7 +80,7 @@ public void serializeToJson(ExceptionHandlingArgumentType argument, JsonObjec try { ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentTypes_getInfo.get(baseType); + Object baseInfo = ArgumentTypes_getInfo.invoke(baseType); Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); properties.addProperty("baseType", keyField.get(baseInfo).toString()); @@ -76,7 +93,7 @@ public void serializeToJson(ExceptionHandlingArgumentType argument, JsonObjec if (subProperties.size() > 0) { properties.add("baseProperties", subProperties); } - } catch (ReflectiveOperationException e) { + } catch (Throwable e) { e.printStackTrace(); } } From 3ba07829acc096d62223b951b00fb71d10c08edd Mon Sep 17 00:00:00 2001 From: BuildTools Date: Mon, 20 Feb 2023 10:14:44 -0500 Subject: [PATCH 45/58] Fix MethodHandle reflection for all versions --- ...eptionHandlingArgumentSerializer_1_15.java | 33 ++++++++++++++----- ...ionHandlingArgumentSerializer_1_16_R1.java | 33 ++++++++++++++----- ...ionHandlingArgumentSerializer_1_16_R2.java | 33 ++++++++++++++----- ...nHandlingArgumentSerializer_1_16_4_R3.java | 33 ++++++++++++++----- ...andlingArgumentSerializer_1_17_Common.java | 33 ++++++++++++++----- ...ionHandlingArgumentSerializer_1_18_R2.java | 33 ++++++++++++++----- ...ionHandlingArgumentSerializer_1_18_R1.java | 2 -- 7 files changed, 144 insertions(+), 56 deletions(-) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java index b936283689..72cd43ab41 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java @@ -6,22 +6,37 @@ import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; import net.minecraft.server.v1_15_R1.ArgumentRegistry; import net.minecraft.server.v1_15_R1.ArgumentSerializer; +import net.minecraft.server.v1_15_R1.MinecraftKey; import net.minecraft.server.v1_15_R1.PacketDataSerializer; +import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; -import java.lang.invoke.VarHandle; +import java.lang.invoke.MethodType; import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; public class ExceptionHandlingArgumentSerializer_1_15 implements ArgumentSerializer> { - private static final VarHandle ArgumentRegistry_getInfo; + private static final MethodHandle ArgumentRegistry_getInfo; // Compute all var handles all in one go so we don't do this during main server runtime static { - VarHandle ar_a = null; + // We need a reference to the class object for ArgumentTypes.a, but that inner class is private + // We can get an object from ArgumentTypes#get(ResourceLocation), then take its class + Class entryClass = null; + try { + Method getInfoByResourceLocation = ArgumentRegistry.class.getDeclaredMethod("a", MinecraftKey.class); + getInfoByResourceLocation.setAccessible(true); + Object entryObject = getInfoByResourceLocation.invoke(null, new MinecraftKey("entity")); + entryClass = entryObject.getClass(); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + + MethodHandle ar_a = null; try { ar_a = MethodHandles.privateLookupIn(ArgumentRegistry.class, MethodHandles.lookup()) - .findVarHandle(ArgumentRegistry.class, "a", ArgumentType.class); + .findStatic(ArgumentRegistry.class, "a", MethodType.methodType(entryClass, ArgumentType.class)); } catch (ReflectiveOperationException e) { e.printStackTrace(); } @@ -33,7 +48,7 @@ public class ExceptionHandlingArgumentSerializer_1_15 implements ArgumentSeri public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { try { // Remove this key from packet - Object myInfo = ArgumentRegistry_getInfo.get(argument); + Object myInfo = ArgumentRegistry_getInfo.invoke(argument); // TODO: This Field reflection (and others in this class) acts on the class ArgumentRegistry.a. This inner // class is package-private, and the @RequireField annotation doesn't currently support that. We would like @@ -46,7 +61,7 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa // Add baseType key instead ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentRegistry_getInfo.get(argument); + Object baseInfo = ArgumentRegistry_getInfo.invoke(argument); String baseKey = keyField.get(baseInfo).toString(); packetDataSerializer.a(baseKey); @@ -54,7 +69,7 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); subSerializer.a(baseType, packetDataSerializer); - } catch (ReflectiveOperationException e) { + } catch (Throwable e) { e.printStackTrace(); } } @@ -65,7 +80,7 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) try { ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentRegistry_getInfo.get(baseType); + Object baseInfo = ArgumentRegistry_getInfo.invoke(baseType); Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); properties.addProperty("baseType", keyField.get(baseInfo).toString()); @@ -78,7 +93,7 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) if (subProperties.size() > 0) { properties.add("baseProperties", subProperties); } - } catch (ReflectiveOperationException e) { + } catch (Throwable e) { e.printStackTrace(); } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java index c5f9484623..4281372f0c 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java @@ -6,22 +6,37 @@ import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; import net.minecraft.server.v1_16_R1.ArgumentRegistry; import net.minecraft.server.v1_16_R1.ArgumentSerializer; +import net.minecraft.server.v1_16_R1.MinecraftKey; import net.minecraft.server.v1_16_R1.PacketDataSerializer; +import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; -import java.lang.invoke.VarHandle; +import java.lang.invoke.MethodType; import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; public class ExceptionHandlingArgumentSerializer_1_16_R1 implements ArgumentSerializer> { - private static final VarHandle ArgumentRegistry_getInfo; + private static final MethodHandle ArgumentRegistry_getInfo; // Compute all var handles all in one go so we don't do this during main server runtime static { - VarHandle ar_a = null; + // We need a reference to the class object for ArgumentTypes.a, but that inner class is private + // We can get an object from ArgumentTypes#get(ResourceLocation), then take its class + Class entryClass = null; + try { + Method getInfoByResourceLocation = ArgumentRegistry.class.getDeclaredMethod("a", MinecraftKey.class); + getInfoByResourceLocation.setAccessible(true); + Object entryObject = getInfoByResourceLocation.invoke(null, new MinecraftKey("entity")); + entryClass = entryObject.getClass(); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + + MethodHandle ar_a = null; try { ar_a = MethodHandles.privateLookupIn(ArgumentRegistry.class, MethodHandles.lookup()) - .findVarHandle(ArgumentRegistry.class, "a", ArgumentType.class); + .findStatic(ArgumentRegistry.class, "a", MethodType.methodType(entryClass, ArgumentType.class)); } catch (ReflectiveOperationException e) { e.printStackTrace(); } @@ -32,7 +47,7 @@ public class ExceptionHandlingArgumentSerializer_1_16_R1 implements ArgumentS // serializeToNetwork public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { try { - Object myInfo = ArgumentRegistry_getInfo.get(argument); + Object myInfo = ArgumentRegistry_getInfo.invoke(argument); // TODO: This Field reflection (and others in this class) acts on the class ArgumentRegistry.a. This inner // class is package-private, and the @RequireField annotation doesn't currently support that. We would like @@ -45,7 +60,7 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa // Add baseType key instead ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentRegistry_getInfo.get(baseType); + Object baseInfo = ArgumentRegistry_getInfo.invoke(baseType); String baseKey = keyField.get(baseInfo).toString(); packetDataSerializer.a(baseKey); @@ -53,7 +68,7 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); subSerializer.a(baseType, packetDataSerializer); - } catch (ReflectiveOperationException e) { + } catch (Throwable e) { e.printStackTrace(); } } @@ -64,7 +79,7 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) try { ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentRegistry_getInfo.get(baseType); + Object baseInfo = ArgumentRegistry_getInfo.invoke(baseType); Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); properties.addProperty("baseType", keyField.get(baseInfo).toString()); @@ -77,7 +92,7 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) if (subProperties.size() > 0) { properties.add("baseProperties", subProperties); } - } catch (ReflectiveOperationException e) { + } catch (Throwable e) { e.printStackTrace(); } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java index 608c1cd200..32a494af9f 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java @@ -7,23 +7,38 @@ import dev.jorel.commandapi.preprocessor.Differs; import net.minecraft.server.v1_16_R2.ArgumentRegistry; import net.minecraft.server.v1_16_R2.ArgumentSerializer; +import net.minecraft.server.v1_16_R2.MinecraftKey; import net.minecraft.server.v1_16_R2.PacketDataSerializer; +import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; -import java.lang.invoke.VarHandle; +import java.lang.invoke.MethodType; import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; @Differs(from = {"1.15", "1.16.2"}, by = "Renamed ArgumentRegistry#a(ArgumentType) to ArgumentRegistry#b(ArgumentType)") public class ExceptionHandlingArgumentSerializer_1_16_R2 implements ArgumentSerializer> { - private static final VarHandle ArgumentRegistry_getInfo; + private static final MethodHandle ArgumentRegistry_getInfo; // Compute all var handles all in one go so we don't do this during main server runtime static { - VarHandle ar_b = null; + // We need a reference to the class object for ArgumentTypes.a, but that inner class is private + // We can get an object from ArgumentTypes#get(ResourceLocation), then take its class + Class entryClass = null; + try { + Method getInfoByResourceLocation = ArgumentRegistry.class.getDeclaredMethod("a", MinecraftKey.class); + getInfoByResourceLocation.setAccessible(true); + Object entryObject = getInfoByResourceLocation.invoke(null, new MinecraftKey("entity")); + entryClass = entryObject.getClass(); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + + MethodHandle ar_b = null; try { ar_b = MethodHandles.privateLookupIn(ArgumentRegistry.class, MethodHandles.lookup()) - .findVarHandle(ArgumentRegistry.class, "b", ArgumentType.class); + .findStatic(ArgumentRegistry.class, "b", MethodType.methodType(entryClass, ArgumentType.class)); } catch (ReflectiveOperationException e) { e.printStackTrace(); } @@ -36,7 +51,7 @@ public class ExceptionHandlingArgumentSerializer_1_16_R2 implements ArgumentS public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { try { // Remove this key from packet - Object myInfo = ArgumentRegistry_getInfo.get(argument); + Object myInfo = ArgumentRegistry_getInfo.invoke(argument); // TODO: This Field reflection (and others in this class) acts on the class ArgumentRegistry.a. This inner // class is package-private, and the @RequireField annotation doesn't currently support that. We would like @@ -49,7 +64,7 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa // Add baseType key instead ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentRegistry_getInfo.get(baseType); + Object baseInfo = ArgumentRegistry_getInfo.invoke(baseType); String baseKey = keyField.get(baseInfo).toString(); packetDataSerializer.a(baseKey); @@ -57,7 +72,7 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); subSerializer.a(baseType, packetDataSerializer); - } catch (ReflectiveOperationException e) { + } catch (Throwable e) { e.printStackTrace(); } } @@ -69,7 +84,7 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) try { ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentRegistry_getInfo.get(baseType); + Object baseInfo = ArgumentRegistry_getInfo.invoke(baseType); Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); properties.addProperty("baseType", keyField.get(baseInfo).toString()); @@ -82,7 +97,7 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) if (subProperties.size() > 0) { properties.add("baseProperties", subProperties); } - } catch (ReflectiveOperationException e) { + } catch (Throwable e) { e.printStackTrace(); } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java index fa47b35f5d..639e7a1577 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java @@ -6,22 +6,37 @@ import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; import net.minecraft.server.v1_16_R3.ArgumentRegistry; import net.minecraft.server.v1_16_R3.ArgumentSerializer; +import net.minecraft.server.v1_16_R3.MinecraftKey; import net.minecraft.server.v1_16_R3.PacketDataSerializer; +import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; -import java.lang.invoke.VarHandle; +import java.lang.invoke.MethodType; import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; public class ExceptionHandlingArgumentSerializer_1_16_4_R3 implements ArgumentSerializer> { - private static final VarHandle ArgumentRegistry_getInfo; + private static final MethodHandle ArgumentRegistry_getInfo; // Compute all var handles all in one go so we don't do this during main server runtime static { - VarHandle ar_b = null; + // We need a reference to the class object for ArgumentTypes.a, but that inner class is private + // We can get an object from ArgumentTypes#get(ResourceLocation), then take its class + Class entryClass = null; + try { + Method getInfoByResourceLocation = ArgumentRegistry.class.getDeclaredMethod("a", MinecraftKey.class); + getInfoByResourceLocation.setAccessible(true); + Object entryObject = getInfoByResourceLocation.invoke(null, new MinecraftKey("entity")); + entryClass = entryObject.getClass(); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + + MethodHandle ar_b = null; try { ar_b = MethodHandles.privateLookupIn(ArgumentRegistry.class, MethodHandles.lookup()) - .findVarHandle(ArgumentRegistry.class, "b", ArgumentType.class); + .findStatic(ArgumentRegistry.class, "b", MethodType.methodType(entryClass, ArgumentType.class)); } catch (ReflectiveOperationException e) { e.printStackTrace(); } @@ -33,7 +48,7 @@ public class ExceptionHandlingArgumentSerializer_1_16_4_R3 implements Argumen public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { try { // Remove this key from packet - Object myInfo = ArgumentRegistry_getInfo.get(argument); + Object myInfo = ArgumentRegistry_getInfo.invoke(argument); // TODO: This Field reflection (and others in this class) acts on the class ArgumentRegistry.a. This inner // class is package-private, and the @RequireField annotation doesn't currently support that. We would like @@ -46,7 +61,7 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa // Add baseType key instead ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentRegistry_getInfo.get(baseType); + Object baseInfo = ArgumentRegistry_getInfo.invoke(baseType); String baseKey = keyField.get(baseInfo).toString(); packetDataSerializer.a(baseKey); @@ -54,7 +69,7 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); subSerializer.a(baseType, packetDataSerializer); - } catch (ReflectiveOperationException e) { + } catch (Throwable e) { e.printStackTrace(); } } @@ -65,7 +80,7 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) try { ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentRegistry_getInfo.get(baseType); + Object baseInfo = ArgumentRegistry_getInfo.invoke(baseType); Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); properties.addProperty("baseType", keyField.get(baseInfo).toString()); @@ -78,7 +93,7 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) if (subProperties.size() > 0) { properties.add("baseProperties", subProperties); } - } catch (ReflectiveOperationException e) { + } catch (Throwable e) { e.printStackTrace(); } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java index edd03a66d3..7de5c5063c 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java @@ -7,21 +7,36 @@ import net.minecraft.commands.synchronization.ArgumentSerializer; import net.minecraft.commands.synchronization.ArgumentTypes; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; -import java.lang.invoke.VarHandle; +import java.lang.invoke.MethodType; import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; public class ExceptionHandlingArgumentSerializer_1_17_Common implements ArgumentSerializer> { - private static final VarHandle ArgumentTypes_getInfo; + private static final MethodHandle ArgumentTypes_getInfo; // Compute all var handles all in one go so we don't do this during main server runtime static { - VarHandle ar_b = null; + // We need a reference to the class object for ArgumentTypes.Entry, but that inner class is private + // We can get an object from ArgumentTypes#get(ResourceLocation), then take its class + Class entryClass = null; + try { + Method getInfoByResourceLocation = ArgumentTypes.class.getDeclaredMethod("a", ResourceLocation.class); + getInfoByResourceLocation.setAccessible(true); + Object entryObject = getInfoByResourceLocation.invoke(null, new ResourceLocation("entity")); + entryClass = entryObject.getClass(); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + + MethodHandle ar_b = null; try { ar_b = MethodHandles.privateLookupIn(ArgumentTypes.class, MethodHandles.lookup()) - .findVarHandle(ArgumentTypes.class, "b", ArgumentType.class); + .findStatic(ArgumentTypes.class, "b", MethodType.methodType(entryClass, ArgumentType.class)); } catch (ReflectiveOperationException e) { e.printStackTrace(); } @@ -32,7 +47,7 @@ public class ExceptionHandlingArgumentSerializer_1_17_Common implements Argum public void serializeToNetwork(ExceptionHandlingArgumentType argument, FriendlyByteBuf friendlyByteBuf) { try { // Remove this key from packet - Object myInfo = ArgumentTypes_getInfo.get(argument); + Object myInfo = ArgumentTypes_getInfo.invoke(argument); // TODO: This Field reflection (and others in this class) acts on the class ArgumentTypes.Entry. This inner // class is private, and the @RequireField annotation doesn't currently support that. We would like @@ -45,7 +60,7 @@ public void serializeToNetwork(ExceptionHandlingArgumentType argument, Friend // Add baseType key instead ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentTypes_getInfo.get(baseType); + Object baseInfo = ArgumentTypes_getInfo.invoke(baseType); String baseKey = keyField.get(baseInfo).toString(); friendlyByteBuf.writeUtf(baseKey); @@ -53,7 +68,7 @@ public void serializeToNetwork(ExceptionHandlingArgumentType argument, Friend Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); subSerializer.serializeToNetwork(baseType, friendlyByteBuf); - } catch (ReflectiveOperationException e) { + } catch (Throwable e) { e.printStackTrace(); } } @@ -63,7 +78,7 @@ public void serializeToJson(ExceptionHandlingArgumentType argument, JsonObjec try { ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentTypes_getInfo.get(baseType); + Object baseInfo = ArgumentTypes_getInfo.invoke(baseType); Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); properties.addProperty("baseType", keyField.get(baseInfo).toString()); @@ -76,7 +91,7 @@ public void serializeToJson(ExceptionHandlingArgumentType argument, JsonObjec if (subProperties.size() > 0) { properties.add("baseProperties", subProperties); } - } catch (ReflectiveOperationException e) { + } catch (Throwable e) { e.printStackTrace(); } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java index 506458bdfd..a3d74ae608 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java @@ -8,21 +8,36 @@ import net.minecraft.commands.synchronization.ArgumentSerializer; import net.minecraft.commands.synchronization.ArgumentTypes; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; -import java.lang.invoke.VarHandle; +import java.lang.invoke.MethodType; import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; public class ExceptionHandlingArgumentSerializer_1_18_R2 implements ArgumentSerializer> { - private static final VarHandle ArgumentTypes_getInfo; + private static final MethodHandle ArgumentTypes_getInfo; // Compute all var handles all in one go so we don't do this during main server runtime static { - VarHandle ar_b = null; + // We need a reference to the class object for ArgumentTypes.Entry, but that inner class is private + // We can get an object from ArgumentTypes#get(ResourceLocation), then take its class + Class entryClass = null; + try { + Method getInfoByResourceLocation = ArgumentTypes.class.getDeclaredMethod("a", ResourceLocation.class); + getInfoByResourceLocation.setAccessible(true); + Object entryObject = getInfoByResourceLocation.invoke(null, new ResourceLocation("entity")); + entryClass = entryObject.getClass(); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + + MethodHandle ar_b = null; try { ar_b = MethodHandles.privateLookupIn(ArgumentTypes.class, MethodHandles.lookup()) - .findVarHandle(ArgumentTypes.class, "b", ArgumentType.class); + .findStatic(ArgumentTypes.class, "b", MethodType.methodType(entryClass, ArgumentType.class)); } catch (ReflectiveOperationException e) { e.printStackTrace(); } @@ -35,7 +50,7 @@ public class ExceptionHandlingArgumentSerializer_1_18_R2 implements ArgumentS public void serializeToNetwork(ExceptionHandlingArgumentType argument, FriendlyByteBuf friendlyByteBuf) { try { // Remove this key from packet - Object myInfo = ArgumentTypes_getInfo.get(argument); + Object myInfo = ArgumentTypes_getInfo.invoke(argument); // TODO: This Field reflection (and others in this class) acts on the class ArgumentTypes.Entry. This inner // class is private, and the @RequireField annotation doesn't currently support that. We would like @@ -48,7 +63,7 @@ public void serializeToNetwork(ExceptionHandlingArgumentType argument, Friend // Add baseType key instead ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentTypes_getInfo.get(baseType); + Object baseInfo = ArgumentTypes_getInfo.invoke(baseType); String baseKey = keyField.get(baseInfo).toString(); friendlyByteBuf.writeUtf(baseKey); @@ -56,7 +71,7 @@ public void serializeToNetwork(ExceptionHandlingArgumentType argument, Friend Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "a"); ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); subSerializer.serializeToNetwork(baseType, friendlyByteBuf); - } catch (ReflectiveOperationException e) { + } catch (Throwable e) { e.printStackTrace(); } } @@ -68,7 +83,7 @@ public void serializeToJson(ExceptionHandlingArgumentType argument, JsonObjec try { ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentTypes_getInfo.get(baseType); + Object baseInfo = ArgumentTypes_getInfo.invoke(baseType); Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); properties.addProperty("baseType", keyField.get(baseInfo).toString()); @@ -81,7 +96,7 @@ public void serializeToJson(ExceptionHandlingArgumentType argument, JsonObjec if (subProperties.size() > 0) { properties.add("baseProperties", subProperties); } - } catch (ReflectiveOperationException e) { + } catch (Throwable e) { e.printStackTrace(); } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java index 97b6c0ca03..944d184e95 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java @@ -12,9 +12,7 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; -import java.lang.invoke.VarHandle; import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; From e40d9bbf6e9b62e877e6d8cc578373f7eb689a7d Mon Sep 17 00:00:00 2001 From: BuildTools Date: Tue, 21 Feb 2023 09:52:10 -0500 Subject: [PATCH 46/58] Refactor variable names in MethodHandles reflection --- .../ExceptionHandlingArgumentSerializer_1_15.java | 14 +++++++------- ...xceptionHandlingArgumentSerializer_1_16_R1.java | 14 +++++++------- ...xceptionHandlingArgumentSerializer_1_16_R2.java | 14 +++++++------- ...eptionHandlingArgumentSerializer_1_16_4_R3.java | 14 +++++++------- ...tionHandlingArgumentSerializer_1_17_Common.java | 14 +++++++------- ...xceptionHandlingArgumentSerializer_1_18_R2.java | 14 +++++++------- ...xceptionHandlingArgumentSerializer_1_18_R1.java | 14 +++++++------- 7 files changed, 49 insertions(+), 49 deletions(-) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java index 72cd43ab41..d137b5dca0 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java @@ -17,7 +17,7 @@ import java.nio.charset.StandardCharsets; public class ExceptionHandlingArgumentSerializer_1_15 implements ArgumentSerializer> { - private static final MethodHandle ArgumentRegistry_getInfo; + private static final MethodHandle getArgumentTypeInformation; // Compute all var handles all in one go so we don't do this during main server runtime static { @@ -33,14 +33,14 @@ public class ExceptionHandlingArgumentSerializer_1_15 implements ArgumentSeri e.printStackTrace(); } - MethodHandle ar_a = null; + MethodHandle argumentRegistryGet = null; try { - ar_a = MethodHandles.privateLookupIn(ArgumentRegistry.class, MethodHandles.lookup()) + argumentRegistryGet = MethodHandles.privateLookupIn(ArgumentRegistry.class, MethodHandles.lookup()) .findStatic(ArgumentRegistry.class, "a", MethodType.methodType(entryClass, ArgumentType.class)); } catch (ReflectiveOperationException e) { e.printStackTrace(); } - ArgumentRegistry_getInfo = ar_a; + getArgumentTypeInformation = argumentRegistryGet; } @Override @@ -48,7 +48,7 @@ public class ExceptionHandlingArgumentSerializer_1_15 implements ArgumentSeri public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { try { // Remove this key from packet - Object myInfo = ArgumentRegistry_getInfo.invoke(argument); + Object myInfo = getArgumentTypeInformation.invoke(argument); // TODO: This Field reflection (and others in this class) acts on the class ArgumentRegistry.a. This inner // class is package-private, and the @RequireField annotation doesn't currently support that. We would like @@ -61,7 +61,7 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa // Add baseType key instead ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentRegistry_getInfo.invoke(argument); + Object baseInfo = getArgumentTypeInformation.invoke(argument); String baseKey = keyField.get(baseInfo).toString(); packetDataSerializer.a(baseKey); @@ -80,7 +80,7 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) try { ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentRegistry_getInfo.invoke(baseType); + Object baseInfo = getArgumentTypeInformation.invoke(baseType); Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); properties.addProperty("baseType", keyField.get(baseInfo).toString()); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java index 4281372f0c..09b1b4ea6a 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java @@ -17,7 +17,7 @@ import java.nio.charset.StandardCharsets; public class ExceptionHandlingArgumentSerializer_1_16_R1 implements ArgumentSerializer> { - private static final MethodHandle ArgumentRegistry_getInfo; + private static final MethodHandle getArgumentTypeInformation; // Compute all var handles all in one go so we don't do this during main server runtime static { @@ -33,21 +33,21 @@ public class ExceptionHandlingArgumentSerializer_1_16_R1 implements ArgumentS e.printStackTrace(); } - MethodHandle ar_a = null; + MethodHandle argumentRegistryGet = null; try { - ar_a = MethodHandles.privateLookupIn(ArgumentRegistry.class, MethodHandles.lookup()) + argumentRegistryGet = MethodHandles.privateLookupIn(ArgumentRegistry.class, MethodHandles.lookup()) .findStatic(ArgumentRegistry.class, "a", MethodType.methodType(entryClass, ArgumentType.class)); } catch (ReflectiveOperationException e) { e.printStackTrace(); } - ArgumentRegistry_getInfo = ar_a; + getArgumentTypeInformation = argumentRegistryGet; } @Override // serializeToNetwork public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { try { - Object myInfo = ArgumentRegistry_getInfo.invoke(argument); + Object myInfo = getArgumentTypeInformation.invoke(argument); // TODO: This Field reflection (and others in this class) acts on the class ArgumentRegistry.a. This inner // class is package-private, and the @RequireField annotation doesn't currently support that. We would like @@ -60,7 +60,7 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa // Add baseType key instead ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentRegistry_getInfo.invoke(baseType); + Object baseInfo = getArgumentTypeInformation.invoke(baseType); String baseKey = keyField.get(baseInfo).toString(); packetDataSerializer.a(baseKey); @@ -79,7 +79,7 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) try { ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentRegistry_getInfo.invoke(baseType); + Object baseInfo = getArgumentTypeInformation.invoke(baseType); Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); properties.addProperty("baseType", keyField.get(baseInfo).toString()); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java index 32a494af9f..81b67be1ed 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java @@ -19,7 +19,7 @@ @Differs(from = {"1.15", "1.16.2"}, by = "Renamed ArgumentRegistry#a(ArgumentType) to ArgumentRegistry#b(ArgumentType)") public class ExceptionHandlingArgumentSerializer_1_16_R2 implements ArgumentSerializer> { - private static final MethodHandle ArgumentRegistry_getInfo; + private static final MethodHandle getArgumentTypeInformation; // Compute all var handles all in one go so we don't do this during main server runtime static { @@ -35,14 +35,14 @@ public class ExceptionHandlingArgumentSerializer_1_16_R2 implements ArgumentS e.printStackTrace(); } - MethodHandle ar_b = null; + MethodHandle argumentRegistryGet = null; try { - ar_b = MethodHandles.privateLookupIn(ArgumentRegistry.class, MethodHandles.lookup()) + argumentRegistryGet = MethodHandles.privateLookupIn(ArgumentRegistry.class, MethodHandles.lookup()) .findStatic(ArgumentRegistry.class, "b", MethodType.methodType(entryClass, ArgumentType.class)); } catch (ReflectiveOperationException e) { e.printStackTrace(); } - ArgumentRegistry_getInfo = ar_b; + getArgumentTypeInformation = argumentRegistryGet; } @Override @@ -51,7 +51,7 @@ public class ExceptionHandlingArgumentSerializer_1_16_R2 implements ArgumentS public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { try { // Remove this key from packet - Object myInfo = ArgumentRegistry_getInfo.invoke(argument); + Object myInfo = getArgumentTypeInformation.invoke(argument); // TODO: This Field reflection (and others in this class) acts on the class ArgumentRegistry.a. This inner // class is package-private, and the @RequireField annotation doesn't currently support that. We would like @@ -64,7 +64,7 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa // Add baseType key instead ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentRegistry_getInfo.invoke(baseType); + Object baseInfo = getArgumentTypeInformation.invoke(baseType); String baseKey = keyField.get(baseInfo).toString(); packetDataSerializer.a(baseKey); @@ -84,7 +84,7 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) try { ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentRegistry_getInfo.invoke(baseType); + Object baseInfo = getArgumentTypeInformation.invoke(baseType); Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); properties.addProperty("baseType", keyField.get(baseInfo).toString()); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java index 639e7a1577..0d2bf39674 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java @@ -17,7 +17,7 @@ import java.nio.charset.StandardCharsets; public class ExceptionHandlingArgumentSerializer_1_16_4_R3 implements ArgumentSerializer> { - private static final MethodHandle ArgumentRegistry_getInfo; + private static final MethodHandle getArgumentTypeInformation; // Compute all var handles all in one go so we don't do this during main server runtime static { @@ -33,14 +33,14 @@ public class ExceptionHandlingArgumentSerializer_1_16_4_R3 implements Argumen e.printStackTrace(); } - MethodHandle ar_b = null; + MethodHandle argumentRegistryGet = null; try { - ar_b = MethodHandles.privateLookupIn(ArgumentRegistry.class, MethodHandles.lookup()) + argumentRegistryGet = MethodHandles.privateLookupIn(ArgumentRegistry.class, MethodHandles.lookup()) .findStatic(ArgumentRegistry.class, "b", MethodType.methodType(entryClass, ArgumentType.class)); } catch (ReflectiveOperationException e) { e.printStackTrace(); } - ArgumentRegistry_getInfo = ar_b; + getArgumentTypeInformation = argumentRegistryGet; } @Override @@ -48,7 +48,7 @@ public class ExceptionHandlingArgumentSerializer_1_16_4_R3 implements Argumen public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { try { // Remove this key from packet - Object myInfo = ArgumentRegistry_getInfo.invoke(argument); + Object myInfo = getArgumentTypeInformation.invoke(argument); // TODO: This Field reflection (and others in this class) acts on the class ArgumentRegistry.a. This inner // class is package-private, and the @RequireField annotation doesn't currently support that. We would like @@ -61,7 +61,7 @@ public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer pa // Add baseType key instead ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentRegistry_getInfo.invoke(baseType); + Object baseInfo = getArgumentTypeInformation.invoke(baseType); String baseKey = keyField.get(baseInfo).toString(); packetDataSerializer.a(baseKey); @@ -80,7 +80,7 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) try { ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentRegistry_getInfo.invoke(baseType); + Object baseInfo = getArgumentTypeInformation.invoke(baseType); Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); properties.addProperty("baseType", keyField.get(baseInfo).toString()); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java index 7de5c5063c..85a1e92d03 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java @@ -17,7 +17,7 @@ import java.nio.charset.StandardCharsets; public class ExceptionHandlingArgumentSerializer_1_17_Common implements ArgumentSerializer> { - private static final MethodHandle ArgumentTypes_getInfo; + private static final MethodHandle getArgumentTypeInformation; // Compute all var handles all in one go so we don't do this during main server runtime static { @@ -33,21 +33,21 @@ public class ExceptionHandlingArgumentSerializer_1_17_Common implements Argum e.printStackTrace(); } - MethodHandle ar_b = null; + MethodHandle argumentTypesGet = null; try { - ar_b = MethodHandles.privateLookupIn(ArgumentTypes.class, MethodHandles.lookup()) + argumentTypesGet = MethodHandles.privateLookupIn(ArgumentTypes.class, MethodHandles.lookup()) .findStatic(ArgumentTypes.class, "b", MethodType.methodType(entryClass, ArgumentType.class)); } catch (ReflectiveOperationException e) { e.printStackTrace(); } - ArgumentTypes_getInfo = ar_b; + getArgumentTypeInformation = argumentTypesGet; } @Override public void serializeToNetwork(ExceptionHandlingArgumentType argument, FriendlyByteBuf friendlyByteBuf) { try { // Remove this key from packet - Object myInfo = ArgumentTypes_getInfo.invoke(argument); + Object myInfo = getArgumentTypeInformation.invoke(argument); // TODO: This Field reflection (and others in this class) acts on the class ArgumentTypes.Entry. This inner // class is private, and the @RequireField annotation doesn't currently support that. We would like @@ -60,7 +60,7 @@ public void serializeToNetwork(ExceptionHandlingArgumentType argument, Friend // Add baseType key instead ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentTypes_getInfo.invoke(baseType); + Object baseInfo = getArgumentTypeInformation.invoke(baseType); String baseKey = keyField.get(baseInfo).toString(); friendlyByteBuf.writeUtf(baseKey); @@ -78,7 +78,7 @@ public void serializeToJson(ExceptionHandlingArgumentType argument, JsonObjec try { ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentTypes_getInfo.invoke(baseType); + Object baseInfo = getArgumentTypeInformation.invoke(baseType); Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); properties.addProperty("baseType", keyField.get(baseInfo).toString()); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java index a3d74ae608..827125803b 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java @@ -18,7 +18,7 @@ import java.nio.charset.StandardCharsets; public class ExceptionHandlingArgumentSerializer_1_18_R2 implements ArgumentSerializer> { - private static final MethodHandle ArgumentTypes_getInfo; + private static final MethodHandle getArgumentTypeInformation; // Compute all var handles all in one go so we don't do this during main server runtime static { @@ -34,14 +34,14 @@ public class ExceptionHandlingArgumentSerializer_1_18_R2 implements ArgumentS e.printStackTrace(); } - MethodHandle ar_b = null; + MethodHandle argumentTypesGet = null; try { - ar_b = MethodHandles.privateLookupIn(ArgumentTypes.class, MethodHandles.lookup()) + argumentTypesGet = MethodHandles.privateLookupIn(ArgumentTypes.class, MethodHandles.lookup()) .findStatic(ArgumentTypes.class, "b", MethodType.methodType(entryClass, ArgumentType.class)); } catch (ReflectiveOperationException e) { e.printStackTrace(); } - ArgumentTypes_getInfo = ar_b; + getArgumentTypeInformation = argumentTypesGet; } @Override @@ -50,7 +50,7 @@ public class ExceptionHandlingArgumentSerializer_1_18_R2 implements ArgumentS public void serializeToNetwork(ExceptionHandlingArgumentType argument, FriendlyByteBuf friendlyByteBuf) { try { // Remove this key from packet - Object myInfo = ArgumentTypes_getInfo.invoke(argument); + Object myInfo = getArgumentTypeInformation.invoke(argument); // TODO: This Field reflection (and others in this class) acts on the class ArgumentTypes.Entry. This inner // class is private, and the @RequireField annotation doesn't currently support that. We would like @@ -63,7 +63,7 @@ public void serializeToNetwork(ExceptionHandlingArgumentType argument, Friend // Add baseType key instead ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentTypes_getInfo.invoke(baseType); + Object baseInfo = getArgumentTypeInformation.invoke(baseType); String baseKey = keyField.get(baseInfo).toString(); friendlyByteBuf.writeUtf(baseKey); @@ -83,7 +83,7 @@ public void serializeToJson(ExceptionHandlingArgumentType argument, JsonObjec try { ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentTypes_getInfo.invoke(baseType); + Object baseInfo = getArgumentTypeInformation.invoke(baseType); Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); properties.addProperty("baseType", keyField.get(baseInfo).toString()); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java index 944d184e95..5ae5cbccd9 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java @@ -17,7 +17,7 @@ import java.nio.charset.StandardCharsets; public class ExceptionHandlingArgumentSerializer_1_18_R1 implements ArgumentSerializer> { - private static final MethodHandle ArgumentTypes_getInfo; + private static final MethodHandle getArgumentTypeInformation; // Compute all var handles all in one go so we don't do this during main server runtime static { @@ -33,21 +33,21 @@ public class ExceptionHandlingArgumentSerializer_1_18_R1 implements ArgumentS e.printStackTrace(); } - MethodHandle at_b = null; + MethodHandle argumentTypesGet = null; try { - at_b = MethodHandles.privateLookupIn(ArgumentTypes.class, MethodHandles.lookup()) + argumentTypesGet = MethodHandles.privateLookupIn(ArgumentTypes.class, MethodHandles.lookup()) .findStatic(ArgumentTypes.class, "b", MethodType.methodType(entryClass, ArgumentType.class)); } catch (ReflectiveOperationException e) { e.printStackTrace(); } - ArgumentTypes_getInfo = at_b; + getArgumentTypeInformation = argumentTypesGet; } @Override public void serializeToNetwork(ExceptionHandlingArgumentType argument, FriendlyByteBuf friendlyByteBuf) { try { // Remove this key from packet - Object myInfo = ArgumentTypes_getInfo.invoke(argument); + Object myInfo = getArgumentTypeInformation.invoke(argument); // TODO: This Field reflection (and others in this class) acts on the class ArgumentTypes.Entry. This inner // class is private, and the @RequireField annotation doesn't currently support that. We would like @@ -60,7 +60,7 @@ public void serializeToNetwork(ExceptionHandlingArgumentType argument, Friend // Add baseType key instead ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentTypes_getInfo.invoke(baseType); + Object baseInfo = getArgumentTypeInformation.invoke(baseType); String baseKey = keyField.get(baseInfo).toString(); friendlyByteBuf.writeUtf(baseKey); @@ -78,7 +78,7 @@ public void serializeToJson(ExceptionHandlingArgumentType argument, JsonObjec try { ArgumentType baseType = argument.baseType(); - Object baseInfo = ArgumentTypes_getInfo.invoke(baseType); + Object baseInfo = getArgumentTypeInformation.invoke(baseType); Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); properties.addProperty("baseType", keyField.get(baseInfo).toString()); From f5d6c898ecf800f526d87f06f9ab7062a73e2079 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Wed, 22 Feb 2023 10:10:10 -0500 Subject: [PATCH 47/58] Revise reflection in 1_15 --- .../java/dev/jorel/commandapi/nms/NMS.java | 39 +++++++- ...eptionHandlingArgumentSerializer_1_15.java | 95 ++++++++----------- 2 files changed, 78 insertions(+), 56 deletions(-) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/nms/NMS.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/nms/NMS.java index 1434d5e468..59d7ea9529 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/nms/NMS.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/nms/NMS.java @@ -49,7 +49,9 @@ import org.bukkit.scoreboard.Objective; import org.bukkit.scoreboard.Team; +import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.lang.invoke.VarHandle; import java.util.*; import java.util.function.Function; @@ -424,7 +426,7 @@ String getScoreHolderSingle(CommandContext cmdCtx, Strin static class SafeVarHandle { - private VarHandle handle; + private final VarHandle handle; private SafeVarHandle(VarHandle handle) { this.handle = handle; @@ -455,4 +457,39 @@ void set(Type instance, FieldType param) { handle.set(instance, param); } } + + static class SafeStaticOneParameterMethodHandle { + + private final MethodHandle handle; + + private SafeStaticOneParameterMethodHandle(MethodHandle handle) { + this.handle = handle; + } + + static SafeStaticOneParameterMethodHandle of(Class classType, String fieldName, Class returnType, Class parameterType) throws ReflectiveOperationException { + return new SafeStaticOneParameterMethodHandle<>(MethodHandles.privateLookupIn(classType, MethodHandles.lookup()).findStatic(classType, fieldName, MethodType.methodType(returnType, parameterType))); + } + + static SafeStaticOneParameterMethodHandle ofOrNull(Class classType, String fieldName, Class returnType, Class parameterType) { + try { + return of(classType, fieldName, returnType, parameterType); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + return null; + } + } + + ReturnType invoke(ParameterType parameter) throws Throwable{ + return (ReturnType) handle.invoke(parameter); + } + + ReturnType invokeOrNull(ParameterType parameter) { + try { + return invoke(parameter); + } catch (Throwable e) { + e.printStackTrace(); + return null; + } + } + } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java index d137b5dca0..64797bd693 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java @@ -2,26 +2,26 @@ import com.google.gson.JsonObject; import com.mojang.brigadier.arguments.ArgumentType; -import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; import net.minecraft.server.v1_15_R1.ArgumentRegistry; import net.minecraft.server.v1_15_R1.ArgumentSerializer; import net.minecraft.server.v1_15_R1.MinecraftKey; import net.minecraft.server.v1_15_R1.PacketDataSerializer; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; -import java.lang.reflect.Field; import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; public class ExceptionHandlingArgumentSerializer_1_15 implements ArgumentSerializer> { - private static final MethodHandle getArgumentTypeInformation; + // All the ? here should actually be ArgumentRegistry.a, but that is a private inner class. That makes everything really annoying. + // TODO: We want to check this reflection, but we can't give ArgumentRegistry.a to the @RequireField annotation + // Hopefully something works out, but the preprocessor needs to be expanded first + private static final NMS.SafeStaticOneParameterMethodHandle getArgumentTypeInformation; + private static final NMS.SafeVarHandle serializationKey; + private static final NMS.SafeVarHandle serializer; // Compute all var handles all in one go so we don't do this during main server runtime static { - // We need a reference to the class object for ArgumentTypes.a, but that inner class is private + // We need a reference to the class object for ArgumentTypes.a // We can get an object from ArgumentTypes#get(ResourceLocation), then take its class Class entryClass = null; try { @@ -33,68 +33,53 @@ public class ExceptionHandlingArgumentSerializer_1_15 implements ArgumentSeri e.printStackTrace(); } - MethodHandle argumentRegistryGet = null; - try { - argumentRegistryGet = MethodHandles.privateLookupIn(ArgumentRegistry.class, MethodHandles.lookup()) - .findStatic(ArgumentRegistry.class, "a", MethodType.methodType(entryClass, ArgumentType.class)); - } catch (ReflectiveOperationException e) { - e.printStackTrace(); - } - getArgumentTypeInformation = argumentRegistryGet; + getArgumentTypeInformation = NMS.SafeStaticOneParameterMethodHandle.ofOrNull(ArgumentRegistry.class, "a", entryClass, ArgumentType.class); + serializationKey = NMS.SafeVarHandle.ofOrNull(entryClass, "c", MinecraftKey.class); + serializer = NMS.SafeVarHandle.ofOrNull(entryClass, "b", ArgumentSerializer.class); + } + + // Two ? wildcards cannot be directly converted to each other, so we need this silly method to capture one of + // those wildcards and convert it to the other + private static T captureCast(Object o) { + return (T) o; } @Override // serializeToNetwork public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { - try { - // Remove this key from packet - Object myInfo = getArgumentTypeInformation.invoke(argument); - - // TODO: This Field reflection (and others in this class) acts on the class ArgumentRegistry.a. This inner - // class is package-private, and the @RequireField annotation doesn't currently support that. We would like - // to check this reflection at compile-time though, but the preprocess needs to be expanded first - Field keyField = CommandAPIHandler.getField(myInfo.getClass(), "c"); - String myKey = keyField.get(myInfo).toString(); - byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); - // Removing length and size of string, assuming length is always written as 1 byte - packetDataSerializer.writerIndex(packetDataSerializer.writerIndex() - myKeyBytes.length - 1); - - // Add baseType key instead - ArgumentType baseType = argument.baseType(); - Object baseInfo = getArgumentTypeInformation.invoke(argument); - String baseKey = keyField.get(baseInfo).toString(); - packetDataSerializer.a(baseKey); - - // Serialize baseType - Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); - ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); - subSerializer.a(baseType, packetDataSerializer); - } catch (Throwable e) { - e.printStackTrace(); - } + // Remove this key from packet + Object myInfo = getArgumentTypeInformation.invokeOrNull(argument); + + byte[] myKeyBytes = serializationKey.get(captureCast(myInfo)).toString().getBytes(StandardCharsets.UTF_8); + // Removing length and size of string, assuming length is always written as 1 byte + packetDataSerializer.writerIndex(packetDataSerializer.writerIndex() - myKeyBytes.length - 1); + + // Add baseType key instead + ArgumentType baseType = argument.baseType(); + Object baseInfo = getArgumentTypeInformation.invokeOrNull(argument); + String baseKey = serializationKey.get(captureCast(baseInfo)).toString(); + packetDataSerializer.a(baseKey); + + // Serialize baseType + ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.get(captureCast(baseInfo)); + baseSerializer.a(baseType, packetDataSerializer); } @Override // serializeToJson public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { - try { - ArgumentType baseType = argument.baseType(); + ArgumentType baseType = argument.baseType(); - Object baseInfo = getArgumentTypeInformation.invoke(baseType); + Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); - Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); - properties.addProperty("baseType", keyField.get(baseInfo).toString()); + properties.addProperty("baseType", serializationKey.get(captureCast(baseInfo)).toString()); - Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); - ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.get(captureCast(baseInfo)); - JsonObject subProperties = new JsonObject(); - subSerializer.a(baseType, subProperties); - if (subProperties.size() > 0) { - properties.add("baseProperties", subProperties); - } - } catch (Throwable e) { - e.printStackTrace(); + JsonObject subProperties = new JsonObject(); + baseSerializer.a(baseType, subProperties); + if (subProperties.size() > 0) { + properties.add("baseProperties", subProperties); } } From 1b22e55628590afa1b6808ba45c555a337d3add1 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Wed, 22 Feb 2023 10:22:22 -0500 Subject: [PATCH 48/58] Add and use SafeVarHandle#getUnknownInstanceType --- .../main/java/dev/jorel/commandapi/nms/NMS.java | 4 ++++ ...ExceptionHandlingArgumentSerializer_1_15.java | 16 +++++----------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/nms/NMS.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/nms/NMS.java index 59d7ea9529..e8b4675f76 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/nms/NMS.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/nms/NMS.java @@ -449,6 +449,10 @@ FieldType get(Type instance) { return (FieldType) handle.get(instance); } + FieldType getUnknownInstanceType(Object instance) { + return (FieldType) handle.get(instance); + } + FieldType getStatic() { return (FieldType) handle.get(null); } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java index 64797bd693..1019299f2c 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java @@ -38,30 +38,24 @@ public class ExceptionHandlingArgumentSerializer_1_15 implements ArgumentSeri serializer = NMS.SafeVarHandle.ofOrNull(entryClass, "b", ArgumentSerializer.class); } - // Two ? wildcards cannot be directly converted to each other, so we need this silly method to capture one of - // those wildcards and convert it to the other - private static T captureCast(Object o) { - return (T) o; - } - @Override // serializeToNetwork public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { // Remove this key from packet Object myInfo = getArgumentTypeInformation.invokeOrNull(argument); - byte[] myKeyBytes = serializationKey.get(captureCast(myInfo)).toString().getBytes(StandardCharsets.UTF_8); + byte[] myKeyBytes = serializationKey.getUnknownInstanceType(myInfo).toString().getBytes(StandardCharsets.UTF_8); // Removing length and size of string, assuming length is always written as 1 byte packetDataSerializer.writerIndex(packetDataSerializer.writerIndex() - myKeyBytes.length - 1); // Add baseType key instead ArgumentType baseType = argument.baseType(); Object baseInfo = getArgumentTypeInformation.invokeOrNull(argument); - String baseKey = serializationKey.get(captureCast(baseInfo)).toString(); + String baseKey = serializationKey.getUnknownInstanceType(baseInfo).toString(); packetDataSerializer.a(baseKey); // Serialize baseType - ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.get(captureCast(baseInfo)); + ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); baseSerializer.a(baseType, packetDataSerializer); } @@ -72,9 +66,9 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); - properties.addProperty("baseType", serializationKey.get(captureCast(baseInfo)).toString()); + properties.addProperty("baseType", serializationKey.getUnknownInstanceType(baseInfo).toString()); - ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.get(captureCast(baseInfo)); + ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); JsonObject subProperties = new JsonObject(); baseSerializer.a(baseType, subProperties); From 0e25e988778edcce884f319a5fe6716d85b7540a Mon Sep 17 00:00:00 2001 From: BuildTools Date: Wed, 22 Feb 2023 19:12:08 -0500 Subject: [PATCH 49/58] Update use of reflection in other ArgumentSerializers --- ...eptionHandlingArgumentSerializer_1_15.java | 12 +-- ...ionHandlingArgumentSerializer_1_16_R1.java | 83 +++++++---------- ...ionHandlingArgumentSerializer_1_16_R2.java | 89 +++++++------------ ...nHandlingArgumentSerializer_1_16_4_R3.java | 85 +++++++----------- ...andlingArgumentSerializer_1_17_Common.java | 83 +++++++---------- ...ionHandlingArgumentSerializer_1_18_R2.java | 89 +++++++------------ ...ionHandlingArgumentSerializer_1_18_R1.java | 83 +++++++---------- ...ptionHandlingArgumentInfo_1_19_Common.java | 3 + .../ExceptionHandlingArgumentInfo_1_19_3.java | 2 +- 9 files changed, 201 insertions(+), 328 deletions(-) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java index 1019299f2c..e4e9c79430 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java @@ -21,8 +21,8 @@ public class ExceptionHandlingArgumentSerializer_1_15 implements ArgumentSeri // Compute all var handles all in one go so we don't do this during main server runtime static { - // We need a reference to the class object for ArgumentTypes.a - // We can get an object from ArgumentTypes#get(ResourceLocation), then take its class + // We need a reference to the class object for ArgumentRegistry.a + // We can get an object from ArgumentRegistry#get(MinecraftKey), then take its class Class entryClass = null; try { Method getInfoByResourceLocation = ArgumentRegistry.class.getDeclaredMethod("a", MinecraftKey.class); @@ -70,10 +70,10 @@ public void a(ExceptionHandlingArgumentType argument, JsonObject properties) ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); - JsonObject subProperties = new JsonObject(); - baseSerializer.a(baseType, subProperties); - if (subProperties.size() > 0) { - properties.add("baseProperties", subProperties); + JsonObject baseProperties = new JsonObject(); + baseSerializer.a(baseType, baseProperties); + if (baseProperties.size() > 0) { + properties.add("baseProperties", baseProperties); } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java index 09b1b4ea6a..e3936442f1 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java @@ -2,27 +2,27 @@ import com.google.gson.JsonObject; import com.mojang.brigadier.arguments.ArgumentType; -import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; import net.minecraft.server.v1_16_R1.ArgumentRegistry; import net.minecraft.server.v1_16_R1.ArgumentSerializer; import net.minecraft.server.v1_16_R1.MinecraftKey; import net.minecraft.server.v1_16_R1.PacketDataSerializer; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; -import java.lang.reflect.Field; import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; public class ExceptionHandlingArgumentSerializer_1_16_R1 implements ArgumentSerializer> { - private static final MethodHandle getArgumentTypeInformation; + // All the ? here should actually be ArgumentRegistry.a, but that is a private inner class. That makes everything really annoying. + // TODO: We want to check this reflection, but we can't give ArgumentRegistry.a to the @RequireField annotation + // Hopefully something works out, but the preprocessor needs to be expanded first + private static final NMS.SafeStaticOneParameterMethodHandle getArgumentTypeInformation; + private static final NMS.SafeVarHandle serializationKey; + private static final NMS.SafeVarHandle serializer; // Compute all var handles all in one go so we don't do this during main server runtime static { - // We need a reference to the class object for ArgumentTypes.a, but that inner class is private - // We can get an object from ArgumentTypes#get(ResourceLocation), then take its class + // We need a reference to the class object for ArgumentRegistry.a, + // We can get an object from ArgumentRegistry#get(MinecraftKey), then take its class Class entryClass = null; try { Method getInfoByResourceLocation = ArgumentRegistry.class.getDeclaredMethod("a", MinecraftKey.class); @@ -33,67 +33,46 @@ public class ExceptionHandlingArgumentSerializer_1_16_R1 implements ArgumentS e.printStackTrace(); } - MethodHandle argumentRegistryGet = null; - try { - argumentRegistryGet = MethodHandles.privateLookupIn(ArgumentRegistry.class, MethodHandles.lookup()) - .findStatic(ArgumentRegistry.class, "a", MethodType.methodType(entryClass, ArgumentType.class)); - } catch (ReflectiveOperationException e) { - e.printStackTrace(); - } - getArgumentTypeInformation = argumentRegistryGet; + getArgumentTypeInformation = NMS.SafeStaticOneParameterMethodHandle.ofOrNull(ArgumentType.class, "a", entryClass, ArgumentType.class); + serializationKey = NMS.SafeVarHandle.ofOrNull(entryClass, "c", MinecraftKey.class); + serializer = NMS.SafeVarHandle.ofOrNull(entryClass, "b", ArgumentSerializer.class); } @Override // serializeToNetwork public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { - try { - Object myInfo = getArgumentTypeInformation.invoke(argument); + Object myInfo = getArgumentTypeInformation.invokeOrNull(argument); - // TODO: This Field reflection (and others in this class) acts on the class ArgumentRegistry.a. This inner - // class is package-private, and the @RequireField annotation doesn't currently support that. We would like - // to check this reflection at compile-time though, but the preprocess needs to be expanded first - Field keyField = CommandAPIHandler.getField(myInfo.getClass(), "c"); - String myKey = keyField.get(myInfo).toString(); - byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); - // Removing length and size of string, assuming length is always written as 1 byte - packetDataSerializer.writerIndex(packetDataSerializer.writerIndex() - myKeyBytes.length - 1); + byte[] myKeyBytes = serializationKey.getUnknownInstanceType(myInfo).toString().getBytes(StandardCharsets.UTF_8); + // Removing length and size of string, assuming length is always written as 1 byte + packetDataSerializer.writerIndex(packetDataSerializer.writerIndex() - myKeyBytes.length - 1); - // Add baseType key instead - ArgumentType baseType = argument.baseType(); - Object baseInfo = getArgumentTypeInformation.invoke(baseType); - String baseKey = keyField.get(baseInfo).toString(); - packetDataSerializer.a(baseKey); + // Add baseType key instead + ArgumentType baseType = argument.baseType(); + Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); + String baseKey = serializationKey.getUnknownInstanceType(myInfo).toString(); + packetDataSerializer.a(baseKey); - // Serialize baseType - Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); - ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); - subSerializer.a(baseType, packetDataSerializer); - } catch (Throwable e) { - e.printStackTrace(); - } + // Serialize baseType + ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); + baseSerializer.a(baseType, packetDataSerializer); } @Override // serializeToJson public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { - try { - ArgumentType baseType = argument.baseType(); + ArgumentType baseType = argument.baseType(); - Object baseInfo = getArgumentTypeInformation.invoke(baseType); + Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); - Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); - properties.addProperty("baseType", keyField.get(baseInfo).toString()); + properties.addProperty("baseType", serializationKey.getUnknownInstanceType(baseInfo).toString()); - Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); - ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); - JsonObject subProperties = new JsonObject(); - subSerializer.a(baseType, subProperties); - if (subProperties.size() > 0) { - properties.add("baseProperties", subProperties); - } - } catch (Throwable e) { - e.printStackTrace(); + JsonObject baseProperties = new JsonObject(); + baseSerializer.a(baseType, baseProperties); + if (baseProperties.size() > 0) { + properties.add("baseProperties", baseProperties); } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java index 81b67be1ed..88939c21c7 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java @@ -2,7 +2,6 @@ import com.google.gson.JsonObject; import com.mojang.brigadier.arguments.ArgumentType; -import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; import dev.jorel.commandapi.preprocessor.Differs; import net.minecraft.server.v1_16_R2.ArgumentRegistry; @@ -10,21 +9,22 @@ import net.minecraft.server.v1_16_R2.MinecraftKey; import net.minecraft.server.v1_16_R2.PacketDataSerializer; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; -import java.lang.reflect.Field; import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; -@Differs(from = {"1.15", "1.16.2"}, by = "Renamed ArgumentRegistry#a(ArgumentType) to ArgumentRegistry#b(ArgumentType)") +@Differs(from = {"1.15", "1.16.1"}, by = "Renamed ArgumentRegistry#a(ArgumentType) to ArgumentRegistry#b(ArgumentType)") public class ExceptionHandlingArgumentSerializer_1_16_R2 implements ArgumentSerializer> { - private static final MethodHandle getArgumentTypeInformation; + // All the ? here should actually be ArgumentRegistry.a, but that is a private inner class. That makes everything really annoying. + // TODO: We want to check this reflection, but we can't give ArgumentRegistry.a to the @RequireField annotation + // Hopefully something works out, but the preprocessor needs to be expanded first + private static final NMS.SafeStaticOneParameterMethodHandle getArgumentTypeInformation; + private static final NMS.SafeVarHandle serializationKey; + private static final NMS.SafeVarHandle serializer; // Compute all var handles all in one go so we don't do this during main server runtime static { - // We need a reference to the class object for ArgumentTypes.a, but that inner class is private - // We can get an object from ArgumentTypes#get(ResourceLocation), then take its class + // We need a reference to the class object for ArgumentRegistry.a, + // We can get an object from ArgumentRegistry#get(MinecraftKey), then take its class Class entryClass = null; try { Method getInfoByResourceLocation = ArgumentRegistry.class.getDeclaredMethod("a", MinecraftKey.class); @@ -35,70 +35,47 @@ public class ExceptionHandlingArgumentSerializer_1_16_R2 implements ArgumentS e.printStackTrace(); } - MethodHandle argumentRegistryGet = null; - try { - argumentRegistryGet = MethodHandles.privateLookupIn(ArgumentRegistry.class, MethodHandles.lookup()) - .findStatic(ArgumentRegistry.class, "b", MethodType.methodType(entryClass, ArgumentType.class)); - } catch (ReflectiveOperationException e) { - e.printStackTrace(); - } - getArgumentTypeInformation = argumentRegistryGet; + getArgumentTypeInformation = NMS.SafeStaticOneParameterMethodHandle.ofOrNull(ArgumentType.class, "b", entryClass, ArgumentType.class); + serializationKey = NMS.SafeVarHandle.ofOrNull(entryClass, "c", MinecraftKey.class); + serializer = NMS.SafeVarHandle.ofOrNull(entryClass, "b", ArgumentSerializer.class); } @Override - @Differs(from = {"1.13", "1.14", "1.15", "1.16.1"}, by = "ArgumentRegistry.a -> ArgumentRegistry.b") // serializeToNetwork public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { - try { - // Remove this key from packet - Object myInfo = getArgumentTypeInformation.invoke(argument); + // Remove this key from packet + Object myInfo = getArgumentTypeInformation.invokeOrNull(argument); - // TODO: This Field reflection (and others in this class) acts on the class ArgumentRegistry.a. This inner - // class is package-private, and the @RequireField annotation doesn't currently support that. We would like - // to check this reflection at compile-time though, but the preprocess needs to be expanded first - Field keyField = CommandAPIHandler.getField(myInfo.getClass(), "c"); - String myKey = keyField.get(myInfo).toString(); - byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); - // Removing length and size of string, assuming length is always written as 1 byte - packetDataSerializer.writerIndex(packetDataSerializer.writerIndex() - myKeyBytes.length - 1); + byte[] myKeyBytes = serializationKey.getUnknownInstanceType(myInfo).toString().getBytes(StandardCharsets.UTF_8); + // Removing length and size of string, assuming length is always written as 1 byte + packetDataSerializer.writerIndex(packetDataSerializer.writerIndex() - myKeyBytes.length - 1); - // Add baseType key instead - ArgumentType baseType = argument.baseType(); - Object baseInfo = getArgumentTypeInformation.invoke(baseType); - String baseKey = keyField.get(baseInfo).toString(); - packetDataSerializer.a(baseKey); + // Add baseType key instead + ArgumentType baseType = argument.baseType(); + Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); + String baseKey = serializationKey.getUnknownInstanceType(baseInfo).toString(); + packetDataSerializer.a(baseKey); - // Serialize baseType - Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); - ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); - subSerializer.a(baseType, packetDataSerializer); - } catch (Throwable e) { - e.printStackTrace(); - } + // Serialize baseType + ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); + baseSerializer.a(baseType, packetDataSerializer); } @Override - @Differs(from = {"1.13", "1.14", "1.15", "1.16.1"}, by = "ArgumentRegistry.a -> ArgumentRegistry.b") // serializeToJson public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { - try { - ArgumentType baseType = argument.baseType(); + ArgumentType baseType = argument.baseType(); - Object baseInfo = getArgumentTypeInformation.invoke(baseType); + Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); - Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); - properties.addProperty("baseType", keyField.get(baseInfo).toString()); + properties.addProperty("baseType", serializationKey.getUnknownInstanceType(baseInfo).toString()); - Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); - ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); - JsonObject subProperties = new JsonObject(); - subSerializer.a(baseType, subProperties); - if (subProperties.size() > 0) { - properties.add("baseProperties", subProperties); - } - } catch (Throwable e) { - e.printStackTrace(); + JsonObject baseProperties = new JsonObject(); + baseSerializer.a(baseType, baseProperties); + if (baseProperties.size() > 0) { + properties.add("baseProperties", baseProperties); } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java index 0d2bf39674..205c67b4cf 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java @@ -2,27 +2,27 @@ import com.google.gson.JsonObject; import com.mojang.brigadier.arguments.ArgumentType; -import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; import net.minecraft.server.v1_16_R3.ArgumentRegistry; import net.minecraft.server.v1_16_R3.ArgumentSerializer; import net.minecraft.server.v1_16_R3.MinecraftKey; import net.minecraft.server.v1_16_R3.PacketDataSerializer; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; -import java.lang.reflect.Field; import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; public class ExceptionHandlingArgumentSerializer_1_16_4_R3 implements ArgumentSerializer> { - private static final MethodHandle getArgumentTypeInformation; + // All the ? here should actually be ArgumentRegistry.a, but that is a private inner class. That makes everything really annoying. + // TODO: We want to check this reflection, but we can't give ArgumentRegistry.a to the @RequireField annotation + // Hopefully something works out, but the preprocessor needs to be expanded first + private static final NMS.SafeStaticOneParameterMethodHandle getArgumentTypeInformation; + private static final NMS.SafeVarHandle serializationKey; + private static final NMS.SafeVarHandle serializer; // Compute all var handles all in one go so we don't do this during main server runtime static { - // We need a reference to the class object for ArgumentTypes.a, but that inner class is private - // We can get an object from ArgumentTypes#get(ResourceLocation), then take its class + // We need a reference to the class object for ArgumentRegistry.a, + // We can get an object from ArgumentRegistry#get(MinecraftKey), then take its class Class entryClass = null; try { Method getInfoByResourceLocation = ArgumentRegistry.class.getDeclaredMethod("a", MinecraftKey.class); @@ -33,68 +33,47 @@ public class ExceptionHandlingArgumentSerializer_1_16_4_R3 implements Argumen e.printStackTrace(); } - MethodHandle argumentRegistryGet = null; - try { - argumentRegistryGet = MethodHandles.privateLookupIn(ArgumentRegistry.class, MethodHandles.lookup()) - .findStatic(ArgumentRegistry.class, "b", MethodType.methodType(entryClass, ArgumentType.class)); - } catch (ReflectiveOperationException e) { - e.printStackTrace(); - } - getArgumentTypeInformation = argumentRegistryGet; + getArgumentTypeInformation = NMS.SafeStaticOneParameterMethodHandle.ofOrNull(ArgumentType.class, "b", entryClass, ArgumentType.class); + serializationKey = NMS.SafeVarHandle.ofOrNull(entryClass, "c", MinecraftKey.class); + serializer = NMS.SafeVarHandle.ofOrNull(entryClass, "b", ArgumentSerializer.class); } @Override // serializeToNetwork public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { - try { - // Remove this key from packet - Object myInfo = getArgumentTypeInformation.invoke(argument); + // Remove this key from packet + Object myInfo = getArgumentTypeInformation.invokeOrNull(argument); - // TODO: This Field reflection (and others in this class) acts on the class ArgumentRegistry.a. This inner - // class is package-private, and the @RequireField annotation doesn't currently support that. We would like - // to check this reflection at compile-time though, but the preprocess needs to be expanded first - Field keyField = CommandAPIHandler.getField(myInfo.getClass(), "c"); - String myKey = keyField.get(myInfo).toString(); - byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); - // Removing length and size of string, assuming length is always written as 1 byte - packetDataSerializer.writerIndex(packetDataSerializer.writerIndex() - myKeyBytes.length - 1); + byte[] myKeyBytes = serializationKey.getUnknownInstanceType(myInfo).toString().getBytes(StandardCharsets.UTF_8); + // Removing length and size of string, assuming length is always written as 1 byte + packetDataSerializer.writerIndex(packetDataSerializer.writerIndex() - myKeyBytes.length - 1); - // Add baseType key instead - ArgumentType baseType = argument.baseType(); - Object baseInfo = getArgumentTypeInformation.invoke(baseType); - String baseKey = keyField.get(baseInfo).toString(); - packetDataSerializer.a(baseKey); + // Add baseType key instead + ArgumentType baseType = argument.baseType(); + Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); + String baseKey = serializationKey.getUnknownInstanceType(baseInfo).toString(); + packetDataSerializer.a(baseKey); - // Serialize baseType - Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); - ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); - subSerializer.a(baseType, packetDataSerializer); - } catch (Throwable e) { - e.printStackTrace(); - } + // Serialize baseType + ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); + baseSerializer.a(baseType, packetDataSerializer); } @Override // serializeToJson public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { - try { - ArgumentType baseType = argument.baseType(); + ArgumentType baseType = argument.baseType(); - Object baseInfo = getArgumentTypeInformation.invoke(baseType); + Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); - Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); - properties.addProperty("baseType", keyField.get(baseInfo).toString()); + properties.addProperty("baseType", serializationKey.getUnknownInstanceType(baseInfo).toString()); - Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); - ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); - JsonObject subProperties = new JsonObject(); - subSerializer.a(baseType, subProperties); - if (subProperties.size() > 0) { - properties.add("baseProperties", subProperties); - } - } catch (Throwable e) { - e.printStackTrace(); + JsonObject baseProperties = new JsonObject(); + baseSerializer.a(baseType, baseProperties); + if (baseProperties.size() > 0) { + properties.add("baseProperties", baseProperties); } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java index 85a1e92d03..9c600fc7b1 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java @@ -2,26 +2,26 @@ import com.google.gson.JsonObject; import com.mojang.brigadier.arguments.ArgumentType; -import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; import net.minecraft.commands.synchronization.ArgumentSerializer; import net.minecraft.commands.synchronization.ArgumentTypes; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; -import java.lang.reflect.Field; import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; public class ExceptionHandlingArgumentSerializer_1_17_Common implements ArgumentSerializer> { - private static final MethodHandle getArgumentTypeInformation; + // All the ? here should actually be ArgumentTypes.Entry, but that is a private inner class. That makes everything really annoying. + // TODO: We want to check this reflection, but we can't give ArgumentTypes.Entry to the @RequireField annotation + // Hopefully something works out, but the preprocessor needs to be expanded first + private static final NMS.SafeStaticOneParameterMethodHandle getArgumentTypeInformation; + private static final NMS.SafeVarHandle serializationKey; + private static final NMS.SafeVarHandle serializer; // Compute all var handles all in one go so we don't do this during main server runtime static { - // We need a reference to the class object for ArgumentTypes.Entry, but that inner class is private + // We need a reference to the class object for ArgumentTypes.Entry, // We can get an object from ArgumentTypes#get(ResourceLocation), then take its class Class entryClass = null; try { @@ -33,66 +33,45 @@ public class ExceptionHandlingArgumentSerializer_1_17_Common implements Argum e.printStackTrace(); } - MethodHandle argumentTypesGet = null; - try { - argumentTypesGet = MethodHandles.privateLookupIn(ArgumentTypes.class, MethodHandles.lookup()) - .findStatic(ArgumentTypes.class, "b", MethodType.methodType(entryClass, ArgumentType.class)); - } catch (ReflectiveOperationException e) { - e.printStackTrace(); - } - getArgumentTypeInformation = argumentTypesGet; + getArgumentTypeInformation = NMS.SafeStaticOneParameterMethodHandle.ofOrNull(ArgumentType.class, "b", entryClass, ArgumentType.class); + serializationKey = NMS.SafeVarHandle.ofOrNull(entryClass, "c", ResourceLocation.class); + serializer = NMS.SafeVarHandle.ofOrNull(entryClass, "b", ArgumentSerializer.class); } @Override public void serializeToNetwork(ExceptionHandlingArgumentType argument, FriendlyByteBuf friendlyByteBuf) { - try { - // Remove this key from packet - Object myInfo = getArgumentTypeInformation.invoke(argument); + // Remove this key from packet + Object myInfo = getArgumentTypeInformation.invokeOrNull(argument); - // TODO: This Field reflection (and others in this class) acts on the class ArgumentTypes.Entry. This inner - // class is private, and the @RequireField annotation doesn't currently support that. We would like - // to check this reflection at compile-time though, but the preprocess needs to be expanded first - Field keyField = CommandAPIHandler.getField(myInfo.getClass(), "c"); - String myKey = keyField.get(myInfo).toString(); - byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); - // Removing length and size of string, assuming length is always written as 1 byte - friendlyByteBuf.writerIndex(friendlyByteBuf.writerIndex() - myKeyBytes.length - 1); + byte[] myKeyBytes = serializationKey.getUnknownInstanceType(myInfo).toString().getBytes(StandardCharsets.UTF_8); + // Removing length and size of string, assuming length is always written as 1 byte + friendlyByteBuf.writerIndex(friendlyByteBuf.writerIndex() - myKeyBytes.length - 1); - // Add baseType key instead - ArgumentType baseType = argument.baseType(); - Object baseInfo = getArgumentTypeInformation.invoke(baseType); - String baseKey = keyField.get(baseInfo).toString(); - friendlyByteBuf.writeUtf(baseKey); + // Add baseType key instead + ArgumentType baseType = argument.baseType(); + Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); + String baseKey = serializationKey.getUnknownInstanceType(baseInfo).toString(); + friendlyByteBuf.writeUtf(baseKey); - // Serialize baseType - Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); - ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); - subSerializer.serializeToNetwork(baseType, friendlyByteBuf); - } catch (Throwable e) { - e.printStackTrace(); - } + // Serialize baseType + ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); + baseSerializer.serializeToNetwork(baseType, friendlyByteBuf); } @Override public void serializeToJson(ExceptionHandlingArgumentType argument, JsonObject properties) { - try { - ArgumentType baseType = argument.baseType(); + ArgumentType baseType = argument.baseType(); - Object baseInfo = getArgumentTypeInformation.invoke(baseType); + Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); - Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); - properties.addProperty("baseType", keyField.get(baseInfo).toString()); + properties.addProperty("baseType", serializationKey.getUnknownInstanceType(baseInfo).toString()); - Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); - ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); - JsonObject subProperties = new JsonObject(); - subSerializer.serializeToJson(baseType, subProperties); - if (subProperties.size() > 0) { - properties.add("baseProperties", subProperties); - } - } catch (Throwable e) { - e.printStackTrace(); + JsonObject baseProperties = new JsonObject(); + baseSerializer.serializeToJson(baseType, baseProperties); + if (baseProperties.size() > 0) { + properties.add("baseProperties", baseProperties); } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java index 827125803b..607d96991f 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java @@ -2,7 +2,6 @@ import com.google.gson.JsonObject; import com.mojang.brigadier.arguments.ArgumentType; -import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; import dev.jorel.commandapi.preprocessor.Differs; import net.minecraft.commands.synchronization.ArgumentSerializer; @@ -10,19 +9,22 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; -import java.lang.reflect.Field; import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; +@Differs(from = {"1.15", "1.16", "1.17", "1.18", "1.18.1"}, + by = "ArgumentTypes.Entry.c -> ArgumentTypes.Entry.b, ArgumentTypes.Entry.b -> ArgumentTypes.Entry.a") public class ExceptionHandlingArgumentSerializer_1_18_R2 implements ArgumentSerializer> { - private static final MethodHandle getArgumentTypeInformation; + // All the ? here should actually be ArgumentTypes.Entry, but that is a private inner class. That makes everything really annoying. + // TODO: We want to check this reflection, but we can't give ArgumentTypes.Entry to the @RequireField annotation + // Hopefully something works out, but the preprocessor needs to be expanded first + private static final NMS.SafeStaticOneParameterMethodHandle getArgumentTypeInformation; + private static final NMS.SafeVarHandle serializationKey; + private static final NMS.SafeVarHandle serializer; // Compute all var handles all in one go so we don't do this during main server runtime static { - // We need a reference to the class object for ArgumentTypes.Entry, but that inner class is private + // We need a reference to the class object for ArgumentTypes.Entry, // We can get an object from ArgumentTypes#get(ResourceLocation), then take its class Class entryClass = null; try { @@ -34,70 +36,45 @@ public class ExceptionHandlingArgumentSerializer_1_18_R2 implements ArgumentS e.printStackTrace(); } - MethodHandle argumentTypesGet = null; - try { - argumentTypesGet = MethodHandles.privateLookupIn(ArgumentTypes.class, MethodHandles.lookup()) - .findStatic(ArgumentTypes.class, "b", MethodType.methodType(entryClass, ArgumentType.class)); - } catch (ReflectiveOperationException e) { - e.printStackTrace(); - } - getArgumentTypeInformation = argumentTypesGet; + getArgumentTypeInformation = NMS.SafeStaticOneParameterMethodHandle.ofOrNull(ArgumentType.class, "b", entryClass, ArgumentType.class); + serializationKey = NMS.SafeVarHandle.ofOrNull(entryClass, "b", ResourceLocation.class); + serializer = NMS.SafeVarHandle.ofOrNull(entryClass, "a", ArgumentSerializer.class); } @Override - @Differs(from = {"1.13", "1.14", "1.15", "1.16", "1.17", "1.18", "1.18.1"}, - by = "ArgumentType.Entry.c -> ArgumentType.Entry.b, ArgumentType.Entry.b -> ArgumentType.Entry.a") public void serializeToNetwork(ExceptionHandlingArgumentType argument, FriendlyByteBuf friendlyByteBuf) { - try { - // Remove this key from packet - Object myInfo = getArgumentTypeInformation.invoke(argument); + // Remove this key from packet + Object myInfo = getArgumentTypeInformation.invokeOrNull(argument); - // TODO: This Field reflection (and others in this class) acts on the class ArgumentTypes.Entry. This inner - // class is private, and the @RequireField annotation doesn't currently support that. We would like - // to check this reflection at compile-time though, but the preprocess needs to be expanded first - Field keyField = CommandAPIHandler.getField(myInfo.getClass(), "b"); - String myKey = keyField.get(myInfo).toString(); - byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); - // Removing length and size of string, assuming length is always written as 1 byte - friendlyByteBuf.writerIndex(friendlyByteBuf.writerIndex() - myKeyBytes.length - 1); + byte[] myKeyBytes = serializationKey.getUnknownInstanceType(myInfo).toString().getBytes(StandardCharsets.UTF_8); + // Removing length and size of string, assuming length is always written as 1 byte + friendlyByteBuf.writerIndex(friendlyByteBuf.writerIndex() - myKeyBytes.length - 1); - // Add baseType key instead - ArgumentType baseType = argument.baseType(); - Object baseInfo = getArgumentTypeInformation.invoke(baseType); - String baseKey = keyField.get(baseInfo).toString(); - friendlyByteBuf.writeUtf(baseKey); + // Add baseType key instead + ArgumentType baseType = argument.baseType(); + Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); + String baseKey = serializationKey.getUnknownInstanceType(baseInfo).toString(); + friendlyByteBuf.writeUtf(baseKey); - // Serialize baseType - Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "a"); - ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); - subSerializer.serializeToNetwork(baseType, friendlyByteBuf); - } catch (Throwable e) { - e.printStackTrace(); - } + // Serialize baseType + ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); + baseSerializer.serializeToNetwork(baseType, friendlyByteBuf); } @Override - @Differs(from = {"1.13", "1.14", "1.15", "1.16", "1.17", "1.18", "1.18.1"}, - by = "ArgumentType.Entry.c -> ArgumentType.Entry.b, ArgumentType.Entry.b -> ArgumentType.Entry.a") public void serializeToJson(ExceptionHandlingArgumentType argument, JsonObject properties) { - try { - ArgumentType baseType = argument.baseType(); + ArgumentType baseType = argument.baseType(); - Object baseInfo = getArgumentTypeInformation.invoke(baseType); + Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); - Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); - properties.addProperty("baseType", keyField.get(baseInfo).toString()); + properties.addProperty("baseType", serializationKey.getUnknownInstanceType(baseInfo).toString()); - Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "a"); - ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); - JsonObject subProperties = new JsonObject(); - subSerializer.serializeToJson(baseType, subProperties); - if (subProperties.size() > 0) { - properties.add("baseProperties", subProperties); - } - } catch (Throwable e) { - e.printStackTrace(); + JsonObject baseProperties = new JsonObject(); + baseSerializer.serializeToJson(baseType, baseProperties); + if (baseProperties.size() > 0) { + properties.add("baseProperties", baseProperties); } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java index 5ae5cbccd9..d5376e734f 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java @@ -2,26 +2,26 @@ import com.google.gson.JsonObject; import com.mojang.brigadier.arguments.ArgumentType; -import dev.jorel.commandapi.CommandAPIHandler; import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; import net.minecraft.commands.synchronization.ArgumentSerializer; import net.minecraft.commands.synchronization.ArgumentTypes; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; -import java.lang.reflect.Field; import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; public class ExceptionHandlingArgumentSerializer_1_18_R1 implements ArgumentSerializer> { - private static final MethodHandle getArgumentTypeInformation; + // All the ? here should actually be ArgumentTypes.Entry, but that is a private inner class. That makes everything really annoying. + // TODO: We want to check this reflection, but we can't give ArgumentTypes.Entry to the @RequireField annotation + // Hopefully something works out, but the preprocessor needs to be expanded first + private static final NMS.SafeStaticOneParameterMethodHandle getArgumentTypeInformation; + private static final NMS.SafeVarHandle serializationKey; + private static final NMS.SafeVarHandle serializer; // Compute all var handles all in one go so we don't do this during main server runtime static { - // We need a reference to the class object for ArgumentTypes.Entry, but that inner class is private + // We need a reference to the class object for ArgumentTypes.Entry, // We can get an object from ArgumentTypes#get(ResourceLocation), then take its class Class entryClass = null; try { @@ -33,66 +33,45 @@ public class ExceptionHandlingArgumentSerializer_1_18_R1 implements ArgumentS e.printStackTrace(); } - MethodHandle argumentTypesGet = null; - try { - argumentTypesGet = MethodHandles.privateLookupIn(ArgumentTypes.class, MethodHandles.lookup()) - .findStatic(ArgumentTypes.class, "b", MethodType.methodType(entryClass, ArgumentType.class)); - } catch (ReflectiveOperationException e) { - e.printStackTrace(); - } - getArgumentTypeInformation = argumentTypesGet; + getArgumentTypeInformation = NMS.SafeStaticOneParameterMethodHandle.ofOrNull(ArgumentType.class, "b", entryClass, ArgumentType.class); + serializationKey = NMS.SafeVarHandle.ofOrNull(entryClass, "c", ResourceLocation.class); + serializer = NMS.SafeVarHandle.ofOrNull(entryClass, "b", ArgumentSerializer.class); } @Override public void serializeToNetwork(ExceptionHandlingArgumentType argument, FriendlyByteBuf friendlyByteBuf) { - try { - // Remove this key from packet - Object myInfo = getArgumentTypeInformation.invoke(argument); + // Remove this key from packet + Object myInfo = getArgumentTypeInformation.invokeOrNull(argument); - // TODO: This Field reflection (and others in this class) acts on the class ArgumentTypes.Entry. This inner - // class is private, and the @RequireField annotation doesn't currently support that. We would like - // to check this reflection at compile-time though, but the preprocess needs to be expanded first - Field keyField = CommandAPIHandler.getField(myInfo.getClass(), "c"); - String myKey = keyField.get(myInfo).toString(); - byte[] myKeyBytes = myKey.getBytes(StandardCharsets.UTF_8); - // Removing length and size of string, assuming length is always written as 1 byte - friendlyByteBuf.writerIndex(friendlyByteBuf.writerIndex() - myKeyBytes.length - 1); + byte[] myKeyBytes = serializationKey.getUnknownInstanceType(myInfo).toString().getBytes(StandardCharsets.UTF_8); + // Removing length and size of string, assuming length is always written as 1 byte + friendlyByteBuf.writerIndex(friendlyByteBuf.writerIndex() - myKeyBytes.length - 1); - // Add baseType key instead - ArgumentType baseType = argument.baseType(); - Object baseInfo = getArgumentTypeInformation.invoke(baseType); - String baseKey = keyField.get(baseInfo).toString(); - friendlyByteBuf.writeUtf(baseKey); + // Add baseType key instead + ArgumentType baseType = argument.baseType(); + Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); + String baseKey = serializationKey.getUnknownInstanceType(baseInfo).toString(); + friendlyByteBuf.writeUtf(baseKey); - // Serialize baseType - Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); - ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); - subSerializer.serializeToNetwork(baseType, friendlyByteBuf); - } catch (Throwable e) { - e.printStackTrace(); - } + // Serialize baseType + ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); + baseSerializer.serializeToNetwork(baseType, friendlyByteBuf); } @Override public void serializeToJson(ExceptionHandlingArgumentType argument, JsonObject properties) { - try { - ArgumentType baseType = argument.baseType(); + ArgumentType baseType = argument.baseType(); - Object baseInfo = getArgumentTypeInformation.invoke(baseType); + Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); - Field keyField = CommandAPIHandler.getField(baseInfo.getClass(), "c"); - properties.addProperty("baseType", keyField.get(baseInfo).toString()); + properties.addProperty("baseType", serializationKey.getUnknownInstanceType(baseInfo).toString()); - Field subSerializerField = CommandAPIHandler.getField(baseInfo.getClass(), "b"); - ArgumentSerializer> subSerializer = (ArgumentSerializer>) subSerializerField.get(baseInfo); + ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); - JsonObject subProperties = new JsonObject(); - subSerializer.serializeToJson(baseType, subProperties); - if (subProperties.size() > 0) { - properties.add("baseProperties", subProperties); - } - } catch (Throwable e) { - e.printStackTrace(); + JsonObject baseProperties = new JsonObject(); + baseSerializer.serializeToJson(baseType, baseProperties); + if (baseProperties.size() > 0) { + properties.add("baseProperties", baseProperties); } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_1_19_Common.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_1_19_Common.java index 7c28bfadf7..ad6b0e3ec8 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_1_19_Common.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_1_19_Common.java @@ -3,12 +3,15 @@ import com.google.gson.JsonObject; import com.mojang.brigadier.arguments.ArgumentType; import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import dev.jorel.commandapi.preprocessor.Differs; import net.minecraft.commands.CommandBuildContext; import net.minecraft.commands.synchronization.ArgumentTypeInfo; import net.minecraft.commands.synchronization.ArgumentTypeInfos; import net.minecraft.core.Registry; import net.minecraft.network.FriendlyByteBuf; +@Differs(from = {"1.15", "1.16", "1.17", "1.18"}, + by = "ArgumentType serialization completely different") public class ExceptionHandlingArgumentInfo_1_19_Common implements ArgumentTypeInfo, ExceptionHandlingArgumentInfo_1_19_Common.Template> { @Override public void serializeToNetwork(Template template, FriendlyByteBuf friendlyByteBuf) { diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_1_19_3.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_1_19_3.java index 5ca9ff9620..e16d82ca73 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_1_19_3.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_1_19_3.java @@ -11,7 +11,7 @@ import net.minecraft.network.FriendlyByteBuf; @Differs(from = {"1.19", "1.19.1", "1.19.2"}, - by = "Registry.COMMAND_ARGUMENT_TYPE renamed to BuiltInRegistries.COMMAND_ARGUMENT_TYPE") + by = "Registry.COMMAND_ARGUMENT_TYPE -> BuiltInRegistries.COMMAND_ARGUMENT_TYPE") public class ExceptionHandlingArgumentInfo_1_19_3 implements ArgumentTypeInfo, ExceptionHandlingArgumentInfo_1_19_3.Template> { @Override public void serializeToNetwork(Template template, FriendlyByteBuf friendlyByteBuf) { From 4b42d1081a6dc764340eb80492b7fe30c57004c5 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Thu, 23 Feb 2023 08:06:09 -0500 Subject: [PATCH 50/58] Fix ArgumentSerializer reflection --- .../nms/ExceptionHandlingArgumentSerializer_1_16_R1.java | 2 +- .../nms/ExceptionHandlingArgumentSerializer_1_16_R2.java | 2 +- .../nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java | 2 +- .../nms/ExceptionHandlingArgumentSerializer_1_17_Common.java | 2 +- .../nms/ExceptionHandlingArgumentSerializer_1_18_R2.java | 2 +- .../nms/ExceptionHandlingArgumentSerializer_1_18_R1.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java index e3936442f1..32180c07a0 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java @@ -33,7 +33,7 @@ public class ExceptionHandlingArgumentSerializer_1_16_R1 implements ArgumentS e.printStackTrace(); } - getArgumentTypeInformation = NMS.SafeStaticOneParameterMethodHandle.ofOrNull(ArgumentType.class, "a", entryClass, ArgumentType.class); + getArgumentTypeInformation = NMS.SafeStaticOneParameterMethodHandle.ofOrNull(ArgumentRegistry.class, "a", entryClass, ArgumentType.class); serializationKey = NMS.SafeVarHandle.ofOrNull(entryClass, "c", MinecraftKey.class); serializer = NMS.SafeVarHandle.ofOrNull(entryClass, "b", ArgumentSerializer.class); } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java index 88939c21c7..6aee3a1b3a 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java @@ -35,7 +35,7 @@ public class ExceptionHandlingArgumentSerializer_1_16_R2 implements ArgumentS e.printStackTrace(); } - getArgumentTypeInformation = NMS.SafeStaticOneParameterMethodHandle.ofOrNull(ArgumentType.class, "b", entryClass, ArgumentType.class); + getArgumentTypeInformation = NMS.SafeStaticOneParameterMethodHandle.ofOrNull(ArgumentRegistry.class, "b", entryClass, ArgumentType.class); serializationKey = NMS.SafeVarHandle.ofOrNull(entryClass, "c", MinecraftKey.class); serializer = NMS.SafeVarHandle.ofOrNull(entryClass, "b", ArgumentSerializer.class); } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java index 205c67b4cf..51c9e80f08 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java @@ -33,7 +33,7 @@ public class ExceptionHandlingArgumentSerializer_1_16_4_R3 implements Argumen e.printStackTrace(); } - getArgumentTypeInformation = NMS.SafeStaticOneParameterMethodHandle.ofOrNull(ArgumentType.class, "b", entryClass, ArgumentType.class); + getArgumentTypeInformation = NMS.SafeStaticOneParameterMethodHandle.ofOrNull(ArgumentRegistry.class, "b", entryClass, ArgumentType.class); serializationKey = NMS.SafeVarHandle.ofOrNull(entryClass, "c", MinecraftKey.class); serializer = NMS.SafeVarHandle.ofOrNull(entryClass, "b", ArgumentSerializer.class); } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java index 9c600fc7b1..644f83894c 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java @@ -33,7 +33,7 @@ public class ExceptionHandlingArgumentSerializer_1_17_Common implements Argum e.printStackTrace(); } - getArgumentTypeInformation = NMS.SafeStaticOneParameterMethodHandle.ofOrNull(ArgumentType.class, "b", entryClass, ArgumentType.class); + getArgumentTypeInformation = NMS.SafeStaticOneParameterMethodHandle.ofOrNull(ArgumentTypes.class, "b", entryClass, ArgumentType.class); serializationKey = NMS.SafeVarHandle.ofOrNull(entryClass, "c", ResourceLocation.class); serializer = NMS.SafeVarHandle.ofOrNull(entryClass, "b", ArgumentSerializer.class); } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java index 607d96991f..686e0ba01d 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java @@ -36,7 +36,7 @@ public class ExceptionHandlingArgumentSerializer_1_18_R2 implements ArgumentS e.printStackTrace(); } - getArgumentTypeInformation = NMS.SafeStaticOneParameterMethodHandle.ofOrNull(ArgumentType.class, "b", entryClass, ArgumentType.class); + getArgumentTypeInformation = NMS.SafeStaticOneParameterMethodHandle.ofOrNull(ArgumentTypes.class, "b", entryClass, ArgumentType.class); serializationKey = NMS.SafeVarHandle.ofOrNull(entryClass, "b", ResourceLocation.class); serializer = NMS.SafeVarHandle.ofOrNull(entryClass, "a", ArgumentSerializer.class); } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java index d5376e734f..b30912a0ca 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java @@ -33,7 +33,7 @@ public class ExceptionHandlingArgumentSerializer_1_18_R1 implements ArgumentS e.printStackTrace(); } - getArgumentTypeInformation = NMS.SafeStaticOneParameterMethodHandle.ofOrNull(ArgumentType.class, "b", entryClass, ArgumentType.class); + getArgumentTypeInformation = NMS.SafeStaticOneParameterMethodHandle.ofOrNull(ArgumentTypes.class, "b", entryClass, ArgumentType.class); serializationKey = NMS.SafeVarHandle.ofOrNull(entryClass, "c", ResourceLocation.class); serializer = NMS.SafeVarHandle.ofOrNull(entryClass, "b", ArgumentSerializer.class); } From 868985fe9380f80e7f7a954a1116c7416f523f14 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Thu, 23 Feb 2023 09:37:54 -0500 Subject: [PATCH 51/58] Share code between ArgumentSerializers --- .../commandapi-bukkit-core/pom.xml | 11 +++- ...tionHandlingArgumentSerializer_Common.java | 54 +++++++++++++++++++ ...eptionHandlingArgumentSerializer_1_15.java | 54 +++++++++---------- ...ionHandlingArgumentSerializer_1_16_R1.java | 53 +++++++++--------- ...ionHandlingArgumentSerializer_1_16_R2.java | 54 +++++++++---------- ...nHandlingArgumentSerializer_1_16_4_R3.java | 54 +++++++++---------- ...andlingArgumentSerializer_1_17_Common.java | 52 ++++++++---------- ...ionHandlingArgumentSerializer_1_18_R2.java | 52 ++++++++---------- ...ionHandlingArgumentSerializer_1_18_R1.java | 52 ++++++++---------- 9 files changed, 229 insertions(+), 207 deletions(-) create mode 100644 commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_Common.java diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/pom.xml b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/pom.xml index ae60d7ccae..063a5f8502 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/pom.xml +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/pom.xml @@ -51,6 +51,15 @@ ${paper.version} provided + + + + io.netty + netty-buffer + 4.1.82.Final + provided + + dev.jorel @@ -64,7 +73,7 @@ ${project.version} provided - + diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_Common.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_Common.java new file mode 100644 index 0000000000..855a62c0fc --- /dev/null +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_Common.java @@ -0,0 +1,54 @@ +package dev.jorel.commandapi.nms; + +import com.google.gson.JsonObject; +import com.mojang.brigadier.arguments.ArgumentType; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import io.netty.buffer.ByteBuf; + +import java.nio.charset.StandardCharsets; + +public abstract class ExceptionHandlingArgumentSerializer_Common { + protected void commonSerializeToNetwork(ExceptionHandlingArgumentType argument, WRITER packetWriter) { + // REMOVE MY KEY FROM THE PACKET + Object myInfo = getArgumentTypeInformation(argument); + + byte[] myKeyBytes = getSerializationKey(myInfo).getBytes(StandardCharsets.UTF_8); + + // Removing bytes for the key, assuming the length always takes up 1 byte + packetWriter.writerIndex(packetWriter.writerIndex() - myKeyBytes.length - 1); + + // ADD BASE TYPE KEY INSTEAD + ArgumentType baseType = argument.baseType(); + Object baseInfo = getArgumentTypeInformation(baseType); + byte[] baseKeyBytes = getSerializationKey(baseInfo).getBytes(StandardCharsets.UTF_8); + + // Assume length always takes up 1 byte + packetWriter.writeByte(baseKeyBytes.length); + packetWriter.writeBytes(baseKeyBytes); + + // SERIALIZE BASE TYPE + serializeBaseTypeToNetwork(baseType, baseInfo, packetWriter); + } + + protected void commonSerializeToJson(ExceptionHandlingArgumentType argument, JsonObject properties) { + ArgumentType baseType = argument.baseType(); + + Object baseInfo = getArgumentTypeInformation(baseType); + + properties.addProperty("baseType", getSerializationKey(baseInfo)); + + JsonObject baseProperties = new JsonObject(); + serializeBaseTypeToJson(baseType, baseInfo, baseProperties); + if (baseProperties.size() > 0) { + properties.add("baseProperties", baseProperties); + } + } + + protected abstract Object getArgumentTypeInformation(ArgumentType argumentType); + + protected abstract String getSerializationKey(Object info); + + protected abstract void serializeBaseTypeToNetwork(ArgumentType baseType, Object baseInfo, WRITER packetWriter); + + protected abstract void serializeBaseTypeToJson(ArgumentType baseType, Object baseInfo, JsonObject properties); +} diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java index e4e9c79430..3f8c249695 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java @@ -9,9 +9,8 @@ import net.minecraft.server.v1_15_R1.PacketDataSerializer; import java.lang.reflect.Method; -import java.nio.charset.StandardCharsets; -public class ExceptionHandlingArgumentSerializer_1_15 implements ArgumentSerializer> { +public class ExceptionHandlingArgumentSerializer_1_15 extends ExceptionHandlingArgumentSerializer_Common implements ArgumentSerializer> { // All the ? here should actually be ArgumentRegistry.a, but that is a private inner class. That makes everything really annoying. // TODO: We want to check this reflection, but we can't give ArgumentRegistry.a to the @RequireField annotation // Hopefully something works out, but the preprocessor needs to be expanded first @@ -38,43 +37,38 @@ public class ExceptionHandlingArgumentSerializer_1_15 implements ArgumentSeri serializer = NMS.SafeVarHandle.ofOrNull(entryClass, "b", ArgumentSerializer.class); } + // Serializer_Common methods @Override - // serializeToNetwork - public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { - // Remove this key from packet - Object myInfo = getArgumentTypeInformation.invokeOrNull(argument); + protected Object getArgumentTypeInformation(ArgumentType argumentType) { + return getArgumentTypeInformation.invokeOrNull(argumentType); + } - byte[] myKeyBytes = serializationKey.getUnknownInstanceType(myInfo).toString().getBytes(StandardCharsets.UTF_8); - // Removing length and size of string, assuming length is always written as 1 byte - packetDataSerializer.writerIndex(packetDataSerializer.writerIndex() - myKeyBytes.length - 1); + @Override + protected String getSerializationKey(Object info) { + return serializationKey.getUnknownInstanceType(info).toString(); + } - // Add baseType key instead - ArgumentType baseType = argument.baseType(); - Object baseInfo = getArgumentTypeInformation.invokeOrNull(argument); - String baseKey = serializationKey.getUnknownInstanceType(baseInfo).toString(); - packetDataSerializer.a(baseKey); + @Override + protected void serializeBaseTypeToNetwork(ArgumentType baseType, Object baseInfo, PacketDataSerializer packetWriter) { + serializer.getUnknownInstanceType(baseInfo).a(baseType, packetWriter); + } + + @Override + protected void serializeBaseTypeToJson(ArgumentType baseType, Object baseInfo, JsonObject properties) { + serializer.getUnknownInstanceType(baseInfo).a(baseType, properties); + } - // Serialize baseType - ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); - baseSerializer.a(baseType, packetDataSerializer); + // ArgumentSerializer methods + @Override + // serializeToNetwork + public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { + commonSerializeToNetwork(argument, packetDataSerializer); } @Override // serializeToJson public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { - ArgumentType baseType = argument.baseType(); - - Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); - - properties.addProperty("baseType", serializationKey.getUnknownInstanceType(baseInfo).toString()); - - ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); - - JsonObject baseProperties = new JsonObject(); - baseSerializer.a(baseType, baseProperties); - if (baseProperties.size() > 0) { - properties.add("baseProperties", baseProperties); - } + commonSerializeToJson(argument, properties); } @Override diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java index 32180c07a0..fa92a20c6e 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java @@ -9,9 +9,8 @@ import net.minecraft.server.v1_16_R1.PacketDataSerializer; import java.lang.reflect.Method; -import java.nio.charset.StandardCharsets; -public class ExceptionHandlingArgumentSerializer_1_16_R1 implements ArgumentSerializer> { +public class ExceptionHandlingArgumentSerializer_1_16_R1 extends ExceptionHandlingArgumentSerializer_Common implements ArgumentSerializer> { // All the ? here should actually be ArgumentRegistry.a, but that is a private inner class. That makes everything really annoying. // TODO: We want to check this reflection, but we can't give ArgumentRegistry.a to the @RequireField annotation // Hopefully something works out, but the preprocessor needs to be expanded first @@ -38,42 +37,38 @@ public class ExceptionHandlingArgumentSerializer_1_16_R1 implements ArgumentS serializer = NMS.SafeVarHandle.ofOrNull(entryClass, "b", ArgumentSerializer.class); } + // Serializer_Common methods @Override - // serializeToNetwork - public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { - Object myInfo = getArgumentTypeInformation.invokeOrNull(argument); + protected Object getArgumentTypeInformation(ArgumentType argumentType) { + return getArgumentTypeInformation.invokeOrNull(argumentType); + } - byte[] myKeyBytes = serializationKey.getUnknownInstanceType(myInfo).toString().getBytes(StandardCharsets.UTF_8); - // Removing length and size of string, assuming length is always written as 1 byte - packetDataSerializer.writerIndex(packetDataSerializer.writerIndex() - myKeyBytes.length - 1); + @Override + protected String getSerializationKey(Object info) { + return serializationKey.getUnknownInstanceType(info).toString(); + } - // Add baseType key instead - ArgumentType baseType = argument.baseType(); - Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); - String baseKey = serializationKey.getUnknownInstanceType(myInfo).toString(); - packetDataSerializer.a(baseKey); + @Override + protected void serializeBaseTypeToNetwork(ArgumentType baseType, Object baseInfo, PacketDataSerializer packetWriter) { + serializer.getUnknownInstanceType(baseInfo).a(baseType, packetWriter); + } + + @Override + protected void serializeBaseTypeToJson(ArgumentType baseType, Object baseInfo, JsonObject properties) { + serializer.getUnknownInstanceType(baseInfo).a(baseType, properties); + } - // Serialize baseType - ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); - baseSerializer.a(baseType, packetDataSerializer); + // ArgumentSerializer methods + @Override + // serializeToNetwork + public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { + commonSerializeToNetwork(argument, packetDataSerializer); } @Override // serializeToJson public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { - ArgumentType baseType = argument.baseType(); - - Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); - - properties.addProperty("baseType", serializationKey.getUnknownInstanceType(baseInfo).toString()); - - ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); - - JsonObject baseProperties = new JsonObject(); - baseSerializer.a(baseType, baseProperties); - if (baseProperties.size() > 0) { - properties.add("baseProperties", baseProperties); - } + commonSerializeToJson(argument, properties); } @Override diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java index 6aee3a1b3a..80df149023 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java @@ -10,10 +10,9 @@ import net.minecraft.server.v1_16_R2.PacketDataSerializer; import java.lang.reflect.Method; -import java.nio.charset.StandardCharsets; @Differs(from = {"1.15", "1.16.1"}, by = "Renamed ArgumentRegistry#a(ArgumentType) to ArgumentRegistry#b(ArgumentType)") -public class ExceptionHandlingArgumentSerializer_1_16_R2 implements ArgumentSerializer> { +public class ExceptionHandlingArgumentSerializer_1_16_R2 extends ExceptionHandlingArgumentSerializer_Common implements ArgumentSerializer> { // All the ? here should actually be ArgumentRegistry.a, but that is a private inner class. That makes everything really annoying. // TODO: We want to check this reflection, but we can't give ArgumentRegistry.a to the @RequireField annotation // Hopefully something works out, but the preprocessor needs to be expanded first @@ -40,43 +39,38 @@ public class ExceptionHandlingArgumentSerializer_1_16_R2 implements ArgumentS serializer = NMS.SafeVarHandle.ofOrNull(entryClass, "b", ArgumentSerializer.class); } + // Serializer_Common methods @Override - // serializeToNetwork - public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { - // Remove this key from packet - Object myInfo = getArgumentTypeInformation.invokeOrNull(argument); + protected Object getArgumentTypeInformation(ArgumentType argumentType) { + return getArgumentTypeInformation.invokeOrNull(argumentType); + } - byte[] myKeyBytes = serializationKey.getUnknownInstanceType(myInfo).toString().getBytes(StandardCharsets.UTF_8); - // Removing length and size of string, assuming length is always written as 1 byte - packetDataSerializer.writerIndex(packetDataSerializer.writerIndex() - myKeyBytes.length - 1); + @Override + protected String getSerializationKey(Object info) { + return serializationKey.getUnknownInstanceType(info).toString(); + } - // Add baseType key instead - ArgumentType baseType = argument.baseType(); - Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); - String baseKey = serializationKey.getUnknownInstanceType(baseInfo).toString(); - packetDataSerializer.a(baseKey); + @Override + protected void serializeBaseTypeToNetwork(ArgumentType baseType, Object baseInfo, PacketDataSerializer packetWriter) { + serializer.getUnknownInstanceType(baseInfo).a(baseType, packetWriter); + } + + @Override + protected void serializeBaseTypeToJson(ArgumentType baseType, Object baseInfo, JsonObject properties) { + serializer.getUnknownInstanceType(baseInfo).a(baseType, properties); + } - // Serialize baseType - ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); - baseSerializer.a(baseType, packetDataSerializer); + // ArgumentSerializer methods + @Override + // serializeToNetwork + public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { + commonSerializeToNetwork(argument, packetDataSerializer); } @Override // serializeToJson public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { - ArgumentType baseType = argument.baseType(); - - Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); - - properties.addProperty("baseType", serializationKey.getUnknownInstanceType(baseInfo).toString()); - - ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); - - JsonObject baseProperties = new JsonObject(); - baseSerializer.a(baseType, baseProperties); - if (baseProperties.size() > 0) { - properties.add("baseProperties", baseProperties); - } + commonSerializeToJson(argument, properties); } @Override diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java index 51c9e80f08..9e2e7d19ae 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java @@ -9,9 +9,8 @@ import net.minecraft.server.v1_16_R3.PacketDataSerializer; import java.lang.reflect.Method; -import java.nio.charset.StandardCharsets; -public class ExceptionHandlingArgumentSerializer_1_16_4_R3 implements ArgumentSerializer> { +public class ExceptionHandlingArgumentSerializer_1_16_4_R3 extends ExceptionHandlingArgumentSerializer_Common implements ArgumentSerializer> { // All the ? here should actually be ArgumentRegistry.a, but that is a private inner class. That makes everything really annoying. // TODO: We want to check this reflection, but we can't give ArgumentRegistry.a to the @RequireField annotation // Hopefully something works out, but the preprocessor needs to be expanded first @@ -38,43 +37,38 @@ public class ExceptionHandlingArgumentSerializer_1_16_4_R3 implements Argumen serializer = NMS.SafeVarHandle.ofOrNull(entryClass, "b", ArgumentSerializer.class); } + // Serializer_Common methods @Override - // serializeToNetwork - public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { - // Remove this key from packet - Object myInfo = getArgumentTypeInformation.invokeOrNull(argument); + protected Object getArgumentTypeInformation(ArgumentType argumentType) { + return getArgumentTypeInformation.invokeOrNull(argumentType); + } - byte[] myKeyBytes = serializationKey.getUnknownInstanceType(myInfo).toString().getBytes(StandardCharsets.UTF_8); - // Removing length and size of string, assuming length is always written as 1 byte - packetDataSerializer.writerIndex(packetDataSerializer.writerIndex() - myKeyBytes.length - 1); + @Override + protected String getSerializationKey(Object info) { + return serializationKey.getUnknownInstanceType(info).toString(); + } - // Add baseType key instead - ArgumentType baseType = argument.baseType(); - Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); - String baseKey = serializationKey.getUnknownInstanceType(baseInfo).toString(); - packetDataSerializer.a(baseKey); + @Override + protected void serializeBaseTypeToNetwork(ArgumentType baseType, Object baseInfo, PacketDataSerializer packetWriter) { + serializer.getUnknownInstanceType(baseInfo).a(baseType, packetWriter); + } + + @Override + protected void serializeBaseTypeToJson(ArgumentType baseType, Object baseInfo, JsonObject properties) { + serializer.getUnknownInstanceType(baseInfo).a(baseType, properties); + } - // Serialize baseType - ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); - baseSerializer.a(baseType, packetDataSerializer); + // ArgumentSerializer methods + @Override + // serializeToNetwork + public void a(ExceptionHandlingArgumentType argument, PacketDataSerializer packetDataSerializer) { + commonSerializeToNetwork(argument, packetDataSerializer); } @Override // serializeToJson public void a(ExceptionHandlingArgumentType argument, JsonObject properties) { - ArgumentType baseType = argument.baseType(); - - Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); - - properties.addProperty("baseType", serializationKey.getUnknownInstanceType(baseInfo).toString()); - - ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); - - JsonObject baseProperties = new JsonObject(); - baseSerializer.a(baseType, baseProperties); - if (baseProperties.size() > 0) { - properties.add("baseProperties", baseProperties); - } + commonSerializeToJson(argument, properties); } @Override diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java index 644f83894c..3e8610f006 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java @@ -9,9 +9,8 @@ import net.minecraft.resources.ResourceLocation; import java.lang.reflect.Method; -import java.nio.charset.StandardCharsets; -public class ExceptionHandlingArgumentSerializer_1_17_Common implements ArgumentSerializer> { +public class ExceptionHandlingArgumentSerializer_1_17_Common extends ExceptionHandlingArgumentSerializer_Common implements ArgumentSerializer> { // All the ? here should actually be ArgumentTypes.Entry, but that is a private inner class. That makes everything really annoying. // TODO: We want to check this reflection, but we can't give ArgumentTypes.Entry to the @RequireField annotation // Hopefully something works out, but the preprocessor needs to be expanded first @@ -38,41 +37,36 @@ public class ExceptionHandlingArgumentSerializer_1_17_Common implements Argum serializer = NMS.SafeVarHandle.ofOrNull(entryClass, "b", ArgumentSerializer.class); } + // Serializer_Common methods @Override - public void serializeToNetwork(ExceptionHandlingArgumentType argument, FriendlyByteBuf friendlyByteBuf) { - // Remove this key from packet - Object myInfo = getArgumentTypeInformation.invokeOrNull(argument); - - byte[] myKeyBytes = serializationKey.getUnknownInstanceType(myInfo).toString().getBytes(StandardCharsets.UTF_8); - // Removing length and size of string, assuming length is always written as 1 byte - friendlyByteBuf.writerIndex(friendlyByteBuf.writerIndex() - myKeyBytes.length - 1); - - // Add baseType key instead - ArgumentType baseType = argument.baseType(); - Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); - String baseKey = serializationKey.getUnknownInstanceType(baseInfo).toString(); - friendlyByteBuf.writeUtf(baseKey); - - // Serialize baseType - ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); - baseSerializer.serializeToNetwork(baseType, friendlyByteBuf); + protected Object getArgumentTypeInformation(ArgumentType argumentType) { + return getArgumentTypeInformation.invokeOrNull(argumentType); } @Override - public void serializeToJson(ExceptionHandlingArgumentType argument, JsonObject properties) { - ArgumentType baseType = argument.baseType(); + protected String getSerializationKey(Object info) { + return serializationKey.getUnknownInstanceType(info).toString(); + } - Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); + @Override + protected void serializeBaseTypeToNetwork(ArgumentType baseType, Object baseInfo, FriendlyByteBuf packetWriter) { + serializer.getUnknownInstanceType(baseInfo).serializeToNetwork(baseType, packetWriter); + } - properties.addProperty("baseType", serializationKey.getUnknownInstanceType(baseInfo).toString()); + @Override + protected void serializeBaseTypeToJson(ArgumentType baseType, Object baseInfo, JsonObject properties) { + serializer.getUnknownInstanceType(baseInfo).serializeToJson(baseType, properties); + } - ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); + // ArgumentSerializer methods + @Override + public void serializeToNetwork(ExceptionHandlingArgumentType argument, FriendlyByteBuf friendlyByteBuf) { + commonSerializeToNetwork(argument, friendlyByteBuf); + } - JsonObject baseProperties = new JsonObject(); - baseSerializer.serializeToJson(baseType, baseProperties); - if (baseProperties.size() > 0) { - properties.add("baseProperties", baseProperties); - } + @Override + public void serializeToJson(ExceptionHandlingArgumentType argument, JsonObject properties) { + commonSerializeToJson(argument, properties); } @Override diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java index 686e0ba01d..18e2541a92 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java @@ -10,11 +10,10 @@ import net.minecraft.resources.ResourceLocation; import java.lang.reflect.Method; -import java.nio.charset.StandardCharsets; @Differs(from = {"1.15", "1.16", "1.17", "1.18", "1.18.1"}, by = "ArgumentTypes.Entry.c -> ArgumentTypes.Entry.b, ArgumentTypes.Entry.b -> ArgumentTypes.Entry.a") -public class ExceptionHandlingArgumentSerializer_1_18_R2 implements ArgumentSerializer> { +public class ExceptionHandlingArgumentSerializer_1_18_R2 extends ExceptionHandlingArgumentSerializer_Common implements ArgumentSerializer> { // All the ? here should actually be ArgumentTypes.Entry, but that is a private inner class. That makes everything really annoying. // TODO: We want to check this reflection, but we can't give ArgumentTypes.Entry to the @RequireField annotation // Hopefully something works out, but the preprocessor needs to be expanded first @@ -41,41 +40,36 @@ public class ExceptionHandlingArgumentSerializer_1_18_R2 implements ArgumentS serializer = NMS.SafeVarHandle.ofOrNull(entryClass, "a", ArgumentSerializer.class); } + // Serializer_Common methods @Override - public void serializeToNetwork(ExceptionHandlingArgumentType argument, FriendlyByteBuf friendlyByteBuf) { - // Remove this key from packet - Object myInfo = getArgumentTypeInformation.invokeOrNull(argument); - - byte[] myKeyBytes = serializationKey.getUnknownInstanceType(myInfo).toString().getBytes(StandardCharsets.UTF_8); - // Removing length and size of string, assuming length is always written as 1 byte - friendlyByteBuf.writerIndex(friendlyByteBuf.writerIndex() - myKeyBytes.length - 1); - - // Add baseType key instead - ArgumentType baseType = argument.baseType(); - Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); - String baseKey = serializationKey.getUnknownInstanceType(baseInfo).toString(); - friendlyByteBuf.writeUtf(baseKey); - - // Serialize baseType - ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); - baseSerializer.serializeToNetwork(baseType, friendlyByteBuf); + protected Object getArgumentTypeInformation(ArgumentType argumentType) { + return getArgumentTypeInformation.invokeOrNull(argumentType); } @Override - public void serializeToJson(ExceptionHandlingArgumentType argument, JsonObject properties) { - ArgumentType baseType = argument.baseType(); + protected String getSerializationKey(Object info) { + return serializationKey.getUnknownInstanceType(info).toString(); + } - Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); + @Override + protected void serializeBaseTypeToNetwork(ArgumentType baseType, Object baseInfo, FriendlyByteBuf packetWriter) { + serializer.getUnknownInstanceType(baseInfo).serializeToNetwork(baseType, packetWriter); + } - properties.addProperty("baseType", serializationKey.getUnknownInstanceType(baseInfo).toString()); + @Override + protected void serializeBaseTypeToJson(ArgumentType baseType, Object baseInfo, JsonObject properties) { + serializer.getUnknownInstanceType(baseInfo).serializeToJson(baseType, properties); + } - ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); + // ArgumentSerializer methods + @Override + public void serializeToNetwork(ExceptionHandlingArgumentType argument, FriendlyByteBuf friendlyByteBuf) { + commonSerializeToNetwork(argument, friendlyByteBuf); + } - JsonObject baseProperties = new JsonObject(); - baseSerializer.serializeToJson(baseType, baseProperties); - if (baseProperties.size() > 0) { - properties.add("baseProperties", baseProperties); - } + @Override + public void serializeToJson(ExceptionHandlingArgumentType argument, JsonObject properties) { + commonSerializeToJson(argument, properties); } @Override diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java index b30912a0ca..12531de9de 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java @@ -9,9 +9,8 @@ import net.minecraft.resources.ResourceLocation; import java.lang.reflect.Method; -import java.nio.charset.StandardCharsets; -public class ExceptionHandlingArgumentSerializer_1_18_R1 implements ArgumentSerializer> { +public class ExceptionHandlingArgumentSerializer_1_18_R1 extends ExceptionHandlingArgumentSerializer_Common implements ArgumentSerializer> { // All the ? here should actually be ArgumentTypes.Entry, but that is a private inner class. That makes everything really annoying. // TODO: We want to check this reflection, but we can't give ArgumentTypes.Entry to the @RequireField annotation // Hopefully something works out, but the preprocessor needs to be expanded first @@ -38,41 +37,36 @@ public class ExceptionHandlingArgumentSerializer_1_18_R1 implements ArgumentS serializer = NMS.SafeVarHandle.ofOrNull(entryClass, "b", ArgumentSerializer.class); } + // Serializer_Common methods @Override - public void serializeToNetwork(ExceptionHandlingArgumentType argument, FriendlyByteBuf friendlyByteBuf) { - // Remove this key from packet - Object myInfo = getArgumentTypeInformation.invokeOrNull(argument); - - byte[] myKeyBytes = serializationKey.getUnknownInstanceType(myInfo).toString().getBytes(StandardCharsets.UTF_8); - // Removing length and size of string, assuming length is always written as 1 byte - friendlyByteBuf.writerIndex(friendlyByteBuf.writerIndex() - myKeyBytes.length - 1); - - // Add baseType key instead - ArgumentType baseType = argument.baseType(); - Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); - String baseKey = serializationKey.getUnknownInstanceType(baseInfo).toString(); - friendlyByteBuf.writeUtf(baseKey); - - // Serialize baseType - ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); - baseSerializer.serializeToNetwork(baseType, friendlyByteBuf); + protected Object getArgumentTypeInformation(ArgumentType argumentType) { + return getArgumentTypeInformation.invokeOrNull(argumentType); } @Override - public void serializeToJson(ExceptionHandlingArgumentType argument, JsonObject properties) { - ArgumentType baseType = argument.baseType(); + protected String getSerializationKey(Object info) { + return serializationKey.getUnknownInstanceType(info).toString(); + } - Object baseInfo = getArgumentTypeInformation.invokeOrNull(baseType); + @Override + protected void serializeBaseTypeToNetwork(ArgumentType baseType, Object baseInfo, FriendlyByteBuf packetWriter) { + serializer.getUnknownInstanceType(baseInfo).serializeToNetwork(baseType, packetWriter); + } - properties.addProperty("baseType", serializationKey.getUnknownInstanceType(baseInfo).toString()); + @Override + protected void serializeBaseTypeToJson(ArgumentType baseType, Object baseInfo, JsonObject properties) { + serializer.getUnknownInstanceType(baseInfo).serializeToJson(baseType, properties); + } - ArgumentSerializer> baseSerializer = (ArgumentSerializer>) serializer.getUnknownInstanceType(baseInfo); + // ArgumentSerializer methods + @Override + public void serializeToNetwork(ExceptionHandlingArgumentType argument, FriendlyByteBuf friendlyByteBuf) { + commonSerializeToNetwork(argument, friendlyByteBuf); + } - JsonObject baseProperties = new JsonObject(); - baseSerializer.serializeToJson(baseType, baseProperties); - if (baseProperties.size() > 0) { - properties.add("baseProperties", baseProperties); - } + @Override + public void serializeToJson(ExceptionHandlingArgumentType argument, JsonObject properties) { + commonSerializeToJson(argument, properties); } @Override From fde031f2cb1ac7b6b34ec4b95856d5c03bc35012 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Mon, 13 Mar 2023 09:20:01 -0400 Subject: [PATCH 52/58] Don't include Object in the platform load log --- .../src/main/java/dev/jorel/commandapi/CommandAPI.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPI.java b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPI.java index b2c1d07d7d..04527bde4e 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPI.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPI.java @@ -108,9 +108,9 @@ public static void onLoad(CommandAPIConfig config) { { List platformClassHierarchyList = new ArrayList<>(); Class platformClass = platform.getClass(); - // Goes up through class inheritance only + // Goes up through class inheritance only (ending at Object, but we don't want to include that) // CommandAPIPlatform is an interface, so it is not included - while (platformClass != null) { + while (platformClass != null && platformClass != Object.class) { platformClassHierarchyList.add(platformClass.getSimpleName()); platformClass = platformClass.getSuperclass(); } From a7570d0df94a4aa9ce04f87d9d1c6cd7b61e9c40 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Fri, 17 Mar 2023 14:23:22 -0400 Subject: [PATCH 53/58] Add simple test for ArgumentParseException --- .../test/ArgumentParseExceptionTest.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-tests/src/test/java/dev/jorel/commandapi/test/ArgumentParseExceptionTest.java diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-tests/src/test/java/dev/jorel/commandapi/test/ArgumentParseExceptionTest.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-tests/src/test/java/dev/jorel/commandapi/test/ArgumentParseExceptionTest.java new file mode 100644 index 0000000000..850ee81583 --- /dev/null +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-tests/src/test/java/dev/jorel/commandapi/test/ArgumentParseExceptionTest.java @@ -0,0 +1,75 @@ +package dev.jorel.commandapi.test; + +import dev.jorel.commandapi.CommandAPI; +import dev.jorel.commandapi.CommandAPICommand; +import dev.jorel.commandapi.arguments.ListArgumentBuilder; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.Collection; +import java.util.List; + +public class ArgumentParseExceptionTest extends TestBase { + + /********* + * Setup * + *********/ + + @BeforeEach + public void setUp() { + super.setUp(); + } + + @AfterEach + public void tearDown() { + super.tearDown(); + } + + /********* + * Tests * + *********/ + + @Test + void test() { + Mut> players = Mut.of(); + + new CommandAPICommand("test") + .withArguments( + new ListArgumentBuilder("players") + .withList(() -> (Collection) Bukkit.getOnlinePlayers()) + .withMapper(Player::getName) + .buildGreedy() + .withArgumentParseExceptionHandler(context -> { + if(context.exception().getMessage().equals("Item is not allowed in list")) { + throw CommandAPI.failWithString("No such player!"); + } else { + throw context.exception(); + } + }) + ) + .executes(info -> { + players.set(info.args().getUnchecked("players")); + }); + + Player a = server.addPlayer("PlayerA"); + Player b = server.addPlayer("PlayerB"); + Player c = server.addPlayer("PlayerC"); + + // Make sure the list argument still works normally + // /test PlayerA PlayerB PlayerC + assertStoresResult(a, "test PlayerA PlayerB PlayerC", players, List.of(a, b, c)); + + // /test PlayerA PlayerB PlayerB + assertCommandFailsWith(a, "test PlayerA PlayerB PlayerB", "Duplicate arguments are not allowed"); + + // Make sure our custom exception was applied + // /test PlayerA PlayerD PlayerC + assertCommandFailsWith(a, "test PlayerA PlayerD PlayerC", "No such player!"); + + + assertNoMoreResults(players); + } +} From deda3239ca38e5405c59afed6825d5152b8f27dd Mon Sep 17 00:00:00 2001 From: BuildTools Date: Fri, 17 Mar 2023 17:10:19 -0400 Subject: [PATCH 54/58] You gotta register the test command to use it! Also other fixes --- .../jorel/commandapi/test/ArgumentParseExceptionTest.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-tests/src/test/java/dev/jorel/commandapi/test/ArgumentParseExceptionTest.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-tests/src/test/java/dev/jorel/commandapi/test/ArgumentParseExceptionTest.java index 850ee81583..6c392e32bf 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-tests/src/test/java/dev/jorel/commandapi/test/ArgumentParseExceptionTest.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-tests/src/test/java/dev/jorel/commandapi/test/ArgumentParseExceptionTest.java @@ -43,7 +43,7 @@ void test() { .withMapper(Player::getName) .buildGreedy() .withArgumentParseExceptionHandler(context -> { - if(context.exception().getMessage().equals("Item is not allowed in list")) { + if(context.exception().getMessage().startsWith("Item is not allowed in list")) { throw CommandAPI.failWithString("No such player!"); } else { throw context.exception(); @@ -52,7 +52,8 @@ void test() { ) .executes(info -> { players.set(info.args().getUnchecked("players")); - }); + }) + .register(); Player a = server.addPlayer("PlayerA"); Player b = server.addPlayer("PlayerB"); @@ -63,7 +64,7 @@ void test() { assertStoresResult(a, "test PlayerA PlayerB PlayerC", players, List.of(a, b, c)); // /test PlayerA PlayerB PlayerB - assertCommandFailsWith(a, "test PlayerA PlayerB PlayerB", "Duplicate arguments are not allowed"); + assertCommandFailsWith(a, "test PlayerA PlayerB PlayerB", "Duplicate arguments are not allowed at position 16: ...A PlayerB <--[HERE]"); // Make sure our custom exception was applied // /test PlayerA PlayerD PlayerC From 08f5218e983bdbb31f1c930f835ee1fe7293d765 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Tue, 21 Mar 2023 10:01:23 -0400 Subject: [PATCH 55/58] Update 1.19.4 NMS --- .../ExceptionHandlingArgumentInfo_1_19_4.java | 86 +++++++++++++++++++ .../jorel/commandapi/nms/NMS_1_19_4_R3.java | 30 +++++++ .../jorel/commandapi/test/ArgumentNMS.java | 8 ++ 3 files changed, 124 insertions(+) create mode 100644 commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_1_19_4.java diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_1_19_4.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_1_19_4.java new file mode 100644 index 0000000000..b4d8c39a17 --- /dev/null +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentInfo_1_19_4.java @@ -0,0 +1,86 @@ +package dev.jorel.commandapi.nms; + +import com.google.gson.JsonObject; +import com.mojang.brigadier.arguments.ArgumentType; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import dev.jorel.commandapi.preprocessor.Differs; +import net.minecraft.commands.CommandBuildContext; +import net.minecraft.commands.synchronization.ArgumentTypeInfo; +import net.minecraft.commands.synchronization.ArgumentTypeInfos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.FriendlyByteBuf; + +@Differs(from = {"1.19", "1.19.1", "1.19.2"}, + by = "Registry.COMMAND_ARGUMENT_TYPE -> BuiltInRegistries.COMMAND_ARGUMENT_TYPE") +public class ExceptionHandlingArgumentInfo_1_19_4 implements ArgumentTypeInfo, ExceptionHandlingArgumentInfo_1_19_4.Template> { + @Override + public void serializeToNetwork(Template template, FriendlyByteBuf friendlyByteBuf) { + ArgumentType baseType = template.baseType; + ArgumentTypeInfo, ArgumentTypeInfo.Template>> baseInfo = + (ArgumentTypeInfo, ArgumentTypeInfo.Template>>) ArgumentTypeInfos.byClass(baseType); + + // Overwrite my id with the base type's. Since there are less than + // 128 argument types by default, assume index will always fill 1 byte. + // If you get a garbage packet, check this assumption + int baseId = BuiltInRegistries.COMMAND_ARGUMENT_TYPE.getId(baseInfo); + friendlyByteBuf.writerIndex(friendlyByteBuf.writerIndex() - 1); + friendlyByteBuf.writeVarInt(baseId); + + // Add the base type to the packet + baseInfo.serializeToNetwork(baseInfo.unpack(baseType), friendlyByteBuf); + } + + @Override + public void serializeToJson(Template template, JsonObject properties) { + ArgumentType baseType = template.baseType; + ArgumentTypeInfo, ArgumentTypeInfo.Template>> baseInfo = + (ArgumentTypeInfo, ArgumentTypeInfo.Template>>) ArgumentTypeInfos.byClass(baseType); + properties.addProperty("baseType", BuiltInRegistries.COMMAND_ARGUMENT_TYPE.getKey(baseInfo).toString()); + JsonObject subProperties = new JsonObject(); + baseInfo.serializeToJson(baseInfo.unpack(baseType), subProperties); + if(subProperties.size() > 0) { + properties.add("baseProperties", subProperties); + } + } + + @Override + public Template unpack(ExceptionHandlingArgumentType exceptionHandlingArgumentType) { + ArgumentType baseType = exceptionHandlingArgumentType.baseType(); + return new Template(baseType); + } + + @Override + public Template deserializeFromNetwork(FriendlyByteBuf friendlyByteBuf) { + // Since this class overrides its COMMAND_ARGUMENT_TYPE id with the baseType's, + // this class's id should never show up in a packet and this method should never + // be called to deserialize the ArgumentType info that wasn't put into the packet + // anyway. Also, the server shouldn't ever deserialize a *ClientBound*CommandPacket + // either. If this method ever gets called, either you or I are doing something very wrong! + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentInfo_1_19_3#deserializeFromNetwork for more information"); + // Including a mini-stacktrace here in case this exception shows up + // on a client-disconnected screen, which is not very helpful + } + + public final class Template implements ArgumentTypeInfo.Template> { + final ArgumentType baseType; + + public Template(ArgumentType baseType) { + this.baseType = baseType; + } + + @Override + public ArgumentTypeInfo, ?> type() { + return ExceptionHandlingArgumentInfo_1_19_4.this; + } + + @Override + public ExceptionHandlingArgumentType instantiate(CommandBuildContext commandBuildContext) { + // Same as ExceptionHandlingArgumentInfo_1_19_3#deserializeFromNetwork. + // An ExceptionHandlingArgumentType should never be built from a packet, + // so this method shouldn't be used + throw new IllegalStateException("This shouldn't happen! See dev.jorel.commandapi.nms.ExceptionHandlingArgumentInfo_1_19_3.Template#instantiate for more information"); + // Including a mini-stacktrace here in case this exception shows up + // on a client-disconnected screen, which is not very helpful + } + } +} diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.4/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_4_R3.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.4/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_4_R3.java index 2734d4029f..902d27e23b 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.4/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_4_R3.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.4/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_4_R3.java @@ -24,6 +24,8 @@ import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; +import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collection; @@ -34,6 +36,11 @@ import java.util.function.Predicate; import java.util.function.ToIntFunction; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import net.minecraft.commands.synchronization.ArgumentTypeInfo; +import net.minecraft.commands.synchronization.ArgumentTypeInfos; +import net.minecraft.core.MappedRegistry; +import net.minecraft.core.Registry; import org.bukkit.Bukkit; import org.bukkit.Color; import org.bukkit.Location; @@ -756,6 +763,29 @@ public final void resendPackets(Player player) { this.getMinecraftServer().getCommands().sendCommands(((CraftPlayer) player).getHandle()); } + @Override + public void registerCustomArgumentType() { + try { + // Unfreeze registry + Field isFrozen = CommandAPIHandler.getField(MappedRegistry.class, "l"); + + isFrozen.set(BuiltInRegistries.COMMAND_ARGUMENT_TYPE, false); + + // Register argument + Method registerArgument = ArgumentTypeInfos.class.getDeclaredMethod("a", Registry.class, String.class, + Class.class, ArgumentTypeInfo.class); + registerArgument.setAccessible(true); + + registerArgument.invoke(null, BuiltInRegistries.COMMAND_ARGUMENT_TYPE, "commandapi:exception_handler", + ExceptionHandlingArgumentType.class, new ExceptionHandlingArgumentInfo_1_19_4<>()); + + // Refreeze registry + isFrozen.set(BuiltInRegistries.COMMAND_ARGUMENT_TYPE, true); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + } + @Override public Message generateMessageFromJson(String json) { return Serializer.fromJson(json); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.19.4/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.19.4/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java index 0d43a697eb..173bb4f9c2 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.19.4/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.19.4/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java @@ -10,6 +10,8 @@ import java.util.function.Function; import java.util.function.Predicate; +import dev.jorel.commandapi.arguments.ExceptionHandlingArgumentType; +import net.minecraft.commands.synchronization.ArgumentTypeInfos; import org.bukkit.Axis; import org.bukkit.ChatColor; import org.bukkit.Location; @@ -569,4 +571,10 @@ public UUID getUUID(CommandContext cmdCtx, String key) { return baseNMS.getUUID(cmdCtx, key); } + @Override + public void registerCustomArgumentType() { + if(!ArgumentTypeInfos.isClassRecognized(ExceptionHandlingArgumentType.class)) { + baseNMS.registerCustomArgumentType(); + } + } } From 5652dab6d7064e3c75e99183eaad09a302125bf5 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Tue, 21 Mar 2023 10:23:52 -0400 Subject: [PATCH 56/58] Fix frozen field access in 1.19 NMS when testing --- .../src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java | 2 +- .../src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java | 2 +- .../src/main/java/dev/jorel/commandapi/nms/NMS_1_19_4_R3.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java index 068e9e0727..fd22de6dcc 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java @@ -861,7 +861,7 @@ public final void resendPackets(Player player) { public void registerCustomArgumentType() { try { // Unfreeze registry - Field isFrozen = CommandAPIHandler.getField(MappedRegistry.class, "ca"); + Field isFrozen = CommandAPIHandler.getField(MappedRegistry.class, "ca", "frozen"); isFrozen.set(Registry.COMMAND_ARGUMENT_TYPE, false); // Register argument diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java index acf88f0a00..f08ed980f3 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java @@ -753,7 +753,7 @@ public final void resendPackets(Player player) { public void registerCustomArgumentType() { try { // Unfreeze registry - Field isFrozen = CommandAPIHandler.getField(MappedRegistry.class, "l"); + Field isFrozen = CommandAPIHandler.getField(MappedRegistry.class, "l", "frozen"); isFrozen.set(BuiltInRegistries.COMMAND_ARGUMENT_TYPE, false); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.4/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_4_R3.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.4/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_4_R3.java index 902d27e23b..4b016a3e59 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.4/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_4_R3.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.4/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_4_R3.java @@ -767,7 +767,7 @@ public final void resendPackets(Player player) { public void registerCustomArgumentType() { try { // Unfreeze registry - Field isFrozen = CommandAPIHandler.getField(MappedRegistry.class, "l"); + Field isFrozen = CommandAPIHandler.getField(MappedRegistry.class, "l", "frozen"); isFrozen.set(BuiltInRegistries.COMMAND_ARGUMENT_TYPE, false); From b13102c81e62215ea9e6c43505f85cab16f359d7 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Thu, 23 Mar 2023 08:55:39 -0400 Subject: [PATCH 57/58] Fix register method access in 1.19 NMS when testing --- .../main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java | 4 ++-- .../src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java | 4 ++-- .../src/main/java/dev/jorel/commandapi/nms/NMS_1_19_4_R3.java | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java index fd22de6dcc..403edb014a 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java @@ -865,8 +865,8 @@ public void registerCustomArgumentType() { isFrozen.set(Registry.COMMAND_ARGUMENT_TYPE, false); // Register argument - Method registerArgument = ArgumentTypeInfos.class.getDeclaredMethod("a", Registry.class, String.class, - Class.class, ArgumentTypeInfo.class); + Method registerArgument = ArgumentTypeInfos.class.getDeclaredMethod(SafeVarHandle.USING_MOJANG_MAPPINGS ? "register" : "a", + Registry.class, String.class, Class.class, ArgumentTypeInfo.class); registerArgument.setAccessible(true); registerArgument.invoke(null, Registry.COMMAND_ARGUMENT_TYPE, "commandapi:exception_handler", diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java index f08ed980f3..bcaeef4247 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.3/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_3_R2.java @@ -758,8 +758,8 @@ public void registerCustomArgumentType() { isFrozen.set(BuiltInRegistries.COMMAND_ARGUMENT_TYPE, false); // Register argument - Method registerArgument = ArgumentTypeInfos.class.getDeclaredMethod("a", Registry.class, String.class, - Class.class, ArgumentTypeInfo.class); + Method registerArgument = ArgumentTypeInfos.class.getDeclaredMethod(SafeVarHandle.USING_MOJANG_MAPPINGS ? "register" : "a", + Registry.class, String.class, Class.class, ArgumentTypeInfo.class); registerArgument.setAccessible(true); registerArgument.invoke(null, BuiltInRegistries.COMMAND_ARGUMENT_TYPE, "commandapi:exception_handler", diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.4/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_4_R3.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.4/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_4_R3.java index 4b016a3e59..b07ffeb94c 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.4/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_4_R3.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19.4/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_4_R3.java @@ -772,8 +772,8 @@ public void registerCustomArgumentType() { isFrozen.set(BuiltInRegistries.COMMAND_ARGUMENT_TYPE, false); // Register argument - Method registerArgument = ArgumentTypeInfos.class.getDeclaredMethod("a", Registry.class, String.class, - Class.class, ArgumentTypeInfo.class); + Method registerArgument = ArgumentTypeInfos.class.getDeclaredMethod(SafeVarHandle.USING_MOJANG_MAPPINGS ? "register" : "a", + Registry.class, String.class, Class.class, ArgumentTypeInfo.class); registerArgument.setAccessible(true); registerArgument.invoke(null, BuiltInRegistries.COMMAND_ARGUMENT_TYPE, "commandapi:exception_handler", From e3d5679bb52837434b0ed4aecdc2899beef8fbab Mon Sep 17 00:00:00 2001 From: BuildTools Date: Mon, 3 Apr 2023 09:44:06 -0400 Subject: [PATCH 58/58] Provide the parametrized type for SafeVarHandles in ArgumentSerializers --- .../jorel/commandapi/SafeStaticOneParameterMethodHandle.java | 4 ++-- .../nms/ExceptionHandlingArgumentSerializer_1_15.java | 4 ++-- .../nms/ExceptionHandlingArgumentSerializer_1_16_R1.java | 4 ++-- .../nms/ExceptionHandlingArgumentSerializer_1_16_R2.java | 4 ++-- .../nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java | 4 ++-- .../nms/ExceptionHandlingArgumentSerializer_1_17_Common.java | 4 ++-- .../nms/ExceptionHandlingArgumentSerializer_1_18_R2.java | 4 ++-- .../nms/ExceptionHandlingArgumentSerializer_1_18_R1.java | 4 ++-- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/SafeStaticOneParameterMethodHandle.java b/commandapi-core/src/main/java/dev/jorel/commandapi/SafeStaticOneParameterMethodHandle.java index 53564dd494..f4fbbca736 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/SafeStaticOneParameterMethodHandle.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/SafeStaticOneParameterMethodHandle.java @@ -12,11 +12,11 @@ private SafeStaticOneParameterMethodHandle(MethodHandle handle) { this.handle = handle; } - private static SafeStaticOneParameterMethodHandle of(Class classType, String fieldName, String mojangMappedFieldName, Class returnType, Class parameterType) throws ReflectiveOperationException { + private static SafeStaticOneParameterMethodHandle of(Class classType, String fieldName, String mojangMappedFieldName, Class returnType, Class parameterType) throws ReflectiveOperationException { return new SafeStaticOneParameterMethodHandle<>(MethodHandles.privateLookupIn(classType, MethodHandles.lookup()).findStatic(classType, SafeVarHandle.USING_MOJANG_MAPPINGS ? mojangMappedFieldName : fieldName, MethodType.methodType(returnType, parameterType))); } - public static SafeStaticOneParameterMethodHandle ofOrNull(Class classType, String fieldName, String mojangMappedFieldName, Class returnType, Class parameterType) { + public static SafeStaticOneParameterMethodHandle ofOrNull(Class classType, String fieldName, String mojangMappedFieldName, Class returnType, Class parameterType) { try { return of(classType, fieldName, mojangMappedFieldName, returnType, parameterType); } catch (ReflectiveOperationException e) { diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java index 4937f8c64e..f603d52d95 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_15.java @@ -16,9 +16,9 @@ public class ExceptionHandlingArgumentSerializer_1_15 extends ExceptionHandli // All the ? here should actually be ArgumentRegistry.a, but that is a private inner class. That makes everything really annoying. // TODO: We want to check this reflection, but we can't give ArgumentRegistry.a to the @RequireField annotation // Hopefully something works out, but the preprocessor needs to be expanded first - private static final SafeStaticOneParameterMethodHandle getArgumentTypeInformation; + private static final SafeStaticOneParameterMethodHandle> getArgumentTypeInformation; private static final SafeVarHandle serializationKey; - private static final SafeVarHandle serializer; + private static final SafeVarHandle>> serializer; // Compute all var handles all in one go so we don't do this during main server runtime static { diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java index a8ba710238..4764516633 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R1.java @@ -16,9 +16,9 @@ public class ExceptionHandlingArgumentSerializer_1_16_R1 extends ExceptionHan // All the ? here should actually be ArgumentRegistry.a, but that is a private inner class. That makes everything really annoying. // TODO: We want to check this reflection, but we can't give ArgumentRegistry.a to the @RequireField annotation // Hopefully something works out, but the preprocessor needs to be expanded first - private static final SafeStaticOneParameterMethodHandle getArgumentTypeInformation; + private static final SafeStaticOneParameterMethodHandle> getArgumentTypeInformation; private static final SafeVarHandle serializationKey; - private static final SafeVarHandle serializer; + private static final SafeVarHandle>> serializer; // Compute all var handles all in one go so we don't do this during main server runtime static { diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java index 2367bad093..7545e8995a 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_R2.java @@ -18,9 +18,9 @@ public class ExceptionHandlingArgumentSerializer_1_16_R2 extends ExceptionHan // All the ? here should actually be ArgumentRegistry.a, but that is a private inner class. That makes everything really annoying. // TODO: We want to check this reflection, but we can't give ArgumentRegistry.a to the @RequireField annotation // Hopefully something works out, but the preprocessor needs to be expanded first - private static final SafeStaticOneParameterMethodHandle getArgumentTypeInformation; + private static final SafeStaticOneParameterMethodHandle> getArgumentTypeInformation; private static final SafeVarHandle serializationKey; - private static final SafeVarHandle serializer; + private static final SafeVarHandle>> serializer; // Compute all var handles all in one go so we don't do this during main server runtime static { diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java index f01d395621..13b22c9baa 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_16_4_R3.java @@ -16,9 +16,9 @@ public class ExceptionHandlingArgumentSerializer_1_16_4_R3 extends ExceptionH // All the ? here should actually be ArgumentRegistry.a, but that is a private inner class. That makes everything really annoying. // TODO: We want to check this reflection, but we can't give ArgumentRegistry.a to the @RequireField annotation // Hopefully something works out, but the preprocessor needs to be expanded first - private static final SafeStaticOneParameterMethodHandle getArgumentTypeInformation; + private static final SafeStaticOneParameterMethodHandle> getArgumentTypeInformation; private static final SafeVarHandle serializationKey; - private static final SafeVarHandle serializer; + private static final SafeVarHandle>> serializer; // Compute all var handles all in one go so we don't do this during main server runtime static { diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java index f5d3b2261a..4f8d5a67ad 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_17_Common.java @@ -16,9 +16,9 @@ public class ExceptionHandlingArgumentSerializer_1_17_Common extends Exceptio // All the ? here should actually be ArgumentTypes.Entry, but that is a private inner class. That makes everything really annoying. // TODO: We want to check this reflection, but we can't give ArgumentTypes.Entry to the @RequireField annotation // Hopefully something works out, but the preprocessor needs to be expanded first - private static final SafeStaticOneParameterMethodHandle getArgumentTypeInformation; + private static final SafeStaticOneParameterMethodHandle> getArgumentTypeInformation; private static final SafeVarHandle serializationKey; - private static final SafeVarHandle serializer; + private static final SafeVarHandle>> serializer; // Compute all var handles all in one go so we don't do this during main server runtime static { diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java index c079c392b8..96d60a178d 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R2.java @@ -19,9 +19,9 @@ public class ExceptionHandlingArgumentSerializer_1_18_R2 extends ExceptionHan // All the ? here should actually be ArgumentTypes.Entry, but that is a private inner class. That makes everything really annoying. // TODO: We want to check this reflection, but we can't give ArgumentTypes.Entry to the @RequireField annotation // Hopefully something works out, but the preprocessor needs to be expanded first - private static final SafeStaticOneParameterMethodHandle getArgumentTypeInformation; + private static final SafeStaticOneParameterMethodHandle> getArgumentTypeInformation; private static final SafeVarHandle serializationKey; - private static final SafeVarHandle serializer; + private static final SafeVarHandle>> serializer; // Compute all var handles all in one go so we don't do this during main server runtime static { diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java index a7e001e3da..197d79686c 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/ExceptionHandlingArgumentSerializer_1_18_R1.java @@ -16,9 +16,9 @@ public class ExceptionHandlingArgumentSerializer_1_18_R1 extends ExceptionHan // All the ? here should actually be ArgumentTypes.Entry, but that is a private inner class. That makes everything really annoying. // TODO: We want to check this reflection, but we can't give ArgumentTypes.Entry to the @RequireField annotation // Hopefully something works out, but the preprocessor needs to be expanded first - private static final SafeStaticOneParameterMethodHandle getArgumentTypeInformation; + private static final SafeStaticOneParameterMethodHandle> getArgumentTypeInformation; private static final SafeVarHandle serializationKey; - private static final SafeVarHandle serializer; + private static final SafeVarHandle>> serializer; // Compute all var handles all in one go so we don't do this during main server runtime static {