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 cloud; @@ -143,7 +152,7 @@ public class CommandRegistry { } // wait for the right moment (depends on the platform) to register permissions - geyser.eventBus().subscribe(new GeyserEventRegistrar(this), GeyserRegisterPermissionsEvent.class, this::onRegisterPermissions); + geyser.eventBus().subscribe(this, GeyserRegisterPermissionsEvent.class, this::onRegisterPermissions); } /** diff --git a/core/src/main/java/org/geysermc/geyser/command/standalone/StandaloneCloudCommandManager.java b/core/src/main/java/org/geysermc/geyser/command/standalone/StandaloneCloudCommandManager.java index 4a0e78a78..2ed9b5dc4 100644 --- a/core/src/main/java/org/geysermc/geyser/command/standalone/StandaloneCloudCommandManager.java +++ b/core/src/main/java/org/geysermc/geyser/command/standalone/StandaloneCloudCommandManager.java @@ -38,8 +38,6 @@ import org.geysermc.geyser.util.FileUtils; import org.incendo.cloud.CommandManager; import org.incendo.cloud.execution.ExecutionCoordinator; import org.incendo.cloud.internal.CommandRegistrationHandler; -import org.incendo.cloud.meta.CommandMeta; -import org.incendo.cloud.meta.SimpleCommandMeta; import java.io.File; import java.util.ArrayList; @@ -84,7 +82,7 @@ public class StandaloneCloudCommandManager extends CommandManager { if (permission.isBlank()) { return; @@ -114,13 +112,7 @@ public class StandaloneCloudCommandManager extends CommandManager