Преглед на файлове

Introduced client/server environment

Lortseam преди 4 години
родител
ревизия
6f9ca6363f

+ 19 - 10
src/main/java/me/lortseam/completeconfig/CompleteConfig.java

@@ -2,40 +2,49 @@ package me.lortseam.completeconfig;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import me.lortseam.completeconfig.gui.GuiBuilder;
+import me.lortseam.completeconfig.gui.cloth.ClothGuiBuilder;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.loader.api.FabricLoader;
 
 import java.util.HashMap;
 import java.util.Objects;
 import java.util.Optional;
 
-/**
- * Starting class for using the CompleteConfig API.
- */
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class CompleteConfig {
 
     private static final HashMap<String, ConfigManager> MANAGERS = new HashMap<>();
 
     /**
-     * Registers a mod.
-     * @param modID The ID of the mod
+     * Registers a mod with a custom GUI builder.
+     *
+     * @param modID      The ID of the mod
+     * @param guiBuilder The {@link GuiBuilder} for the mod's config GUI
      * @return The {@link ConfigManager} for the newly registered mod
      */
-    public static ConfigManager register(String modID) {
+    public static ConfigManager register(String modID, GuiBuilder guiBuilder) {
         Objects.requireNonNull(modID);
         if (MANAGERS.containsKey(modID)) {
             throw new IllegalArgumentException("A manager with this mod ID is already registered");
         }
-        ConfigManager manager = new ConfigManager(modID);
+        ConfigManager manager = new ConfigManager(modID, guiBuilder);
         MANAGERS.put(modID, manager);
         return manager;
     }
 
     /**
-     * Gets the {@link ConfigManager} for the specified mod if that mod was registered before.
+     * Registers a mod. Uses the default Cloth Config GUI builder in a client environment if Cloth Config is installed.
+     *
      * @param modID The ID of the mod
-     * @return The {@link ConfigManager} if one was found or else an empty result
+     * @return The {@link ConfigManager} for the newly registered mod
      */
-    public static Optional<ConfigManager> getManager(String modID) {
+    public static ConfigManager register(String modID) {
+        return register(modID, FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT
+                && FabricLoader.getInstance().isModLoaded("cloth-config2") ? new ClothGuiBuilder() : null);
+    }
+
+    static Optional<ConfigManager> getManager(String modID) {
         return Optional.ofNullable(MANAGERS.get(modID));
     }
 

+ 24 - 23
src/main/java/me/lortseam/completeconfig/ConfigManager.java

@@ -3,20 +3,23 @@ package me.lortseam.completeconfig;
 import com.google.gson.*;
 import me.lortseam.completeconfig.api.ConfigCategory;
 import me.lortseam.completeconfig.gui.GuiBuilder;
-import me.lortseam.completeconfig.gui.GuiRegistry;
 import me.lortseam.completeconfig.serialization.CollectionSerializer;
 import me.lortseam.completeconfig.serialization.EntrySerializer;
-import me.shedaniel.clothconfig2.api.ConfigBuilder;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.fabricmc.loader.api.FabricLoader;
 import net.minecraft.client.gui.screen.Screen;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
-import java.io.*;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.Writer;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.function.Supplier;
+import java.util.Optional;
 
 /**
  * Main interaction class for using the CompleteConfig API. References a single mod.
@@ -35,11 +38,21 @@ public final class ConfigManager {
     private final Config config;
     private final GuiBuilder guiBuilder;
 
-    ConfigManager(String modID) {
+    /**
+     * Gets the {@link ConfigManager} for the specified mod if that mod was registered before.
+     *
+     * @param modID The ID of the mod
+     * @return The {@link ConfigManager} if one was found or else an empty result
+     */
+    public static Optional<ConfigManager> of(String modID) {
+        return CompleteConfig.getManager(modID);
+    }
+
+    ConfigManager(String modID, GuiBuilder guiBuilder) {
         this.modID = modID;
         jsonPath = Paths.get(FabricLoader.getInstance().getConfigDir().toString(), modID + ".json");
         config = new Config(modID, load());
-        guiBuilder = new GuiBuilder(this, config);
+        this.guiBuilder = guiBuilder;
     }
 
     private JsonElement load() {
@@ -65,29 +78,17 @@ public final class ConfigManager {
         }
     }
 
-    public GuiRegistry getGuiRegistry() {
-        return guiBuilder.getRegistry();
-    }
-
-    public void setCustomGuiSupplier(Supplier<ConfigBuilder> supplier) {
-        guiBuilder.setSupplier(supplier);
-    }
-
-    /**
-     * @deprecated Use {@link #setCustomGuiSupplier(Supplier)}.
-     */
-    @Deprecated
-    public void setCustomGuiBuilder(Supplier<ConfigBuilder> guiBuilder) {
-        setCustomGuiSupplier(guiBuilder);
-    }
-
     /**
      * Generates the configuration GUI.
      * @param parentScreen The parent screen
      * @return The generated configuration screen
      */
+    @Environment(EnvType.CLIENT)
     public Screen buildScreen(Screen parentScreen) {
-        return guiBuilder.buildScreen(parentScreen, this::save);
+        if(guiBuilder == null) {
+            throw new UnsupportedOperationException("No GUI builder provided");
+        }
+        return guiBuilder.buildScreen(parentScreen, config, this::save);
     }
 
     /**

+ 5 - 54
src/main/java/me/lortseam/completeconfig/gui/GuiBuilder.java

@@ -1,62 +1,13 @@
 package me.lortseam.completeconfig.gui;
 
-import lombok.Getter;
-import lombok.Setter;
 import me.lortseam.completeconfig.Config;
-import me.lortseam.completeconfig.ConfigManager;
-import me.lortseam.completeconfig.collection.Collection;
-import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
-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.TranslatableText;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-import java.util.function.Supplier;
+@Environment(EnvType.CLIENT)
+public interface GuiBuilder {
 
-public class GuiBuilder {
+    Screen buildScreen(Screen parentScreen, Config config, Runnable savingRunnable);
 
-    private final ConfigManager manager;
-    private final Config config;
-    @Setter
-    private Supplier<ConfigBuilder> supplier = ConfigBuilder::create;
-    @Getter
-    private final GuiRegistry registry = new GuiRegistry();
-
-    public GuiBuilder(ConfigManager manager, Config config) {
-        this.manager = manager;
-        this.config = config;
-    }
-
-    public Screen buildScreen(Screen parentScreen, Runnable savingRunnable) {
-        ConfigBuilder builder = supplier.get();
-        builder.setParentScreen(parentScreen)
-                .setTitle(new TranslatableText(config.getModTranslationKey() + ".title"))
-                .setSavingRunnable(savingRunnable);
-        config.values().forEach(collection -> {
-            ConfigCategory configCategory = builder.getOrCreateCategory(collection.getText());
-            for (AbstractConfigListEntry<?> entry : buildCollection(collection)) {
-                configCategory.addEntry(entry);
-            }
-        });
-        return builder.build();
-    }
-
-    private List<AbstractConfigListEntry> buildCollection(Collection collection) {
-        List<AbstractConfigListEntry> collectionGui = new ArrayList<>();
-        collection.getEntries().values().forEach(entry -> collectionGui.add(((Optional<GuiProvider>) manager.getGuiRegistry().getProvider(entry)).orElseGet(() -> {
-            throw new UnsupportedOperationException("Could not find gui provider for field " + entry.getField());
-        }).build(entry.getText(), entry.getField(), entry.getValue(), entry.getDefaultValue(), entry.getTooltip(), entry.getExtras(), entry::setValue, entry.requiresRestart())));
-        collection.getCollections().values().forEach(c -> {
-            SubCategoryBuilder subBuilder = ConfigEntryBuilder.create().startSubCategory(c.getText());
-            subBuilder.addAll(buildCollection(c));
-            collectionGui.add(subBuilder.build());
-        });
-        return collectionGui;
-    }
-    
 }

+ 65 - 0
src/main/java/me/lortseam/completeconfig/gui/cloth/ClothGuiBuilder.java

@@ -0,0 +1,65 @@
+package me.lortseam.completeconfig.gui.cloth;
+
+import lombok.Getter;
+import me.lortseam.completeconfig.Config;
+import me.lortseam.completeconfig.collection.Collection;
+import me.lortseam.completeconfig.gui.GuiBuilder;
+import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
+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.TranslatableText;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.function.Supplier;
+
+@Environment(EnvType.CLIENT)
+public class ClothGuiBuilder implements GuiBuilder {
+
+    private final Supplier<ConfigBuilder> supplier;
+    @Getter
+    private final GuiRegistry registry = new GuiRegistry();
+
+    public ClothGuiBuilder(Supplier<ConfigBuilder> supplier) {
+        this.supplier = supplier;
+    }
+
+    public ClothGuiBuilder() {
+        this(ConfigBuilder::create);
+    }
+
+    @Override
+    public Screen buildScreen(Screen parentScreen, Config config, Runnable savingRunnable) {
+        ConfigBuilder builder = supplier.get();
+        builder.setParentScreen(parentScreen)
+                .setTitle(new TranslatableText(config.getModTranslationKey() + ".title"))
+                .setSavingRunnable(savingRunnable);
+        config.values().forEach(collection -> {
+            ConfigCategory configCategory = builder.getOrCreateCategory(collection.getText());
+            for (AbstractConfigListEntry<?> entry : buildCollection(collection)) {
+                configCategory.addEntry(entry);
+            }
+        });
+        return builder.build();
+    }
+
+    private List<AbstractConfigListEntry> buildCollection(Collection collection) {
+        List<AbstractConfigListEntry> collectionGui = new ArrayList<>();
+        collection.getEntries().values().forEach(entry -> collectionGui.add(((Optional<GuiProvider>) registry.getProvider(entry)).orElseGet(() -> {
+            throw new UnsupportedOperationException("Could not find gui provider for field " + entry.getField());
+        }).build(entry.getText(), entry.getField(), entry.getValue(), entry.getDefaultValue(), entry.getTooltip(), entry.getExtras(), entry::setValue, entry.requiresRestart())));
+        collection.getCollections().values().forEach(c -> {
+            SubCategoryBuilder subBuilder = ConfigEntryBuilder.create().startSubCategory(c.getText());
+            subBuilder.addAll(buildCollection(c));
+            collectionGui.add(subBuilder.build());
+        });
+        return collectionGui;
+    }
+
+}

+ 4 - 1
src/main/java/me/lortseam/completeconfig/gui/GuiProvider.java → src/main/java/me/lortseam/completeconfig/gui/cloth/GuiProvider.java

@@ -1,13 +1,16 @@
-package me.lortseam.completeconfig.gui;
+package me.lortseam.completeconfig.gui.cloth;
 
 import me.lortseam.completeconfig.entry.Extras;
 import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.text.Text;
 
 import java.lang.reflect.Field;
 import java.util.Optional;
 import java.util.function.Consumer;
 
+@Environment(EnvType.CLIENT)
 @FunctionalInterface
 public interface GuiProvider<T> {
 

+ 4 - 1
src/main/java/me/lortseam/completeconfig/gui/GuiProviderPredicate.java → src/main/java/me/lortseam/completeconfig/gui/cloth/GuiProviderPredicate.java

@@ -1,10 +1,13 @@
-package me.lortseam.completeconfig.gui;
+package me.lortseam.completeconfig.gui.cloth;
 
 import me.lortseam.completeconfig.entry.Extras;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 
 import java.lang.reflect.Field;
 import java.util.Objects;
 
+@Environment(EnvType.CLIENT)
 @FunctionalInterface
 public interface GuiProviderPredicate<T> {
 

+ 4 - 1
src/main/java/me/lortseam/completeconfig/gui/GuiProviderRegistration.java → src/main/java/me/lortseam/completeconfig/gui/cloth/GuiProviderRegistration.java

@@ -1,12 +1,15 @@
-package me.lortseam.completeconfig.gui;
+package me.lortseam.completeconfig.gui.cloth;
 
 import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import me.lortseam.completeconfig.entry.Entry;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 
 import java.util.function.Predicate;
 
+@Environment(EnvType.CLIENT)
 @RequiredArgsConstructor(access = AccessLevel.PACKAGE)
 //TODO: Functional interfaces should not get extended
 class GuiProviderRegistration<T> implements Predicate<Entry<?>> {

+ 4 - 1
src/main/java/me/lortseam/completeconfig/gui/GuiRegistry.java → src/main/java/me/lortseam/completeconfig/gui/cloth/GuiRegistry.java

@@ -1,4 +1,4 @@
-package me.lortseam.completeconfig.gui;
+package me.lortseam.completeconfig.gui.cloth;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.MoreCollectors;
@@ -8,6 +8,8 @@ import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
 import me.shedaniel.clothconfig2.api.ConfigEntryBuilder;
 import me.shedaniel.clothconfig2.impl.builders.DropdownMenuBuilder;
 import me.shedaniel.clothconfig2.impl.builders.FieldBuilder;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import org.apache.commons.lang3.ArrayUtils;
 
 import java.lang.reflect.ParameterizedType;
@@ -19,6 +21,7 @@ import java.util.Optional;
 import java.util.function.Consumer;
 import java.util.function.Function;
 
+@Environment(EnvType.CLIENT)
 public class GuiRegistry {
 
     //TODO: Only used for setting requireRestart cause that method returns void, should be done differently

+ 3 - 1
src/main/resources/fabric.mod.json

@@ -19,7 +19,9 @@
   "environment": "client",
 
   "depends": {
-    "fabricloader": ">=0.9.0",
+    "fabricloader": ">=0.9.0"
+  },
+  "suggests": {
     "cloth-config2": "*"
   }
 }