From cc94227b6ee25cf0f0467faacf784857cccbf330 Mon Sep 17 00:00:00 2001 From: Konicai <71294714+Konicai@users.noreply.github.com> Date: Sat, 1 Jun 2024 16:44:16 -0500 Subject: [PATCH] Only initialize commands once on Geyser-Standalone --- .../standalone/GeyserStandaloneBootstrap.java | 11 ++++++----- .../geysermc/geyser/command/CommandRegistry.java | 15 ++++++++++++--- .../standalone/StandaloneCloudCommandManager.java | 12 ++---------- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/GeyserStandaloneBootstrap.java b/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/GeyserStandaloneBootstrap.java index bc49ae1fd..8ac358d8a 100644 --- a/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/GeyserStandaloneBootstrap.java +++ b/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/GeyserStandaloneBootstrap.java @@ -223,14 +223,15 @@ public class GeyserStandaloneBootstrap implements GeyserBootstrap { geyser = GeyserImpl.load(PlatformType.STANDALONE, this); - // fire GeyserDefineCommandsEvent after PreInitEvent, before PostInitEvent, for consistency with other bootstraps - StandaloneCloudCommandManager cloud = new StandaloneCloudCommandManager(geyser); - commandRegistry = new CommandRegistry(geyser, cloud); + if (!geyser.isReloading()) { + // fire GeyserDefineCommandsEvent after PreInitEvent, before PostInitEvent, for consistency with other bootstraps + StandaloneCloudCommandManager cloud = new StandaloneCloudCommandManager(geyser); + commandRegistry = new CommandRegistry(geyser, cloud); + cloud.fireRegisterPermissionsEvent(); // event must be fired after CommandRegistry has subscribed its listener + } GeyserImpl.start(); - cloud.gatherPermissions(); // event must be fired after CommandRegistry has subscribed its listener - if (gui != null) { gui.enableCommands(geyser.getScheduledThread(), commandRegistry); } diff --git a/core/src/main/java/org/geysermc/geyser/command/CommandRegistry.java b/core/src/main/java/org/geysermc/geyser/command/CommandRegistry.java index a75512f40..6cb7fde20 100644 --- a/core/src/main/java/org/geysermc/geyser/command/CommandRegistry.java +++ b/core/src/main/java/org/geysermc/geyser/command/CommandRegistry.java @@ -30,6 +30,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.Constants; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.command.Command; +import org.geysermc.geyser.api.event.EventRegistrar; import org.geysermc.geyser.api.event.lifecycle.GeyserDefineCommandsEvent; import org.geysermc.geyser.api.event.lifecycle.GeyserRegisterPermissionsEvent; import org.geysermc.geyser.api.extension.Extension; @@ -48,7 +49,6 @@ import org.geysermc.geyser.command.defaults.SettingsCommand; import org.geysermc.geyser.command.defaults.StatisticsCommand; import org.geysermc.geyser.command.defaults.StopCommand; import org.geysermc.geyser.command.defaults.VersionCommand; -import org.geysermc.geyser.event.GeyserEventRegistrar; import org.geysermc.geyser.event.type.GeyserDefineCommandsEventImpl; import org.geysermc.geyser.extension.command.GeyserExtensionCommand; import org.geysermc.geyser.text.GeyserLocale; @@ -59,7 +59,16 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; -public class CommandRegistry { +/** + * Registers all built-in and extension commands to the given Cloud CommandManager. + *
+ * Fires {@link GeyserDefineCommandsEvent} upon construction. + *
+ * Subscribes to {@link GeyserRegisterPermissionsEvent} upon construction.
+ * A new instance of this class (that registers the same permissions) shouldn't be created until the previous
+ * instance is unsubscribed from the event.
+ */
+public class CommandRegistry implements EventRegistrar {
private final GeyserImpl geyser;
private final CommandManager