diff --git a/build.gradle b/build.gradle index cf3f8031..3c626aab 100644 --- a/build.gradle +++ b/build.gradle @@ -55,7 +55,7 @@ dependencies { //modRuntimeOnly "maven.modrinth:nvidium:0.2.6-beta" modCompileOnly "maven.modrinth:nvidium:0.2.6-beta" - modImplementation("maven.modrinth:cloth-config:13.0.121+fabric") + include(modImplementation("maven.modrinth:cloth-config:13.0.121+fabric")) modImplementation("maven.modrinth:modmenu:9.0.0") modCompileOnly("maven.modrinth:iris:1.6.17+1.20.4") modCompileOnly("maven.modrinth:starlight:1.1.3+1.20.4") diff --git a/src/main/java/me/cortex/voxy/client/Voxy.java b/src/main/java/me/cortex/voxy/client/Voxy.java index b947c8db..92dfe56d 100644 --- a/src/main/java/me/cortex/voxy/client/Voxy.java +++ b/src/main/java/me/cortex/voxy/client/Voxy.java @@ -3,7 +3,7 @@ package me.cortex.voxy.client; import me.cortex.voxy.client.core.VoxelCore; import me.cortex.voxy.client.saver.ContextSelectionSystem; import me.cortex.voxy.client.terrain.WorldImportCommand; -import me.cortex.voxy.common.storage.config.Serialization; +import me.cortex.voxy.common.config.Serialization; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.fabricmc.loader.api.FabricLoader; diff --git a/src/main/java/me/cortex/voxy/client/config/BlockConfig.java b/src/main/java/me/cortex/voxy/client/config/BlockConfig.java new file mode 100644 index 00000000..ff8dc37d --- /dev/null +++ b/src/main/java/me/cortex/voxy/client/config/BlockConfig.java @@ -0,0 +1,28 @@ +package me.cortex.voxy.client.config; + +import net.minecraft.block.Block; +import net.minecraft.block.Blocks; + +public class BlockConfig { + public Block block = Blocks.AIR; + public boolean ignoreBlock = false; + public final Face[] faces = new Face[6]; + public float colourMultiplier = 1.0f; + + public BlockConfig() { + for (int i = 0; i < this.faces.length; i++) { + this.faces[i] = new Face(); + } + } + + public static class Face { + public BooleanChoice occludes = BooleanChoice.DEFAULT; + public BooleanChoice canBeOccluded = BooleanChoice.DEFAULT; + } + + public enum BooleanChoice { + DEFAULT, + TRUE, + FALSE + } +} diff --git a/src/main/java/me/cortex/voxy/client/config/VoxyConfigScreenFactory.java b/src/main/java/me/cortex/voxy/client/config/VoxyConfigScreenFactory.java index e2b5077e..39bfd599 100644 --- a/src/main/java/me/cortex/voxy/client/config/VoxyConfigScreenFactory.java +++ b/src/main/java/me/cortex/voxy/client/config/VoxyConfigScreenFactory.java @@ -39,7 +39,7 @@ public class VoxyConfigScreenFactory implements ModMenuApi { VoxyConfig.CONFIG.save(); }); - return builder.build();//ClothConfigDemo.getConfigBuilderWithDemo().build(); + return builder.build();// } private static void addGeneralCategory(ConfigBuilder builder, VoxyConfig config) { diff --git a/src/main/java/me/cortex/voxy/client/config/screens/BlockConfigScreen.java b/src/main/java/me/cortex/voxy/client/config/screens/BlockConfigScreen.java new file mode 100644 index 00000000..1810ea70 --- /dev/null +++ b/src/main/java/me/cortex/voxy/client/config/screens/BlockConfigScreen.java @@ -0,0 +1,17 @@ +package me.cortex.voxy.client.config.screens; + +import me.cortex.voxy.client.config.BlockConfig; +import me.shedaniel.clothconfig2.api.AbstractConfigEntry; +import me.shedaniel.clothconfig2.api.AbstractConfigListEntry; +import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; +import net.minecraft.block.Blocks; +import net.minecraft.text.Text; + +public class BlockConfigScreen { + private static final ConfigEntryBuilder ENTRY_BUILDER = ConfigEntryBuilder.create(); + public static AbstractConfigListEntry makeScreen(BlockConfig config) { + var entry = ENTRY_BUILDER.startSubCategory(config.block.getName()); + entry.add(UtilityScreens.makeBlockSelectionScreen(Text.literal("a"), Blocks.AIR, null)); + return null; + } +} diff --git a/src/main/java/me/cortex/voxy/client/config/screens/UtilityScreens.java b/src/main/java/me/cortex/voxy/client/config/screens/UtilityScreens.java new file mode 100644 index 00000000..822e249b --- /dev/null +++ b/src/main/java/me/cortex/voxy/client/config/screens/UtilityScreens.java @@ -0,0 +1,29 @@ +package me.cortex.voxy.client.config.screens; + +import me.cortex.voxy.client.config.BlockConfig; +import me.shedaniel.clothconfig2.api.AbstractConfigEntry; +import me.shedaniel.clothconfig2.api.AbstractConfigListEntry; +import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; +import me.shedaniel.clothconfig2.impl.builders.DropdownMenuBuilder; +import net.minecraft.block.Block; +import net.minecraft.block.Blocks; +import net.minecraft.registry.Registries; +import net.minecraft.text.Text; + +import java.util.function.Consumer; + +public class UtilityScreens { + private static final ConfigEntryBuilder ENTRY_BUILDER = ConfigEntryBuilder.create(); + public static AbstractConfigListEntry makeBlockSelectionScreen(Text name, Block selectedBlock, Consumer onSave) { + return makeBlockSelectionScreen(name, Blocks.AIR, selectedBlock, onSave); + } + public static AbstractConfigListEntry makeBlockSelectionScreen(Text name, Block defaultBlock, Block selectedBlock, Consumer onSave) { + return ENTRY_BUILDER.startDropdownMenu(name, + DropdownMenuBuilder.TopCellElementBuilder.ofBlockObject(selectedBlock), + DropdownMenuBuilder.CellCreatorBuilder.ofBlockObject()) + .setDefaultValue(defaultBlock) + .setSelections(Registries.BLOCK.stream().toList()) + .setSaveConsumer(onSave) + .build(); + } +} diff --git a/src/main/java/me/cortex/voxy/client/saver/ContextSelectionSystem.java b/src/main/java/me/cortex/voxy/client/saver/ContextSelectionSystem.java index cebf08da..327421ad 100644 --- a/src/main/java/me/cortex/voxy/client/saver/ContextSelectionSystem.java +++ b/src/main/java/me/cortex/voxy/client/saver/ContextSelectionSystem.java @@ -4,17 +4,15 @@ import me.cortex.voxy.client.config.VoxyConfig; import me.cortex.voxy.common.storage.StorageBackend; import me.cortex.voxy.common.storage.compressors.ZSTDCompressor; import me.cortex.voxy.common.storage.config.ConfigBuildCtx; -import me.cortex.voxy.common.storage.config.Serialization; +import me.cortex.voxy.common.config.Serialization; import me.cortex.voxy.common.storage.config.StorageConfig; import me.cortex.voxy.common.storage.other.CompressionStorageAdaptor; -import me.cortex.voxy.common.storage.other.TranslocatingStorageAdaptor; import me.cortex.voxy.common.storage.rocksdb.RocksDBStorageBackend; import me.cortex.voxy.common.world.WorldEngine; import net.minecraft.client.MinecraftClient; import net.minecraft.client.world.ClientWorld; import net.minecraft.util.WorldSavePath; -import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; diff --git a/src/main/java/me/cortex/voxy/common/storage/config/Serialization.java b/src/main/java/me/cortex/voxy/common/config/Serialization.java similarity index 91% rename from src/main/java/me/cortex/voxy/common/storage/config/Serialization.java rename to src/main/java/me/cortex/voxy/common/config/Serialization.java index af9eded0..ef95a517 100644 --- a/src/main/java/me/cortex/voxy/common/storage/config/Serialization.java +++ b/src/main/java/me/cortex/voxy/common/config/Serialization.java @@ -1,10 +1,8 @@ -package me.cortex.voxy.common.storage.config; +package me.cortex.voxy.common.config; import com.google.gson.*; -import com.google.gson.internal.bind.JsonTreeWriter; import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; import net.fabricmc.loader.api.FabricLoader; @@ -13,14 +11,12 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.lang.reflect.Method; -import java.lang.reflect.Type; +import java.lang.reflect.Modifier; import java.nio.file.Files; import java.nio.file.Path; import java.util.*; -import java.util.jar.JarFile; import java.util.stream.Collectors; import java.util.stream.Stream; -import java.util.zip.ZipEntry; public class Serialization { public static final Set> CONFIG_TYPES = new HashSet<>(); @@ -93,21 +89,34 @@ public class Serialization { } static { + String BASE_SEARCH_PACKAGE = "me.cortex.voxy"; + Map, GsonConfigSerialization> serializers = new HashMap<>(); Set clazzs = new LinkedHashSet<>(); var path = FabricLoader.getInstance().getModContainer("voxy").get().getRootPaths().get(0); - clazzs.addAll(collectAllClasses(path, "me.cortex.voxy.common.storage")); - clazzs.addAll(collectAllClasses("me.cortex.voxy.common.storage")); + clazzs.addAll(collectAllClasses(path, BASE_SEARCH_PACKAGE)); + clazzs.addAll(collectAllClasses(BASE_SEARCH_PACKAGE)); outer: for (var clzName : clazzs) { + if (!clzName.toLowerCase().contains("config")) { + continue;//Only load classes that contain the word config + } + if (clzName.contains("mixin")) { + continue;//Dont want to load mixins + } + if (clzName.equals(Serialization.class.getName())) { continue;//Dont want to load ourselves } try { var clz = Class.forName(clzName); + if (Modifier.isAbstract(clz.getModifiers())) { + //Dont want to register abstract classes + continue; + } var original = clz; while ((clz = clz.getSuperclass()) != null) { if (CONFIG_TYPES.contains(clz)) { diff --git a/src/main/java/me/cortex/voxy/common/storage/config/CompressorConfig.java b/src/main/java/me/cortex/voxy/common/storage/config/CompressorConfig.java index 574ef0d4..9fa0a14e 100644 --- a/src/main/java/me/cortex/voxy/common/storage/config/CompressorConfig.java +++ b/src/main/java/me/cortex/voxy/common/storage/config/CompressorConfig.java @@ -1,5 +1,6 @@ package me.cortex.voxy.common.storage.config; +import me.cortex.voxy.common.config.Serialization; import me.cortex.voxy.common.storage.StorageCompressor; public abstract class CompressorConfig { diff --git a/src/main/java/me/cortex/voxy/common/storage/config/StorageConfig.java b/src/main/java/me/cortex/voxy/common/storage/config/StorageConfig.java index 48371a76..6fd65f45 100644 --- a/src/main/java/me/cortex/voxy/common/storage/config/StorageConfig.java +++ b/src/main/java/me/cortex/voxy/common/storage/config/StorageConfig.java @@ -1,5 +1,6 @@ package me.cortex.voxy.common.storage.config; +import me.cortex.voxy.common.config.Serialization; import me.cortex.voxy.common.storage.StorageBackend; import java.util.ArrayList; diff --git a/src/main/java/me/cortex/voxy/common/storage/other/ConditionalStorageBackendConfig.java b/src/main/java/me/cortex/voxy/common/storage/other/ConditionalStorageBackendConfig.java index ffa1992c..d6869577 100644 --- a/src/main/java/me/cortex/voxy/common/storage/other/ConditionalStorageBackendConfig.java +++ b/src/main/java/me/cortex/voxy/common/storage/other/ConditionalStorageBackendConfig.java @@ -2,13 +2,9 @@ package me.cortex.voxy.common.storage.other; import me.cortex.voxy.common.storage.StorageBackend; import me.cortex.voxy.common.storage.config.ConfigBuildCtx; -import me.cortex.voxy.common.storage.config.Serialization; import me.cortex.voxy.common.storage.config.StorageConfig; import org.apache.commons.lang3.NotImplementedException; -import java.util.ArrayList; -import java.util.List; - //A conditional storage backend depending on build time config, this enables conditional backends depending on the // dimension as an example public class ConditionalStorageBackendConfig extends StorageConfig {