diff --git a/src/main/java/io/gitlab/jfronny/respackopts/GuiFactory.java b/src/main/java/io/gitlab/jfronny/respackopts/GuiFactory.java index 41e221e..8f34ca8 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/GuiFactory.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/GuiFactory.java @@ -8,10 +8,12 @@ import me.shedaniel.clothconfig2.api.ConfigCategory; import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; import net.minecraft.client.gui.screen.FatalErrorScreen; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.text.TranslatableText; +import net.minecraft.text.*; +import net.minecraft.util.Language; import java.util.HashMap; import java.util.Map; +import java.util.Objects; public class GuiFactory { public void buildCategory(JsonObject source, String screenId, ConfigCategory config, ConfigEntryBuilder entryBuilder) { @@ -21,8 +23,13 @@ public class GuiFactory { Respackopts.numVals.put(screenId, new HashMap<>()); if (!Respackopts.strVals.containsKey(screenId)) Respackopts.strVals.put(screenId, new HashMap<>()); + String b = "respackopts.field." + screenId; for (Map.Entry entry : source.entrySet()) { String n = entry.getKey(); + if (n.contains(":") || n.contains(".")) { + System.err.println(n + " contains invalid characters"); + continue; + } JsonElement e = entry.getValue(); if (e.isJsonPrimitive()) { JsonPrimitive p = e.getAsJsonPrimitive(); @@ -33,7 +40,7 @@ public class GuiFactory { currentValue = Respackopts.boolVals.get(screenId).get(n); else Respackopts.boolVals.get(screenId).put(n, defaultValue); - config.addEntry(entryBuilder.startBooleanToggle(new TranslatableText(n), currentValue) + config.addEntry(entryBuilder.startBooleanToggle(getText(n, b), currentValue) .setDefaultValue(defaultValue) .setSaveConsumer(v -> Respackopts.boolVals.get(screenId).put(n, v)) .build()); @@ -45,7 +52,7 @@ public class GuiFactory { currentValue = Respackopts.numVals.get(screenId).get(n); else Respackopts.numVals.get(screenId).put(n, defaultValue); - config.addEntry(entryBuilder.startDoubleField(new TranslatableText(n), currentValue) + config.addEntry(entryBuilder.startDoubleField(getText(n, b), currentValue) .setDefaultValue(defaultValue) .setSaveConsumer(v -> Respackopts.numVals.get(screenId).put(n, v)) .build()); @@ -57,7 +64,7 @@ public class GuiFactory { currentValue = Respackopts.strVals.get(screenId).get(n); else Respackopts.strVals.get(screenId).put(n, defaultValue); - config.addEntry(entryBuilder.startStrField(new TranslatableText(n), currentValue) + config.addEntry(entryBuilder.startStrField(getText(n, b), currentValue) .setDefaultValue(defaultValue) .setSaveConsumer(v -> Respackopts.strVals.get(screenId).put(n, v)) .build()); @@ -74,10 +81,10 @@ public class GuiFactory { ConfigBuilder builder; builder = ConfigBuilder.create() .setParentScreen(parent) - .setTitle(new TranslatableText("respackopts.title." + resourcepackid)); + .setTitle(getText(resourcepackid, "respackopts.title")); ConfigEntryBuilder entryBuilder = builder.entryBuilder(); builder.setSavingRunnable(respackReload); - ConfigCategory config = builder.getOrCreateCategory(new TranslatableText("respackopts.category." + resourcepackid)); + ConfigCategory config = builder.getOrCreateCategory(getText(resourcepackid, "respackopts.category")); buildCategory(source, resourcepackid, config, entryBuilder); return builder.build(); } @@ -86,4 +93,10 @@ public class GuiFactory { return new FatalErrorScreen(new TranslatableText("respackopts.loadFailed"), new TranslatableText("respackopts.loadError")); } } + + private Text getText(String key, String idPrefix) { + String k = idPrefix + "." + key; + if (Language.getInstance().hasTranslation(k)) return new TranslatableText(k); + else return new LiteralText(key); + } } diff --git a/src/main/java/io/gitlab/jfronny/respackopts/LibCDCompat.java b/src/main/java/io/gitlab/jfronny/respackopts/LibCDCompat.java index c626a7f..d886eb9 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/LibCDCompat.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/LibCDCompat.java @@ -24,7 +24,7 @@ public class LibCDCompat implements ConditionInitializer { AtomicBoolean found = new AtomicBoolean(false); AtomicBoolean output = new AtomicBoolean(false); Respackopts.resPackMetas.forEach((r, v) -> { - if (Objects.equals(v.meta.id, s.split(":")[0])) { + if (Objects.equals(v.id, s.split(":")[0])) { found.set(true); String name = s.substring(s.indexOf(':') + 1); output.set(v.conf.get(name).getAsBoolean()); diff --git a/src/main/java/io/gitlab/jfronny/respackopts/MMI.java b/src/main/java/io/gitlab/jfronny/respackopts/MMI.java index 5536543..958f03c 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/MMI.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/MMI.java @@ -23,8 +23,8 @@ public class MMI implements ModMenuApi { Respackopts.save(); }); Respackopts.resPackMetas.forEach((s, v) -> { - ConfigCategory config = builder.getOrCreateCategory(new TranslatableText("respackopts.category." + v.meta.id)); - Respackopts.factory.buildCategory(v.conf, v.meta.id, config, entryBuilder); + ConfigCategory config = builder.getOrCreateCategory(new TranslatableText("respackopts.category." + v.id)); + Respackopts.factory.buildCategory(v.conf, v.id, config, entryBuilder); }); return builder.build(); } diff --git a/src/main/java/io/gitlab/jfronny/respackopts/Respackopts.java b/src/main/java/io/gitlab/jfronny/respackopts/Respackopts.java index bf1b8f0..962942e 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/Respackopts.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/Respackopts.java @@ -7,7 +7,6 @@ import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.loader.api.FabricLoader; -import org.lwjgl.stb.STBRPNode; import java.io.*; import java.nio.file.Files; @@ -24,18 +23,68 @@ public class Respackopts implements ClientModInitializer { public static final Integer metaVersion = 1; public static HashMap resPackMetas = new HashMap<>(); public static final String ID = "respackopts"; - static final Path p = FabricLoader.getInstance().getConfigDir().resolve("respackopts.json"); + static final Path p = FabricLoader.getInstance().getConfigDir().resolve("respackopts"); @Override public void onInitializeClient() { + load(); + } + + public static void save() { + deNull(); try { - Reader reader = Files.newBufferedReader(p); - Config c = g.fromJson(reader, Config.class); - boolVals = c.boolVals; - numVals = c.numVals; - strVals = c.strVals; + Files.createDirectories(p); } catch (IOException e) { e.printStackTrace(); } + for (String s : resPackMetas.keySet()) { + s = resPackMetas.get(s).id; + Config cfg = new Config(); + if (boolVals.containsKey(s)) + cfg.bools = boolVals.get(s); + if (numVals.containsKey(s)) + cfg.doubles = numVals.get(s); + if (strVals.containsKey(s)) + cfg.strings = strVals.get(s); + Path q = p.resolve(s + ".json"); + try { + Writer writer = Files.newBufferedWriter(q); + g.toJson(cfg, writer); + writer.flush(); + writer.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + public static void load() { + try { + for (String s : resPackMetas.keySet()) { + s = resPackMetas.get(s).id; + Path q = p.resolve(s + ".json"); + if (Files.exists(q)) { + try { + Reader reader = Files.newBufferedReader(q); + Config c = g.fromJson(reader, Config.class); + reader.close(); + if (c.bools != null) + boolVals.put(s, c.bools); + if (c.doubles != null) + numVals.put(s, c.doubles); + if (c.strings != null) + strVals.put(s, c.strings); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } catch (Throwable e) { + e.printStackTrace(); + } + deNull(); + } + + public static void deNull() { if (boolVals == null) boolVals = new HashMap<>(); if (numVals == null) @@ -43,18 +92,4 @@ public class Respackopts implements ClientModInitializer { if (strVals == null) strVals = new HashMap<>(); } - - public static void save() { - System.out.println("Yay"); - Config c = new Config(); - c.boolVals = boolVals; - c.numVals = numVals; - c.strVals = strVals; - try { - Writer writer = Files.newBufferedWriter(p); - g.toJson(c, writer); - } catch (IOException e) { - e.printStackTrace(); - } - } } diff --git a/src/main/java/io/gitlab/jfronny/respackopts/data/Config.java b/src/main/java/io/gitlab/jfronny/respackopts/data/Config.java index 3ff9cbd..b894acc 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/data/Config.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/data/Config.java @@ -3,7 +3,7 @@ package io.gitlab.jfronny.respackopts.data; import java.util.HashMap; public class Config { - public HashMap> boolVals; - public HashMap> numVals; - public HashMap> strVals; + public HashMap bools; + public HashMap doubles; + public HashMap strings; } diff --git a/src/main/java/io/gitlab/jfronny/respackopts/data/Respackmeta.java b/src/main/java/io/gitlab/jfronny/respackopts/data/Respackmeta.java index d183c22..a54dddd 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/data/Respackmeta.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/data/Respackmeta.java @@ -3,16 +3,7 @@ package io.gitlab.jfronny.respackopts.data; import com.google.gson.JsonObject; public class Respackmeta { - public JsonMeta meta; public JsonObject conf; - - public Respackmeta(JsonMeta meta, JsonObject conf) { - this.meta = meta; - this.conf = conf; - } - - public static class JsonMeta { - public String id; - public Integer version; - } + public String id; + public Integer version; } diff --git a/src/main/java/io/gitlab/jfronny/respackopts/mixin/ResourcePackEntryMixin.java b/src/main/java/io/gitlab/jfronny/respackopts/mixin/ResourcePackEntryMixin.java index 75df7b0..f560f2b 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/mixin/ResourcePackEntryMixin.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/mixin/ResourcePackEntryMixin.java @@ -57,7 +57,7 @@ public abstract class ResourcePackEntryMixin extends AlwaysSelectedEntryListWidg if (Respackopts.resPackMetas.containsKey(k) && respackopts$selected) { Respackmeta meta = Respackopts.resPackMetas.get(k); MinecraftClient c = MinecraftClient.getInstance(); - c.openScreen(Respackopts.factory.buildGui(meta.conf, meta.meta.id, c.currentScreen, () -> { + c.openScreen(Respackopts.factory.buildGui(meta.conf, meta.id, c.currentScreen, () -> { Respackopts.save(); })); } diff --git a/src/main/java/io/gitlab/jfronny/respackopts/mixin/ResourcePackManagerMixin.java b/src/main/java/io/gitlab/jfronny/respackopts/mixin/ResourcePackManagerMixin.java index 24d3b8a..870f711 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/mixin/ResourcePackManagerMixin.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/mixin/ResourcePackManagerMixin.java @@ -27,17 +27,22 @@ public class ResourcePackManagerMixin { @Inject(at = @At("TAIL"), method = "scanPacks()V") private void scanPacks(CallbackInfo info) { profiles.forEach((s, v) -> { - if (hasMetadata(v, "meta.json") && hasMetadata(v, "conf.json")) { + if (hasMetadata(v, "conf.json")) { try { - Respackmeta.JsonMeta meta = Respackopts.g.fromJson(readMetadata(v, "meta.json", Respackopts.g), Respackmeta.JsonMeta.class); - if (Respackopts.metaVersion.equals(meta.version)) { - Respackopts.resPackMetas.put(v.getDisplayName().asString(), new Respackmeta(meta, readMetadata(v, "conf.json", Respackopts.g))); + Respackmeta conf = Respackopts.g.fromJson(readMetadata(v, "conf.json", Respackopts.g), Respackmeta.class); + if (Respackopts.metaVersion.equals(conf.version)) { + Respackopts.resPackMetas.put(v.getDisplayName().asString(), conf); + } + else { + System.err.println(s + " was not loaded as it specifies a different respackopts version than is installed"); } } catch (IOException e) { e.printStackTrace(); } } }); + Respackopts.load(); + Respackopts.save(); } private boolean hasMetadata(ResourcePackProfile v, String fname) {