Przeglądaj źródła

Add Key and ModifierKeyCode types

Lortseam 3 lat temu
rodzic
commit
6f647a5476

+ 4 - 0
example/src/main/java/me/lortseam/completeconfig/example/Settings.java

@@ -5,7 +5,9 @@ import me.lortseam.completeconfig.api.ConfigEntries;
 import me.lortseam.completeconfig.api.ConfigEntry;
 import me.lortseam.completeconfig.api.ConfigGroup;
 import me.lortseam.completeconfig.data.Config;
+import me.shedaniel.clothconfig2.api.ModifierKeyCode;
 import me.shedaniel.math.Color;
+import net.minecraft.client.util.InputUtil;
 
 import java.util.Arrays;
 import java.util.List;
@@ -37,6 +39,8 @@ public final class Settings extends Config implements ConfigContainer {
         private List<String> list = Arrays.asList("First entry", "Second entry");
         private String[] array = new String[0];
         private Color color = Color.ofRGB(0, 255, 0);
+        private InputUtil.Key key = InputUtil.UNKNOWN_KEY;
+        private ModifierKeyCode modKey = ModifierKeyCode.unknown();
 
     }
 

+ 8 - 3
lib/src/main/java/me/lortseam/completeconfig/CompleteConfig.java

@@ -4,10 +4,14 @@ import com.google.common.collect.Sets;
 import lombok.NonNull;
 import lombok.experimental.UtilityClass;
 import lombok.extern.log4j.Log4j2;
-import me.lortseam.completeconfig.extension.*;
+import me.lortseam.completeconfig.extension.BaseExtension;
+import me.lortseam.completeconfig.extension.ClientExtension;
+import me.lortseam.completeconfig.extension.Extension;
+import me.lortseam.completeconfig.extension.ServerExtension;
 import me.lortseam.completeconfig.extension.clothbasicmath.ClothBasicMathExtension;
+import me.lortseam.completeconfig.extension.clothconfig.ClothConfigExtension;
 import me.lortseam.completeconfig.extension.clothconfig.GuiExtension;
-import me.lortseam.completeconfig.extension.minecraft.MinecraftClientExtension;
+import me.lortseam.completeconfig.extension.minecraft.MinecraftExtension;
 import me.lortseam.completeconfig.util.ReflectionUtils;
 import net.fabricmc.api.EnvType;
 import net.fabricmc.loader.api.FabricLoader;
