diff --git a/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java index a0f2c8bfe..030efeef3 100644 --- a/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java @@ -2,6 +2,8 @@ package com.dfsek.terra.config.pack; import com.dfsek.paralithic.eval.parser.Scope; import com.dfsek.tectonic.abstraction.AbstractConfigLoader; +import com.dfsek.tectonic.config.ConfigTemplate; +import com.dfsek.tectonic.config.Configuration; import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; @@ -24,14 +26,7 @@ import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.config.builder.BiomeBuilder; import com.dfsek.terra.config.dummy.DummyWorld; -import com.dfsek.terra.config.factories.BiomeFactory; -import com.dfsek.terra.config.factories.CarverFactory; import com.dfsek.terra.config.factories.ConfigFactory; -import com.dfsek.terra.config.factories.FloraFactory; -import com.dfsek.terra.config.factories.OreFactory; -import com.dfsek.terra.config.factories.PaletteFactory; -import com.dfsek.terra.config.factories.StructureFactory; -import com.dfsek.terra.config.factories.TreeFactory; import com.dfsek.terra.config.fileloaders.FolderLoader; import com.dfsek.terra.config.fileloaders.Loader; import com.dfsek.terra.config.fileloaders.ZIPLoader; @@ -41,14 +36,9 @@ import com.dfsek.terra.config.loaders.config.biome.templates.provider.ImageProvi import com.dfsek.terra.config.loaders.config.biome.templates.provider.SingleBiomeProviderTemplate; import com.dfsek.terra.config.loaders.config.sampler.NoiseSamplerBuilderLoader; import com.dfsek.terra.config.loaders.config.sampler.templates.ImageSamplerTemplate; +import com.dfsek.terra.config.prototype.ConfigType; +import com.dfsek.terra.config.prototype.ProtoConfig; import com.dfsek.terra.config.templates.AbstractableTemplate; -import com.dfsek.terra.config.templates.BiomeTemplate; -import com.dfsek.terra.config.templates.CarverTemplate; -import com.dfsek.terra.config.templates.FloraTemplate; -import com.dfsek.terra.config.templates.OreTemplate; -import com.dfsek.terra.config.templates.PaletteTemplate; -import com.dfsek.terra.config.templates.StructureTemplate; -import com.dfsek.terra.config.templates.TreeTemplate; import com.dfsek.terra.registry.OpenRegistry; import com.dfsek.terra.registry.config.BiomeRegistry; import com.dfsek.terra.registry.config.CarverRegistry; @@ -74,7 +64,9 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.Enumeration; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -224,14 +216,22 @@ public class ConfigPack implements LoaderRegistrar { } }).close(); - loader - .open("carving", ".yml").then(streams -> buildAll(new CarverFactory(this), carverRegistry, abstractConfigLoader.load(streams, CarverTemplate::new), main)).close() - .open("palettes", ".yml").then(streams -> buildAll(new PaletteFactory(), paletteRegistry, abstractConfigLoader.load(streams, PaletteTemplate::new), main)).close() - .open("ores", ".yml").then(streams -> buildAll(new OreFactory(), oreRegistry, abstractConfigLoader.load(streams, OreTemplate::new), main)).close() - .open("structures/trees", ".yml").then(streams -> buildAll(new TreeFactory(), treeRegistry, abstractConfigLoader.load(streams, TreeTemplate::new), main)).close() - .open("structures/structures", ".yml").then(streams -> buildAll(new StructureFactory(), structureRegistry, abstractConfigLoader.load(streams, StructureTemplate::new), main)).close() - .open("flora", ".yml").then(streams -> buildAll(new FloraFactory(), floraRegistry, abstractConfigLoader.load(streams, FloraTemplate::new), main)).close() - .open("biomes", ".yml").then(streams -> buildAll(new BiomeFactory(this), biomeRegistry, abstractConfigLoader.load(streams, () -> new BiomeTemplate(this, main)), main)).close(); + List configurations = new ArrayList<>(); + + loader.open("", ".yml").then(streams -> streams.forEach(stream -> configurations.add(new Configuration(stream)))); + + ConfigLoader protoLoader = new ConfigLoader(); + Map, List> configs = new HashMap<>(); + + for(Configuration configuration : configurations) { + ProtoConfig config = new ProtoConfig(); + protoLoader.load(config, configuration); + configs.computeIfAbsent(config.getType(), configType -> new ArrayList<>()).add(configuration); + } + + for(Map.Entry, List> entry : configs.entrySet()) { + abstractConfigLoader.loadConfigs(entry.getValue(), () -> entry.getKey().getTemplate(this, main)); + } main.getEventManager().callEvent(new ConfigPackPostLoadEvent(this)); main.logger().info("Loaded config pack \"" + template.getID() + "\" v" + template.getVersion() + " by " + template.getAuthor() + " in " + (System.nanoTime() - start) / 1000000D + "ms."); diff --git a/common/src/main/java/com/dfsek/terra/config/prototype/ConfigType.java b/common/src/main/java/com/dfsek/terra/config/prototype/ConfigType.java new file mode 100644 index 000000000..0d87f8bfc --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/config/prototype/ConfigType.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.config.prototype; + +import com.dfsek.tectonic.config.ConfigTemplate; +import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.config.pack.ConfigPack; + +@FunctionalInterface +public interface ConfigType { + T getTemplate(ConfigPack pack, TerraPlugin main); + +} diff --git a/common/src/main/java/com/dfsek/terra/config/prototype/ProtoConfig.java b/common/src/main/java/com/dfsek/terra/config/prototype/ProtoConfig.java new file mode 100644 index 000000000..bc1aec46b --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/config/prototype/ProtoConfig.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.config.prototype; + +import com.dfsek.tectonic.annotations.Value; +import com.dfsek.tectonic.config.ConfigTemplate; + +public class ProtoConfig implements ConfigTemplate { + @Value("id") + private String id; + + @Value("type") + private ConfigType type; + + + public String getId() { + return id; + } + + public ConfigType getType() { + return type; + } +} diff --git a/common/src/main/java/com/dfsek/terra/registry/master/ConfigTypeRegistry.java b/common/src/main/java/com/dfsek/terra/registry/master/ConfigTypeRegistry.java new file mode 100644 index 000000000..561208ec1 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/registry/master/ConfigTypeRegistry.java @@ -0,0 +1,41 @@ +package com.dfsek.terra.registry.master; + +import com.dfsek.tectonic.exception.LoadException; +import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.registry.CheckedRegistry; +import com.dfsek.terra.config.factories.BiomeFactory; +import com.dfsek.terra.config.factories.CarverFactory; +import com.dfsek.terra.config.factories.ConfigFactory; +import com.dfsek.terra.config.factories.FloraFactory; +import com.dfsek.terra.config.factories.OreFactory; +import com.dfsek.terra.config.factories.PaletteFactory; +import com.dfsek.terra.config.factories.StructureFactory; +import com.dfsek.terra.config.factories.TreeFactory; +import com.dfsek.terra.config.prototype.ConfigType; +import com.dfsek.terra.config.templates.AbstractableTemplate; +import com.dfsek.terra.config.templates.BiomeTemplate; +import com.dfsek.terra.config.templates.CarverTemplate; +import com.dfsek.terra.config.templates.FloraTemplate; +import com.dfsek.terra.config.templates.OreTemplate; +import com.dfsek.terra.config.templates.PaletteTemplate; +import com.dfsek.terra.config.templates.StructureTemplate; +import com.dfsek.terra.config.templates.TreeTemplate; +import com.dfsek.terra.registry.OpenRegistry; + +public class ConfigTypeRegistry extends OpenRegistry> { + public ConfigTypeRegistry() { + add("BIOME", (pack, main) -> load(pack.getBiomeRegistry(), new BiomeTemplate(pack, main), new BiomeFactory(pack), main)); + add("PALETTE", (pack, main) -> load(pack.getPaletteRegistry(), new PaletteTemplate(), new PaletteFactory(), main)); + add("ORE", (pack, main) -> load(pack.getOreRegistry(), new OreTemplate(), new OreFactory(), main)); + add("FLORA", (pack, main) -> load(pack.getFloraRegistry(), new FloraTemplate(), new FloraFactory(), main)); + add("CARVER", (pack, main) -> load(pack.getCarverRegistry(), new CarverTemplate(), new CarverFactory(pack), main)); + add("STRUCTURE", (pack, main) -> load(pack.getStructureRegistry(), new StructureTemplate(), new StructureFactory(), main)); + add("TREE", (pack, main) -> load(pack.getTreeRegistry(), new TreeTemplate(), new TreeFactory(), main)); + } + + @SuppressWarnings("deprecation") + private T load(CheckedRegistry registry, T object, ConfigFactory factory, TerraPlugin main) throws LoadException { + registry.addUnchecked(object.getID(), factory.build(object, main)); + return object; + } +}