diff --git a/common/src/main/java/com/seibel/distanthorizons/common/LodCommonMain.java b/common/src/main/java/com/seibel/distanthorizons/common/LodCommonMain.java index 922e519e4..010fbe8e5 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/LodCommonMain.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/LodCommonMain.java @@ -48,11 +48,6 @@ public class LodCommonMain DependencySetup.createSharedBindings(); SharedApi.init(); -// if (!serverSided) { -// new NetworkReceiver().register_Client(); -// } else { -// new NetworkReceiver().register_Server(); -// } } public static void initConfig() diff --git a/coreSubProjects b/coreSubProjects index e98cf1f2b..82d66ca39 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit e98cf1f2b5cf924bb9268cec7d1df12282256632 +Subproject commit 82d66ca392b8e7df30123d31e2e410e63a4897b2 diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricDedicatedServerMain.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricDedicatedServerMain.java index d856b2339..af4cdadfa 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricDedicatedServerMain.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricDedicatedServerMain.java @@ -1,18 +1,43 @@ package com.seibel.distanthorizons.fabric; +import com.mojang.brigadier.Command; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.arguments.BoolArgumentType; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; import com.seibel.distanthorizons.common.LodCommonMain; import com.seibel.distanthorizons.common.wrappers.DependencySetup; import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftDedicatedServerWrapper; +import com.seibel.distanthorizons.core.config.ConfigBase; import com.seibel.distanthorizons.core.config.eventHandlers.presets.ThreadPresetConfigEventHandler; +import com.seibel.distanthorizons.core.config.types.AbstractConfigType; +import com.seibel.distanthorizons.core.config.types.ConfigEntry; import com.seibel.distanthorizons.core.util.LodUtil; +import com.seibel.distanthorizons.core.util.objects.Pair; import net.fabricmc.api.DedicatedServerModInitializer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.network.chat.Component; import net.minecraft.server.dedicated.DedicatedServer; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.util.HashMap; +import java.util.Objects; +import java.util.function.BiFunction; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + +import static com.mojang.brigadier.arguments.IntegerArgumentType.integer; +import static net.minecraft.commands.Commands.argument; +import static net.minecraft.commands.Commands.literal; + @Environment(EnvType.SERVER) public class FabricDedicatedServerMain implements DedicatedServerModInitializer { @@ -21,6 +46,8 @@ public class FabricDedicatedServerMain implements DedicatedServerModInitializer public static FabricServerProxy server_proxy; public boolean hasPostSetupDone = false; + private CommandDispatcher commandDispatcher; + @Override public void onInitializeServer() { @@ -35,6 +62,10 @@ public class FabricDedicatedServerMain implements DedicatedServerModInitializer server_proxy = new FabricServerProxy(true); server_proxy.registerEvents(); + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { + this.commandDispatcher = dispatcher; + }); + ServerLifecycleEvents.SERVER_STARTING.register((server) -> { if (this.hasPostSetupDone) @@ -48,9 +79,74 @@ public class FabricDedicatedServerMain implements DedicatedServerModInitializer MinecraftDedicatedServerWrapper.INSTANCE.dedicatedServer = (DedicatedServer) server; LodCommonMain.initConfig(); FabricMain.postInit(); + this.initCommands(); LOGGER.info("Dedicated server initialized at " + server.getServerDirectory()); }); } + @SuppressWarnings({"rawtypes", "unchecked"}) + public void initCommands() + { + LiteralArgumentBuilder builder = literal("dhconfig") + .requires(source -> source.hasPermission(4)); + + for (AbstractConfigType type : ConfigBase.INSTANCE.entries) + { + if (!(type instanceof ConfigEntry configEntry)) continue; + + if (configEntry.getServersideShortName() == null) continue; + LOGGER.info("{}: {}", configEntry.getServersideShortName(), configEntry.getType()); + + Function< + Function, Object>, + Command + > makeConfigUpdater = getter -> c -> { + var value = getter.apply(c); + c.getSource().sendSuccess(() -> Component.literal("Changed the value of "+configEntry.getServersideShortName()+" to "+value), true); + configEntry.set(value); + return 1; + }; + + var subcommand = literal(configEntry.getServersideShortName()) + .executes(c -> { + LOGGER.info("Current value of {} is {}", configEntry.getServersideShortName(), configEntry.get()); + return 1; + }); + + if (Enum.class.isAssignableFrom(configEntry.getType())) + { + for (var choice : configEntry.getType().getEnumConstants()) + { + subcommand.then( + literal(choice.toString()) + .executes(makeConfigUpdater.apply(c -> choice)) + ); + } + } + else + { + for (var pair : new HashMap< + Class, + Pair< + Supplier>, + BiFunction, String, ?>> + >() {{ + put(Integer.class, new Pair<>(() -> integer((int) configEntry.getMin(), (int) configEntry.getMax()), IntegerArgumentType::getInteger)); + put(Boolean.class, new Pair<>(BoolArgumentType::bool, BoolArgumentType::getBool)); + }}.entrySet()) + { + if (!pair.getKey().isAssignableFrom(configEntry.getType())) continue; + + subcommand.then(argument("value", pair.getValue().first.get()) + .executes(makeConfigUpdater.apply(c -> pair.getValue().second.apply(c, "value")))); + } + } + + builder.then(subcommand); + } + + commandDispatcher.register(builder); + } + } diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricServerProxy.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricServerProxy.java index 8a493aed2..751672d6e 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricServerProxy.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricServerProxy.java @@ -154,25 +154,6 @@ public class FabricServerProxy ); } }); - - CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { - dispatcher.register(literal("dhconfig") - .requires(source -> source.hasPermission(4)) - .then( - argument("name", integer()) - .executes(c -> { - System.out.println("Bar is " + getInteger(c, "bar")); - return 1; - }) - ) - .executes(context -> { - // For versions below 1.19, replace "Text.literal" with "new LiteralText". - // For 1.19, remove "() ->" directly. - context.getSource().sendFailure(Component.literal("No arguments were provided")); - - return 1; - })); - }); } }