@@ -29,8 +33,9 @@ public final class CompleteConfig {
         registerExtensionType(ClientExtension.class, EnvType.CLIENT);
         registerExtensionType(ServerExtension.class, EnvType.SERVER);
         registerExtensionType(GuiExtension.class, EnvType.CLIENT, "cloth-config2");
-        registerExtension(MinecraftClientExtension.class);
+        registerExtension(MinecraftExtension.class);
         registerExtension("cloth-basic-math", ClothBasicMathExtension.class);
+        registerExtension("cloth-config2", ClothConfigExtension.class);
         for (EntrypointContainer<BaseExtension> entrypoint : FabricLoader.getInstance().getEntrypointContainers("completeconfig-extension", BaseExtension.class)) {
             registerExtension(entrypoint.getEntrypoint());
         }

+ 55 - 0
lib/src/main/java/me/lortseam/completeconfig/extension/clothconfig/ClothConfigClientExtension.java

@@ -0,0 +1,55 @@
+package me.lortseam.completeconfig.extension.clothconfig;
+
+import me.lortseam.completeconfig.extension.ClientExtension;
+import me.shedaniel.clothconfig2.api.Modifier;
+import me.shedaniel.clothconfig2.api.ModifierKeyCode;
+import net.minecraft.client.util.InputUtil;
+import org.spongepowered.configurate.ConfigurationNode;
+import org.spongepowered.configurate.serialize.SerializationException;
+import org.spongepowered.configurate.serialize.TypeSerializer;
+import org.spongepowered.configurate.serialize.TypeSerializerCollection;
+
+import java.lang.reflect.Type;
+import java.util.Map;
+
+import static java.util.Objects.requireNonNull;
+
+public final class ClothConfigClientExtension implements ClientExtension {
+
+    @Override
+    public TypeSerializerCollection getTypeSerializers() {
+        return TypeSerializerCollection.builder()
+                .register(ModifierKeyCode.class, new ModifierKeyCodeSerializer())
+                .build();
+    }
+
+    private static final class ModifierKeyCodeSerializer implements TypeSerializer<ModifierKeyCode> {
+
+        @Override
+        public ModifierKeyCode deserialize(Type type, ConfigurationNode node) throws SerializationException {
+            if (node.isMap()) {
+                var map = node.childrenMap();
+                var key = InputUtil.fromTranslationKey(requireNonNull(map.get("keyCode"), "keyCode").getString());
+                if (key == InputUtil.UNKNOWN_KEY) {
+                    return ModifierKeyCode.unknown();
+                }
+                var modifier = Modifier.none();
+                if (map.containsKey("modifier")) {
+                    modifier = Modifier.of((short) map.get("modifier").getInt());
+                }
+                return ModifierKeyCode.of(key, modifier);
+            }
+            throw new SerializationException(node, type, "Node must be of type map");
+        }
+
+        @Override
+        public void serialize(Type type, ModifierKeyCode obj, ConfigurationNode node) throws SerializationException {
+            node.set(Map.of(
+                    "keyCode", obj.getKeyCode().getTranslationKey(),
+                    "modifier", obj.getModifier().getValue()
+            ));
+        }
+
+    }
+
+}

+ 16 - 0
lib/src/main/java/me/lortseam/completeconfig/extension/clothconfig/ClothConfigExtension.java

@@ -0,0 +1,16 @@
+package me.lortseam.completeconfig.extension.clothconfig;
+
+import com.google.common.collect.ImmutableSet;
+import me.lortseam.completeconfig.extension.BaseExtension;
+import me.lortseam.completeconfig.extension.Extension;
+
+import java.util.Set;
+
+public final class ClothConfigExtension implements BaseExtension {
+
+    @Override
+    public Set<Class<? extends Extension>> children() {
+        return ImmutableSet.of(ClothConfigClientExtension.class, ClothConfigGuiExtension.class);
+    }
+
+}

+ 22 - 0
lib/src/main/java/me/lortseam/completeconfig/extension/clothconfig/ClothConfigGuiExtension.java

@@ -0,0 +1,22 @@
+package me.lortseam.completeconfig.extension.clothconfig;
+
+import me.lortseam.completeconfig.data.Entry;
+import me.lortseam.completeconfig.gui.cloth.GuiProvider;
+import me.shedaniel.clothconfig2.api.ConfigEntryBuilder;
+import me.shedaniel.clothconfig2.api.ModifierKeyCode;
+
+public final class ClothConfigGuiExtension implements GuiExtension {
+
+    @Override
+    public GuiProvider[] getProviders() {
+        return new GuiProvider[] {
+                GuiProvider.create((Entry<ModifierKeyCode> entry) -> ConfigEntryBuilder.create()
+                        .startModifierKeyCodeField(entry.getText(), entry.getValue())
+                        .setDefaultValue(entry.getDefaultValue())
+                        .setTooltip(entry.getTooltip())
+                        .setModifierSaveConsumer(entry::setValue),
+                        ModifierKeyCode.class)
+        };
+    }
+
+}

+ 8 - 1
lib/src/main/java/me/lortseam/completeconfig/extension/minecraft/MinecraftClientExtension.java

@@ -5,13 +5,14 @@ import lombok.NoArgsConstructor;
 import me.lortseam.completeconfig.data.ColorEntry;
 import me.lortseam.completeconfig.data.transform.Transformation;
 import me.lortseam.completeconfig.extension.ClientExtension;
+import net.minecraft.client.util.InputUtil;
 import net.minecraft.text.TextColor;
 import org.spongepowered.configurate.serialize.CoercionFailedException;
 import org.spongepowered.configurate.serialize.TypeSerializer;
 import org.spongepowered.configurate.serialize.TypeSerializerCollection;
 
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
-public class MinecraftClientExtension implements ClientExtension {
+public final class MinecraftClientExtension implements ClientExtension {
 
     @Override
     public TypeSerializerCollection getTypeSerializers() {
@@ -22,6 +23,12 @@ public class MinecraftClientExtension implements ClientExtension {
                     }
                     throw new CoercionFailedException(v, TextColor.class.getSimpleName());
                 }))
+                .registerExact(TypeSerializer.of(InputUtil.Key.class, (v, pass) -> v.getTranslationKey(), v -> {
+                    if(v instanceof String) {
+                        return InputUtil.fromTranslationKey((String) v);
+                    }
+                    throw new CoercionFailedException(v, InputUtil.Key.class.getSimpleName());
+                }))
                 .build();
     }
 

+ 16 - 0
lib/src/main/java/me/lortseam/completeconfig/extension/minecraft/MinecraftExtension.java

@@ -0,0 +1,16 @@
+package me.lortseam.completeconfig.extension.minecraft;
+
+import com.google.common.collect.ImmutableSet;
+import me.lortseam.completeconfig.extension.BaseExtension;
+import me.lortseam.completeconfig.extension.Extension;
+
+import java.util.Set;
+
+public final class MinecraftExtension implements BaseExtension {
+
+    @Override
+    public Set<Class<? extends Extension>> children() {
+        return ImmutableSet.of(MinecraftClientExtension.class, MinecraftGuiExtension.class);
+    }
+
+}

+ 23 - 0
lib/src/main/java/me/lortseam/completeconfig/extension/minecraft/MinecraftGuiExtension.java

@@ -0,0 +1,23 @@
+package me.lortseam.completeconfig.extension.minecraft;
+
+import me.lortseam.completeconfig.data.Entry;
+import me.lortseam.completeconfig.extension.clothconfig.GuiExtension;
+import me.lortseam.completeconfig.gui.cloth.GuiProvider;
+import me.shedaniel.clothconfig2.api.ConfigEntryBuilder;
+import net.minecraft.client.util.InputUtil;
+
+public final class MinecraftGuiExtension implements GuiExtension {
+
+    @Override
+    public GuiProvider[] getProviders() {
+        return new GuiProvider[] {
+                GuiProvider.create((Entry<InputUtil.Key> entry) -> ConfigEntryBuilder.create()
+                        .startKeyCodeField(entry.getText(), entry.getValue())
+                        .setDefaultValue(entry.getDefaultValue())
+                        .setTooltip(entry.getTooltip())
+                        .setSaveConsumer(entry::setValue),
+                        InputUtil.Key.class)
+        };
+    }
+
+}