diff --git a/gradle.properties b/gradle.properties index ce1a362..c665b0f 100755 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ org.gradle.jvmargs=-Xmx1G loader_version=0.11.3 # Mod Properties - mod_version = 0.2.2 + mod_version = 0.2.3 maven_group = eu.midnightdust archives_base_name = midnightlib diff --git a/src/main/java/eu/midnightdust/hats/config/ModMenuIntegration.java b/src/main/java/eu/midnightdust/hats/config/ModMenuIntegration.java deleted file mode 100755 index 4d16bdb..0000000 --- a/src/main/java/eu/midnightdust/hats/config/ModMenuIntegration.java +++ /dev/null @@ -1,16 +0,0 @@ -package eu.midnightdust.hats.config; - -import com.terraformersmc.modmenu.api.ConfigScreenFactory; -import com.terraformersmc.modmenu.api.ModMenuApi; -import eu.midnightdust.lib.config.MidnightConfig; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; - -@Environment(EnvType.CLIENT) -public class ModMenuIntegration implements ModMenuApi { - - @Override - public ConfigScreenFactory getModConfigScreenFactory() { - return parent -> MidnightConfig.getScreen(parent, "midnightlib"); - } -} \ No newline at end of file diff --git a/src/main/java/eu/midnightdust/lib/config/AutoModMenu.java b/src/main/java/eu/midnightdust/lib/config/AutoModMenu.java new file mode 100755 index 0000000..49f8815 --- /dev/null +++ b/src/main/java/eu/midnightdust/lib/config/AutoModMenu.java @@ -0,0 +1,23 @@ +package eu.midnightdust.lib.config; + +import com.google.common.collect.ImmutableMap; +import com.terraformersmc.modmenu.api.ConfigScreenFactory; +import com.terraformersmc.modmenu.api.ModMenuApi; +import eu.midnightdust.core.config.MidnightLibConfig; + +import java.util.HashMap; +import java.util.Map; + +public class AutoModMenu implements ModMenuApi { + @Override + public ConfigScreenFactory getModConfigScreenFactory() { + return parent -> MidnightLibConfig.getScreen(parent,"midnightlib"); + } + + @Override + public Map> getProvidedConfigScreenFactories() { + HashMap> map = new HashMap<>(); + MidnightConfig.configClass.forEach((modid, cClass) -> map.put(modid, parent -> MidnightConfig.getScreen(parent, modid))); + return map; + } +} diff --git a/src/main/java/eu/midnightdust/lib/config/MidnightConfig.java b/src/main/java/eu/midnightdust/lib/config/MidnightConfig.java index e922563..930ea31 100755 --- a/src/main/java/eu/midnightdust/lib/config/MidnightConfig.java +++ b/src/main/java/eu/midnightdust/lib/config/MidnightConfig.java @@ -31,9 +31,12 @@ import java.util.function.Function; import java.util.function.Predicate; import java.util.regex.Pattern; -// MidnightConfig v1.0.2 +// MidnightConfig v1.0.3 // Single class config library - feel free to copy! // Changelog: +// - 1.0.3: +// - Text field length is now configurable +// - Better separation of client and server // - 1.0.2: // - Update to 21w20a // - 1.0.1: @@ -61,6 +64,7 @@ public class MidnightConfig { Field field; Object widget; int width; + int max; Map.Entry error; Object defaultValue; Object value; @@ -81,9 +85,7 @@ public class MidnightConfig { for (Field field : config.getFields()) { EntryInfo info = new EntryInfo(); if (field.isAnnotationPresent(Entry.class) || field.isAnnotationPresent(Comment.class)) - try { - initClient(modid, field, info); - } catch (Exception e) {continue;} + if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) initClient(modid, field, info); if (field.isAnnotationPresent(Entry.class)) try { info.defaultValue = field.get(null); @@ -102,7 +104,7 @@ public class MidnightConfig { } } @Environment(EnvType.CLIENT) - public static void initClient(String modid, Field field, EntryInfo info) { + private static void initClient(String modid, Field field, EntryInfo info) { Class type = field.getType(); Entry e = field.getAnnotation(Entry.class); info.width = e != null ? e.width() : 0; @@ -110,21 +112,24 @@ public class MidnightConfig { info.id = modid; if (e != null) - if (type == int.class) textField(info, Integer::parseInt, INTEGER_ONLY, e.min(), e.max(), true); - else if (type == double.class) textField(info, Double::parseDouble, DECIMAL_ONLY, e.min(), e.max(),false); - else if (type == String.class) textField(info, String::length, null, Math.min(e.min(),0), Math.max(e.max(),1),true); + if (type == int.class) textField(info, Integer::parseInt, INTEGER_ONLY, e.min(), e.max(), true); + else if (type == double.class) textField(info, Double::parseDouble, DECIMAL_ONLY, e.min(), e.max(), false); + else if (type == String.class) { + info.max = e.max() == Double.MAX_VALUE ? Integer.MAX_VALUE : (int) e.max(); + textField(info, String::length, null, Math.min(e.min(), 0), Math.max(e.max(), 1), true); + } else if (type == boolean.class) { - Function func = value -> new LiteralText((Boolean) value ? "True" : "False").formatted((Boolean) value ? Formatting.GREEN : Formatting.RED); + Function func = value -> new LiteralText((Boolean) value ? "True" : "False").formatted((Boolean) value ? Formatting.GREEN : Formatting.RED); info.widget = new AbstractMap.SimpleEntry>(button -> { info.value = !(Boolean) info.value; button.setMessage(func.apply(info.value)); }, func); } else if (type.isEnum()) { List values = Arrays.asList(field.getType().getEnumConstants()); - Function func = value -> new TranslatableText(modid + ".midnightconfig." + "enum." + type.getSimpleName() + "." + info.value.toString()); - info.widget = new AbstractMap.SimpleEntry>( button -> { + Function func = value -> new TranslatableText(modid + ".midnightconfig." + "enum." + type.getSimpleName() + "." + info.value.toString()); + info.widget = new AbstractMap.SimpleEntry>(button -> { int index = values.indexOf(info.value) + 1; - info.value = values.get(index >= values.size()? 0 : index); + info.value = values.get(index >= values.size() ? 0 : index); button.setMessage(func.apply(info.value)); }, func); } @@ -171,16 +176,14 @@ public class MidnightConfig { e.printStackTrace(); } } - @Environment(EnvType.CLIENT) public static Screen getScreen(Screen parent, String modid) { - return new TinyConfigScreen(parent, modid); + return new MidnightConfigScreen(parent, modid); } - @Environment(EnvType.CLIENT) - private static class TinyConfigScreen extends Screen { + private static class MidnightConfigScreen extends Screen { - protected TinyConfigScreen(Screen parent, String modid) { + protected MidnightConfigScreen(Screen parent, String modid) { super(new TranslatableText(modid + ".midnightconfig." + "title")); this.parent = parent; this.modid = modid; @@ -250,6 +253,7 @@ public class MidnightConfig { } else if (info.widget != null) { TextFieldWidget widget = new TextFieldWidget(textRenderer, width - 110, 0, info.width, 20, null); + widget.setMaxLength(info.max); widget.setText(info.tempValue); Predicate processor = ((BiFunction>) info.widget).apply(widget, done); widget.setTextPredicate(processor); diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index f83535a..de56e18 100755 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -24,7 +24,7 @@ "eu.midnightdust.core.MidnightLibClient" ], "modmenu": [ - "eu.midnightdust.hats.config.ModMenuIntegration" + "eu.midnightdust.lib.config.AutoModMenu" ] },