From b078a0bf952cdee5967c53a5a2e1e6a032fea506 Mon Sep 17 00:00:00 2001 From: willkroboth <46540330+willkroboth@users.noreply.github.com> Date: Mon, 21 Apr 2025 14:14:33 -0400 Subject: [PATCH 1/6] Main plugin provides functionality of CommandAPINetworking plugin --- .../commandapi-paper-plugin/src/main/resources/plugin.yml | 2 ++ .../commandapi-spigot-plugin/src/main/resources/plugin.yml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/commandapi-platforms/commandapi-paper/commandapi-paper-plugin/src/main/resources/plugin.yml b/commandapi-platforms/commandapi-paper/commandapi-paper-plugin/src/main/resources/plugin.yml index c31f8ced83..288f0a6893 100644 --- a/commandapi-platforms/commandapi-paper/commandapi-paper-plugin/src/main/resources/plugin.yml +++ b/commandapi-platforms/commandapi-paper/commandapi-paper-plugin/src/main/resources/plugin.yml @@ -9,5 +9,7 @@ authors: website: https://www.jorel.dev/CommandAPI/ softdepend: - NBTAPI +provides: + - CommandAPINetworking api-version: 1.13 folia-supported: true diff --git a/commandapi-platforms/commandapi-spigot/commandapi-spigot-plugin/src/main/resources/plugin.yml b/commandapi-platforms/commandapi-spigot/commandapi-spigot-plugin/src/main/resources/plugin.yml index c31f8ced83..f13c4a9faf 100644 --- a/commandapi-platforms/commandapi-spigot/commandapi-spigot-plugin/src/main/resources/plugin.yml +++ b/commandapi-platforms/commandapi-spigot/commandapi-spigot-plugin/src/main/resources/plugin.yml @@ -9,5 +9,7 @@ authors: website: https://www.jorel.dev/CommandAPI/ softdepend: - NBTAPI +provides: + - CommandAPINetworking api-version: 1.13 folia-supported: true From 6ada265c58933c43248af2ba0da7926462d7cb8f Mon Sep 17 00:00:00 2001 From: willkroboth <46540330+willkroboth@users.noreply.github.com> Date: Mon, 21 Apr 2025 16:14:09 -0400 Subject: [PATCH 2/6] Add config option `report-failed-packet-sends` --- .../dev/jorel/commandapi/CommandAPIConfig.java | 12 ++++++++++++ .../dev/jorel/commandapi/InternalConfig.java | 11 +++++++++++ .../commandapi/network/CommandAPIMessenger.java | 17 +++++++++++++---- .../dev/jorel/commandapi/CommandAPIBukkit.java | 6 +++++- .../network/BukkitCommandAPIMessenger.java | 8 +++++--- .../BukkitNetworkingCommandAPIMessenger.java | 7 ++++++- .../commandapi/config/DefaultBukkitConfig.java | 1 + .../dev/jorel/commandapi/CommandAPIMain.java | 3 ++- .../dev/jorel/commandapi/CommandAPIMain.java | 3 ++- .../jorel/commandapi/CommandAPIVelocity.java | 5 +++-- .../network/VelocityCommandAPIMessenger.java | 10 ++++++---- .../dev/jorel/commandapi/CommandAPIMain.java | 3 ++- .../config/DefaultVelocityConfig.java | 1 + .../jorel/commandapi/config/DefaultConfig.java | 9 +++++++++ 14 files changed, 78 insertions(+), 18 deletions(-) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIConfig.java b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIConfig.java index e494004065..df62a4a8c7 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIConfig.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIConfig.java @@ -45,6 +45,8 @@ public abstract class CommandAPIConfig config) { this.messageMissingExecutorImplementation = config.missingExecutorImplementationMessage; this.dispatcherFile = config.dispatcherFile; this.namespace = config.namespace; + this.reportFailedPacketSends = config.reportFailedPacketSends; } /** @@ -95,4 +99,11 @@ public File getDispatcherFile() { public String getNamespace() { return namespace; } + + /** + * @return Whether an exception is thrown when a packet cannot be sent + */ + public boolean shouldReportFailedPacketSends() { + return this.reportFailedPacketSends; + } } \ No newline at end of file diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/network/CommandAPIMessenger.java b/commandapi-core/src/main/java/dev/jorel/commandapi/network/CommandAPIMessenger.java index d9c4b06b13..a4dc8082ff 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/network/CommandAPIMessenger.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/network/CommandAPIMessenger.java @@ -15,15 +15,19 @@ */ public abstract class CommandAPIMessenger { private final CommandAPIPacketHandlerProvider packetHandlerProvider; + private final boolean reportFailedSends; /** * Creates a new {@link CommandAPIMessenger}. * * @param packetHandlerProvider The {@link CommandAPIPacketHandlerProvider} that defines the various implementations * of {@link CommandAPIPacketHandler} that should be used to handle incoming packets. + * @param reportFailedSends If true, {@link #sendPacket(Object, CommandAPIPacket)} will throw an exception if it + * cannot send the requested packet. Otherwise, if false, that method will fail silently. */ - protected CommandAPIMessenger(CommandAPIPacketHandlerProvider packetHandlerProvider) { + protected CommandAPIMessenger(CommandAPIPacketHandlerProvider packetHandlerProvider, boolean reportFailedSends) { this.packetHandlerProvider = packetHandlerProvider; + this.reportFailedSends = reportFailedSends; } /** @@ -117,9 +121,14 @@ public void sendPacket(OutputChannel target, CommandAPIPacket packet) { // Write packet's data packet.write(output, target, this.getConnectionProtocolVersion(target)); } catch (ProtocolVersionTooOldException exception) { - // Send the exception to the other side too, so they know to update their protocol version - this.sendPacket(target, new ProtocolVersionTooOldPacket(CommandAPIProtocol.PROTOCOL_VERSION, exception.getReason())); - throw exception; + if (reportFailedSends) { + // Send the exception to the other side too, so they know to update their protocol version + this.sendPacket(target, new ProtocolVersionTooOldPacket(CommandAPIProtocol.PROTOCOL_VERSION, exception.getReason())); + throw exception; + } else { + // Fail silently + return; + } } // Send the bytes diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/CommandAPIBukkit.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/CommandAPIBukkit.java index 7c2fafef65..dc401822cd 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/CommandAPIBukkit.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/CommandAPIBukkit.java @@ -385,7 +385,11 @@ private void unregisterInternal(String commandName, boolean unregisterNamespaces @Override public BukkitCommandAPIMessenger setupMessenger() { - messenger = new BukkitCommandAPIMessenger(plugin); + messenger = new BukkitCommandAPIMessenger( + plugin, + config.shouldReportFailedPacketSends() + ); + return messenger; } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/network/BukkitCommandAPIMessenger.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/network/BukkitCommandAPIMessenger.java index f67241ea26..fcdb36a345 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/network/BukkitCommandAPIMessenger.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/network/BukkitCommandAPIMessenger.java @@ -28,10 +28,12 @@ public class BukkitCommandAPIMessenger extends CommandAPIMessenger(); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-networking-plugin/src/main/java/dev/jorel/commandapi/network/BukkitNetworkingCommandAPIMessenger.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-networking-plugin/src/main/java/dev/jorel/commandapi/network/BukkitNetworkingCommandAPIMessenger.java index baeac63f07..262911a971 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-networking-plugin/src/main/java/dev/jorel/commandapi/network/BukkitNetworkingCommandAPIMessenger.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-networking-plugin/src/main/java/dev/jorel/commandapi/network/BukkitNetworkingCommandAPIMessenger.java @@ -30,7 +30,12 @@ public class BukkitNetworkingCommandAPIMessenger extends CommandAPIMessenger(); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/DefaultBukkitConfig.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/DefaultBukkitConfig.java index 5238ff6043..10f56a20c0 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/DefaultBukkitConfig.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/DefaultBukkitConfig.java @@ -90,6 +90,7 @@ public static DefaultBukkitConfig createDefaultSpigotConfig() { options.put("create-dispatcher-json", CREATE_DISPATCHER_JSON); options.put("fallback-to-latest-nms", FALLBACK_TO_LATEST_NMS(false)); options.put("skip-initial-datapack-reload", SKIP_RELOAD_DATAPACKS); + options.put("report-failed-packet-sends", REPORT_FAILED_PACKET_SENDS); options.put("plugins-to-convert", PLUGINS_TO_CONVERT); options.put("other-commands-to-convert", OTHER_COMMANDS_TO_CONVERT); options.put("skip-sender-proxy", SKIP_SENDER_PROXY); diff --git a/commandapi-platforms/commandapi-paper/commandapi-paper-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-paper/commandapi-paper-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index 601b05b37e..7814f62e55 100644 --- a/commandapi-platforms/commandapi-paper/commandapi-paper-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-paper/commandapi-paper-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -53,7 +53,8 @@ public void onLoad() { .missingExecutorImplementationMessage(fileConfig.getString("messages.missing-executor-implementation")) .dispatcherFile(fileConfig.getBoolean("create-dispatcher-json") ? new File(getDataFolder(), "command_registration.json") : null) .hookPaperReload(fileConfig.getBoolean("hook-paper-reload")) // TODO: Remove once this utilizes the bootstrapper - .skipInitialDatapackReload(fileConfig.getBoolean("skip-initial-datapack-reload")); // TODO: Remove once this utilizes the bootstrapper + .skipInitialDatapackReload(fileConfig.getBoolean("skip-initial-datapack-reload")) // TODO: Remove once this utilizes the bootstrapper + .reportFailedPacketSends(fileConfig.getBoolean("report-failed-packet-sends")); for (String pluginName : fileConfig.getStringList("skip-sender-proxy")) { if (Bukkit.getPluginManager().getPlugin(pluginName) != null) { diff --git a/commandapi-platforms/commandapi-spigot/commandapi-spigot-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-spigot/commandapi-spigot-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index e4c75adb6d..ef7b464d61 100644 --- a/commandapi-platforms/commandapi-spigot/commandapi-spigot-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-spigot/commandapi-spigot-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -52,7 +52,8 @@ public void onLoad() { .fallbackToLatestNMS(fileConfig.getBoolean("fallback-to-latest-nms")) .missingExecutorImplementationMessage(fileConfig.getString("messages.missing-executor-implementation")) .dispatcherFile(fileConfig.getBoolean("create-dispatcher-json") ? new File(getDataFolder(), "command_registration.json") : null) - .skipReloadDatapacks(fileConfig.getBoolean("skip-initial-datapack-reload")); + .skipReloadDatapacks(fileConfig.getBoolean("skip-initial-datapack-reload")) + .reportFailedPacketSends(fileConfig.getBoolean("report-failed-packet-sends")); for (String pluginName : fileConfig.getStringList("skip-sender-proxy")) { if (Bukkit.getPluginManager().getPlugin(pluginName) != null) { diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-core/src/main/java/dev/jorel/commandapi/CommandAPIVelocity.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-core/src/main/java/dev/jorel/commandapi/CommandAPIVelocity.java index 13caf6255d..8c6c37043b 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-core/src/main/java/dev/jorel/commandapi/CommandAPIVelocity.java +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-core/src/main/java/dev/jorel/commandapi/CommandAPIVelocity.java @@ -105,8 +105,9 @@ public void unregister(String commandName, boolean unregisterNamespaces) { @Override public VelocityCommandAPIMessenger setupMessenger() { messenger = new VelocityCommandAPIMessenger( - getConfiguration().getPlugin(), - getConfiguration().getServer() + config.getPlugin(), + config.getServer(), + config.shouldReportFailedPacketSends() ); return messenger; } diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-core/src/main/java/dev/jorel/commandapi/network/VelocityCommandAPIMessenger.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-core/src/main/java/dev/jorel/commandapi/network/VelocityCommandAPIMessenger.java index 91e06359ee..de8dc25ae6 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-core/src/main/java/dev/jorel/commandapi/network/VelocityCommandAPIMessenger.java +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-core/src/main/java/dev/jorel/commandapi/network/VelocityCommandAPIMessenger.java @@ -33,11 +33,13 @@ public class VelocityCommandAPIMessenger extends CommandAPIMessenger sections = new LinkedHashMap<>(); sections.put("messages", SECTION_MESSAGE); diff --git a/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/DefaultConfig.java b/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/DefaultConfig.java index 67216db0eb..64f3dd8bd2 100644 --- a/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/DefaultConfig.java +++ b/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/DefaultConfig.java @@ -41,6 +41,15 @@ public abstract class DefaultConfig { }, false ); + public static final CommentedConfigOption REPORT_FAILED_PACKET_SENDS = new CommentedConfigOption<>( + new String[]{ + "Report failed packet sends (default: true)", + "If \"true\", the CommandAPI will throw an exception if it tries to send a packet but cannot", + "(likely due to the receiver not having a new enough CommandAPI version to receive it). If", + "\"false\", failed attempts to send a packet will be ignored." + }, true + ); + public static final CommentedSection SECTION_MESSAGE = new CommentedSection( new String[]{ "Messages", From 99588d5e2a4a124760acbe18c1205991df3dd2cf Mon Sep 17 00:00:00 2001 From: willkroboth <46540330+willkroboth@users.noreply.github.com> Date: Mon, 21 Apr 2025 18:21:31 -0400 Subject: [PATCH 3/6] Change config option to `error-on-failed-packet-sends` --- .../jorel/commandapi/CommandAPIConfig.java | 9 ++++--- .../dev/jorel/commandapi/InternalConfig.java | 8 +++--- .../network/CommandAPIMessenger.java | 17 +++---------- .../network/HandshakePacketHandler.java | 1 - .../packets/UpdateRequirementsPacket.java | 2 +- .../jorel/commandapi/CommandAPIBukkit.java | 6 +---- .../network/BukkitCommandAPIMessenger.java | 23 +++++++++++++---- .../network/BukkitHandshakePacketHandler.java | 16 ++++++++++++ .../BukkitNetworkingCommandAPIMessenger.java | 22 +++++++++++----- .../config/DefaultBukkitConfig.java | 2 +- .../dev/jorel/commandapi/CommandAPIMain.java | 2 +- .../dev/jorel/commandapi/CommandAPIMain.java | 2 +- .../jorel/commandapi/CommandAPIVelocity.java | 3 +-- .../network/VelocityCommandAPIMessenger.java | 25 ++++++++++++++----- .../VelocityHandshakePacketHandler.java | 18 ++++++++++++- .../dev/jorel/commandapi/CommandAPIMain.java | 2 +- .../config/DefaultVelocityConfig.java | 2 +- .../commandapi/config/DefaultConfig.java | 6 ++--- 18 files changed, 110 insertions(+), 56 deletions(-) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIConfig.java b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIConfig.java index df62a4a8c7..05eba98c93 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIConfig.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIConfig.java @@ -45,7 +45,7 @@ public abstract class CommandAPIConfig config) { this.messageMissingExecutorImplementation = config.missingExecutorImplementationMessage; this.dispatcherFile = config.dispatcherFile; this.namespace = config.namespace; - this.reportFailedPacketSends = config.reportFailedPacketSends; + this.errorOnFailedPacketSends = config.errorOnFailedPacketSends; } /** @@ -103,7 +103,7 @@ public String getNamespace() { /** * @return Whether an exception is thrown when a packet cannot be sent */ - public boolean shouldReportFailedPacketSends() { - return this.reportFailedPacketSends; + public boolean shouldErrorOnFailedPacketSends() { + return this.errorOnFailedPacketSends; } } \ No newline at end of file diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/network/CommandAPIMessenger.java b/commandapi-core/src/main/java/dev/jorel/commandapi/network/CommandAPIMessenger.java index a4dc8082ff..d9c4b06b13 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/network/CommandAPIMessenger.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/network/CommandAPIMessenger.java @@ -15,19 +15,15 @@ */ public abstract class CommandAPIMessenger { private final CommandAPIPacketHandlerProvider packetHandlerProvider; - private final boolean reportFailedSends; /** * Creates a new {@link CommandAPIMessenger}. * * @param packetHandlerProvider The {@link CommandAPIPacketHandlerProvider} that defines the various implementations * of {@link CommandAPIPacketHandler} that should be used to handle incoming packets. - * @param reportFailedSends If true, {@link #sendPacket(Object, CommandAPIPacket)} will throw an exception if it - * cannot send the requested packet. Otherwise, if false, that method will fail silently. */ - protected CommandAPIMessenger(CommandAPIPacketHandlerProvider packetHandlerProvider, boolean reportFailedSends) { + protected CommandAPIMessenger(CommandAPIPacketHandlerProvider packetHandlerProvider) { this.packetHandlerProvider = packetHandlerProvider; - this.reportFailedSends = reportFailedSends; } /** @@ -121,14 +117,9 @@ public void sendPacket(OutputChannel target, CommandAPIPacket packet) { // Write packet's data packet.write(output, target, this.getConnectionProtocolVersion(target)); } catch (ProtocolVersionTooOldException exception) { - if (reportFailedSends) { - // Send the exception to the other side too, so they know to update their protocol version - this.sendPacket(target, new ProtocolVersionTooOldPacket(CommandAPIProtocol.PROTOCOL_VERSION, exception.getReason())); - throw exception; - } else { - // Fail silently - return; - } + // Send the exception to the other side too, so they know to update their protocol version + this.sendPacket(target, new ProtocolVersionTooOldPacket(CommandAPIProtocol.PROTOCOL_VERSION, exception.getReason())); + throw exception; } // Send the bytes diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/network/HandshakePacketHandler.java b/commandapi-core/src/main/java/dev/jorel/commandapi/network/HandshakePacketHandler.java index 9adf73bb1a..32adfd2da2 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/network/HandshakePacketHandler.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/network/HandshakePacketHandler.java @@ -28,7 +28,6 @@ else throw new IllegalStateException("Tried to handle " + packet + " with Handsh */ void handleSetVersionPacket(InputChannel sender, SetVersionPacket packet); - /** * Handles a {@link ProtocolVersionTooOldPacket}. * diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/network/packets/UpdateRequirementsPacket.java b/commandapi-core/src/main/java/dev/jorel/commandapi/network/packets/UpdateRequirementsPacket.java index af0591c656..862cefb1f7 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/network/packets/UpdateRequirementsPacket.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/network/packets/UpdateRequirementsPacket.java @@ -35,7 +35,7 @@ public static UpdateRequirementsPacket deserialize(FriendlyByteBuffer ignored) { public void write(FriendlyByteBuffer buffer, Object target, int protocolVersion) throws ProtocolVersionTooOldException { if (protocolVersion == 0) { throw ProtocolVersionTooOldException.whileSending(target, protocolVersion, - "CommandAPI version 10.0.0 or greater is required to receive UpdateRequirementsPacket" + "CommandAPI version 10.0.0 or greater is required to receive UpdateRequirementsPacket." ); } // Nothing to write diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/CommandAPIBukkit.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/CommandAPIBukkit.java index dc401822cd..7c2fafef65 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/CommandAPIBukkit.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/CommandAPIBukkit.java @@ -385,11 +385,7 @@ private void unregisterInternal(String commandName, boolean unregisterNamespaces @Override public BukkitCommandAPIMessenger setupMessenger() { - messenger = new BukkitCommandAPIMessenger( - plugin, - config.shouldReportFailedPacketSends() - ); - + messenger = new BukkitCommandAPIMessenger(plugin); return messenger; } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/network/BukkitCommandAPIMessenger.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/network/BukkitCommandAPIMessenger.java index fcdb36a345..8de2b1252c 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/network/BukkitCommandAPIMessenger.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/network/BukkitCommandAPIMessenger.java @@ -1,5 +1,7 @@ package dev.jorel.commandapi.network; +import dev.jorel.commandapi.CommandAPI; +import dev.jorel.commandapi.exceptions.ProtocolVersionTooOldException; import dev.jorel.commandapi.network.packets.SetVersionPacket; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -28,12 +30,10 @@ public class BukkitCommandAPIMessenger extends CommandAPIMessenger(); @@ -102,6 +102,19 @@ public void onPluginMessageReceived(@NotNull String channel, @NotNull Player pla messageReceived(protocol, player, message); } + @Override + public void sendPacket(Player target, CommandAPIPacket packet) { + try { + super.sendPacket(target, packet); + } catch (ProtocolVersionTooOldException exception) { + if (CommandAPI.getConfiguration().shouldErrorOnFailedPacketSends()) { + throw exception; + } else { + CommandAPI.logWarning(exception.getMessage()); + } + } + } + @Override public void sendRawBytes(CommandAPIProtocol protocol, Player target, byte[] bytes) { target.sendPluginMessage(this.plugin, protocol.getChannelIdentifier(), bytes); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/network/BukkitHandshakePacketHandler.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/network/BukkitHandshakePacketHandler.java index e91fa437ca..4aa735a7d1 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/network/BukkitHandshakePacketHandler.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/network/BukkitHandshakePacketHandler.java @@ -1,6 +1,9 @@ package dev.jorel.commandapi.network; +import dev.jorel.commandapi.CommandAPI; import dev.jorel.commandapi.CommandAPIBukkit; +import dev.jorel.commandapi.exceptions.ProtocolVersionTooOldException; +import dev.jorel.commandapi.network.packets.ProtocolVersionTooOldPacket; import dev.jorel.commandapi.network.packets.SetVersionPacket; import org.bukkit.entity.Player; @@ -12,4 +15,17 @@ public class BukkitHandshakePacketHandler implements HandshakePacketHandler(); @@ -104,6 +101,19 @@ public void onPluginMessageReceived(String channel, Player player, byte[] messag messageReceived(protocol, player, message); } + @Override + public void sendPacket(Player target, CommandAPIPacket packet) { + try { + super.sendPacket(target, packet); + } catch (ProtocolVersionTooOldException exception) { + if (CommandAPI.getConfiguration().shouldErrorOnFailedPacketSends()) { + throw exception; + } else { + CommandAPI.logWarning(exception.getMessage()); + } + } + } + @Override public void sendRawBytes(CommandAPIProtocol protocol, Player target, byte[] bytes) { target.sendPluginMessage(this.plugin, protocol.getChannelIdentifier(), bytes); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/DefaultBukkitConfig.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/DefaultBukkitConfig.java index 10f56a20c0..292976ea30 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/DefaultBukkitConfig.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/DefaultBukkitConfig.java @@ -90,7 +90,7 @@ public static DefaultBukkitConfig createDefaultSpigotConfig() { options.put("create-dispatcher-json", CREATE_DISPATCHER_JSON); options.put("fallback-to-latest-nms", FALLBACK_TO_LATEST_NMS(false)); options.put("skip-initial-datapack-reload", SKIP_RELOAD_DATAPACKS); - options.put("report-failed-packet-sends", REPORT_FAILED_PACKET_SENDS); + options.put("error-on-failed-packet-sends", ERROR_ON_FAILED_PACKET_SENDS); options.put("plugins-to-convert", PLUGINS_TO_CONVERT); options.put("other-commands-to-convert", OTHER_COMMANDS_TO_CONVERT); options.put("skip-sender-proxy", SKIP_SENDER_PROXY); diff --git a/commandapi-platforms/commandapi-paper/commandapi-paper-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-paper/commandapi-paper-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index 7814f62e55..a1fad1671c 100644 --- a/commandapi-platforms/commandapi-paper/commandapi-paper-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-paper/commandapi-paper-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -54,7 +54,7 @@ public void onLoad() { .dispatcherFile(fileConfig.getBoolean("create-dispatcher-json") ? new File(getDataFolder(), "command_registration.json") : null) .hookPaperReload(fileConfig.getBoolean("hook-paper-reload")) // TODO: Remove once this utilizes the bootstrapper .skipInitialDatapackReload(fileConfig.getBoolean("skip-initial-datapack-reload")) // TODO: Remove once this utilizes the bootstrapper - .reportFailedPacketSends(fileConfig.getBoolean("report-failed-packet-sends")); + .errorOnFailedPacketSends(fileConfig.getBoolean("error-on-failed-packet-sends")); for (String pluginName : fileConfig.getStringList("skip-sender-proxy")) { if (Bukkit.getPluginManager().getPlugin(pluginName) != null) { diff --git a/commandapi-platforms/commandapi-spigot/commandapi-spigot-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-spigot/commandapi-spigot-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index ef7b464d61..5e29156e5b 100644 --- a/commandapi-platforms/commandapi-spigot/commandapi-spigot-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-spigot/commandapi-spigot-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -53,7 +53,7 @@ public void onLoad() { .missingExecutorImplementationMessage(fileConfig.getString("messages.missing-executor-implementation")) .dispatcherFile(fileConfig.getBoolean("create-dispatcher-json") ? new File(getDataFolder(), "command_registration.json") : null) .skipReloadDatapacks(fileConfig.getBoolean("skip-initial-datapack-reload")) - .reportFailedPacketSends(fileConfig.getBoolean("report-failed-packet-sends")); + .errorOnFailedPacketSends(fileConfig.getBoolean("error-on-failed-packet-sends")); for (String pluginName : fileConfig.getStringList("skip-sender-proxy")) { if (Bukkit.getPluginManager().getPlugin(pluginName) != null) { diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-core/src/main/java/dev/jorel/commandapi/CommandAPIVelocity.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-core/src/main/java/dev/jorel/commandapi/CommandAPIVelocity.java index 8c6c37043b..01409535bd 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-core/src/main/java/dev/jorel/commandapi/CommandAPIVelocity.java +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-core/src/main/java/dev/jorel/commandapi/CommandAPIVelocity.java @@ -106,8 +106,7 @@ public void unregister(String commandName, boolean unregisterNamespaces) { public VelocityCommandAPIMessenger setupMessenger() { messenger = new VelocityCommandAPIMessenger( config.getPlugin(), - config.getServer(), - config.shouldReportFailedPacketSends() + config.getServer() ); return messenger; } diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-core/src/main/java/dev/jorel/commandapi/network/VelocityCommandAPIMessenger.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-core/src/main/java/dev/jorel/commandapi/network/VelocityCommandAPIMessenger.java index de8dc25ae6..74e8010320 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-core/src/main/java/dev/jorel/commandapi/network/VelocityCommandAPIMessenger.java +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-core/src/main/java/dev/jorel/commandapi/network/VelocityCommandAPIMessenger.java @@ -9,6 +9,8 @@ import com.velocitypowered.api.proxy.ProxyServer; import com.velocitypowered.api.proxy.ServerConnection; import com.velocitypowered.api.proxy.messages.*; +import dev.jorel.commandapi.CommandAPI; +import dev.jorel.commandapi.exceptions.ProtocolVersionTooOldException; import dev.jorel.commandapi.network.packets.SetVersionPacket; import java.util.HashMap; @@ -33,13 +35,11 @@ public class VelocityCommandAPIMessenger extends CommandAPIMessenger sections = new LinkedHashMap<>(); sections.put("messages", SECTION_MESSAGE); diff --git a/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/DefaultConfig.java b/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/DefaultConfig.java index 64f3dd8bd2..5c5779a561 100644 --- a/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/DefaultConfig.java +++ b/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/DefaultConfig.java @@ -41,12 +41,12 @@ public abstract class DefaultConfig { }, false ); - public static final CommentedConfigOption REPORT_FAILED_PACKET_SENDS = new CommentedConfigOption<>( + public static final CommentedConfigOption ERROR_ON_FAILED_PACKET_SENDS = new CommentedConfigOption<>( new String[]{ - "Report failed packet sends (default: true)", + "Throw an error when a packet fails to send (default: true)", "If \"true\", the CommandAPI will throw an exception if it tries to send a packet but cannot", "(likely due to the receiver not having a new enough CommandAPI version to receive it). If", - "\"false\", failed attempts to send a packet will be ignored." + "\"false\", failed attempts to send a packet will be logged as a warning." }, true ); From 1517b600ca0916e30055a2f733b8b2a43d61256f Mon Sep 17 00:00:00 2001 From: willkroboth <46540330+willkroboth@users.noreply.github.com> Date: Tue, 4 Nov 2025 17:37:17 -0500 Subject: [PATCH 4/6] Change config option to `make-networking-exceptions-warnings` --- .../jorel/commandapi/CommandAPIConfig.java | 15 ++--- .../dev/jorel/commandapi/InternalConfig.java | 14 ++--- .../network/CommandAPIMessenger.java | 55 ++++++++++++------- .../network/BukkitCommandAPIMessenger.java | 21 +++---- .../network/BukkitHandshakePacketHandler.java | 16 ------ .../BukkitNetworkingCommandAPIMessenger.java | 19 ++----- .../config/DefaultBukkitConfig.java | 3 +- .../dev/jorel/commandapi/CommandAPIMain.java | 2 +- .../dev/jorel/commandapi/CommandAPIMain.java | 2 +- .../network/VelocityCommandAPIMessenger.java | 21 +++---- .../VelocityHandshakePacketHandler.java | 16 ------ .../dev/jorel/commandapi/CommandAPIMain.java | 2 +- .../config/DefaultVelocityConfig.java | 2 +- .../commandapi/config/DefaultConfig.java | 13 +++-- 14 files changed, 80 insertions(+), 121 deletions(-) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIConfig.java b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIConfig.java index 05eba98c93..c3cae7706d 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIConfig.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIConfig.java @@ -21,9 +21,6 @@ package dev.jorel.commandapi; import java.io.File; -import java.util.ArrayList; -import java.util.List; -import java.util.function.Function; /** * A class to contain information about how to configure the CommandAPI during its loading step. @@ -45,7 +42,7 @@ public abstract class CommandAPIConfig config) { this.messageMissingExecutorImplementation = config.missingExecutorImplementationMessage; this.dispatcherFile = config.dispatcherFile; this.namespace = config.namespace; - this.errorOnFailedPacketSends = config.errorOnFailedPacketSends; + this.makeNetworkingExceptionsWarnings = config.makeNetworkingExceptionsWarnings; } /** @@ -101,9 +99,9 @@ public String getNamespace() { } /** - * @return Whether an exception is thrown when a packet cannot be sent + * @return Whether networking exceptions are logged as warnings */ - public boolean shouldErrorOnFailedPacketSends() { - return this.errorOnFailedPacketSends; + public boolean makeNetworkingExceptionsWarnings() { + return this.makeNetworkingExceptionsWarnings; } } \ No newline at end of file diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/network/CommandAPIMessenger.java b/commandapi-core/src/main/java/dev/jorel/commandapi/network/CommandAPIMessenger.java index d9c4b06b13..819fabf679 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/network/CommandAPIMessenger.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/network/CommandAPIMessenger.java @@ -59,28 +59,32 @@ protected void messageReceived(CommandAPIProtocol protocol, InputChannel sender, FriendlyByteBuffer buffer = new FriendlyByteBuffer(input); - int id; - CommandAPIPacket packet; try { - // Read the id - id = buffer.readVarInt(); - // Use the id and protocol to find and use the correct deserialize method - packet = protocol.createPacket(id, buffer); - } catch (IllegalStateException e) { - throw new IllegalStateException("Exception while reading packet", e); + int id; + CommandAPIPacket packet; + try { + // Read the id + id = buffer.readVarInt(); + // Use the id and protocol to find and use the correct deserialize method + packet = protocol.createPacket(id, buffer); + } catch (IllegalStateException e) { + throw new IllegalStateException("Exception while reading packet", e); + } + if (packet == null) throw new IllegalStateException("Unknown packet id: " + id); + + if (buffer.countReadableBytes() != 0) { + // If the packet didn't read all the bytes it was given, we have a strange miscommunication + throw new IllegalStateException( + "Packet was larger than expected! " + buffer.countReadableBytes() + " extra byte(s) found after deserializing.\n" + + "Given: " + Arrays.toString(input) + ", Read: " + packet + ); + } + + // Handle the packet + packetHandlerProvider.getHandlerForProtocol(protocol).handlePacket(sender, packet); + } catch (RuntimeException exception) { + handlePacketException(exception); } - if (packet == null) throw new IllegalStateException("Unknown packet id: " + id); - - if (buffer.countReadableBytes() != 0) { - // If the packet didn't read all the bytes it was given, we have a strange miscommunication - throw new IllegalStateException( - "Packet was larger than expected! " + buffer.countReadableBytes() + " extra byte(s) found after deserializing.\n" + - "Given: " + Arrays.toString(input) + ", Read: " + packet - ); - } - - // Handle the packet - packetHandlerProvider.getHandlerForProtocol(protocol).handlePacket(sender, packet); } /** @@ -119,7 +123,8 @@ public void sendPacket(OutputChannel target, CommandAPIPacket packet) { } catch (ProtocolVersionTooOldException exception) { // Send the exception to the other side too, so they know to update their protocol version this.sendPacket(target, new ProtocolVersionTooOldPacket(CommandAPIProtocol.PROTOCOL_VERSION, exception.getReason())); - throw exception; + handlePacketException(exception); + return; } // Send the bytes @@ -134,4 +139,12 @@ public void sendPacket(OutputChannel target, CommandAPIPacket packet) { * @param bytes The array of bytes to send. */ protected abstract void sendRawBytes(CommandAPIProtocol protocol, OutputChannel target, byte[] bytes); + + /** + * Called when there is an exception while sending or receiving a packet. + * May rethrow the exception or log it in another manner. + * + * @param exception The exception that was thrown. + */ + protected abstract void handlePacketException(RuntimeException exception); } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/network/BukkitCommandAPIMessenger.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/network/BukkitCommandAPIMessenger.java index 8de2b1252c..1730aed440 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/network/BukkitCommandAPIMessenger.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/network/BukkitCommandAPIMessenger.java @@ -1,7 +1,6 @@ package dev.jorel.commandapi.network; import dev.jorel.commandapi.CommandAPI; -import dev.jorel.commandapi.exceptions.ProtocolVersionTooOldException; import dev.jorel.commandapi.network.packets.SetVersionPacket; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -103,20 +102,16 @@ public void onPluginMessageReceived(@NotNull String channel, @NotNull Player pla } @Override - public void sendPacket(Player target, CommandAPIPacket packet) { - try { - super.sendPacket(target, packet); - } catch (ProtocolVersionTooOldException exception) { - if (CommandAPI.getConfiguration().shouldErrorOnFailedPacketSends()) { - throw exception; - } else { - CommandAPI.logWarning(exception.getMessage()); - } - } + public void sendRawBytes(CommandAPIProtocol protocol, Player target, byte[] bytes) { + target.sendPluginMessage(this.plugin, protocol.getChannelIdentifier(), bytes); } @Override - public void sendRawBytes(CommandAPIProtocol protocol, Player target, byte[] bytes) { - target.sendPluginMessage(this.plugin, protocol.getChannelIdentifier(), bytes); + protected void handlePacketException(RuntimeException exception) { + if (CommandAPI.getConfiguration().makeNetworkingExceptionsWarnings()) { + CommandAPI.logWarning(exception.getMessage()); + } else { + throw exception; + } } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/network/BukkitHandshakePacketHandler.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/network/BukkitHandshakePacketHandler.java index 4aa735a7d1..e91fa437ca 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/network/BukkitHandshakePacketHandler.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/network/BukkitHandshakePacketHandler.java @@ -1,9 +1,6 @@ package dev.jorel.commandapi.network; -import dev.jorel.commandapi.CommandAPI; import dev.jorel.commandapi.CommandAPIBukkit; -import dev.jorel.commandapi.exceptions.ProtocolVersionTooOldException; -import dev.jorel.commandapi.network.packets.ProtocolVersionTooOldPacket; import dev.jorel.commandapi.network.packets.SetVersionPacket; import org.bukkit.entity.Player; @@ -15,17 +12,4 @@ public class BukkitHandshakePacketHandler implements HandshakePacketHandler sections = new LinkedHashMap<>(); sections.put("messages", SECTION_MESSAGE); diff --git a/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/DefaultConfig.java b/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/DefaultConfig.java index 5c5779a561..472a3ae4bf 100644 --- a/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/DefaultConfig.java +++ b/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/DefaultConfig.java @@ -41,13 +41,14 @@ public abstract class DefaultConfig { }, false ); - public static final CommentedConfigOption ERROR_ON_FAILED_PACKET_SENDS = new CommentedConfigOption<>( + public static final CommentedConfigOption MAKE_NETWORKING_EXCEPTIONS_WARNINGS = new CommentedConfigOption<>( new String[]{ - "Throw an error when a packet fails to send (default: true)", - "If \"true\", the CommandAPI will throw an exception if it tries to send a packet but cannot", - "(likely due to the receiver not having a new enough CommandAPI version to receive it). If", - "\"false\", failed attempts to send a packet will be logged as a warning." - }, true + "Turn exceptions while sending and receiving packets into warnings (default: false)", + "If \"false\", the CommandAPI will throw an exception when receiving malformed packets", + "or if it tries to send a packet but cannot. If \"true\", these problems will be logged", + "as a warning, which does not include the stacktrace. Additionally, warnings can be hidden", + "by setting silent logs to \"true\"." + }, false ); public static final CommentedSection SECTION_MESSAGE = new CommentedSection( From 327bdbd743d36c822a94df0a507ef76609e45b9a Mon Sep 17 00:00:00 2001 From: willkroboth <46540330+willkroboth@users.noreply.github.com> Date: Tue, 4 Nov 2025 19:49:46 -0500 Subject: [PATCH 5/6] Add config option to `enable-networking` --- .../dev/jorel/commandapi/CommandAPIConfig.java | 15 ++++++++++++++- .../dev/jorel/commandapi/CommandAPIHandler.java | 14 +++++++++----- .../java/dev/jorel/commandapi/InternalConfig.java | 11 +++++++++++ .../ProtocolVersionTooOldException.java | 2 +- .../dev/jorel/commandapi/CommandAPIBukkit.java | 10 ++++++++-- .../commandapi/config/DefaultBukkitConfig.java | 2 ++ .../java/dev/jorel/commandapi/CommandAPIMain.java | 1 + .../java/dev/jorel/commandapi/CommandAPIMain.java | 1 + .../dev/jorel/commandapi/CommandAPIVelocity.java | 10 ++++++++-- .../java/dev/jorel/commandapi/CommandAPIMain.java | 1 + .../commandapi/config/DefaultVelocityConfig.java | 1 + .../jorel/commandapi/config/DefaultConfig.java | 10 ++++++++++ 12 files changed, 67 insertions(+), 11 deletions(-) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIConfig.java b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIConfig.java index c3cae7706d..33be710b99 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIConfig.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIConfig.java @@ -42,7 +42,8 @@ public abstract class CommandAPIConfig String getRawArgumentInput(CommandContext FIELDS = new HashMap<>(); final CommandAPIPlatform platform; - private CommandAPIMessenger messenger; + private CommandAPIMessenger messenger = null; final TreeMap registeredPermissions = new TreeMap<>(); final List registeredCommands; // Keep track of what has been registered for type checking @@ -154,13 +154,17 @@ private void checkDependencies() { public void onEnable() { platform.onEnable(); - // Setting up the network messenger usually requires registering - // events, which often does not work until onEnable - messenger = platform.setupMessenger(); + + if (CommandAPI.getConfiguration().isNetworkingEnabled()) { + // Setting up the network messenger usually requires registering + // events, which often does not work until onEnable + messenger = platform.setupMessenger(); + } } public void onDisable() { - messenger.close(); + if (messenger != null) messenger.close(); + platform.onDisable(); CommandAPIHandler.resetInstance(); } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/InternalConfig.java b/commandapi-core/src/main/java/dev/jorel/commandapi/InternalConfig.java index d430999b14..3d5f538f9f 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/InternalConfig.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/InternalConfig.java @@ -44,6 +44,9 @@ public class InternalConfig { // The default command namespace private final String namespace; + // Whether we should turn on networking + private final boolean enableNetworking; + // Whether we should log networking exceptions as warnings private final boolean makeNetworkingExceptionsWarnings; @@ -58,6 +61,7 @@ public InternalConfig(CommandAPIConfig config) { this.messageMissingExecutorImplementation = config.missingExecutorImplementationMessage; this.dispatcherFile = config.dispatcherFile; this.namespace = config.namespace; + this.enableNetworking = config.enableNetworking; this.makeNetworkingExceptionsWarnings = config.makeNetworkingExceptionsWarnings; } @@ -98,6 +102,13 @@ public String getNamespace() { return namespace; } + /** + * @return Whether networking should be enabled + */ + public boolean isNetworkingEnabled() { + return enableNetworking; + } + /** * @return Whether networking exceptions are logged as warnings */ diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/exceptions/ProtocolVersionTooOldException.java b/commandapi-core/src/main/java/dev/jorel/commandapi/exceptions/ProtocolVersionTooOldException.java index 7dd3b45785..ab9f1a4626 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/exceptions/ProtocolVersionTooOldException.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/exceptions/ProtocolVersionTooOldException.java @@ -7,7 +7,7 @@ public static ProtocolVersionTooOldException whileSending(Object target, int pro return new ProtocolVersionTooOldException( "Tried to send a packet to " + target + ", which is using protocol version " + protocolVersion + ". " + "This system is using version " + CommandAPIProtocol.PROTOCOL_VERSION + ". " + - "That version is too old to receive the packet. " + + "That version is too old to receive the packet, or CommandAPI networking is not enabled. " + reason, protocolVersion, reason ); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/CommandAPIBukkit.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/CommandAPIBukkit.java index 7c2fafef65..9b85b13ac9 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/CommandAPIBukkit.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/CommandAPIBukkit.java @@ -48,7 +48,7 @@ public abstract class CommandAPIBukkit implements BukkitPlatform // References to utility classes private static CommandAPIBukkit bukkit; protected static InternalBukkitConfig config; - private BukkitCommandAPIMessenger messenger; + private BukkitCommandAPIMessenger messenger = null; protected JavaPlugin plugin; protected NMS nms; @@ -391,7 +391,13 @@ public BukkitCommandAPIMessenger setupMessenger() { @Override public BukkitCommandAPIMessenger getMessenger() { - return messenger; + if (messenger != null) { + return messenger; + } else { + throw new IllegalStateException("Tried to access the plugin messenger, but it was null." + + " Plugin messages are only possible after calling CommandAPI#onEnable." + + " Also ensure that the \"enable-networking\" config option is \"true\"."); + } } @Override diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/DefaultBukkitConfig.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/DefaultBukkitConfig.java index 16cb629d0b..cc8fe4d6e1 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/DefaultBukkitConfig.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/DefaultBukkitConfig.java @@ -72,6 +72,7 @@ public static DefaultBukkitConfig createDefaultPaperConfig() { options.put("fallback-to-latest-nms", FALLBACK_TO_LATEST_NMS(true)); options.put("skip-initial-datapack-reload", SKIP_RELOAD_DATAPACKS); // TODO: Remove once the Paper plugin utilizes the bootstrapper options.put("hook-paper-reload", HOOK_PAPER_RELOAD); // TODO: Remove once the Paper plugin utilizes the bootstrapper + options.put("enable-networking", ENABLE_NETWORKING); options.put("make-networking-exceptions-warnings", MAKE_NETWORKING_EXCEPTIONS_WARNINGS); options.put("plugins-to-convert", PLUGINS_TO_CONVERT); options.put("other-commands-to-convert", OTHER_COMMANDS_TO_CONVERT); @@ -91,6 +92,7 @@ public static DefaultBukkitConfig createDefaultSpigotConfig() { options.put("create-dispatcher-json", CREATE_DISPATCHER_JSON); options.put("fallback-to-latest-nms", FALLBACK_TO_LATEST_NMS(false)); options.put("skip-initial-datapack-reload", SKIP_RELOAD_DATAPACKS); + options.put("enable-networking", ENABLE_NETWORKING); options.put("make-networking-exceptions-warnings", MAKE_NETWORKING_EXCEPTIONS_WARNINGS); options.put("plugins-to-convert", PLUGINS_TO_CONVERT); options.put("other-commands-to-convert", OTHER_COMMANDS_TO_CONVERT); diff --git a/commandapi-platforms/commandapi-paper/commandapi-paper-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-paper/commandapi-paper-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index 0ae7f34483..410314ff27 100644 --- a/commandapi-platforms/commandapi-paper/commandapi-paper-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-paper/commandapi-paper-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -54,6 +54,7 @@ public void onLoad() { .dispatcherFile(fileConfig.getBoolean("create-dispatcher-json") ? new File(getDataFolder(), "command_registration.json") : null) .hookPaperReload(fileConfig.getBoolean("hook-paper-reload")) // TODO: Remove once this utilizes the bootstrapper .skipInitialDatapackReload(fileConfig.getBoolean("skip-initial-datapack-reload")) // TODO: Remove once this utilizes the bootstrapper + .enableNetworking(fileConfig.getBoolean("enable-networking")) .makeNetworkingExceptionsWarnings(fileConfig.getBoolean("make-networking-exceptions-warnings")); for (String pluginName : fileConfig.getStringList("skip-sender-proxy")) { diff --git a/commandapi-platforms/commandapi-spigot/commandapi-spigot-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-spigot/commandapi-spigot-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index a898023dec..bcbd86b763 100644 --- a/commandapi-platforms/commandapi-spigot/commandapi-spigot-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-spigot/commandapi-spigot-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -53,6 +53,7 @@ public void onLoad() { .missingExecutorImplementationMessage(fileConfig.getString("messages.missing-executor-implementation")) .dispatcherFile(fileConfig.getBoolean("create-dispatcher-json") ? new File(getDataFolder(), "command_registration.json") : null) .skipReloadDatapacks(fileConfig.getBoolean("skip-initial-datapack-reload")) + .enableNetworking(fileConfig.getBoolean("enable-networking")) .makeNetworkingExceptionsWarnings(fileConfig.getBoolean("make-networking-exceptions-warnings")); for (String pluginName : fileConfig.getStringList("skip-sender-proxy")) { diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-core/src/main/java/dev/jorel/commandapi/CommandAPIVelocity.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-core/src/main/java/dev/jorel/commandapi/CommandAPIVelocity.java index 01409535bd..3d9010b60d 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-core/src/main/java/dev/jorel/commandapi/CommandAPIVelocity.java +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-core/src/main/java/dev/jorel/commandapi/CommandAPIVelocity.java @@ -42,7 +42,7 @@ public class CommandAPIVelocity implements CommandAPIPlatform, Comma private static CommandAPIVelocity instance; private static InternalVelocityConfig config; - private VelocityCommandAPIMessenger messenger; + private VelocityCommandAPIMessenger messenger = null; private CommandManager commandManager; private CommandDispatcher dispatcher; @@ -112,7 +112,13 @@ public VelocityCommandAPIMessenger setupMessenger() { } public VelocityCommandAPIMessenger getMessenger() { - return messenger; + if (messenger != null) { + return messenger; + } else { + throw new IllegalStateException("Tried to access the plugin messenger, but it was null." + + " Plugin messages are only possible after calling CommandAPI#onEnable." + + " Also ensure that the \"enable-networking\" config option is \"true\"."); + } } @Override diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index 3c240bba70..d340a0eb36 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -62,6 +62,7 @@ public CommandAPIMain(ProxyServer server, Logger logger, @DataDirectory Path dat .silentLogs(configYAML.node("silent-logs").getBoolean()) .missingExecutorImplementationMessage(configYAML.node("messages", "missing-executor-implementation").getString()) .dispatcherFile(configYAML.node("create-dispatcher-json").getBoolean() ? new File(dataDirectory.toFile(), "command_registration.json") : null) + .enableNetworking(configYAML.node("enable-networking").getBoolean()) .makeNetworkingExceptionsWarnings(configYAML.node("make-networking-exceptions-warnings").getBoolean()); // Load diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/DefaultVelocityConfig.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/DefaultVelocityConfig.java index 6adfd364f7..169ba500eb 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/DefaultVelocityConfig.java +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/DefaultVelocityConfig.java @@ -13,6 +13,7 @@ public static DefaultVelocityConfig createDefault() { options.put("silent-logs", SILENT_LOGS); options.put("messages.missing-executor-implementation", MISSING_EXECUTOR_IMPLEMENTATION); options.put("create-dispatcher-json", CREATE_DISPATCHER_JSON); + options.put("enable-networking", ENABLE_NETWORKING); options.put("make-networking-exceptions-warnings", MAKE_NETWORKING_EXCEPTIONS_WARNINGS); Map sections = new LinkedHashMap<>(); diff --git a/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/DefaultConfig.java b/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/DefaultConfig.java index 472a3ae4bf..e62cfdd893 100644 --- a/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/DefaultConfig.java +++ b/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/DefaultConfig.java @@ -41,6 +41,16 @@ public abstract class DefaultConfig { }, false ); + public static final CommentedConfigOption ENABLE_NETWORKING = new CommentedConfigOption<>( + new String[]{ + "Turn on the CommandAPI's plugin messaging functionality (default: false)", + "If \"false\", the CommandAPI will not listen to incoming plugin messages", + "and attempts to send plugin messages will fail. Enabling networking by", + "setting this to \"true\" is currently only useful for allowing command", + "requirements on Velocity." + }, false + ); + public static final CommentedConfigOption MAKE_NETWORKING_EXCEPTIONS_WARNINGS = new CommentedConfigOption<>( new String[]{ "Turn exceptions while sending and receiving packets into warnings (default: false)", From ca20c47984ab874e4e69884bc3480131167ff1b4 Mon Sep 17 00:00:00 2001 From: willkroboth <46540330+willkroboth@users.noreply.github.com> Date: Thu, 20 Nov 2025 18:42:24 -0500 Subject: [PATCH 6/6] Improve packet error logging by including the bytes which caused the problem --- .../network/CommandAPIMessenger.java | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/network/CommandAPIMessenger.java b/commandapi-core/src/main/java/dev/jorel/commandapi/network/CommandAPIMessenger.java index 819fabf679..effa95f8ac 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/network/CommandAPIMessenger.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/network/CommandAPIMessenger.java @@ -4,7 +4,7 @@ import dev.jorel.commandapi.network.packets.ProtocolVersionTooOldPacket; import dev.jorel.commandapi.network.packets.SetVersionPacket; -import java.util.Arrays; +import java.util.HexFormat; /** * Handles sending and receiving {@link CommandAPIPacket}s between instances of the CommandAPI plugin on different servers. @@ -41,6 +41,8 @@ protected CommandAPIMessenger(CommandAPIPacketHandlerProvider pack */ public abstract int getConnectionProtocolVersion(OutputChannel target); + private final static HexFormat byteArrayFormat = HexFormat.ofDelimiter(", ").withUpperCase(); + /** * Handles a message sent to this plugin. The given byte array will be decoded into a {@link CommandAPIPacket} * according to the given {@link CommandAPIProtocol}, then handled appropriately. Nothing happens if the given byte @@ -60,30 +62,25 @@ protected void messageReceived(CommandAPIProtocol protocol, InputChannel sender, FriendlyByteBuffer buffer = new FriendlyByteBuffer(input); try { - int id; - CommandAPIPacket packet; - try { - // Read the id - id = buffer.readVarInt(); - // Use the id and protocol to find and use the correct deserialize method - packet = protocol.createPacket(id, buffer); - } catch (IllegalStateException e) { - throw new IllegalStateException("Exception while reading packet", e); - } - if (packet == null) throw new IllegalStateException("Unknown packet id: " + id); + // Read the id + int id = buffer.readVarInt(); + // Use the id and protocol to find and use the correct deserialize method + CommandAPIPacket packet = protocol.createPacket(id, buffer); + + if (packet == null) throw new IllegalStateException("Unknown packet id: " + id + " for channel: " + protocol.getChannelIdentifier()); if (buffer.countReadableBytes() != 0) { // If the packet didn't read all the bytes it was given, we have a strange miscommunication throw new IllegalStateException( "Packet was larger than expected! " + buffer.countReadableBytes() + " extra byte(s) found after deserializing.\n" + - "Given: " + Arrays.toString(input) + ", Read: " + packet + "Read: " + packet ); } // Handle the packet packetHandlerProvider.getHandlerForProtocol(protocol).handlePacket(sender, packet); - } catch (RuntimeException exception) { - handlePacketException(exception); + } catch (Throwable throwable) { + handlePacketException(new IllegalStateException("Exception while reading packet [" + byteArrayFormat.formatHex(input) + "]", throwable)); } }