Selaa lähdekoodia

Automatic Mod Menu integration

Lortseam 4 vuotta sitten
vanhempi
sitoutus
32640d7b3a

+ 4 - 0
build.gradle

@@ -31,6 +31,9 @@ subprojects {
         maven {
             url "https://maven.shedaniel.me/"
         }
+        maven {
+            url "https://maven.terraformersmc.com/"
+        }
     }
 
     dependencies {
@@ -41,6 +44,7 @@ subprojects {
         modApi("me.shedaniel.cloth:cloth-config-fabric:${rootProject.cloth_config_version}") {
             exclude(group: "net.fabricmc.fabric-api")
         }
+        modImplementation("com.terraformersmc:modmenu:${rootProject.modmenu_version}")
 
         // Using modApi because api does not include dependency inside Maven pom file
         // see https://github.com/FabricMC/fabric-loom/issues/200

+ 0 - 7
example/build.gradle

@@ -1,10 +1,3 @@
-repositories {
-    maven {
-        url "https://maven.terraformersmc.com/"
-    }
-}
-
 dependencies {
     implementation(project(":lib"))
-    modImplementation("com.terraformersmc:modmenu:${rootProject.modmenu_version}")
 }

+ 29 - 13
lib/src/main/java/me/lortseam/completeconfig/data/Config.java

@@ -1,5 +1,6 @@
 package me.lortseam.completeconfig.data;
 
+import lombok.Getter;
 import lombok.NonNull;
 import lombok.extern.log4j.Log4j2;
 import me.lortseam.completeconfig.api.ConfigContainer;
@@ -12,12 +13,13 @@ import java.util.*;
 @Log4j2
 public class Config extends Node {
 
-    private static final Set<Config> configs = new HashSet<>();
+    @Getter
+    private static final Map<String, Config> mainConfigs = new HashMap<>();
+    private static final Set<Config> saveOnExitConfigs = new HashSet<>();
 
     static {
         Runtime.getRuntime().addShutdownHook(new Thread(() -> {
-            for (Config config : configs) {
-                if(!config.saveOnExit) continue;
+            for (Config config : saveOnExitConfigs) {
                 config.save();
             }
         }));
@@ -36,19 +38,11 @@ public class Config extends Node {
     }
 
     private final ConfigSource source;
-    private final boolean saveOnExit;
 
-    private Config(ConfigSource source, LinkedHashSet<ConfigContainer> children, boolean saveOnExit) {
+    private Config(ConfigSource source, LinkedHashSet<ConfigContainer> children) {
         super(TranslationIdentifier.ofRoot(source.getModID()));
         this.source = source;
-        this.saveOnExit = saveOnExit;
         resolve(children);
-        if (isEmpty()) {
-            logger.warn("[CompleteConfig] Config of " + source + " is empty!");
-            return;
-        }
-        source.load(this);
-        configs.add(this);
     }
 
     public String getModID() {
@@ -59,6 +53,10 @@ public class Config extends Node {
         return translation;
     }
 
+    private void load() {
+        source.load(this);
+    }
+
     public void save() {
         source.save(this);
     }
@@ -69,6 +67,7 @@ public class Config extends Node {
         private final String modID;
         private String[] branch = new String[0];
         private final LinkedHashSet<ConfigContainer> children = new LinkedHashSet<>();
+        private boolean main;
         private boolean saveOnExit = true;
 
         private Builder(String modID) {
@@ -111,6 +110,11 @@ public class Config extends Node {
             return this;
         }
 
+        public Builder main() {
+            main = true;
+            return this;
+        }
+
         /**
          * Completes the config creation.
          *
@@ -121,7 +125,19 @@ public class Config extends Node {
                 logger.warn("[CompleteConfig] Mod " + modID + " tried to create an empty config!");
                 return null;
             }
-            return new Config(new ConfigSource(modID, branch), children, saveOnExit);
+            Config config = new Config(new ConfigSource(modID, branch), children);
+            if (config.isEmpty()) {
+                logger.warn("[CompleteConfig] Config of " + config.source + " is empty!");
+                return null;
+            }
+            config.load();
+            if (main || branch.length == 0 && !mainConfigs.containsKey(modID)) {
+                mainConfigs.put(modID, config);
+            }
+            if (saveOnExit) {
+                saveOnExitConfigs.add(config);
+            }
+            return config;
         }
 
     }

+ 20 - 0
lib/src/main/java/me/lortseam/completeconfig/gui/ModMenuIntegration.java

@@ -0,0 +1,20 @@
+package me.lortseam.completeconfig.gui;
+
+import com.google.common.collect.Maps;
+import com.terraformersmc.modmenu.api.ConfigScreenFactory;
+import com.terraformersmc.modmenu.api.ModMenuApi;
+import me.lortseam.completeconfig.data.Config;
+import me.lortseam.completeconfig.gui.cloth.ClothConfigScreenBuilder;
+
+import java.util.Map;
+
+public final class ModMenuIntegration implements ModMenuApi {
+
+    private final ConfigScreenBuilder screenBuilder = new ClothConfigScreenBuilder();
+
+    @Override
+    public Map<String, ConfigScreenFactory<?>> getProvidedConfigScreenFactories() {
+        return Maps.transformValues(Config.getMainConfigs(), config -> screen -> screenBuilder.build(screen, config));
+    }
+
+}

+ 7 - 1
lib/src/main/resources/fabric.mod.json

@@ -17,13 +17,19 @@
   "license": "Apache-2.0",
 
   "environment": "*",
+  "entrypoints": {
+    "modmenu": [
+      "me.lortseam.completeconfig.gui.ModMenuIntegration"
+    ]
+  },
   "depends": {
     "fabricloader": ">=0.9.0"
   },
   "suggests": {
     "cloth-config2": "*",
     "confabricate": "*",
-    "cloth-basic-math": "*"
+    "cloth-basic-math": "*",
+    "modmenu": ">=1.16.9"
   },
 
   "custom": {