mirror of
https://github.com/TeamMidnightDust/MidnightLib.git
synced 2025-12-15 17:05:09 +01:00
Enable commands in all environments
- Many command-related fixes and improvements - Added test environment for easier development
This commit is contained in:
@@ -8,7 +8,7 @@ import net.fabricmc.api.Environment;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.UIManager;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -25,8 +25,7 @@ public class MidnightLib {
|
||||
} catch (Exception e) { LOGGER.error("Error setting system look and feel", e); }
|
||||
MidnightLibConfig.init(MOD_ID, MidnightLibConfig.class);
|
||||
}
|
||||
@Environment(EnvType.SERVER)
|
||||
public static void onInitializeServer() {
|
||||
public static void onInitialize() {
|
||||
MidnightConfig.configClass.forEach((modid, config) -> {
|
||||
for (Field field : config.getFields()) {
|
||||
if (field.isAnnotationPresent(MidnightConfig.Entry.class) && !field.isAnnotationPresent(MidnightConfig.Client.class) && !field.isAnnotationPresent(MidnightConfig.Hidden.class))
|
||||
|
||||
@@ -6,11 +6,16 @@ import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.minecraft.client.gui.DrawContext;
|
||||
import net.minecraft.client.gui.screen.Screen;
|
||||
import net.minecraft.client.gui.widget.*;
|
||||
import net.minecraft.client.gui.widget.ButtonWidget;
|
||||
import net.minecraft.screen.ScreenTexts;
|
||||
import net.minecraft.text.*;
|
||||
import net.minecraft.text.Text;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import static eu.midnightdust.lib.config.MidnightConfig.MidnightConfigListWidget;
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
public class MidnightConfigOverviewScreen extends Screen {
|
||||
@@ -20,19 +25,19 @@ public class MidnightConfigOverviewScreen extends Screen {
|
||||
this.parent = parent;
|
||||
}
|
||||
private final Screen parent;
|
||||
private MidnightConfig.MidnightConfigListWidget list;
|
||||
private MidnightConfigListWidget list;
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
this.addDrawableChild(ButtonWidget.builder(ScreenTexts.DONE, (button) -> Objects.requireNonNull(client).setScreen(parent)).dimensions(this.width / 2 - 100, this.height - 26, 200, 20).build());
|
||||
|
||||
this.addSelectableChild(this.list = new MidnightConfig.MidnightConfigListWidget(this.client, this.width, this.height - 57, 24, 25));
|
||||
this.addSelectableChild(this.list = new MidnightConfigListWidget(this.client, this.width, this.height - 57, 24, 25));
|
||||
List<String> sortedMods = new ArrayList<>(MidnightConfig.configClass.keySet());
|
||||
Collections.sort(sortedMods);
|
||||
sortedMods.forEach((modid) -> {
|
||||
if (!MidnightLib.hiddenMods.contains(modid)) {
|
||||
list.addButton(List.of(ButtonWidget.builder(Text.translatable(modid +".midnightconfig.title"), (button) ->
|
||||
Objects.requireNonNull(client).setScreen(MidnightConfig.getScreen(this,modid))).dimensions(this.width / 2 - 125, this.height - 28, 250, 20).build()), null, null);
|
||||
Objects.requireNonNull(client).setScreen(MidnightConfig.getScreen(this, modid))).dimensions(this.width / 2 - 125, this.height - 28, 250, 20).build()), null, null);
|
||||
}});
|
||||
super.init();
|
||||
}
|
||||
@@ -40,7 +45,6 @@ public class MidnightConfigOverviewScreen extends Screen {
|
||||
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
|
||||
super.render(context, mouseX, mouseY, delta);
|
||||
this.list.render(context, mouseX, mouseY, delta);
|
||||
|
||||
context.drawCenteredTextWithShadow(textRenderer, title, width / 2, 10, 0xFFFFFF);
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
package eu.midnightdust.lib.config;
|
||||
|
||||
import com.mojang.brigadier.arguments.*;
|
||||
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
|
||||
import com.mojang.brigadier.context.CommandContext;
|
||||
import eu.midnightdust.lib.util.PlatformFunctions;
|
||||
import net.minecraft.server.command.CommandManager;
|
||||
@@ -9,47 +8,41 @@ import net.minecraft.server.command.ServerCommandSource;
|
||||
import net.minecraft.text.Text;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import static eu.midnightdust.lib.config.MidnightConfig.Entry;
|
||||
|
||||
public class AutoCommand {
|
||||
public static List<LiteralArgumentBuilder<ServerCommandSource>> commands = new ArrayList<>();
|
||||
final static String BASE = "midnightconfig";
|
||||
final static String VALUE = "value";
|
||||
final Field field;
|
||||
final Class<?> type;
|
||||
final String modid;
|
||||
final boolean isList;
|
||||
final boolean isList, isNumber;
|
||||
|
||||
public AutoCommand(Field field, String modid) {
|
||||
this.field = field;
|
||||
this.modid = modid;
|
||||
this.type = field.getType();
|
||||
this.field = field; this.modid = modid;
|
||||
this.type = MidnightConfig.getUnderlyingType(field);
|
||||
this.isList = field.getType() == List.class;
|
||||
this.isNumber = type == int.class || type == double.class || type == float.class;
|
||||
|
||||
LiteralArgumentBuilder<ServerCommandSource> command = CommandManager.literal(BASE).requires(source -> source.hasPermissionLevel(2)).then(
|
||||
CommandManager.literal(modid).then(CommandManager.literal(field.getName()).executes(this::getValue)));
|
||||
var command = CommandManager.literal(field.getName()).executes(this::getValue);
|
||||
|
||||
if (type.isEnum()) {
|
||||
for (Object enumValue : field.getType().getEnumConstants()) {
|
||||
for (Object enumValue : field.getType().getEnumConstants())
|
||||
command = command.then(CommandManager.literal(enumValue.toString()).executes(ctx -> this.setValue(ctx.getSource(), enumValue, "")));
|
||||
}
|
||||
}
|
||||
else if (isList) {
|
||||
for (String action : List.of("add", "remove")) {
|
||||
} else if (isList) {
|
||||
for (String action : List.of("add", "remove"))
|
||||
command = command.then(CommandManager.literal(action).then(
|
||||
CommandManager.argument(VALUE, getArgType()).executes(ctx -> setValueFromArg(ctx, action))));
|
||||
}
|
||||
}
|
||||
else command = command.then(CommandManager.argument(VALUE, getArgType()).executes(ctx -> setValueFromArg(ctx, "")));
|
||||
} else command = command.then(CommandManager.argument(VALUE, getArgType()).executes(ctx -> setValueFromArg(ctx, "")));
|
||||
|
||||
PlatformFunctions.registerCommand(command); commands.add(command);
|
||||
PlatformFunctions.registerCommand(CommandManager.literal("midnightconfig").requires(source -> source.hasPermissionLevel(2)).then(CommandManager.literal(modid).then(command)));
|
||||
}
|
||||
|
||||
public ArgumentType<?> getArgType() {
|
||||
MidnightConfig.Entry entry = type.getAnnotation(MidnightConfig.Entry.class);
|
||||
if (type.isInstance(Number.class)) {
|
||||
if (isNumber) {
|
||||
Entry entry = field.getAnnotation(Entry.class);
|
||||
if (type == int.class) return IntegerArgumentType.integer((int) entry.min(), (int) entry.max());
|
||||
else if (type == double.class) return DoubleArgumentType.doubleArg(entry.min(), entry.max());
|
||||
else if (type == float.class) return FloatArgumentType.floatArg((float) entry.min(), (float) entry.max());
|
||||
@@ -58,7 +51,7 @@ public class AutoCommand {
|
||||
return StringArgumentType.string();
|
||||
}
|
||||
public int setValueFromArg(CommandContext<ServerCommandSource> context, String action) {
|
||||
if (type.isInstance(Number.class)) {
|
||||
if (isNumber) {
|
||||
if (type == int.class) return setValue(context.getSource(), IntegerArgumentType.getInteger(context, VALUE), action);
|
||||
else if (type == double.class) return setValue(context.getSource(), DoubleArgumentType.getDouble(context, VALUE), action);
|
||||
else if (type == float.class) return setValue(context.getSource(), FloatArgumentType.getFloat(context, VALUE), action);
|
||||
|
||||
@@ -107,15 +107,10 @@ public abstract class MidnightConfig {
|
||||
}
|
||||
@Environment(EnvType.CLIENT)
|
||||
private static void initClient(String modid, Field field, EntryInfo info) {
|
||||
info.dataType = field.getType();
|
||||
info.dataType = getUnderlyingType(field);
|
||||
Entry e = field.getAnnotation(Entry.class);
|
||||
info.width = e != null ? e.width() : 0;
|
||||
info.field = field; info.modid = modid;
|
||||
if (info.dataType == List.class) {
|
||||
Class<?> listType = (Class<?>) ((ParameterizedType) info.field.getGenericType()).getActualTypeArguments()[0];
|
||||
try { info.dataType = (Class<?>) listType.getField("TYPE").get(null);
|
||||
} catch (NoSuchFieldException | IllegalAccessException ignored) { info.dataType = listType; }
|
||||
}
|
||||
|
||||
if (e != null) {
|
||||
if (!e.name().isEmpty()) info.name = Text.translatable(e.name());
|
||||
@@ -138,6 +133,13 @@ public abstract class MidnightConfig {
|
||||
}}
|
||||
entries.add(info);
|
||||
}
|
||||
public static Class<?> getUnderlyingType(Field field) {
|
||||
if (field.getType() == List.class) {
|
||||
Class<?> listType = (Class<?>) ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0];
|
||||
try { return (Class<?>) listType.getField("TYPE").get(null);
|
||||
} catch (NoSuchFieldException | IllegalAccessException ignored) { return listType; }
|
||||
} else return field.getType();
|
||||
}
|
||||
public static Tooltip getTooltip(EntryInfo info) {
|
||||
String key = info.modid + ".midnightconfig."+info.field.getName()+".tooltip";
|
||||
return Tooltip.of(info.error != null ? info.error : I18n.hasTranslation(key) ? Text.translatable(key) : Text.empty());
|
||||
|
||||
Reference in New Issue
Block a user