Basic chat commands

This commit is contained in:
s809
2023-11-25 17:44:52 +05:00
parent 28f8099777
commit 0e93aa4aea
4 changed files with 97 additions and 25 deletions
@@ -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()
@@ -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<CommandSourceStack> 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<CommandSourceStack> 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<CommandContext<CommandSourceStack>, Object>,
Command<CommandSourceStack>
> 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<ArgumentType<?>>,
BiFunction<CommandContext<?>, 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);
}
}
@@ -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;
}));
});
}
}