浏览代码

Make ConfigScreenBuilder client-side only

Lortseam 4 年之前
父节点
当前提交
7f9ce4b1cc

+ 0 - 27
lib/src/main/java/me/lortseam/completeconfig/data/Registry.java

@@ -1,14 +1,10 @@
 package me.lortseam.completeconfig.data;
 
 import com.google.common.collect.Lists;
-import lombok.NonNull;
 import lombok.experimental.UtilityClass;
 import me.lortseam.completeconfig.api.ConfigEntry;
 import me.lortseam.completeconfig.data.transform.Transformation;
-import me.lortseam.completeconfig.gui.ConfigScreenBuilder;
 import me.lortseam.completeconfig.util.ReflectionUtils;
-import net.fabricmc.api.EnvType;
-import net.fabricmc.api.Environment;
 import net.minecraft.text.TextColor;
 
 import java.util.Collection;
@@ -71,18 +67,6 @@ public final class Registry {
         Registry.transformations.addAll(Arrays.asList(transformations));
     }
 
-    /**
-     * Sets the main screen builder for a mod. The main screen builder will be used to build the config screen if no
-     * custom builder was specified.
-     *
-     * @param modId the mod's ID
-     * @param screenBuilder the screen builder
-     */
-    @Environment(EnvType.CLIENT)
-    public static void register(@NonNull String modId, @NonNull ConfigScreenBuilder screenBuilder) {
-        getConfigs(modId).screenBuilder = screenBuilder;
-    }
-
     private static ModConfigSet getConfigs(String modId) {
         return configs.computeIfAbsent(modId, key -> new ModConfigSet());
     }
@@ -105,20 +89,9 @@ public final class Registry {
         return Collections.unmodifiableList(transformations);
     }
 
-    @Environment(EnvType.CLIENT)
-    public static Optional<ConfigScreenBuilder> getScreenBuilder(String modId, ConfigScreenBuilder fallback) {
-        ConfigScreenBuilder screenBuilder = getConfigs(modId).screenBuilder;
-        if (screenBuilder != null) {
-            return Optional.of(screenBuilder);
-        }
-        return Optional.ofNullable(fallback);
-    }
-
     private static class ModConfigSet extends HashSet<Config> {
 
         private Config main;
-        @Environment(EnvType.CLIENT)
-        private ConfigScreenBuilder screenBuilder;
 
         private void add(Config config, boolean main) {
             add(config);

+ 27 - 2
lib/src/main/java/me/lortseam/completeconfig/gui/ConfigScreenBuilder.java

@@ -1,5 +1,6 @@
 package me.lortseam.completeconfig.gui;
 
+import lombok.NonNull;
 import me.lortseam.completeconfig.data.Config;
 import me.lortseam.completeconfig.gui.cloth.ClothConfigScreenBuilder;
 import net.fabricmc.api.EnvType;
@@ -7,9 +8,34 @@ import net.fabricmc.api.Environment;
 import net.fabricmc.loader.api.FabricLoader;
 import net.minecraft.client.gui.screen.Screen;
 
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+@Environment(EnvType.CLIENT)
 public abstract class ConfigScreenBuilder {
 
-    public static final ConfigScreenBuilder FALLBACK = FabricLoader.getInstance().isModLoaded("cloth-config2") ? new ClothConfigScreenBuilder() : null;
+    private static final ConfigScreenBuilder fallback = FabricLoader.getInstance().isModLoaded("cloth-config2") ? new ClothConfigScreenBuilder() : null;
+    private static final Map<String, ConfigScreenBuilder> builders = new HashMap<>();
+
+    /**
+     * Sets the main screen builder for a mod. The main screen builder will be used to build the config screen if no
+     * custom builder was specified.
+     *
+     * @param modId the mod's ID
+     * @param screenBuilder the screen builder
+     */
+    public static void setMain(@NonNull String modId, @NonNull ConfigScreenBuilder screenBuilder) {
+        builders.put(modId, screenBuilder);
+    }
+
+    public static Optional<ConfigScreenBuilder> getMain(String modId) {
+        ConfigScreenBuilder screenBuilder = builders.get(modId);
+        if (screenBuilder != null) {
+            return Optional.of(screenBuilder);
+        }
+        return Optional.ofNullable(fallback);
+    }
 
     /**
      * Builds a screen based on a config.
@@ -18,7 +44,6 @@ public abstract class ConfigScreenBuilder {
      * @param config the config to build the screen of
      * @return the built screen
      */
-    @Environment(EnvType.CLIENT)
     public abstract Screen build(Screen parentScreen, Config config);
 
 }

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

@@ -15,7 +15,7 @@ public final class ModMenuIntegration implements ModMenuApi {
     public Map<String, ConfigScreenFactory<?>> getProvidedConfigScreenFactories() {
         Map<String, ConfigScreenFactory<?>> factories = new HashMap<>();
         for (Map.Entry<String, Config> entry : Registry.getMainConfigs().entrySet()) {
-            Optional<ConfigScreenBuilder> builder = Registry.getScreenBuilder(entry.getKey(), ConfigScreenBuilder.FALLBACK);
+            Optional<ConfigScreenBuilder> builder = ConfigScreenBuilder.getMain(entry.getKey());
             if (!builder.isPresent()) continue;
             factories.put(entry.getKey(), parentScreen -> builder.get().build(parentScreen, entry.getValue()));
         }

+ 0 - 3
lib/src/main/java/me/lortseam/completeconfig/gui/cloth/ClothConfigScreenBuilder.java

@@ -12,8 +12,6 @@ import me.shedaniel.clothconfig2.api.ConfigBuilder;
 import me.shedaniel.clothconfig2.api.ConfigCategory;
 import me.shedaniel.clothconfig2.api.ConfigEntryBuilder;
 import me.shedaniel.clothconfig2.impl.builders.SubCategoryBuilder;
-import net.fabricmc.api.EnvType;
-import net.fabricmc.api.Environment;
 import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.text.StringVisitable;
 import net.minecraft.text.TranslatableText;
@@ -26,7 +24,6 @@ import java.util.function.Supplier;
 /**
  * A screen builder based on the Cloth Config API.
  */
-@Environment(EnvType.CLIENT)
 public final class ClothConfigScreenBuilder extends ConfigScreenBuilder {
 
     private final Supplier<ConfigBuilder> supplier;