From 58b5f3a5fec04986b22f14f117a7d4e83b5df7ff Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 5 Apr 2021 00:27:58 -0700 Subject: [PATCH 01/20] bump Tectonic version --- common/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 5938324de..d9a1714d2 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -14,7 +14,7 @@ dependencies { "shadedApi"("commons-io:commons-io:2.4") "shadedApi"("com.dfsek:Paralithic:0.3.2") - "shadedApi"("com.dfsek:Tectonic:1.2.3") + "shadedApi"("com.dfsek:Tectonic:1.3.0") "shadedApi"("net.jafama:jafama:2.3.2") "shadedApi"("org.yaml:snakeyaml:1.27") "shadedApi"("org.ow2.asm:asm:9.0") From e6931a53d67404f0baafcd335409e8bf9b631159 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 5 Apr 2021 01:31:22 -0700 Subject: [PATCH 02/20] basic implementation --- .../dfsek/terra/config/pack/ConfigPack.java | 44 +++++++++---------- .../terra/config/prototype/ConfigType.java | 11 +++++ .../terra/config/prototype/ProtoConfig.java | 21 +++++++++ .../registry/master/ConfigTypeRegistry.java | 41 +++++++++++++++++ 4 files changed, 95 insertions(+), 22 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/config/prototype/ConfigType.java create mode 100644 common/src/main/java/com/dfsek/terra/config/prototype/ProtoConfig.java create mode 100644 common/src/main/java/com/dfsek/terra/registry/master/ConfigTypeRegistry.java 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; + } +} From f756ebef44fc130c15ec56ad8304df1611b360a3 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 5 Apr 2021 01:36:39 -0700 Subject: [PATCH 03/20] fix unhandled exception --- .../java/com/dfsek/terra/config/prototype/ConfigType.java | 1 - .../dfsek/terra/registry/master/ConfigTypeRegistry.java | 8 ++++++-- 2 files changed, 6 insertions(+), 3 deletions(-) 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 index 0d87f8bfc..cab8959c0 100644 --- a/common/src/main/java/com/dfsek/terra/config/prototype/ConfigType.java +++ b/common/src/main/java/com/dfsek/terra/config/prototype/ConfigType.java @@ -7,5 +7,4 @@ 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/registry/master/ConfigTypeRegistry.java b/common/src/main/java/com/dfsek/terra/registry/master/ConfigTypeRegistry.java index 561208ec1..4765438a8 100644 --- a/common/src/main/java/com/dfsek/terra/registry/master/ConfigTypeRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/master/ConfigTypeRegistry.java @@ -34,8 +34,12 @@ public class ConfigTypeRegistry extends OpenRegistry> { } @SuppressWarnings("deprecation") - private T load(CheckedRegistry registry, T object, ConfigFactory factory, TerraPlugin main) throws LoadException { - registry.addUnchecked(object.getID(), factory.build(object, main)); + private T load(CheckedRegistry registry, T object, ConfigFactory factory, TerraPlugin main) { + try { + registry.addUnchecked(object.getID(), factory.build(object, main)); + } catch(LoadException e) { + throw new RuntimeException(e); + } return object; } } From d96d834a0811325c2a1eb0dfaafe5d7726af9e49 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 5 Apr 2021 09:48:11 -0700 Subject: [PATCH 04/20] redo ConfigType and loading --- .../dfsek/terra/config/pack/ConfigPack.java | 5 +- .../terra/config/prototype/ConfigType.java | 4 +- .../registry/config/ConfigTypeRegistry.java | 62 +++++++++++++++++++ .../registry/master/ConfigTypeRegistry.java | 45 -------------- 4 files changed, 69 insertions(+), 47 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/registry/config/ConfigTypeRegistry.java delete mode 100644 common/src/main/java/com/dfsek/terra/registry/master/ConfigTypeRegistry.java 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 030efeef3..3b2129873 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 @@ -190,6 +190,7 @@ public class ConfigPack implements LoaderRegistrar { for(C template : configTemplates) registry.add(template.getID(), factory.build(template, main)); } + @SuppressWarnings({"unchecked", "rawtypes"}) private void load(long start, TerraPlugin main) throws ConfigException { main.getEventManager().callEvent(new ConfigPackPreLoadEvent(this)); @@ -230,7 +231,9 @@ public class ConfigPack implements LoaderRegistrar { } for(Map.Entry, List> entry : configs.entrySet()) { - abstractConfigLoader.loadConfigs(entry.getValue(), () -> entry.getKey().getTemplate(this, main)); + for(ConfigTemplate config : abstractConfigLoader.loadConfigs(entry.getValue(), () -> entry.getKey().getTemplate(this, main))) { + ((ConfigType) entry.getKey()).callback(this, main, config); + } } main.getEventManager().callEvent(new ConfigPackPostLoadEvent(this)); 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 index cab8959c0..cf5a08853 100644 --- a/common/src/main/java/com/dfsek/terra/config/prototype/ConfigType.java +++ b/common/src/main/java/com/dfsek/terra/config/prototype/ConfigType.java @@ -1,10 +1,12 @@ package com.dfsek.terra.config.prototype; import com.dfsek.tectonic.config.ConfigTemplate; +import com.dfsek.tectonic.exception.LoadException; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.config.pack.ConfigPack; -@FunctionalInterface public interface ConfigType { T getTemplate(ConfigPack pack, TerraPlugin main); + + void callback(ConfigPack pack, TerraPlugin main, T loadedConfig) throws LoadException; } diff --git a/common/src/main/java/com/dfsek/terra/registry/config/ConfigTypeRegistry.java b/common/src/main/java/com/dfsek/terra/registry/config/ConfigTypeRegistry.java new file mode 100644 index 000000000..9648a560e --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/registry/config/ConfigTypeRegistry.java @@ -0,0 +1,62 @@ +package com.dfsek.terra.registry.config; + +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.pack.ConfigPack; +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; + +import java.util.function.Function; +import java.util.function.Supplier; + +public class ConfigTypeRegistry extends OpenRegistry> { + public ConfigTypeRegistry(ConfigPack pack, TerraPlugin main) { + add("BIOME", new ConfigBuilder<>(pack.getBiomeRegistry(), new BiomeFactory(pack), () -> new BiomeTemplate(pack, main))); + add("PALETTE", new ConfigBuilder<>(pack.getPaletteRegistry(), new PaletteFactory(), PaletteTemplate::new)); + add("ORE", new ConfigBuilder<>(pack.getOreRegistry(), new OreFactory(), OreTemplate::new)); + add("FLORA", new ConfigBuilder<>(pack.getFloraRegistry(), new FloraFactory(), FloraTemplate::new)); + add("CARVER", new ConfigBuilder<>(pack.getCarverRegistry(), new CarverFactory(pack), CarverTemplate::new)); + add("STRUCTURE", new ConfigBuilder<>(pack.getStructureRegistry(), new StructureFactory(), StructureTemplate::new)); + add("TREE", new ConfigBuilder<>(pack.getTreeRegistry(), new TreeFactory(), TreeTemplate::new)); + } + + private static final class ConfigBuilder implements ConfigType { + private final CheckedRegistry registry; + private final ConfigFactory factory; + private final Supplier provider; + + private ConfigBuilder(CheckedRegistry registry, ConfigFactory factory, Supplier provider) { + this.registry = registry; + this.factory = factory; + this.provider = provider; + } + + @Override + public T getTemplate(ConfigPack pack, TerraPlugin main) { + return provider.get(); + } + + @SuppressWarnings("deprecation") + @Override + public void callback(ConfigPack pack, TerraPlugin main, T loadedConfig) throws LoadException { + registry.addUnchecked(loadedConfig.getID(), factory.build(loadedConfig, main)); + } + } +} 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 deleted file mode 100644 index 4765438a8..000000000 --- a/common/src/main/java/com/dfsek/terra/registry/master/ConfigTypeRegistry.java +++ /dev/null @@ -1,45 +0,0 @@ -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) { - try { - registry.addUnchecked(object.getID(), factory.build(object, main)); - } catch(LoadException e) { - throw new RuntimeException(e); - } - return object; - } -} From 473ed45dee5e60ed22012f1ada6aacb239be68ab Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 5 Apr 2021 09:50:07 -0700 Subject: [PATCH 05/20] add config type registry to ConfigPack loader registry --- .../main/java/com/dfsek/terra/config/pack/ConfigPack.java | 6 ++++++ 1 file changed, 6 insertions(+) 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 3b2129873..36626d5ee 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 @@ -42,6 +42,7 @@ import com.dfsek.terra.config.templates.AbstractableTemplate; import com.dfsek.terra.registry.OpenRegistry; import com.dfsek.terra.registry.config.BiomeRegistry; import com.dfsek.terra.registry.config.CarverRegistry; +import com.dfsek.terra.registry.config.ConfigTypeRegistry; import com.dfsek.terra.registry.config.FloraRegistry; import com.dfsek.terra.registry.config.FunctionRegistry; import com.dfsek.terra.registry.config.LootRegistry; @@ -104,9 +105,12 @@ public class ConfigPack implements LoaderRegistrar { private final BiomeProvider.BiomeProviderBuilder biomeProviderBuilder; + private final ConfigTypeRegistry configTypeRegistry; + public ConfigPack(File folder, TerraPlugin main) throws ConfigException { try { + this.configTypeRegistry = new ConfigTypeRegistry(this, main); this.loader = new FolderLoader(folder.toPath()); this.main = main; long l = System.nanoTime(); @@ -143,6 +147,7 @@ public class ConfigPack implements LoaderRegistrar { public ConfigPack(ZipFile file, TerraPlugin main) throws ConfigException { try { + this.configTypeRegistry = new ConfigTypeRegistry(this, main); this.loader = new ZIPLoader(file); this.main = main; long l = System.nanoTime(); @@ -264,6 +269,7 @@ public class ConfigPack implements LoaderRegistrar { @Override public void register(TypeRegistry registry) { registry + .registerLoader(ConfigType.class, configTypeRegistry) .registerLoader(Palette.class, paletteRegistry) .registerLoader(BiomeBuilder.class, biomeRegistry) .registerLoader(Flora.class, floraRegistry) From 6374b0ab087a489a9b5304bc054f8a36d1ba2662 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 5 Apr 2021 09:52:47 -0700 Subject: [PATCH 06/20] add ConfigPack#getConfigTypeRegistry --- .../java/com/dfsek/terra/config/pack/ConfigPack.java | 10 ++++++++++ 1 file changed, 10 insertions(+) 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 36626d5ee..0ed43e759 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 @@ -342,4 +342,14 @@ public class ConfigPack implements LoaderRegistrar { public WorldConfig toWorldConfig(TerraWorld world){ return new WorldConfig(world, this, main); } + + public CheckedRegistry> getConfigTypeRegistry() { + return new CheckedRegistry>(configTypeRegistry) { + @Override + @SuppressWarnings("deprecation") + public void addUnchecked(String identifier, ConfigType value) { + if(contains(identifier)) throw new UnsupportedOperationException("Cannot override values in ConfigTypeRegistry!"); + } + }; + } } From a78e64a9bbc7c95c92ddd4cab98bb83bce93c262 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 5 Apr 2021 09:59:52 -0700 Subject: [PATCH 07/20] rename ore "type" to "algorithm" --- .../main/java/com/dfsek/terra/config/templates/OreTemplate.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java index 7362a4c6a..b3ecdb61f 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java @@ -17,7 +17,7 @@ public class OreTemplate extends AbstractableTemplate { @Abstractable private BlockData material; - @Value("type") + @Value("algorithm") @Abstractable @Default private Ore.Type oreType = Ore.Type.VANILLA; From 03ebafc7b6f7ee06bcf5cb525a842772f54e9db4 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 5 Apr 2021 12:26:54 -0700 Subject: [PATCH 08/20] working config loading --- common/build.gradle.kts | 2 +- .../terra/api/registry/CheckedRegistry.java | 3 +- .../terra/api/registry/LockedRegistry.java | 3 +- .../dfsek/terra/api/registry/Registry.java | 3 +- .../terra/config/fileloaders/ZIPLoader.java | 2 +- .../dfsek/terra/config/pack/ConfigPack.java | 31 ++++++++++--------- .../dfsek/terra/config/pack/WorldConfig.java | 5 +-- .../dfsek/terra/registry/OpenRegistry.java | 15 +++++++-- .../registry/config/ConfigTypeRegistry.java | 20 +++++++++++- 9 files changed, 59 insertions(+), 25 deletions(-) diff --git a/common/build.gradle.kts b/common/build.gradle.kts index d9a1714d2..653aab8c6 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -14,7 +14,7 @@ dependencies { "shadedApi"("commons-io:commons-io:2.4") "shadedApi"("com.dfsek:Paralithic:0.3.2") - "shadedApi"("com.dfsek:Tectonic:1.3.0") + "shadedApi"("com.dfsek:Tectonic:1.3.1") "shadedApi"("net.jafama:jafama:2.3.2") "shadedApi"("org.yaml:snakeyaml:1.27") "shadedApi"("org.ow2.asm:asm:9.0") diff --git a/common/src/main/java/com/dfsek/terra/api/registry/CheckedRegistry.java b/common/src/main/java/com/dfsek/terra/api/registry/CheckedRegistry.java index 9934c767b..85323611b 100644 --- a/common/src/main/java/com/dfsek/terra/api/registry/CheckedRegistry.java +++ b/common/src/main/java/com/dfsek/terra/api/registry/CheckedRegistry.java @@ -6,6 +6,7 @@ import com.dfsek.terra.registry.OpenRegistry; import com.dfsek.terra.registry.exception.DuplicateEntryException; import java.lang.reflect.Type; +import java.util.Collection; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -68,7 +69,7 @@ public class CheckedRegistry implements Registry { } @Override - public Set entries() { + public Collection entries() { return registry.entries(); } diff --git a/common/src/main/java/com/dfsek/terra/api/registry/LockedRegistry.java b/common/src/main/java/com/dfsek/terra/api/registry/LockedRegistry.java index 227656c4d..8889998b6 100644 --- a/common/src/main/java/com/dfsek/terra/api/registry/LockedRegistry.java +++ b/common/src/main/java/com/dfsek/terra/api/registry/LockedRegistry.java @@ -4,6 +4,7 @@ import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import java.lang.reflect.Type; +import java.util.Collection; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -41,7 +42,7 @@ public class LockedRegistry implements Registry { } @Override - public Set entries() { + public Collection entries() { return registry.entries(); } diff --git a/common/src/main/java/com/dfsek/terra/api/registry/Registry.java b/common/src/main/java/com/dfsek/terra/api/registry/Registry.java index 773d784ca..0976697e3 100644 --- a/common/src/main/java/com/dfsek/terra/api/registry/Registry.java +++ b/common/src/main/java/com/dfsek/terra/api/registry/Registry.java @@ -2,6 +2,7 @@ package com.dfsek.terra.api.registry; import com.dfsek.tectonic.loading.TypeLoader; +import java.util.Collection; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -42,7 +43,7 @@ public interface Registry extends TypeLoader { * * @return Set containing all entries. */ - Set entries(); + Collection entries(); /** * Get all the keys in this registry. diff --git a/common/src/main/java/com/dfsek/terra/config/fileloaders/ZIPLoader.java b/common/src/main/java/com/dfsek/terra/config/fileloaders/ZIPLoader.java index d10449a37..8c94af81a 100644 --- a/common/src/main/java/com/dfsek/terra/config/fileloaders/ZIPLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/fileloaders/ZIPLoader.java @@ -30,7 +30,7 @@ public class ZIPLoader extends Loader { ZipEntry entry = entries.nextElement(); if(!entry.isDirectory() && entry.getName().startsWith(directory) && entry.getName().endsWith(extension)) { try { - String rel = entry.getName().substring(directory.length() + 1); + String rel = entry.getName().substring(directory.length()); streams.put(rel, file.getInputStream(entry)); } catch(IOException e) { e.printStackTrace(); 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 0ed43e759..598bfff6e 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 @@ -66,8 +66,10 @@ import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -110,13 +112,14 @@ public class ConfigPack implements LoaderRegistrar { public ConfigPack(File folder, TerraPlugin main) throws ConfigException { try { + floraRegistry = new FloraRegistry(main); + paletteRegistry = new PaletteRegistry(main); + treeRegistry = new TreeRegistry(); this.configTypeRegistry = new ConfigTypeRegistry(this, main); this.loader = new FolderLoader(folder.toPath()); this.main = main; long l = System.nanoTime(); - floraRegistry = new FloraRegistry(main); - paletteRegistry = new PaletteRegistry(main); - treeRegistry = new TreeRegistry(); + register(abstractConfigLoader); register(selfLoader); @@ -147,13 +150,14 @@ public class ConfigPack implements LoaderRegistrar { public ConfigPack(ZipFile file, TerraPlugin main) throws ConfigException { try { + floraRegistry = new FloraRegistry(main); + paletteRegistry = new PaletteRegistry(main); + treeRegistry = new TreeRegistry(); this.configTypeRegistry = new ConfigTypeRegistry(this, main); this.loader = new ZIPLoader(file); this.main = main; long l = System.nanoTime(); - floraRegistry = new FloraRegistry(main); - paletteRegistry = new PaletteRegistry(main); - treeRegistry = new TreeRegistry(); + register(abstractConfigLoader); register(selfLoader); @@ -224,20 +228,19 @@ public class ConfigPack implements LoaderRegistrar { List configurations = new ArrayList<>(); - loader.open("", ".yml").then(streams -> streams.forEach(stream -> configurations.add(new Configuration(stream)))); + loader.open("", ".yml").thenEntries(entries -> entries.forEach(stream -> configurations.add(new Configuration(stream.getValue(), stream.getKey())))); - ConfigLoader protoLoader = new ConfigLoader(); Map, List> configs = new HashMap<>(); for(Configuration configuration : configurations) { ProtoConfig config = new ProtoConfig(); - protoLoader.load(config, configuration); + selfLoader.load(config, configuration); configs.computeIfAbsent(config.getType(), configType -> new ArrayList<>()).add(configuration); } - for(Map.Entry, List> entry : configs.entrySet()) { - for(ConfigTemplate config : abstractConfigLoader.loadConfigs(entry.getValue(), () -> entry.getKey().getTemplate(this, main))) { - ((ConfigType) entry.getKey()).callback(this, main, config); + for(ConfigType configType : configTypeRegistry.entries()) { + for(ConfigTemplate config : abstractConfigLoader.loadConfigs(configs.getOrDefault(configType, Collections.emptyList()), () -> configType.getTemplate(this, main))) { + ((ConfigType) configType).callback(this, main, config); } } @@ -250,7 +253,7 @@ public class ConfigPack implements LoaderRegistrar { } public Set getStructures() { - return structureRegistry.entries(); + return new HashSet<>(structureRegistry.entries()); } public List getStructureIDs() { @@ -288,7 +291,7 @@ public class ConfigPack implements LoaderRegistrar { } public Set getCarvers() { - return carverRegistry.entries(); + return new HashSet<>(carverRegistry.entries()); } public BiomeProvider.BiomeProviderBuilder getBiomeProviderBuilder() { diff --git a/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java b/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java index 6ddc798ef..2b2c5ed14 100644 --- a/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java +++ b/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java @@ -17,6 +17,7 @@ import com.dfsek.terra.world.generation.math.SamplerCache; import com.dfsek.terra.world.population.items.TerraStructure; import com.dfsek.terra.world.population.items.ores.Ore; +import java.util.HashSet; import java.util.Set; public class WorldConfig { @@ -66,7 +67,7 @@ public class WorldConfig { } public Set getCarvers() { - return carverRegistry.entries(); + return new HashSet<>(carverRegistry.entries()); } public LockedRegistry getScriptRegistry() { @@ -110,7 +111,7 @@ public class WorldConfig { } public Set getStructures() { - return structureRegistry.entries(); + return new HashSet<>(structureRegistry.entries()); } public ConfigPackTemplate getTemplate() { diff --git a/common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java b/common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java index 1cd0b81f2..eb01964dd 100644 --- a/common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java @@ -6,6 +6,7 @@ import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.registry.exception.DuplicateEntryException; import java.lang.reflect.Type; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -18,7 +19,15 @@ import java.util.function.Consumer; * @param */ public class OpenRegistry implements Registry { - private final Map objects = new HashMap<>(); + private final Map objects; + + public OpenRegistry() { + objects = new HashMap<>(); + } + + protected OpenRegistry(Map init) { + this.objects = init; + } @Override public T load(Type type, Object o, ConfigLoader configLoader) throws LoadException { @@ -74,8 +83,8 @@ public class OpenRegistry implements Registry { } @Override - public Set entries() { - return new HashSet<>(objects.values()); + public Collection entries() { + return objects.values(); } @Override diff --git a/common/src/main/java/com/dfsek/terra/registry/config/ConfigTypeRegistry.java b/common/src/main/java/com/dfsek/terra/registry/config/ConfigTypeRegistry.java index 9648a560e..6d68e58c9 100644 --- a/common/src/main/java/com/dfsek/terra/registry/config/ConfigTypeRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/config/ConfigTypeRegistry.java @@ -1,5 +1,6 @@ package com.dfsek.terra.registry.config; +import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.registry.CheckedRegistry; @@ -23,18 +24,35 @@ import com.dfsek.terra.config.templates.StructureTemplate; import com.dfsek.terra.config.templates.TreeTemplate; import com.dfsek.terra.registry.OpenRegistry; +import java.util.LinkedHashMap; import java.util.function.Function; import java.util.function.Supplier; public class ConfigTypeRegistry extends OpenRegistry> { public ConfigTypeRegistry(ConfigPack pack, TerraPlugin main) { - add("BIOME", new ConfigBuilder<>(pack.getBiomeRegistry(), new BiomeFactory(pack), () -> new BiomeTemplate(pack, main))); + super(new LinkedHashMap<>()); // Ordered add("PALETTE", new ConfigBuilder<>(pack.getPaletteRegistry(), new PaletteFactory(), PaletteTemplate::new)); add("ORE", new ConfigBuilder<>(pack.getOreRegistry(), new OreFactory(), OreTemplate::new)); add("FLORA", new ConfigBuilder<>(pack.getFloraRegistry(), new FloraFactory(), FloraTemplate::new)); add("CARVER", new ConfigBuilder<>(pack.getCarverRegistry(), new CarverFactory(pack), CarverTemplate::new)); add("STRUCTURE", new ConfigBuilder<>(pack.getStructureRegistry(), new StructureFactory(), StructureTemplate::new)); add("TREE", new ConfigBuilder<>(pack.getTreeRegistry(), new TreeFactory(), TreeTemplate::new)); + add("BIOME", new ConfigBuilder<>(pack.getBiomeRegistry(), new BiomeFactory(pack), () -> new BiomeTemplate(pack, main))); + add("PACK", new PackBuilder()); + } + + private static final class PackBuilder implements ConfigType { + + @Override + public ConfigTemplate getTemplate(ConfigPack pack, TerraPlugin main) { + return new ConfigTemplate() { + }; + } + + @Override + public void callback(ConfigPack pack, TerraPlugin main, ConfigTemplate loadedConfig) { + + } } private static final class ConfigBuilder implements ConfigType { From da4aebe4986b82e337bfde08e3af495c0ccd929c Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 5 Apr 2021 17:08:13 -0700 Subject: [PATCH 09/20] fix parser EOF NPE --- .../terra/api/structures/tokenizer/Tokenizer.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java index 2fb3e4e1f..4f21273ee 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -15,6 +15,7 @@ public class Tokenizer { private final Lookahead reader; private final Stack brackets = new Stack<>(); private Token current; + private Token last; public Tokenizer(String data) throws ParseException { reader = new Lookahead(new StringReader(data + '\0')); @@ -28,7 +29,7 @@ public class Tokenizer { * @throws ParseException If token does not exist */ public Token get() throws ParseException { - if(!hasNext()) throw new ParseException("Unexpected end of input", current.getPosition()); + if(!hasNext()) throw new ParseException("Unexpected end of input", last.getPosition()); return current; } @@ -39,7 +40,7 @@ public class Tokenizer { * @throws ParseException If token does not exist */ public Token consume() throws ParseException { - if(!hasNext()) throw new ParseException("Unexpected end of input", current.getPosition()); + if(!hasNext()) throw new ParseException("Unexpected end of input", last.getPosition()); Token temp = current; current = fetchCheck(); return temp; @@ -57,8 +58,9 @@ public class Tokenizer { private Token fetchCheck() throws ParseException { Token fetch = fetch(); if(fetch != null) { - if(fetch.getType().equals(Token.Type.BLOCK_BEGIN)) brackets.push(fetch); // Opening bracket - else if(fetch.getType().equals(Token.Type.BLOCK_END)) { + last = fetch; + if(fetch.getType() == Token.Type.BLOCK_BEGIN) brackets.push(fetch); // Opening bracket + else if(fetch.getType() == Token.Type.BLOCK_END) { if(!brackets.isEmpty()) brackets.pop(); else throw new ParseException("Dangling opening brace", new Position(0, 0)); } From a6a1810b4ad846c615f483db56c7d59ee827502f Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 5 Apr 2021 17:08:57 -0700 Subject: [PATCH 10/20] bump version --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 1e189b37b..b544506a5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,6 @@ import com.dfsek.terra.getGitHash -val versionObj = Version("5", "1", "2", true) +val versionObj = Version("6", "0", "0", true) allprojects { version = versionObj From 2080db21cadfd499c1b3bb6cb410597ae119b89a Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 10 Apr 2021 19:22:41 -0700 Subject: [PATCH 11/20] warn about dead registry entries when debug mode is enabled --- .../dfsek/terra/config/pack/ConfigPack.java | 12 +++++ .../dfsek/terra/registry/OpenRegistry.java | 48 ++++++++++++++++--- .../terra/registry/config/FloraRegistry.java | 4 +- platforms/bukkit/build.gradle.kts | 10 ++-- .../terra/bukkit/listeners/TerraListener.java | 4 +- 5 files changed, 65 insertions(+), 13 deletions(-) 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..abfeb2266 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 @@ -139,6 +139,7 @@ public class ConfigPack implements LoaderRegistrar { selfLoader.load(packPostTemplate, new FileInputStream(pack)); biomeProviderBuilder = packPostTemplate.getProviderBuilder(); biomeProviderBuilder.build(0); // Build dummy provider to catch errors at load time. + checkDeadEntries(main); } catch(FileNotFoundException e) { throw new LoadException("No pack.yml file found in " + folder.getAbsolutePath(), e); } @@ -183,6 +184,7 @@ public class ConfigPack implements LoaderRegistrar { selfLoader.load(packPostTemplate, file.getInputStream(pack)); biomeProviderBuilder = packPostTemplate.getProviderBuilder(); biomeProviderBuilder.build(0); // Build dummy provider to catch errors at load time. + checkDeadEntries(main); } catch(IOException e) { throw new LoadException("Unable to load pack.yml from ZIP file", e); } @@ -198,6 +200,16 @@ public class ConfigPack implements LoaderRegistrar { for(C template : configTemplates) registry.add(template.getID(), factory.build(template, main)); } + private void checkDeadEntries(TerraPlugin main) { + biomeRegistry.getDeadEntries().forEach((id, value) -> main.getDebugLogger().warn("Dead entry in biome registry: '" + id + "'")); + paletteRegistry.getDeadEntries().forEach((id, value) -> main.getDebugLogger().warn("Dead entry in palette registry: '" + id + "'")); + floraRegistry.getDeadEntries().forEach((id, value) -> main.getDebugLogger().warn("Dead entry in flora registry: '" + id + "'")); + carverRegistry.getDeadEntries().forEach((id, value) -> main.getDebugLogger().warn("Dead entry in carver registry: '" + id + "'")); + treeRegistry.getDeadEntries().forEach((id, value) -> main.getDebugLogger().warn("Dead entry in tree registry: '" + id + "'")); + oreRegistry.getDeadEntries().forEach((id, value) -> main.getDebugLogger().warn("Dead entry in ore registry: '" + id + "'")); + } + + private void load(long start, TerraPlugin main) throws ConfigException { main.getEventManager().callEvent(new ConfigPackPreLoadEvent(this)); diff --git a/common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java b/common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java index 1cd0b81f2..597b5f607 100644 --- a/common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java @@ -7,18 +7,19 @@ import com.dfsek.terra.registry.exception.DuplicateEntryException; import java.lang.reflect.Type; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiConsumer; import java.util.function.Consumer; +import java.util.stream.Collectors; /** * Registry implementation with read/write access. For internal use only. * @param */ public class OpenRegistry implements Registry { - private final Map objects = new HashMap<>(); + private final Map> objects = new HashMap<>(); @Override public T load(Type type, Object o, ConfigLoader configLoader) throws LoadException { @@ -35,6 +36,10 @@ public class OpenRegistry implements Registry { * @param value Value to add. */ public boolean add(String identifier, T value) { + return add(identifier, new Entry<>(value)); + } + + protected boolean add(String identifier, Entry value) { boolean exists = objects.containsKey(identifier); objects.put(identifier, value); return exists; @@ -60,22 +65,22 @@ public class OpenRegistry implements Registry { @Override public T get(String identifier) { - return objects.get(identifier); + return objects.get(identifier).getValue(); } @Override public void forEach(Consumer consumer) { - objects.forEach((id, obj) -> consumer.accept(obj)); + objects.forEach((id, obj) -> consumer.accept(obj.getRaw())); } @Override public void forEach(BiConsumer consumer) { - objects.forEach(consumer); + objects.forEach((id, entry) -> consumer.accept(id, entry.getRaw())); } @Override public Set entries() { - return new HashSet<>(objects.values()); + return objects.values().stream().map(Entry::getRaw).collect(Collectors.toSet()); } @Override @@ -83,10 +88,41 @@ public class OpenRegistry implements Registry { return objects.keySet(); } + public Map getDeadEntries() { + Map dead = new HashMap<>(); + objects.forEach((id, entry) -> { + if(entry.dead()) dead.put(id, entry.value); // dont increment value here. + }); + return dead; + } + /** * Clears all entries from the registry. */ public void clear() { objects.clear(); } + + + protected static final class Entry { + private final T value; + private final AtomicInteger access = new AtomicInteger(0); + + public Entry(T value) { + this.value = value; + } + + public T getValue() { + access.incrementAndGet(); + return value; + } + + private T getRaw() { + return value; + } + + public boolean dead() { + return access.get() == 0; + } + } } diff --git a/common/src/main/java/com/dfsek/terra/registry/config/FloraRegistry.java b/common/src/main/java/com/dfsek/terra/registry/config/FloraRegistry.java index 71fd680cd..878890bff 100644 --- a/common/src/main/java/com/dfsek/terra/registry/config/FloraRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/config/FloraRegistry.java @@ -57,7 +57,9 @@ public class FloraRegistry extends OpenRegistry { private void addItem(String id, Callable flora) { try { - add(id, flora.call()); + Entry entry = new Entry<>(flora.call()); + entry.getValue(); // Mark as not dead. + add(id, entry); } catch(Exception e) { main.logger().warning("Failed to load Flora item: " + id + ": " + e.getMessage()); } diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index e9dac10e5..3b477791b 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -16,7 +16,7 @@ configureCommon() group = "com.dfsek.terra.bukkit" val mcVersion = "1.16.5" -val testDir = "target/server/" +val testDir = "target/server" val testMem = "3G" val paperURL = "https://papermc.io/api/v1/paper/%version%/latest/download/" @@ -42,14 +42,14 @@ dependencies { "shadedImplementation"("com.google.guava:guava:30.0-jre") } -val aikarsFlags = listOf("-XX:+UseG1GC", "-XX:+ParallelRefProcEnabled", "-XX:MaxGCPauseMillis=200", +val jvmFlags = listOf("-XX:+UseG1GC", "-XX:+ParallelRefProcEnabled", "-XX:MaxGCPauseMillis=200", "-XX:+UnlockExperimentalVMOptions", "-XX:+DisableExplicitGC", "-XX:+AlwaysPreTouch", "-XX:G1NewSizePercent=30", "-XX:G1MaxNewSizePercent=40", "-XX:G1HeapRegionSize=8M", "-XX:G1ReservePercent=20", "-XX:G1HeapWastePercent=5", "-XX:G1MixedGCCountTarget=4", "-XX:InitiatingHeapOccupancyPercent=15", "-XX:G1MixedGCLiveThresholdPercent=90", "-XX:G1RSetUpdatingPauseTimePercent=5", "-XX:SurvivorRatio=32", "-XX:+PerfDisableSharedMem", "-XX:MaxTenuringThreshold=1", "-Dusing.aikars.flags=https://mcflags.emc.gs", - "-Daikars.new.flags=true", "-DIReallyKnowWhatIAmDoingISwear") + "-Daikars.new.flags=true", "-DIReallyKnowWhatIAmDoingISwear", "-javaagent:paperclip.jar") fun downloadPaperclip(url: String, dir: String) { val clip = URL(url.replace("%version%", mcVersion)) @@ -160,7 +160,7 @@ task(name = "runPaper") { } main = "io.papermc.paperclip.Paperclip" - jvmArgs = aikarsFlags + jvmArgs = jvmFlags maxHeapSize = testMem minHeapSize = testMem //args = listOf("nogui") @@ -178,7 +178,7 @@ task(name = "runPurpur") { } main = "io.papermc.paperclip.Paperclip" - jvmArgs = aikarsFlags + jvmArgs = jvmFlags maxHeapSize = testMem minHeapSize = testMem //args = listOf("nogui") diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/TerraListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/TerraListener.java index 78615d036..4eb05f91e 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/TerraListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/TerraListener.java @@ -22,7 +22,9 @@ public class TerraListener implements EventListener { public void injectTrees(ConfigPackPreLoadEvent event) { for(TreeType value : TreeType.values()) { try { - event.getPack().getTreeRegistry().add(BukkitAdapter.TREE_TRANSFORMER.translate(value), new BukkitTree(value, main)); + String id = BukkitAdapter.TREE_TRANSFORMER.translate(value); + event.getPack().getTreeRegistry().add(id, new BukkitTree(value, main)); + event.getPack().getTreeRegistry().get(id); // Platform trees should never be marked "dead" } catch(DuplicateEntryException ignore) { // If another addon has already registered trees, do nothing. } } From 653a414ac11aa95d4830f3e93c80926f6da37359 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 10 Apr 2021 23:49:02 -0700 Subject: [PATCH 12/20] should(tm) fix fabric physics --- .../java/com/dfsek/terra/fabric/world/block/FabricBlock.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java index 9379380ca..d676f1413 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java @@ -21,7 +21,7 @@ public class FabricBlock implements Block { @Override public void setBlockData(BlockData data, boolean physics) { - delegate.worldAccess.setBlockState(delegate.position, ((FabricBlockData) data).getHandle(), physics ? 3 : 1042, 0); + delegate.worldAccess.setBlockState(delegate.position, ((FabricBlockData) data).getHandle(), physics ? 3 : 1042); } @Override From ce9273c7e85e06d1862ef23f2c38d99a696454ce Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 11 Apr 2021 00:45:53 -0700 Subject: [PATCH 13/20] proper fluid updating on Fabric --- .../java/com/dfsek/terra/fabric/world/block/FabricBlock.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java index d676f1413..9e0b440ac 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java @@ -9,6 +9,7 @@ import com.dfsek.terra.api.platform.block.state.BlockState; import com.dfsek.terra.fabric.world.FabricAdapter; import com.dfsek.terra.fabric.world.block.state.FabricBlockState; import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; +import net.minecraft.block.FluidBlock; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldAccess; @@ -22,6 +23,9 @@ public class FabricBlock implements Block { @Override public void setBlockData(BlockData data, boolean physics) { delegate.worldAccess.setBlockState(delegate.position, ((FabricBlockData) data).getHandle(), physics ? 3 : 1042); + if(physics && ((FabricBlockData) data).getHandle().getBlock() instanceof FluidBlock) { + delegate.worldAccess.getFluidTickScheduler().schedule(delegate.position, ((FluidBlock) ((FabricBlockData) data).getHandle().getBlock()).getFluidState(((FabricBlockData) data).getHandle()).getFluid(), 0); + } } @Override From 75cb6be36fe0203a15a27af29af546c53f4823d0 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 11 Apr 2021 00:53:21 -0700 Subject: [PATCH 14/20] resolve merge issues --- .../src/main/java/com/dfsek/terra/registry/OpenRegistry.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java b/common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java index 62103b018..f6b6a3917 100644 --- a/common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java @@ -20,7 +20,7 @@ import java.util.stream.Collectors; * @param */ public class OpenRegistry implements Registry { - private final Map objects; + private final Map> objects; public OpenRegistry() { objects = new HashMap<>(); @@ -29,7 +29,6 @@ public class OpenRegistry implements Registry { protected OpenRegistry(Map> init) { this.objects = init; } - private final Map> objects = new HashMap<>(); @Override public T load(Type type, Object o, ConfigLoader configLoader) throws LoadException { From 4237657dadfb33a0eaa2f384c839d9fb5dc766a1 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 11 Apr 2021 02:39:21 -0700 Subject: [PATCH 15/20] remove most hard coded registries --- .../api/util/generic/pair/ImmutablePair.java | 13 +- .../terra/api/util/generic/pair/Pair.java | 4 +- .../terra/api/util/world/PaletteUtil.java | 3 +- .../terra/api/world/biome/Generator.java | 3 +- .../terra/api/world/palette/NoisePalette.java | 9 +- .../terra/api/world/palette/Palette.java | 33 ++--- .../api/world/palette/SinglePalette.java | 10 +- .../world/palette/holder/PaletteHolder.java | 7 +- .../palette/holder/PaletteHolderBuilder.java | 11 +- .../terra/config/factories/FloraFactory.java | 3 +- .../config/factories/PaletteFactory.java | 7 +- .../com/dfsek/terra/config/loaders/Types.java | 4 - .../loaders/palette/PaletteHolderLoader.java | 4 +- .../dfsek/terra/config/pack/ConfigPack.java | 135 ++++-------------- .../dfsek/terra/config/pack/WorldConfig.java | 20 +-- .../terra/config/prototype/ConfigType.java | 9 +- .../terra/config/prototype/ProtoConfig.java | 4 +- .../terra/config/templates/BiomeTemplate.java | 27 ++-- .../dfsek/terra/registry/OpenRegistry.java | 6 +- .../registry/config/ConfigTypeRegistry.java | 71 ++++++--- .../registry/config/PaletteRegistry.java | 9 +- .../com/dfsek/terra/world/TerraWorld.java | 2 +- .../world/generation/WorldGenerator.java | 5 +- .../generators/DefaultChunkGenerator2D.java | 2 +- .../generators/DefaultChunkGenerator3D.java | 18 +-- .../population/items/flora/TerraFlora.java | 4 +- .../bukkit/handles/BukkitWorldHandle.java | 2 +- .../terra/bukkit/listeners/TerraListener.java | 5 +- .../dfsek/terra/fabric/TerraFabricPlugin.java | 4 +- 29 files changed, 202 insertions(+), 232 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/util/generic/pair/ImmutablePair.java b/common/src/main/java/com/dfsek/terra/api/util/generic/pair/ImmutablePair.java index f58cbb52b..0ca0c0ad3 100644 --- a/common/src/main/java/com/dfsek/terra/api/util/generic/pair/ImmutablePair.java +++ b/common/src/main/java/com/dfsek/terra/api/util/generic/pair/ImmutablePair.java @@ -1,10 +1,12 @@ package com.dfsek.terra.api.util.generic.pair; -public class ImmutablePair { +public final class ImmutablePair { private final L left; private final R right; - public ImmutablePair(L left, R right) { + private static final ImmutablePair NULL = new ImmutablePair<>(null, null); + + private ImmutablePair(L left, R right) { this.left = left; this.right = right; } @@ -21,7 +23,12 @@ public class ImmutablePair { return left; } + @SuppressWarnings("unchecked") + public static ImmutablePair ofNull() { + return (ImmutablePair) NULL; + } + public Pair mutable() { - return new Pair<>(left, right); + return Pair.of(left, right); } } diff --git a/common/src/main/java/com/dfsek/terra/api/util/generic/pair/Pair.java b/common/src/main/java/com/dfsek/terra/api/util/generic/pair/Pair.java index dcb0be070..5ec1ede8f 100644 --- a/common/src/main/java/com/dfsek/terra/api/util/generic/pair/Pair.java +++ b/common/src/main/java/com/dfsek/terra/api/util/generic/pair/Pair.java @@ -4,7 +4,7 @@ public class Pair { private L left; private R right; - public Pair(L left, R right) { + private Pair(L left, R right) { this.left = left; this.right = right; } @@ -30,6 +30,6 @@ public class Pair { } public ImmutablePair immutable() { - return new ImmutablePair<>(left, right); + return ImmutablePair.of(left, right); } } diff --git a/common/src/main/java/com/dfsek/terra/api/util/world/PaletteUtil.java b/common/src/main/java/com/dfsek/terra/api/util/world/PaletteUtil.java index 69edf202e..491341ad9 100644 --- a/common/src/main/java/com/dfsek/terra/api/util/world/PaletteUtil.java +++ b/common/src/main/java/com/dfsek/terra/api/util/world/PaletteUtil.java @@ -1,14 +1,13 @@ package com.dfsek.terra.api.util.world; import com.dfsek.terra.api.math.MathUtil; -import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.holder.PaletteHolder; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.world.generation.math.samplers.Sampler; public final class PaletteUtil { - public static Palette getPalette(int x, int y, int z, BiomeTemplate c, Sampler sampler) { + public static Palette getPalette(int x, int y, int z, BiomeTemplate c, Sampler sampler) { PaletteHolder slant = c.getSlantPalette(); if(slant != null && MathUtil.derivative(sampler, x, y, z) > c.getSlantThreshold()) { return slant.getPalette(y); diff --git a/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java b/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java index 539437a71..a72243739 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java +++ b/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java @@ -1,7 +1,6 @@ package com.dfsek.terra.api.world.biome; import com.dfsek.terra.api.math.noise.NoiseSampler; -import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.palette.Palette; public interface Generator { @@ -35,7 +34,7 @@ public interface Generator { * * @return BlocPalette - The biome's palette. */ - Palette getPalette(int y); + Palette getPalette(int y); NoiseSampler getBiomeNoise(); diff --git a/common/src/main/java/com/dfsek/terra/api/world/palette/NoisePalette.java b/common/src/main/java/com/dfsek/terra/api/world/palette/NoisePalette.java index 3af3d383b..f8d3b20a6 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/palette/NoisePalette.java +++ b/common/src/main/java/com/dfsek/terra/api/world/palette/NoisePalette.java @@ -1,10 +1,11 @@ package com.dfsek.terra.api.world.palette; import com.dfsek.terra.api.math.noise.NoiseSampler; +import com.dfsek.terra.api.platform.block.BlockData; import java.util.List; -public class NoisePalette extends Palette { +public class NoisePalette extends Palette { private final NoiseSampler sampler; private final boolean is2D; @@ -14,11 +15,11 @@ public class NoisePalette extends Palette { } @Override - public E get(int layer, double x, double y, double z) { - PaletteLayer paletteLayer; + public BlockData get(int layer, double x, double y, double z) { + PaletteLayer paletteLayer; if(layer > this.getSize()) paletteLayer = this.getLayers().get(this.getLayers().size() - 1); else { - List> pl = getLayers(); + List pl = getLayers(); if(layer >= pl.size()) paletteLayer = pl.get(pl.size() - 1); else paletteLayer = pl.get(layer); } diff --git a/common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java b/common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java index 881cd406c..fb367c191 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java +++ b/common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java @@ -1,6 +1,7 @@ package com.dfsek.terra.api.world.palette; import com.dfsek.terra.api.math.noise.NoiseSampler; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.util.GlueList; import com.dfsek.terra.api.util.collections.ProbabilityCollection; @@ -11,8 +12,8 @@ import java.util.Random; * A class representation of a "slice" of the world. * Used to get a section of blocks, based on the depth at which they are found. */ -public abstract class Palette { - private final List> pallet = new GlueList<>(); +public abstract class Palette { + private final List pallet = new GlueList<>(); /** * Constructs a blank palette. @@ -21,16 +22,16 @@ public abstract class Palette { } - public com.dfsek.terra.api.world.palette.Palette add(E m, int layers, NoiseSampler sampler) { + public com.dfsek.terra.api.world.palette.Palette add(BlockData m, int layers, NoiseSampler sampler) { for(int i = 0; i < layers; i++) { - pallet.add(new PaletteLayer<>(m, sampler)); + pallet.add(new PaletteLayer(m, sampler)); } return this; } - public com.dfsek.terra.api.world.palette.Palette add(ProbabilityCollection m, int layers, NoiseSampler sampler) { + public com.dfsek.terra.api.world.palette.Palette add(ProbabilityCollection m, int layers, NoiseSampler sampler) { for(int i = 0; i < layers; i++) { - pallet.add(new PaletteLayer<>(m, sampler)); + pallet.add(new PaletteLayer(m, sampler)); } return this; } @@ -41,25 +42,25 @@ public abstract class Palette { * @param layer - The layer at which to fetch the material. * @return BlockData - The material fetched. */ - public abstract E get(int layer, double x, double y, double z); + public abstract BlockData get(int layer, double x, double y, double z); public int getSize() { return pallet.size(); } - public List> getLayers() { + public List getLayers() { return pallet; } /** * Class representation of a layer of a BlockPalette. */ - public static class PaletteLayer { + public static class PaletteLayer { private final boolean col; // Is layer using a collection? - private ProbabilityCollection collection; + private ProbabilityCollection collection; private final NoiseSampler sampler; - private E m; + private BlockData m; /** * Constructs a PaletteLayerHolder with a ProbabilityCollection of materials and a number of layers. @@ -67,7 +68,7 @@ public abstract class Palette { * @param type The collection of materials to choose from. * @param sampler Noise sampler to use */ - public PaletteLayer(ProbabilityCollection type, NoiseSampler sampler) { + public PaletteLayer(ProbabilityCollection type, NoiseSampler sampler) { this.sampler = sampler; this.col = true; this.collection = type; @@ -79,7 +80,7 @@ public abstract class Palette { * @param type The material to use. * @param sampler Noise sampler to use */ - public PaletteLayer(E type, NoiseSampler sampler) { + public PaletteLayer(BlockData type, NoiseSampler sampler) { this.sampler = sampler; this.col = false; this.m = type; @@ -94,18 +95,18 @@ public abstract class Palette { * * @return Material - the material.. */ - public E get(Random random) { + public BlockData get(Random random) { if(col) return this.collection.get(random); return m; } - public E get(NoiseSampler random, double x, double y, double z, boolean is2D) { + public BlockData get(NoiseSampler random, double x, double y, double z, boolean is2D) { if(col && is2D) return this.collection.get(random, x, z); else if(col) return this.collection.get(random, x, y, z); return m; } - public ProbabilityCollection getCollection() { + public ProbabilityCollection getCollection() { return collection; } } diff --git a/common/src/main/java/com/dfsek/terra/api/world/palette/SinglePalette.java b/common/src/main/java/com/dfsek/terra/api/world/palette/SinglePalette.java index 06b075a2b..7b2db1fe2 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/palette/SinglePalette.java +++ b/common/src/main/java/com/dfsek/terra/api/world/palette/SinglePalette.java @@ -1,14 +1,16 @@ package com.dfsek.terra.api.world.palette; -public class SinglePalette extends Palette { - private final E item; +import com.dfsek.terra.api.platform.block.BlockData; - public SinglePalette(E item) { +public class SinglePalette extends Palette { + private final BlockData item; + + public SinglePalette(BlockData item) { this.item = item; } @Override - public E get(int layer, double x, double y, double z) { + public BlockData get(int layer, double x, double y, double z) { return item; } } diff --git a/common/src/main/java/com/dfsek/terra/api/world/palette/holder/PaletteHolder.java b/common/src/main/java/com/dfsek/terra/api/world/palette/holder/PaletteHolder.java index 2b4704cac..743bbba14 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/palette/holder/PaletteHolder.java +++ b/common/src/main/java/com/dfsek/terra/api/world/palette/holder/PaletteHolder.java @@ -1,16 +1,15 @@ package com.dfsek.terra.api.world.palette.holder; -import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.palette.Palette; public class PaletteHolder { - private final Palette[] palettes; + private final Palette[] palettes; - protected PaletteHolder(Palette[] palettes) { + protected PaletteHolder(Palette[] palettes) { this.palettes = palettes; } - public Palette getPalette(int y) { + public Palette getPalette(int y) { return palettes[y]; } } diff --git a/common/src/main/java/com/dfsek/terra/api/world/palette/holder/PaletteHolderBuilder.java b/common/src/main/java/com/dfsek/terra/api/world/palette/holder/PaletteHolderBuilder.java index 2cc72764b..451567113 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/palette/holder/PaletteHolderBuilder.java +++ b/common/src/main/java/com/dfsek/terra/api/world/palette/holder/PaletteHolderBuilder.java @@ -1,6 +1,5 @@ package com.dfsek.terra.api.world.palette.holder; -import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.palette.Palette; import net.jafama.FastMath; @@ -8,19 +7,19 @@ import java.util.Map; import java.util.TreeMap; public class PaletteHolderBuilder { - private final TreeMap> paletteMap = new TreeMap<>(); + private final TreeMap paletteMap = new TreeMap<>(); - public PaletteHolderBuilder add(int y, Palette palette) { + public PaletteHolderBuilder add(int y, Palette palette) { paletteMap.put(y, palette); return this; } @SuppressWarnings({"unchecked", "rawtypes", "RedundantSuppression"}) public PaletteHolder build() { - Palette[] palettes = new Palette[paletteMap.lastKey() + 1]; + Palette[] palettes = new Palette[paletteMap.lastKey() + 1]; for(int y = 0; y <= FastMath.max(paletteMap.lastKey(), 255); y++) { - Palette d = null; - for(Map.Entry> e : paletteMap.entrySet()) { + Palette d = null; + for(Map.Entry e : paletteMap.entrySet()) { if(e.getKey() >= y) { d = e.getValue(); break; diff --git a/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java index 279dbf3e4..78c2c288a 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java @@ -2,7 +2,6 @@ package com.dfsek.terra.config.factories; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.math.noise.samplers.noise.random.WhiteNoiseSampler; -import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.api.world.palette.NoisePalette; import com.dfsek.terra.api.world.palette.Palette; @@ -13,7 +12,7 @@ import com.dfsek.terra.world.population.items.flora.TerraFlora; public class FloraFactory implements ConfigFactory { @Override public TerraFlora build(FloraTemplate config, TerraPlugin main) { - Palette palette = new NoisePalette<>(new WhiteNoiseSampler(2403), false); + Palette palette = new NoisePalette(new WhiteNoiseSampler(2403), false); for(PaletteLayerHolder layer : config.getFloraPalette()) { palette.add(layer.getLayer(), layer.getSize(), layer.getSampler()); } diff --git a/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java index d4983c076..e4d9fbeda 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java @@ -1,16 +1,15 @@ package com.dfsek.terra.config.factories; import com.dfsek.terra.api.TerraPlugin; -import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.palette.NoisePalette; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.holder.PaletteLayerHolder; import com.dfsek.terra.config.templates.PaletteTemplate; -public class PaletteFactory implements ConfigFactory> { +public class PaletteFactory implements ConfigFactory { @Override - public Palette build(PaletteTemplate config, TerraPlugin main) { - NoisePalette palette = new NoisePalette<>(config.getNoise().apply(2403L), config.getNoise().getDimensions() == 2); + public Palette build(PaletteTemplate config, TerraPlugin main) { + NoisePalette palette = new NoisePalette(config.getNoise().apply(2403L), config.getNoise().getDimensions() == 2); for(PaletteLayerHolder layer : config.getPalette()) { palette.add(layer.getLayer(), layer.getSize(), layer.getSampler()); } diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/Types.java b/common/src/main/java/com/dfsek/terra/config/loaders/Types.java index 46c4f0978..595728d60 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/Types.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/Types.java @@ -5,7 +5,6 @@ import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.util.collections.ProbabilityCollection; import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.flora.Flora; -import com.dfsek.terra.api.world.palette.Palette; import java.lang.reflect.Type; import java.util.Map; @@ -15,7 +14,6 @@ import java.util.Map; */ @SuppressWarnings("unused") public final class Types { - public static final Type BLOCK_DATA_PALETTE_TYPE; public static final Type BLOCK_DATA_PROBABILITY_COLLECTION_TYPE; public static final Type FLORA_PROBABILITY_COLLECTION_TYPE; public static final Type TREE_PROBABILITY_COLLECTION_TYPE; @@ -23,7 +21,6 @@ public final class Types { public static final Type TERRA_BIOME_TERRA_BIOME_PROBABILITY_COLLECTION_MAP; static { - BLOCK_DATA_PALETTE_TYPE = getType("blockDataPalette"); BLOCK_DATA_PROBABILITY_COLLECTION_TYPE = getType("blockDataProbabilityCollection"); FLORA_PROBABILITY_COLLECTION_TYPE = getType("floraProbabilityCollection"); TREE_PROBABILITY_COLLECTION_TYPE = getType("treeProbabilityCollection"); @@ -31,7 +28,6 @@ public final class Types { TERRA_BIOME_TERRA_BIOME_PROBABILITY_COLLECTION_MAP = getType("terraBiomeProbabilityCollectionMap"); } - private Palette blockDataPalette; private ProbabilityCollection blockDataProbabilityCollection; private ProbabilityCollection floraProbabilityCollection; private ProbabilityCollection treeProbabilityCollection; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java index a0e7929e0..7dc94a21b 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java @@ -3,11 +3,9 @@ package com.dfsek.terra.config.loaders.palette; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.holder.PaletteHolder; import com.dfsek.terra.api.world.palette.holder.PaletteHolderBuilder; -import com.dfsek.terra.config.loaders.Types; import java.lang.reflect.Type; import java.util.List; @@ -21,7 +19,7 @@ public class PaletteHolderLoader implements TypeLoader { PaletteHolderBuilder builder = new PaletteHolderBuilder(); for(Map layer : palette) { for(Map.Entry entry : layer.entrySet()) { - builder.add(entry.getValue(), (Palette) configLoader.loadType(Types.BLOCK_DATA_PALETTE_TYPE, entry.getKey())); + builder.add(entry.getValue(), (Palette) configLoader.loadType(Palette.class, entry.getKey())); } } return builder.build(); 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 b0dd6c03f..3de4eeb20 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 @@ -8,22 +8,16 @@ import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeRegistry; -import com.dfsek.tectonic.loading.object.ObjectTemplate; import com.dfsek.terra.api.LoaderRegistrar; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.event.events.config.ConfigPackPostLoadEvent; import com.dfsek.terra.api.event.events.config.ConfigPackPreLoadEvent; -import com.dfsek.terra.api.platform.block.BlockData; -import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.structures.loot.LootTable; -import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.api.structures.script.StructureScript; +import com.dfsek.terra.api.util.generic.pair.ImmutablePair; import com.dfsek.terra.api.util.seeded.NoiseSeeded; import com.dfsek.terra.api.world.biome.provider.BiomeProvider; -import com.dfsek.terra.api.world.flora.Flora; -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.ConfigFactory; @@ -40,21 +34,13 @@ 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.registry.OpenRegistry; -import com.dfsek.terra.registry.config.BiomeRegistry; -import com.dfsek.terra.registry.config.CarverRegistry; import com.dfsek.terra.registry.config.ConfigTypeRegistry; -import com.dfsek.terra.registry.config.FloraRegistry; import com.dfsek.terra.registry.config.FunctionRegistry; import com.dfsek.terra.registry.config.LootRegistry; import com.dfsek.terra.registry.config.NoiseRegistry; -import com.dfsek.terra.registry.config.OreRegistry; -import com.dfsek.terra.registry.config.PaletteRegistry; import com.dfsek.terra.registry.config.ScriptRegistry; -import com.dfsek.terra.registry.config.StructureRegistry; -import com.dfsek.terra.registry.config.TreeRegistry; import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.population.items.TerraStructure; -import com.dfsek.terra.world.population.items.ores.Ore; import org.apache.commons.io.IOUtils; import org.json.simple.parser.ParseException; @@ -73,8 +59,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.function.Supplier; -import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -84,17 +68,12 @@ import java.util.zip.ZipFile; public class ConfigPack implements LoaderRegistrar { private final ConfigPackTemplate template = new ConfigPackTemplate(); - private final BiomeRegistry biomeRegistry = new BiomeRegistry(); - private final StructureRegistry structureRegistry = new StructureRegistry(); - private final PaletteRegistry paletteRegistry; - private final FloraRegistry floraRegistry; - private final OreRegistry oreRegistry = new OreRegistry(); - private final TreeRegistry treeRegistry; + private final Map, ImmutablePair, CheckedRegistry>> registryMap = new HashMap<>(); + + private final ScriptRegistry scriptRegistry = new ScriptRegistry(); private final LootRegistry lootRegistry = new LootRegistry(); - private final CarverRegistry carverRegistry = new CarverRegistry(); - private final NoiseRegistry noiseRegistry = new NoiseRegistry(); private final FunctionRegistry functionRegistry = new FunctionRegistry(); @@ -112,10 +91,12 @@ public class ConfigPack implements LoaderRegistrar { public ConfigPack(File folder, TerraPlugin main) throws ConfigException { try { - floraRegistry = new FloraRegistry(main); - paletteRegistry = new PaletteRegistry(main); - treeRegistry = new TreeRegistry(); - this.configTypeRegistry = new ConfigTypeRegistry(this, main); + this.configTypeRegistry = new ConfigTypeRegistry(this, main, (id, configType) -> { + OpenRegistry openRegistry = configType.registrySupplier().get(); + selfLoader.registerLoader(configType.getTypeClass(), openRegistry); + abstractConfigLoader.registerLoader(configType.getTypeClass(), openRegistry); + registryMap.put(configType.getTypeClass(), ImmutablePair.of(openRegistry, new CheckedRegistry<>(openRegistry))); + }); this.loader = new FolderLoader(folder.toPath()); this.main = main; long l = System.nanoTime(); @@ -151,19 +132,18 @@ public class ConfigPack implements LoaderRegistrar { public ConfigPack(ZipFile file, TerraPlugin main) throws ConfigException { try { - floraRegistry = new FloraRegistry(main); - paletteRegistry = new PaletteRegistry(main); - treeRegistry = new TreeRegistry(); - this.configTypeRegistry = new ConfigTypeRegistry(this, main); + this.configTypeRegistry = new ConfigTypeRegistry(this, main, (id, configType) -> { + OpenRegistry openRegistry = configType.registrySupplier().get(); + selfLoader.registerLoader(configType.getTypeClass(), openRegistry); + abstractConfigLoader.registerLoader(configType.getTypeClass(), openRegistry); + registryMap.put(configType.getTypeClass(), ImmutablePair.of(openRegistry, new CheckedRegistry<>(openRegistry))); + }); this.loader = new ZIPLoader(file); this.main = main; long l = System.nanoTime(); - register(abstractConfigLoader); register(selfLoader); - main.register(selfLoader); - main.register(abstractConfigLoader); try { ZipEntry pack = null; @@ -202,12 +182,7 @@ public class ConfigPack implements LoaderRegistrar { } private void checkDeadEntries(TerraPlugin main) { - biomeRegistry.getDeadEntries().forEach((id, value) -> main.getDebugLogger().warn("Dead entry in biome registry: '" + id + "'")); - paletteRegistry.getDeadEntries().forEach((id, value) -> main.getDebugLogger().warn("Dead entry in palette registry: '" + id + "'")); - floraRegistry.getDeadEntries().forEach((id, value) -> main.getDebugLogger().warn("Dead entry in flora registry: '" + id + "'")); - carverRegistry.getDeadEntries().forEach((id, value) -> main.getDebugLogger().warn("Dead entry in carver registry: '" + id + "'")); - treeRegistry.getDeadEntries().forEach((id, value) -> main.getDebugLogger().warn("Dead entry in tree registry: '" + id + "'")); - oreRegistry.getDeadEntries().forEach((id, value) -> main.getDebugLogger().warn("Dead entry in ore registry: '" + id + "'")); + registryMap.forEach((clazz, pair) -> pair.getLeft().getDeadEntries().forEach((id, value) -> main.getDebugLogger().warn("Dead entry in '" + clazz + "' registry: '" + id + "'"))); } @@ -242,7 +217,7 @@ public class ConfigPack implements LoaderRegistrar { loader.open("", ".yml").thenEntries(entries -> entries.forEach(stream -> configurations.add(new Configuration(stream.getValue(), stream.getKey())))); - Map, List> configs = new HashMap<>(); + Map, List> configs = new HashMap<>(); for(Configuration configuration : configurations) { ProtoConfig config = new ProtoConfig(); @@ -250,7 +225,7 @@ public class ConfigPack implements LoaderRegistrar { configs.computeIfAbsent(config.getType(), configType -> new ArrayList<>()).add(configuration); } - for(ConfigType configType : configTypeRegistry.entries()) { + for(ConfigType configType : configTypeRegistry.entries()) { for(ConfigTemplate config : abstractConfigLoader.loadConfigs(configs.getOrDefault(configType, Collections.emptyList()), () -> configType.getTemplate(this, main))) { ((ConfigType) configType).callback(this, main, config); } @@ -260,16 +235,9 @@ public class ConfigPack implements LoaderRegistrar { main.logger().info("Loaded config pack \"" + template.getID() + "\" v" + template.getVersion() + " by " + template.getAuthor() + " in " + (System.nanoTime() - start) / 1000000D + "ms."); } - public TerraStructure getStructure(String id) { - return structureRegistry.get(id); - } public Set getStructures() { - return new HashSet<>(structureRegistry.entries()); - } - - public List getStructureIDs() { - return structureRegistry.entries().stream().map(terraStructure -> terraStructure.getTemplate().getID()).collect(Collectors.toList()); + return new HashSet<>(getRegistry(TerraStructure.class).entries()); } public ConfigPackTemplate getTemplate() { @@ -280,30 +248,24 @@ public class ConfigPack implements LoaderRegistrar { return varScope; } + @SuppressWarnings("unchecked") + public CheckedRegistry getRegistry(Class clazz) { + return (CheckedRegistry) registryMap.getOrDefault(clazz, ImmutablePair.ofNull()).getRight(); + } + @Override public void register(TypeRegistry registry) { registry .registerLoader(ConfigType.class, configTypeRegistry) - .registerLoader(Palette.class, paletteRegistry) - .registerLoader(BiomeBuilder.class, biomeRegistry) - .registerLoader(Flora.class, floraRegistry) - .registerLoader(Ore.class, oreRegistry) - .registerLoader(Tree.class, treeRegistry) .registerLoader(StructureScript.class, scriptRegistry) - .registerLoader(TerraStructure.class, structureRegistry) .registerLoader(LootTable.class, lootRegistry) - .registerLoader(UserDefinedCarver.class, carverRegistry) .registerLoader(BufferedImage.class, new BufferedImageLoader(loader)) .registerLoader(NoiseSeeded.class, new NoiseSamplerBuilderLoader(noiseRegistry)) .registerLoader(SingleBiomeProviderTemplate.class, SingleBiomeProviderTemplate::new) .registerLoader(BiomePipelineTemplate.class, () -> new BiomePipelineTemplate(main)) - .registerLoader(ImageProviderTemplate.class, () -> new ImageProviderTemplate(biomeRegistry)) - .registerLoader(ImageSamplerTemplate.class, () -> new ImageProviderTemplate(biomeRegistry)); - } - - public Set getCarvers() { - return new HashSet<>(carverRegistry.entries()); + .registerLoader(ImageProviderTemplate.class, () -> new ImageProviderTemplate(getRegistry(BiomeBuilder.class))) + .registerLoader(ImageSamplerTemplate.class, () -> new ImageProviderTemplate(getRegistry(BiomeBuilder.class))); } public BiomeProvider.BiomeProviderBuilder getBiomeProviderBuilder() { @@ -314,55 +276,20 @@ public class ConfigPack implements LoaderRegistrar { return new CheckedRegistry<>(scriptRegistry); } - public CheckedRegistry getBiomeRegistry() { - return new CheckedRegistry<>(biomeRegistry); - } - - public CheckedRegistry getTreeRegistry() { - return new CheckedRegistry<>(treeRegistry); - } - - public CheckedRegistry> getFunctionRegistry() { - return new CheckedRegistry<>(functionRegistry); - } - - public CheckedRegistry>> getNormalizerRegistry() { - return new CheckedRegistry<>(noiseRegistry); - } - - public CheckedRegistry getCarverRegistry() { - return new CheckedRegistry<>(carverRegistry); - } - - public CheckedRegistry getFloraRegistry() { - return new CheckedRegistry<>(floraRegistry); - } - public CheckedRegistry getLootRegistry() { return new CheckedRegistry<>(lootRegistry); } - public CheckedRegistry getOreRegistry() { - return new CheckedRegistry<>(oreRegistry); - } - public CheckedRegistry> getPaletteRegistry() { - return new CheckedRegistry<>(paletteRegistry); - } - - public CheckedRegistry getStructureRegistry() { - return new CheckedRegistry<>(structureRegistry); - } - - public WorldConfig toWorldConfig(TerraWorld world){ + public WorldConfig toWorldConfig(TerraWorld world) { return new WorldConfig(world, this, main); } - public CheckedRegistry> getConfigTypeRegistry() { - return new CheckedRegistry>(configTypeRegistry) { + public CheckedRegistry> getConfigTypeRegistry() { + return new CheckedRegistry>(configTypeRegistry) { @Override @SuppressWarnings("deprecation") - public void addUnchecked(String identifier, ConfigType value) { + public void addUnchecked(String identifier, ConfigType value) { if(contains(identifier)) throw new UnsupportedOperationException("Cannot override values in ConfigTypeRegistry!"); } }; diff --git a/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java b/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java index 2b2c5ed14..40fbe711c 100644 --- a/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java +++ b/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java @@ -1,7 +1,6 @@ package com.dfsek.terra.config.pack; import com.dfsek.terra.api.TerraPlugin; -import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.registry.LockedRegistry; import com.dfsek.terra.api.structures.loot.LootTable; @@ -11,6 +10,7 @@ import com.dfsek.terra.api.world.biome.provider.BiomeProvider; import com.dfsek.terra.api.world.flora.Flora; 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.registry.OpenRegistry; import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.generation.math.SamplerCache; @@ -29,7 +29,7 @@ public class WorldConfig { private final LockedRegistry floraRegistry; private final LockedRegistry lootRegistry; private final LockedRegistry oreRegistry; - private final LockedRegistry> paletteRegistry; + private final LockedRegistry paletteRegistry; private final LockedRegistry structureRegistry; private final BiomeProvider provider; @@ -44,16 +44,16 @@ public class WorldConfig { this.scriptRegistry = new LockedRegistry<>(pack.getScriptRegistry()); OpenRegistry biomeOpenRegistry = new OpenRegistry<>(); - pack.getBiomeRegistry().forEach((id, biome) -> biomeOpenRegistry.add(id, biome.apply(world.getWorld().getSeed()))); + pack.getRegistry(BiomeBuilder.class).forEach((id, biome) -> biomeOpenRegistry.add(id, biome.apply(world.getWorld().getSeed()))); this.biomeRegistry = new LockedRegistry<>(biomeOpenRegistry); - this.carverRegistry = new LockedRegistry<>(pack.getCarverRegistry()); - this.treeRegistry = new LockedRegistry<>(pack.getTreeRegistry()); - this.floraRegistry = new LockedRegistry<>(pack.getFloraRegistry()); + this.carverRegistry = new LockedRegistry<>(pack.getRegistry(UserDefinedCarver.class)); + this.treeRegistry = new LockedRegistry<>(pack.getRegistry(Tree.class)); + this.floraRegistry = new LockedRegistry<>(pack.getRegistry(Flora.class)); this.lootRegistry = new LockedRegistry<>(pack.getLootRegistry()); - this.oreRegistry = new LockedRegistry<>(pack.getOreRegistry()); - this.paletteRegistry = new LockedRegistry<>(pack.getPaletteRegistry()); - this.structureRegistry = new LockedRegistry<>(pack.getStructureRegistry()); + this.oreRegistry = new LockedRegistry<>(pack.getRegistry(Ore.class)); + this.paletteRegistry = new LockedRegistry<>(pack.getRegistry(Palette.class)); + this.structureRegistry = new LockedRegistry<>(pack.getRegistry(TerraStructure.class)); this.provider = pack.getBiomeProviderBuilder().build(world.getWorld().getSeed()); } @@ -98,7 +98,7 @@ public class WorldConfig { return oreRegistry; } - public LockedRegistry> getPaletteRegistry() { + public LockedRegistry getPaletteRegistry() { return paletteRegistry; } 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 index cf5a08853..4c6f66ec7 100644 --- a/common/src/main/java/com/dfsek/terra/config/prototype/ConfigType.java +++ b/common/src/main/java/com/dfsek/terra/config/prototype/ConfigType.java @@ -4,9 +4,16 @@ import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.config.pack.ConfigPack; +import com.dfsek.terra.registry.OpenRegistry; -public interface ConfigType { +import java.util.function.Supplier; + +public interface ConfigType { T getTemplate(ConfigPack pack, TerraPlugin main); void callback(ConfigPack pack, TerraPlugin main, T loadedConfig) throws LoadException; + + Class getTypeClass(); + + Supplier> registrySupplier(); } 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 index bc1aec46b..329a88113 100644 --- a/common/src/main/java/com/dfsek/terra/config/prototype/ProtoConfig.java +++ b/common/src/main/java/com/dfsek/terra/config/prototype/ProtoConfig.java @@ -8,14 +8,14 @@ public class ProtoConfig implements ConfigTemplate { private String id; @Value("type") - private ConfigType type; + private ConfigType type; public String getId() { return id; } - public ConfigType getType() { + public ConfigType getType() { return type; } } diff --git a/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java index 69ee69122..a34a2c8b4 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java @@ -13,7 +13,6 @@ import com.dfsek.terra.api.math.noise.NoiseSampler; import com.dfsek.terra.api.math.noise.samplers.noise.ConstantSampler; import com.dfsek.terra.api.math.paralithic.BlankFunction; import com.dfsek.terra.api.math.paralithic.defined.UserDefinedFunction; -import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.BlockType; import com.dfsek.terra.api.platform.world.Biome; import com.dfsek.terra.api.util.GlueList; @@ -124,7 +123,7 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf @Value("ocean.palette") @Abstractable @Default - private Palette oceanPalette; + private Palette oceanPalette; @Value("elevation.equation") @Default @@ -159,12 +158,12 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf @Value("slabs.palettes") @Abstractable @Default - private Map> slabPalettes; + private Map slabPalettes; @Value("slabs.stair-palettes") @Abstractable @Default - private Map> stairPalettes; + private Map stairPalettes; @Value("slant.threshold") @Abstractable @@ -247,14 +246,6 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf return doSlabs; } - public Map> getSlabPalettes() { - return slabPalettes; - } - - public Map> getStairPalettes() { - return stairPalettes; - } - public BiomeTemplate(ConfigPack pack, TerraPlugin main) { this.pack = pack; biomeNoise = new NoiseSeeded() { @@ -268,7 +259,15 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf return 2; } }; - oceanPalette = new SinglePalette<>(main.getWorldHandle().createBlockData("minecraft:water")); + oceanPalette = new SinglePalette(main.getWorldHandle().createBlockData("minecraft:water")); + } + + public Map getSlabPalettes() { + return slabPalettes; + } + + public Map getStairPalettes() { + return stairPalettes; } public NoiseSeeded getBiomeNoise() { @@ -291,7 +290,7 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf return seaLevel; } - public Palette getOceanPalette() { + public Palette getOceanPalette() { return oceanPalette; } diff --git a/common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java b/common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java index f6b6a3917..3cbe07b0a 100644 --- a/common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java @@ -21,6 +21,7 @@ import java.util.stream.Collectors; */ public class OpenRegistry implements Registry { private final Map> objects; + private static final Entry NULL = new Entry<>(null); public OpenRegistry() { objects = new HashMap<>(); @@ -72,9 +73,10 @@ public class OpenRegistry implements Registry { return objects.containsKey(identifier); } + @SuppressWarnings("unchecked") @Override public T get(String identifier) { - return objects.get(identifier).getValue(); + return objects.getOrDefault(identifier, (Entry) NULL).getValue(); } @Override @@ -89,7 +91,7 @@ public class OpenRegistry implements Registry { @Override public Collection entries() { - return objects.values().stream().map(Entry::getRaw).collect(Collectors.toSet()); + return objects.values().stream().map(Entry::getRaw).collect(Collectors.toList()); } @Override diff --git a/common/src/main/java/com/dfsek/terra/registry/config/ConfigTypeRegistry.java b/common/src/main/java/com/dfsek/terra/registry/config/ConfigTypeRegistry.java index 6d68e58c9..90dd2a4b4 100644 --- a/common/src/main/java/com/dfsek/terra/registry/config/ConfigTypeRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/config/ConfigTypeRegistry.java @@ -3,7 +3,11 @@ package com.dfsek.terra.registry.config; import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.terra.api.TerraPlugin; -import com.dfsek.terra.api.registry.CheckedRegistry; +import com.dfsek.terra.api.platform.world.Tree; +import com.dfsek.terra.api.world.flora.Flora; +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.factories.BiomeFactory; import com.dfsek.terra.config.factories.CarverFactory; import com.dfsek.terra.config.factories.ConfigFactory; @@ -23,25 +27,36 @@ 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.world.population.items.TerraStructure; +import com.dfsek.terra.world.population.items.ores.Ore; import java.util.LinkedHashMap; -import java.util.function.Function; +import java.util.function.BiConsumer; import java.util.function.Supplier; -public class ConfigTypeRegistry extends OpenRegistry> { - public ConfigTypeRegistry(ConfigPack pack, TerraPlugin main) { +public class ConfigTypeRegistry extends OpenRegistry> { + private final BiConsumer> callback; + + public ConfigTypeRegistry(ConfigPack pack, TerraPlugin main, BiConsumer> callback) { super(new LinkedHashMap<>()); // Ordered - add("PALETTE", new ConfigBuilder<>(pack.getPaletteRegistry(), new PaletteFactory(), PaletteTemplate::new)); - add("ORE", new ConfigBuilder<>(pack.getOreRegistry(), new OreFactory(), OreTemplate::new)); - add("FLORA", new ConfigBuilder<>(pack.getFloraRegistry(), new FloraFactory(), FloraTemplate::new)); - add("CARVER", new ConfigBuilder<>(pack.getCarverRegistry(), new CarverFactory(pack), CarverTemplate::new)); - add("STRUCTURE", new ConfigBuilder<>(pack.getStructureRegistry(), new StructureFactory(), StructureTemplate::new)); - add("TREE", new ConfigBuilder<>(pack.getTreeRegistry(), new TreeFactory(), TreeTemplate::new)); - add("BIOME", new ConfigBuilder<>(pack.getBiomeRegistry(), new BiomeFactory(pack), () -> new BiomeTemplate(pack, main))); + this.callback = callback; + add("PALETTE", new ConfigBuilder<>(new PaletteFactory(), PaletteTemplate::new, Palette.class, () -> new PaletteRegistry(main))); + add("ORE", new ConfigBuilder<>(new OreFactory(), OreTemplate::new, Ore.class, OreRegistry::new)); + add("FLORA", new ConfigBuilder<>(new FloraFactory(), FloraTemplate::new, Flora.class, () -> new FloraRegistry(main))); + add("CARVER", new ConfigBuilder<>(new CarverFactory(pack), CarverTemplate::new, UserDefinedCarver.class, CarverRegistry::new)); + add("STRUCTURE", new ConfigBuilder<>(new StructureFactory(), StructureTemplate::new, TerraStructure.class, StructureRegistry::new)); + add("TREE", new ConfigBuilder<>(new TreeFactory(), TreeTemplate::new, Tree.class, TreeRegistry::new)); + add("BIOME", new ConfigBuilder<>(new BiomeFactory(pack), () -> new BiomeTemplate(pack, main), BiomeBuilder.class, BiomeRegistry::new)); add("PACK", new PackBuilder()); } - private static final class PackBuilder implements ConfigType { + @Override + protected boolean add(String identifier, Entry> value) { + callback.accept(identifier, value.getValue()); + return super.add(identifier, value); + } + + private static final class PackBuilder implements ConfigType { @Override public ConfigTemplate getTemplate(ConfigPack pack, TerraPlugin main) { @@ -53,17 +68,29 @@ public class ConfigTypeRegistry extends OpenRegistry> { public void callback(ConfigPack pack, TerraPlugin main, ConfigTemplate loadedConfig) { } + + @Override + public Class getTypeClass() { + return ConfigPack.class; + } + + @Override + public Supplier> registrySupplier() { + return OpenRegistry::new; + } } - private static final class ConfigBuilder implements ConfigType { - private final CheckedRegistry registry; + private static final class ConfigBuilder implements ConfigType { private final ConfigFactory factory; private final Supplier provider; + private final Class clazz; + private final Supplier> registrySupplier; - private ConfigBuilder(CheckedRegistry registry, ConfigFactory factory, Supplier provider) { - this.registry = registry; + private ConfigBuilder(ConfigFactory factory, Supplier provider, Class clazz, Supplier> registrySupplier) { this.factory = factory; this.provider = provider; + this.clazz = clazz; + this.registrySupplier = registrySupplier; } @Override @@ -74,7 +101,17 @@ public class ConfigTypeRegistry extends OpenRegistry> { @SuppressWarnings("deprecation") @Override public void callback(ConfigPack pack, TerraPlugin main, T loadedConfig) throws LoadException { - registry.addUnchecked(loadedConfig.getID(), factory.build(loadedConfig, main)); + pack.getRegistry(clazz).addUnchecked(loadedConfig.getID(), factory.build(loadedConfig, main)); + } + + @Override + public Class getTypeClass() { + return clazz; + } + + @Override + public Supplier> registrySupplier() { + return registrySupplier; } } } diff --git a/common/src/main/java/com/dfsek/terra/registry/config/PaletteRegistry.java b/common/src/main/java/com/dfsek/terra/registry/config/PaletteRegistry.java index e54c8ec81..bcdfea683 100644 --- a/common/src/main/java/com/dfsek/terra/registry/config/PaletteRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/config/PaletteRegistry.java @@ -1,22 +1,21 @@ package com.dfsek.terra.registry.config; import com.dfsek.terra.api.TerraPlugin; -import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.SinglePalette; import com.dfsek.terra.registry.OpenRegistry; -public class PaletteRegistry extends OpenRegistry> { +public class PaletteRegistry extends OpenRegistry { private final TerraPlugin main; + public PaletteRegistry(TerraPlugin main) { this.main = main; } - @Override - public Palette get(String identifier) { + public Palette get(String identifier) { if(identifier.startsWith("BLOCK:")) - return new SinglePalette<>(main.getWorldHandle().createBlockData(identifier.substring(6))); // Return single palette for BLOCK: shortcut. + return new SinglePalette(main.getWorldHandle().createBlockData(identifier.substring(6))); // Return single palette for BLOCK: shortcut. return super.get(identifier); } } diff --git a/common/src/main/java/com/dfsek/terra/world/TerraWorld.java b/common/src/main/java/com/dfsek/terra/world/TerraWorld.java index bbf0ac9f3..02b0c848a 100644 --- a/common/src/main/java/com/dfsek/terra/world/TerraWorld.java +++ b/common/src/main/java/com/dfsek/terra/world/TerraWorld.java @@ -75,7 +75,7 @@ public class TerraWorld { */ public BlockData getUngeneratedBlock(int x, int y, int z) { UserDefinedBiome biome = (UserDefinedBiome) provider.getBiome(x, z); - Palette palette = biome.getGenerator(world).getPalette(y); + Palette palette = biome.getGenerator(world).getPalette(y); Sampler sampler = config.getSamplerCache().get(x, z); int fdX = FastMath.floorMod(x, 16); int fdZ = FastMath.floorMod(z, 16); diff --git a/common/src/main/java/com/dfsek/terra/world/generation/WorldGenerator.java b/common/src/main/java/com/dfsek/terra/world/generation/WorldGenerator.java index 971241ca5..2a46d1c2a 100644 --- a/common/src/main/java/com/dfsek/terra/world/generation/WorldGenerator.java +++ b/common/src/main/java/com/dfsek/terra/world/generation/WorldGenerator.java @@ -1,7 +1,6 @@ package com.dfsek.terra.world.generation; import com.dfsek.terra.api.math.noise.NoiseSampler; -import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.biome.Generator; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.holder.PaletteHolder; @@ -67,7 +66,7 @@ public class WorldGenerator implements Generator { * @return BlockPalette - The biome's palette. */ @Override - public Palette getPalette(int y) { + public Palette getPalette(int y) { return palettes.getPalette(y); } @@ -86,7 +85,7 @@ public class WorldGenerator implements Generator { return blendStep; } - public Palette getSlantPalette(int y) { + public Palette getSlantPalette(int y) { return slantPalettes.getPalette(y); } } diff --git a/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator2D.java b/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator2D.java index c4f384b07..e0124a4a0 100644 --- a/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator2D.java +++ b/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator2D.java @@ -112,7 +112,7 @@ public class DefaultChunkGenerator2D implements TerraChunkGenerator { TerraBiome b = grid.getBiome(xOrig + x, zOrig + z); BiomeTemplate c = ((UserDefinedBiome) b).getConfig(); - Palette seaPalette = c.getOceanPalette(); + Palette seaPalette = c.getOceanPalette(); int height = FastMath.min((int) sampler.sample(x, 0, z), world.getMaxHeight() - 1); diff --git a/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator3D.java b/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator3D.java index f63676161..69e6c8675 100644 --- a/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator3D.java +++ b/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator3D.java @@ -45,7 +45,7 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator { private final ConfigPack configPack; private final TerraPlugin main; private final BlockType water; - private final SinglePalette blank; + private final SinglePalette blank; private final List blockPopulators = new ArrayList<>(); private final Carver carver; @@ -63,7 +63,7 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator { carver = new NoiseCarver(new Range(0, 255), main.getWorldHandle().createBlockData("minecraft:air"), main); water = main.getWorldHandle().createBlockData("minecraft:water").getBlockType(); - blank = new SinglePalette<>(main.getWorldHandle().createBlockData("minecraft:air")); + blank = new SinglePalette(main.getWorldHandle().createBlockData("minecraft:air")); } @Override @@ -124,7 +124,7 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator { BiomeTemplate c = ((UserDefinedBiome) b).getConfig(); int sea = c.getSeaLevel(); - Palette seaPalette = c.getOceanPalette(); + Palette seaPalette = c.getOceanPalette(); boolean justSet = false; BlockData data = null; @@ -162,11 +162,11 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator { } } - private void prepareBlockPartFloor(BlockData down, BlockData orig, ChunkData chunk, Vector3 block, Map> slabs, - Map> stairs, double thresh, Sampler sampler) { + private void prepareBlockPartFloor(BlockData down, BlockData orig, ChunkData chunk, Vector3 block, Map slabs, + Map stairs, double thresh, Sampler sampler) { if(sampler.sample(block.getX(), block.getY() - 0.4, block.getZ()) > thresh) { if(stairs != null) { - Palette stairPalette = stairs.get(down.getBlockType()); + Palette stairPalette = stairs.get(down.getBlockType()); if(stairPalette != null) { BlockData stair = stairPalette.get(0, block.getX(), block.getY(), block.getZ()).clone(); if(stair instanceof Stairs) { @@ -183,11 +183,11 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator { } } - private void prepareBlockPartCeiling(BlockData up, BlockData orig, ChunkData chunk, Vector3 block, Map> slabs, - Map> stairs, double thresh, Sampler sampler) { + private void prepareBlockPartCeiling(BlockData up, BlockData orig, ChunkData chunk, Vector3 block, Map slabs, + Map stairs, double thresh, Sampler sampler) { if(sampler.sample(block.getX(), block.getY() + 0.4, block.getZ()) > thresh) { if(stairs != null) { - Palette stairPalette = stairs.get(up.getBlockType()); + Palette stairPalette = stairs.get(up.getBlockType()); if(stairPalette != null) { BlockData stair = stairPalette.get(0, block.getX(), block.getY(), block.getZ()).clone(); if(stair instanceof Stairs) { diff --git a/common/src/main/java/com/dfsek/terra/world/population/items/flora/TerraFlora.java b/common/src/main/java/com/dfsek/terra/world/population/items/flora/TerraFlora.java index 0893d1c92..b154c2e91 100644 --- a/common/src/main/java/com/dfsek/terra/world/population/items/flora/TerraFlora.java +++ b/common/src/main/java/com/dfsek/terra/world/population/items/flora/TerraFlora.java @@ -22,7 +22,7 @@ import java.util.ArrayList; import java.util.List; public class TerraFlora implements Flora { - private final Palette floraPalette; + private final Palette floraPalette; private final boolean physics; private final boolean ceiling; @@ -43,7 +43,7 @@ public class TerraFlora implements Flora { private final TerraPlugin main; - public TerraFlora(Palette floraPalette, boolean physics, boolean ceiling, MaterialSet irrigable, MaterialSet spawnable, MaterialSet replaceable, MaterialSet testRotation, int maxPlacements, Search search, boolean spawnBlacklist, int irrigableOffset, TerraPlugin main) { + public TerraFlora(Palette floraPalette, boolean physics, boolean ceiling, MaterialSet irrigable, MaterialSet spawnable, MaterialSet replaceable, MaterialSet testRotation, int maxPlacements, Search search, boolean spawnBlacklist, int irrigableOffset, TerraPlugin main) { this.floraPalette = floraPalette; this.physics = physics; this.testRotation = testRotation; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java index 8f3736103..62747e2e2 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java @@ -28,6 +28,6 @@ public class BukkitWorldHandle implements WorldHandle { @Override public Pair getSelectedLocation(Player player) { org.bukkit.Location[] locations = WorldEditUtil.getSelectionLocations(BukkitAdapter.adapt(player)); - return new Pair<>(BukkitAdapter.adapt(locations[0]), BukkitAdapter.adapt(locations[1])); + return Pair.of(BukkitAdapter.adapt(locations[0]), BukkitAdapter.adapt(locations[1])); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/TerraListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/TerraListener.java index 4eb05f91e..f1a205e79 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/TerraListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/TerraListener.java @@ -5,6 +5,7 @@ import com.dfsek.terra.api.event.EventListener; import com.dfsek.terra.api.event.annotations.Global; import com.dfsek.terra.api.event.annotations.Priority; import com.dfsek.terra.api.event.events.config.ConfigPackPreLoadEvent; +import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.bukkit.world.BukkitTree; import com.dfsek.terra.registry.exception.DuplicateEntryException; @@ -23,8 +24,8 @@ public class TerraListener implements EventListener { for(TreeType value : TreeType.values()) { try { String id = BukkitAdapter.TREE_TRANSFORMER.translate(value); - event.getPack().getTreeRegistry().add(id, new BukkitTree(value, main)); - event.getPack().getTreeRegistry().get(id); // Platform trees should never be marked "dead" + event.getPack().getRegistry(Tree.class).add(id, new BukkitTree(value, main)); + event.getPack().getRegistry(Tree.class).get(id); // Platform trees should never be marked "dead" } catch(DuplicateEntryException ignore) { // If another addon has already registered trees, do nothing. } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 57a326726..95b8f1fb5 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -311,7 +311,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { RegistryKey> floraKey = RegistryKey.of(Registry.CONFIGURED_FEATURE_WORLDGEN, new Identifier("terra", "flora_populator")); Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, floraKey.getValue(), POPULATOR_CONFIGURED_FEATURE); - registry.forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> Registry.register(BuiltinRegistries.BIOME, new Identifier("terra", createBiomeID(pack, id)), createBiome(biome)))); // Register all Terra biomes. + registry.forEach(pack -> pack.getRegistry(BiomeBuilder.class).forEach((id, biome) -> Registry.register(BuiltinRegistries.BIOME, new Identifier("terra", createBiomeID(pack, id)), createBiome(biome)))); // Register all Terra biomes. Registry.register(Registry.CHUNK_GENERATOR, new Identifier("terra:terra"), FabricChunkGeneratorWrapper.CODEC); Registry.register(Registry.BIOME_SOURCE, new Identifier("terra:terra"), TerraBiomeSource.CODEC); @@ -408,7 +408,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Priority(Priority.LOWEST) @Global public void injectTrees(ConfigPackPreLoadEvent event) { - CheckedRegistry treeRegistry = event.getPack().getTreeRegistry(); + CheckedRegistry treeRegistry = event.getPack().getRegistry(Tree.class); injectTree(treeRegistry, "BROWN_MUSHROOM", ConfiguredFeatures.HUGE_BROWN_MUSHROOM); injectTree(treeRegistry, "RED_MUSHROOM", ConfiguredFeatures.HUGE_RED_MUSHROOM); injectTree(treeRegistry, "JUNGLE", ConfiguredFeatures.MEGA_JUNGLE_TREE); From 4202875675ddca0f5b367b65aa9cc973df77ef8f Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 11 Apr 2021 03:15:44 -0700 Subject: [PATCH 16/20] dynamic registris in WorldConfig --- .../biome/arg/BiomeArgumentParser.java | 2 +- .../commands/biome/tab/BiomeTabCompleter.java | 2 +- .../argument/StructureArgumentParser.java | 2 +- .../completer/StructureCompleter.java | 3 +- .../dfsek/terra/config/pack/ConfigPack.java | 4 -- .../dfsek/terra/config/pack/WorldConfig.java | 71 ++++--------------- .../bukkit/listeners/CommonListener.java | 2 +- .../terra/bukkit/listeners/PaperListener.java | 2 +- .../bukkit/listeners/SpigotListener.java | 2 +- 9 files changed, 23 insertions(+), 67 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/commands/biome/arg/BiomeArgumentParser.java b/common/src/main/java/com/dfsek/terra/commands/biome/arg/BiomeArgumentParser.java index 251036d39..7931b30be 100644 --- a/common/src/main/java/com/dfsek/terra/commands/biome/arg/BiomeArgumentParser.java +++ b/common/src/main/java/com/dfsek/terra/commands/biome/arg/BiomeArgumentParser.java @@ -14,6 +14,6 @@ public class BiomeArgumentParser implements ArgumentParser { @Override public TerraBiome parse(CommandSender sender, String arg) { Player player = (Player) sender; - return main.getWorld(player.getWorld()).getConfig().getBiomeRegistry().get(arg); + return main.getWorld(player.getWorld()).getConfig().getRegistry(TerraBiome.class).get(arg); } } diff --git a/common/src/main/java/com/dfsek/terra/commands/biome/tab/BiomeTabCompleter.java b/common/src/main/java/com/dfsek/terra/commands/biome/tab/BiomeTabCompleter.java index f2461c532..4476e3613 100644 --- a/common/src/main/java/com/dfsek/terra/commands/biome/tab/BiomeTabCompleter.java +++ b/common/src/main/java/com/dfsek/terra/commands/biome/tab/BiomeTabCompleter.java @@ -17,6 +17,6 @@ public class BiomeTabCompleter implements TabCompleter { @Override public List complete(CommandSender sender) { Player player = (Player) sender; - return main.getWorld(player.getWorld()).getConfig().getBiomeRegistry().entries().stream().map(TerraBiome::getID).collect(Collectors.toList()); + return main.getWorld(player.getWorld()).getConfig().getRegistry(TerraBiome.class).entries().stream().map(TerraBiome::getID).collect(Collectors.toList()); } } diff --git a/common/src/main/java/com/dfsek/terra/commands/structure/argument/StructureArgumentParser.java b/common/src/main/java/com/dfsek/terra/commands/structure/argument/StructureArgumentParser.java index dce50ac65..cf8b3378f 100644 --- a/common/src/main/java/com/dfsek/terra/commands/structure/argument/StructureArgumentParser.java +++ b/common/src/main/java/com/dfsek/terra/commands/structure/argument/StructureArgumentParser.java @@ -13,6 +13,6 @@ public class StructureArgumentParser implements ArgumentParser { @Override public TerraStructure parse(CommandSender sender, String arg) { - return main.getWorld(((Player) sender).getWorld()).getConfig().getStructureRegistry().get(arg); + return main.getWorld(((Player) sender).getWorld()).getConfig().getRegistry(TerraStructure.class).get(arg); } } diff --git a/common/src/main/java/com/dfsek/terra/commands/structure/completer/StructureCompleter.java b/common/src/main/java/com/dfsek/terra/commands/structure/completer/StructureCompleter.java index a2b5b1dad..cebfa20ab 100644 --- a/common/src/main/java/com/dfsek/terra/commands/structure/completer/StructureCompleter.java +++ b/common/src/main/java/com/dfsek/terra/commands/structure/completer/StructureCompleter.java @@ -5,6 +5,7 @@ import com.dfsek.terra.api.command.tab.TabCompleter; import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.platform.CommandSender; import com.dfsek.terra.api.platform.entity.Player; +import com.dfsek.terra.world.population.items.TerraStructure; import java.util.ArrayList; import java.util.List; @@ -16,6 +17,6 @@ public class StructureCompleter implements TabCompleter { @Override public List complete(CommandSender sender) { Player player = (Player) sender; - return new ArrayList<>(main.getWorld(player.getWorld()).getConfig().getStructureRegistry().keys()); + return new ArrayList<>(main.getWorld(player.getWorld()).getConfig().getRegistry(TerraStructure.class).keys()); } } 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 3de4eeb20..d9d1e2be9 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 @@ -276,10 +276,6 @@ public class ConfigPack implements LoaderRegistrar { return new CheckedRegistry<>(scriptRegistry); } - public CheckedRegistry getLootRegistry() { - return new CheckedRegistry<>(lootRegistry); - } - public WorldConfig toWorldConfig(TerraWorld world) { return new WorldConfig(world, this, main); diff --git a/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java b/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java index 40fbe711c..a9fddf712 100644 --- a/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java +++ b/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java @@ -1,63 +1,54 @@ package com.dfsek.terra.config.pack; import com.dfsek.terra.api.TerraPlugin; -import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.registry.LockedRegistry; -import com.dfsek.terra.api.structures.loot.LootTable; import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.provider.BiomeProvider; -import com.dfsek.terra.api.world.flora.Flora; -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.registry.OpenRegistry; import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.generation.math.SamplerCache; import com.dfsek.terra.world.population.items.TerraStructure; -import com.dfsek.terra.world.population.items.ores.Ore; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Set; public class WorldConfig { private final LockedRegistry scriptRegistry; - private final LockedRegistry biomeRegistry; private final SamplerCache samplerCache; - private final LockedRegistry carverRegistry; - private final LockedRegistry treeRegistry; - private final LockedRegistry floraRegistry; - private final LockedRegistry lootRegistry; - private final LockedRegistry oreRegistry; - private final LockedRegistry paletteRegistry; - private final LockedRegistry structureRegistry; private final BiomeProvider provider; private final TerraWorld world; private final ConfigPack pack; + private final Map, LockedRegistry> registryMap = new HashMap<>(); + public WorldConfig(TerraWorld world, ConfigPack pack, TerraPlugin main) { this.world = world; this.pack = pack; this.samplerCache = new SamplerCache(main, world); + + pack.getConfigTypeRegistry().forEach(configType -> registryMap.put(configType.getTypeClass(), new LockedRegistry<>(pack.getRegistry(configType.getTypeClass())))); + this.scriptRegistry = new LockedRegistry<>(pack.getScriptRegistry()); OpenRegistry biomeOpenRegistry = new OpenRegistry<>(); pack.getRegistry(BiomeBuilder.class).forEach((id, biome) -> biomeOpenRegistry.add(id, biome.apply(world.getWorld().getSeed()))); - - this.biomeRegistry = new LockedRegistry<>(biomeOpenRegistry); - this.carverRegistry = new LockedRegistry<>(pack.getRegistry(UserDefinedCarver.class)); - this.treeRegistry = new LockedRegistry<>(pack.getRegistry(Tree.class)); - this.floraRegistry = new LockedRegistry<>(pack.getRegistry(Flora.class)); - this.lootRegistry = new LockedRegistry<>(pack.getLootRegistry()); - this.oreRegistry = new LockedRegistry<>(pack.getRegistry(Ore.class)); - this.paletteRegistry = new LockedRegistry<>(pack.getRegistry(Palette.class)); - this.structureRegistry = new LockedRegistry<>(pack.getRegistry(TerraStructure.class)); + registryMap.put(TerraBiome.class, new LockedRegistry<>(biomeOpenRegistry)); this.provider = pack.getBiomeProviderBuilder().build(world.getWorld().getSeed()); } + @SuppressWarnings("unchecked") + public LockedRegistry getRegistry(Class clazz) { + return (LockedRegistry) registryMap.get(clazz); + } + public TerraWorld getWorld() { return world; } @@ -67,51 +58,19 @@ public class WorldConfig { } public Set getCarvers() { - return new HashSet<>(carverRegistry.entries()); + return new HashSet<>(getRegistry(UserDefinedCarver.class).entries()); } public LockedRegistry getScriptRegistry() { return scriptRegistry; } - public LockedRegistry getBiomeRegistry() { - return biomeRegistry; - } - - public LockedRegistry getTreeRegistry() { - return treeRegistry; - } - - public LockedRegistry getCarverRegistry() { - return carverRegistry; - } - - public LockedRegistry getFloraRegistry() { - return floraRegistry; - } - - public LockedRegistry getLootRegistry() { - return lootRegistry; - } - - public LockedRegistry getOreRegistry() { - return oreRegistry; - } - - public LockedRegistry getPaletteRegistry() { - return paletteRegistry; - } - - public LockedRegistry getStructureRegistry() { - return structureRegistry; - } - public BiomeProvider getProvider() { return provider; } public Set getStructures() { - return new HashSet<>(structureRegistry.entries()); + return new HashSet<>(getRegistry(TerraStructure.class).entries()); } public ConfigPackTemplate getTemplate() { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java index 5c6d31183..9e2a65407 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java @@ -52,7 +52,7 @@ public class CommonListener implements Listener { Block block = e.getLocation().getBlock(); BlockData data = block.getBlockData(); block.setType(Material.AIR); - Tree tree = c.getTreeRegistry().get(TREE_TYPE_STRING_TRANSFORMER.translate(e.getSpecies())); + Tree tree = c.getRegistry(Tree.class).get(TREE_TYPE_STRING_TRANSFORMER.translate(e.getSpecies())); org.bukkit.Location location = e.getLocation(); if(!tree.plant(new Location(bukkit, location.getX(), location.getY(), location.getZ()), new FastRandom())) block.setBlockData(data); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/PaperListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/PaperListener.java index 3945451f4..aebdd017d 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/PaperListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/PaperListener.java @@ -23,7 +23,7 @@ public class PaperListener implements Listener { String name = "minecraft:" + e.getType().getName(); main.getDebugLogger().info("Overriding structure location for \"" + name + "\""); TerraWorld tw = main.getWorld(BukkitAdapter.adapt(e.getWorld())); - TerraStructure config = tw.getConfig().getStructureRegistry().get(tw.getConfig().getTemplate().getLocatable().get(name)); + TerraStructure config = tw.getConfig().getRegistry(TerraStructure.class).get(tw.getConfig().getTemplate().getLocatable().get(name)); if(config != null) { AsyncStructureFinder finder = new AsyncStructureFinder(tw.getBiomeProvider(), config, BukkitAdapter.adapt(e.getOrigin()), 0, 500, location -> { if(location != null) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java index fe4681e61..0260bf215 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java @@ -37,7 +37,7 @@ public class SpigotListener implements Listener { if(!TerraWorld.isTerraWorld(BukkitAdapter.adapt(e.getEntity().getWorld()))) return; TerraWorld tw = main.getWorld(BukkitAdapter.adapt(e.getEntity().getWorld())); EnderSignal signal = (EnderSignal) entity; - TerraStructure config = tw.getConfig().getStructureRegistry().get(tw.getConfig().getTemplate().getLocatable().get("STRONGHOLD")); + TerraStructure config = tw.getConfig().getRegistry(TerraStructure.class).get(tw.getConfig().getTemplate().getLocatable().get("STRONGHOLD")); if(config != null) { main.getDebugLogger().info("Overriding Ender Signal..."); AsyncStructureFinder finder = new AsyncStructureFinder(tw.getBiomeProvider(), config, BukkitAdapter.adapt(e.getLocation()), 0, 500, location -> { From 7a703ad091800de5e811fa04f2b36f58026667b7 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 11 Apr 2021 14:15:13 -0700 Subject: [PATCH 17/20] add publication config to Fabric --- platforms/fabric/build.gradle.kts | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index bde8a8d1a..9d4597bc5 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -6,6 +6,7 @@ import net.fabricmc.loom.task.RemapJarTask plugins { `java-library` + `maven-publish` id("fabric-loom").version("0.6-SNAPSHOT") id("com.modrinth.minotaur").version("1.1.0") } @@ -63,4 +64,28 @@ tasks.register("publishModrinth") { addGameVersion("1.16.4") addGameVersion("1.16.5") addLoader("fabric") +} + +publishing { + publications { + create("mavenJava") { + artifact(tasks["sourcesJar"]) + artifact(tasks["jar"]) + } + } + + repositories { + val mavenUrl = "https://repo.codemc.io/repository/maven-releases/" + + maven(mavenUrl) { + val mavenUsername: String? by project + val mavenPassword: String? by project + if (mavenUsername != null && mavenPassword != null) { + credentials { + username = mavenUsername + password = mavenPassword + } + } + } + } } \ No newline at end of file From 01d169256e0fb1260cc9c4f27e8098c0b2c1163f Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 11 Apr 2021 17:49:39 -0700 Subject: [PATCH 18/20] properly relocate dependencies --- .../main/kotlin/com/dfsek/terra/DependencyConfig.kt | 4 +--- .../main/kotlin/com/dfsek/terra/DistributionConfig.kt | 8 +++++++- common/build.gradle.kts | 3 ++- platforms/bukkit/build.gradle.kts | 10 ++-------- platforms/fabric/build.gradle.kts | 7 ------- 5 files changed, 12 insertions(+), 20 deletions(-) diff --git a/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt b/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt index bdcada325..4bab053e4 100644 --- a/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt +++ b/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt @@ -18,9 +18,7 @@ fun Project.configureDependencies() { dependencies { "testImplementation"("org.junit.jupiter:junit-jupiter-api:5.7.0") - "testImplementation"("org.yaml:snakeyaml:1.27") - "testImplementation"("com.googlecode.json-simple:json-simple:1.1.1") - "testRuntimeOnly"("org.junit.jupiter:junit-jupiter-engine:5.7.0") + "testImplementation"("org.junit.jupiter:junit-jupiter-engine:5.7.0") "compileOnly"("org.jetbrains:annotations:20.1.0") } } \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/com/dfsek/terra/DistributionConfig.kt b/buildSrc/src/main/kotlin/com/dfsek/terra/DistributionConfig.kt index aeb306888..c874d8820 100644 --- a/buildSrc/src/main/kotlin/com/dfsek/terra/DistributionConfig.kt +++ b/buildSrc/src/main/kotlin/com/dfsek/terra/DistributionConfig.kt @@ -62,8 +62,14 @@ fun Project.configureDistribution() { archiveClassifier.set("shaded") setVersion(project.version) relocate("org.apache.commons", "com.dfsek.terra.lib.commons") - relocate("parsii", "com.dfsek.terra.lib.parsii") relocate("net.jafama", "com.dfsek.terra.lib.jafama") + relocate("org.objectweb.asm", "com.dfsek.terra.lib.asm") + relocate("com.google.errorprone", "com.dfsek.terra.lib.google.errorprone") + relocate("com.google.j2objc", "com.dfsek.terra.lib.google.j2objc") + relocate("org.checkerframework", "com.dfsek.terra.lib.checkerframework") + relocate("org.javax.annotation", "com.dfsek.terra.lib.javax.annotation") + relocate("org.json", "com.dfsek.terra.lib.json") + relocate("org.yaml", "com.dfsek.terra.lib.yaml") minimize() } convention.getPlugin().archivesBaseName = project.name diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 5938324de..ec58b60e9 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -20,7 +20,8 @@ dependencies { "shadedApi"("org.ow2.asm:asm:9.0") "shadedApi"("commons-io:commons-io:2.6") - "compileOnly"("com.googlecode.json-simple:json-simple:1.1") + "shadedApi"("com.googlecode.json-simple:json-simple:1.1.1") + "shadedApi"("org.yaml:snakeyaml:1.27") "compileOnly"("com.google.guava:guava:30.0-jre") diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index 3b477791b..6e8f30a0e 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -22,13 +22,6 @@ val testMem = "3G" val paperURL = "https://papermc.io/api/v1/paper/%version%/latest/download/" val purpurURL = "https://ci.pl3x.net/job/Purpur/lastSuccessfulBuild/artifact/final/purpurclip.jar" -repositories { - mavenCentral() - maven { url = uri("http://maven.enginehub.org/repo/") } - maven { url = uri("https://repo.codemc.org/repository/maven-public") } - maven { url = uri("https://papermc.io/repo/repository/maven-public/") } -} - dependencies { "shadedApi"(project(":common")) @@ -39,7 +32,7 @@ dependencies { "compileOnly"("com.sk89q.worldedit:worldedit-bukkit:7.2.0-SNAPSHOT") - "shadedImplementation"("com.google.guava:guava:30.0-jre") + "shadedApi"("com.google.guava:guava:30.0-jre") } val jvmFlags = listOf("-XX:+UseG1GC", "-XX:+ParallelRefProcEnabled", "-XX:MaxGCPauseMillis=200", @@ -189,6 +182,7 @@ task(name = "runPurpur") { tasks.named("shadowJar") { relocate("org.bstats.bukkit", "com.dfsek.terra.lib.bstats") relocate("io.papermc.lib", "com.dfsek.terra.lib.paperlib") + relocate("com.google.common", "com.dfsek.terra.lib.google.common") } publishing { diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index bde8a8d1a..cd9555463 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -21,8 +21,6 @@ group = "com.dfsek.terra.fabric" dependencies { "shadedApi"(project(":common")) - "shadedImplementation"("org.yaml:snakeyaml:1.27") - "shadedImplementation"("com.googlecode.json-simple:json-simple:1.1.1") "minecraft"("com.mojang:minecraft:1.16.5") "mappings"("net.fabricmc:yarn:1.16.5+build.5:v2") @@ -31,11 +29,6 @@ dependencies { "modImplementation"("net.fabricmc.fabric-api:fabric-api:0.31.0+1.16") } -tasks.named("shadowJar") { - relocate("org.json", "com.dfsek.terra.lib.json") - relocate("org.yaml", "com.dfsek.terra.lib.yaml") -} - configure { accessWidener("src/main/resources/terra.accesswidener") From 9f4f9702a68818223fb19f2ea215c11426fa1a84 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 11 Apr 2021 17:54:07 -0700 Subject: [PATCH 19/20] bump version --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 1e189b37b..8d567f9d9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,6 @@ import com.dfsek.terra.getGitHash -val versionObj = Version("5", "1", "2", true) +val versionObj = Version("5", "1", "3", true) allprojects { version = versionObj From e671ef783f48341194b57cc463c35885cc6241a7 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 11 Apr 2021 20:56:15 -0700 Subject: [PATCH 20/20] completely dynamic registries --- .../structures/script/StructureScript.java | 8 +- .../script/builders/LootFunctionBuilder.java | 7 +- .../builders/StructureFunctionBuilder.java | 7 +- .../script/functions/LootFunction.java | 6 +- .../script/functions/StructureFunction.java | 6 +- .../terra/api/util/seeded/NoiseProvider.java | 9 + .../argument/ScriptArgumentParser.java | 2 +- .../structure/completer/ScriptCompleter.java | 2 +- .../sampler/NoiseSamplerBuilderLoader.java | 7 +- .../dfsek/terra/config/pack/ConfigPack.java | 70 ++-- .../dfsek/terra/config/pack/WorldConfig.java | 7 - .../terra/registry/config/NoiseRegistry.java | 7 +- .../src/test/java/biome/DistributionTest.java | 352 ------------------ common/src/test/java/biome/ImageTest.java | 218 ----------- 14 files changed, 73 insertions(+), 635 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/util/seeded/NoiseProvider.java delete mode 100644 common/src/test/java/biome/DistributionTest.java delete mode 100644 common/src/test/java/biome/ImageTest.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 108b3b101..b4f9439a6 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -3,10 +3,13 @@ package com.dfsek.terra.api.structures.script; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.registry.Registry; +import com.dfsek.terra.api.structures.loot.LootTable; import com.dfsek.terra.api.structures.parser.Parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.api.structures.script.builders.BinaryNumberFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.BiomeFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.BlockFunctionBuilder; @@ -29,9 +32,6 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.structure.buffer.DirectBuffer; import com.dfsek.terra.api.structures.structure.buffer.StructureBuffer; -import com.dfsek.terra.registry.config.FunctionRegistry; -import com.dfsek.terra.registry.config.LootRegistry; -import com.dfsek.terra.registry.config.ScriptRegistry; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import net.jafama.FastMath; @@ -49,7 +49,7 @@ public class StructureScript { private final TerraPlugin main; private String tempID; - public StructureScript(InputStream inputStream, TerraPlugin main, ScriptRegistry registry, LootRegistry lootRegistry, FunctionRegistry functionRegistry) throws ParseException { + public StructureScript(InputStream inputStream, TerraPlugin main, Registry registry, Registry lootRegistry, Registry> functionRegistry) throws ParseException { Parser parser; try { parser = new Parser(IOUtils.toString(inputStream)); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/LootFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/LootFunctionBuilder.java index d5e46d9d3..b894743a7 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/LootFunctionBuilder.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/LootFunctionBuilder.java @@ -1,21 +1,22 @@ package com.dfsek.terra.api.structures.script.builders; import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.registry.Registry; +import com.dfsek.terra.api.structures.loot.LootTable; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.api.structures.script.functions.LootFunction; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.registry.config.LootRegistry; import java.util.List; public class LootFunctionBuilder implements FunctionBuilder { private final TerraPlugin main; - private final LootRegistry registry; + private final Registry registry; private final StructureScript script; - public LootFunctionBuilder(TerraPlugin main, LootRegistry registry, StructureScript script) { + public LootFunctionBuilder(TerraPlugin main, Registry registry, StructureScript script) { this.main = main; this.registry = registry; this.script = script; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/StructureFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/StructureFunctionBuilder.java index 2b0be8468..918fec245 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/StructureFunctionBuilder.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/StructureFunctionBuilder.java @@ -1,21 +1,22 @@ package com.dfsek.terra.api.structures.script.builders; import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.api.structures.script.functions.StructureFunction; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.registry.config.ScriptRegistry; import java.util.List; import java.util.stream.Collectors; public class StructureFunctionBuilder implements FunctionBuilder { - private final ScriptRegistry registry; + private final Registry registry; private final TerraPlugin main; - public StructureFunctionBuilder(ScriptRegistry registry, TerraPlugin main) { + public StructureFunctionBuilder(Registry registry, TerraPlugin main) { this.registry = registry; this.main = main; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java index 42add8070..ddbc064cd 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java @@ -3,6 +3,7 @@ package com.dfsek.terra.api.structures.script.functions; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.structures.loot.LootTable; import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Returnable; @@ -13,20 +14,19 @@ import com.dfsek.terra.api.structures.script.TerraImplementationArguments; import com.dfsek.terra.api.structures.structure.RotationUtil; import com.dfsek.terra.api.structures.structure.buffer.items.BufferedLootApplication; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.registry.config.LootRegistry; import net.jafama.FastMath; import java.util.Map; public class LootFunction implements Function { - private final LootRegistry registry; + private final Registry registry; private final Returnable data; private final Returnable x, y, z; private final Position position; private final TerraPlugin main; private final StructureScript script; - public LootFunction(LootRegistry registry, Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, Position position, StructureScript script) { + public LootFunction(Registry registry, Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, Position position, StructureScript script) { this.registry = registry; this.position = position; this.data = data; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java index 7b9b38830..c0378d60e 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java @@ -3,6 +3,7 @@ package com.dfsek.terra.api.structures.script.functions; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.Function; @@ -13,21 +14,20 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.RotationUtil; import com.dfsek.terra.api.structures.structure.buffer.IntermediateBuffer; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.registry.config.ScriptRegistry; import net.jafama.FastMath; import java.util.List; import java.util.Map; public class StructureFunction implements Function { - private final ScriptRegistry registry; + private final Registry registry; private final Returnable id; private final Returnable x, y, z; private final Position position; private final TerraPlugin main; private final List> rotations; - public StructureFunction(Returnable x, Returnable y, Returnable z, Returnable id, List> rotations, ScriptRegistry registry, Position position, TerraPlugin main) { + public StructureFunction(Returnable x, Returnable y, Returnable z, Returnable id, List> rotations, Registry registry, Position position, TerraPlugin main) { this.registry = registry; this.id = id; this.position = position; diff --git a/common/src/main/java/com/dfsek/terra/api/util/seeded/NoiseProvider.java b/common/src/main/java/com/dfsek/terra/api/util/seeded/NoiseProvider.java new file mode 100644 index 000000000..90b04c3f1 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/util/seeded/NoiseProvider.java @@ -0,0 +1,9 @@ +package com.dfsek.terra.api.util.seeded; + +import com.dfsek.tectonic.loading.object.ObjectTemplate; + +import java.util.function.Supplier; + +@FunctionalInterface +public interface NoiseProvider extends Supplier> { +} diff --git a/common/src/main/java/com/dfsek/terra/commands/structure/argument/ScriptArgumentParser.java b/common/src/main/java/com/dfsek/terra/commands/structure/argument/ScriptArgumentParser.java index 3797c08cd..f7d23dee8 100644 --- a/common/src/main/java/com/dfsek/terra/commands/structure/argument/ScriptArgumentParser.java +++ b/common/src/main/java/com/dfsek/terra/commands/structure/argument/ScriptArgumentParser.java @@ -13,6 +13,6 @@ public class ScriptArgumentParser implements ArgumentParser { @Override public StructureScript parse(CommandSender sender, String arg) { - return main.getWorld(((Player) sender).getWorld()).getConfig().getScriptRegistry().get(arg); + return main.getWorld(((Player) sender).getWorld()).getConfig().getRegistry(StructureScript.class).get(arg); } } diff --git a/common/src/main/java/com/dfsek/terra/commands/structure/completer/ScriptCompleter.java b/common/src/main/java/com/dfsek/terra/commands/structure/completer/ScriptCompleter.java index 24f927baa..81e6eba02 100644 --- a/common/src/main/java/com/dfsek/terra/commands/structure/completer/ScriptCompleter.java +++ b/common/src/main/java/com/dfsek/terra/commands/structure/completer/ScriptCompleter.java @@ -16,6 +16,6 @@ public class ScriptCompleter implements TabCompleter { @Override public List complete(CommandSender sender) { - return main.getWorld(((Player) sender).getWorld()).getConfig().getScriptRegistry().entries().stream().map(StructureScript::getId).collect(Collectors.toList()); + return main.getWorld(((Player) sender).getWorld()).getConfig().getRegistry(StructureScript.class).entries().stream().map(StructureScript::getId).collect(Collectors.toList()); } } diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/NoiseSamplerBuilderLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/NoiseSamplerBuilderLoader.java index 65ebf9d38..919ace8f7 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/NoiseSamplerBuilderLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/NoiseSamplerBuilderLoader.java @@ -6,8 +6,9 @@ import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.tectonic.loading.object.ObjectTemplate; +import com.dfsek.terra.api.registry.Registry; +import com.dfsek.terra.api.util.seeded.NoiseProvider; import com.dfsek.terra.api.util.seeded.NoiseSeeded; -import com.dfsek.terra.registry.config.NoiseRegistry; import java.lang.reflect.Type; import java.util.Locale; @@ -15,9 +16,9 @@ import java.util.Map; @SuppressWarnings("unchecked") public class NoiseSamplerBuilderLoader implements TypeLoader { - private final NoiseRegistry noiseRegistry; + private final Registry noiseRegistry; - public NoiseSamplerBuilderLoader(NoiseRegistry noiseRegistry) { + public NoiseSamplerBuilderLoader(Registry noiseRegistry) { this.noiseRegistry = noiseRegistry; } 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 d9d1e2be9..07ea5b52a 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 @@ -13,14 +13,16 @@ import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.event.events.config.ConfigPackPostLoadEvent; import com.dfsek.terra.api.event.events.config.ConfigPackPreLoadEvent; import com.dfsek.terra.api.registry.CheckedRegistry; +import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.structures.loot.LootTable; +import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.api.util.generic.pair.ImmutablePair; +import com.dfsek.terra.api.util.seeded.NoiseProvider; import com.dfsek.terra.api.util.seeded.NoiseSeeded; import com.dfsek.terra.api.world.biome.provider.BiomeProvider; import com.dfsek.terra.config.builder.BiomeBuilder; import com.dfsek.terra.config.dummy.DummyWorld; -import com.dfsek.terra.config.factories.ConfigFactory; import com.dfsek.terra.config.fileloaders.FolderLoader; import com.dfsek.terra.config.fileloaders.Loader; import com.dfsek.terra.config.fileloaders.ZIPLoader; @@ -32,7 +34,6 @@ 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.registry.OpenRegistry; import com.dfsek.terra.registry.config.ConfigTypeRegistry; import com.dfsek.terra.registry.config.FunctionRegistry; @@ -68,33 +69,21 @@ import java.util.zip.ZipFile; public class ConfigPack implements LoaderRegistrar { private final ConfigPackTemplate template = new ConfigPackTemplate(); - private final Map, ImmutablePair, CheckedRegistry>> registryMap = new HashMap<>(); - - - private final ScriptRegistry scriptRegistry = new ScriptRegistry(); - private final LootRegistry lootRegistry = new LootRegistry(); - - private final NoiseRegistry noiseRegistry = new NoiseRegistry(); - private final FunctionRegistry functionRegistry = new FunctionRegistry(); - private final AbstractConfigLoader abstractConfigLoader = new AbstractConfigLoader(); private final ConfigLoader selfLoader = new ConfigLoader(); private final Scope varScope = new Scope(); - private final TerraPlugin main; private final Loader loader; - private final BiomeProvider.BiomeProviderBuilder biomeProviderBuilder; - private final ConfigTypeRegistry configTypeRegistry; + private final ConfigTypeRegistry configTypeRegistry; + private final Map, ImmutablePair, CheckedRegistry>> registryMap = newRegistryMap(); public ConfigPack(File folder, TerraPlugin main) throws ConfigException { try { this.configTypeRegistry = new ConfigTypeRegistry(this, main, (id, configType) -> { OpenRegistry openRegistry = configType.registrySupplier().get(); - selfLoader.registerLoader(configType.getTypeClass(), openRegistry); - abstractConfigLoader.registerLoader(configType.getTypeClass(), openRegistry); registryMap.put(configType.getTypeClass(), ImmutablePair.of(openRegistry, new CheckedRegistry<>(openRegistry))); }); this.loader = new FolderLoader(folder.toPath()); @@ -134,8 +123,6 @@ public class ConfigPack implements LoaderRegistrar { try { this.configTypeRegistry = new ConfigTypeRegistry(this, main, (id, configType) -> { OpenRegistry openRegistry = configType.registrySupplier().get(); - selfLoader.registerLoader(configType.getTypeClass(), openRegistry); - abstractConfigLoader.registerLoader(configType.getTypeClass(), openRegistry); registryMap.put(configType.getTypeClass(), ImmutablePair.of(openRegistry, new CheckedRegistry<>(openRegistry))); }); this.loader = new ZIPLoader(file); @@ -177,15 +164,35 @@ public class ConfigPack implements LoaderRegistrar { toWorldConfig(new TerraWorld(new DummyWorld(), this, main)); // Build now to catch any errors immediately. } - public static void buildAll(ConfigFactory factory, OpenRegistry registry, List configTemplates, TerraPlugin main) throws LoadException { - for(C template : configTemplates) registry.add(template.getID(), factory.build(template, main)); + @SuppressWarnings({"unchecked", "rawtypes"}) + private Map, ImmutablePair, CheckedRegistry>> newRegistryMap() { + Map, ImmutablePair, CheckedRegistry>> map = new HashMap, ImmutablePair, CheckedRegistry>>() { + private static final long serialVersionUID = 4015855819914064466L; + + @Override + public ImmutablePair, CheckedRegistry> put(Class key, ImmutablePair, CheckedRegistry> value) { + selfLoader.registerLoader(key, value.getLeft()); + abstractConfigLoader.registerLoader(key, value.getLeft()); + return super.put(key, value); + } + }; + + putPair(map, NoiseProvider.class, new NoiseRegistry()); + putPair(map, FunctionBuilder.class, (OpenRegistry) (Object) new FunctionRegistry()); + putPair(map, LootTable.class, new LootRegistry()); + putPair(map, StructureScript.class, new ScriptRegistry()); + + return map; + } + + private void putPair(Map, ImmutablePair, CheckedRegistry>> map, Class key, OpenRegistry l) { + map.put(key, ImmutablePair.of(l, new CheckedRegistry<>(l))); } private void checkDeadEntries(TerraPlugin main) { registryMap.forEach((clazz, pair) -> pair.getLeft().getDeadEntries().forEach((id, value) -> main.getDebugLogger().warn("Dead entry in '" + clazz + "' registry: '" + id + "'"))); } - @SuppressWarnings({"unchecked", "rawtypes"}) private void load(long start, TerraPlugin main) throws ConfigException { main.getEventManager().callEvent(new ConfigPackPreLoadEvent(this)); @@ -197,8 +204,8 @@ public class ConfigPack implements LoaderRegistrar { loader.open("structures/data", ".tesf").thenEntries(entries -> { for(Map.Entry entry : entries) { try(InputStream stream = entry.getValue()) { - StructureScript structureScript = new StructureScript(stream, main, scriptRegistry, lootRegistry, functionRegistry); - scriptRegistry.add(structureScript.getId(), structureScript); + StructureScript structureScript = new StructureScript(stream, main, getRegistry(StructureScript.class), getRegistry(LootTable.class), (Registry>) (Object) getRegistry(FunctionBuilder.class)); + getOpenRegistry(StructureScript.class).add(structureScript.getId(), structureScript); } catch(com.dfsek.terra.api.structures.parser.exceptions.ParseException | IOException e) { throw new LoadException("Unable to load script \"" + entry.getKey() + "\"", e); } @@ -206,7 +213,7 @@ public class ConfigPack implements LoaderRegistrar { }).close().open("structures/loot", ".json").thenEntries(entries -> { for(Map.Entry entry : entries) { try { - lootRegistry.add(entry.getKey(), new LootTable(IOUtils.toString(entry.getValue(), StandardCharsets.UTF_8), main)); + getOpenRegistry(LootTable.class).add(entry.getKey(), new LootTable(IOUtils.toString(entry.getValue(), StandardCharsets.UTF_8), main)); } catch(ParseException | IOException | NullPointerException e) { throw new LoadException("Unable to load loot table \"" + entry.getKey() + "\"", e); } @@ -253,29 +260,28 @@ public class ConfigPack implements LoaderRegistrar { return (CheckedRegistry) registryMap.getOrDefault(clazz, ImmutablePair.ofNull()).getRight(); } + @SuppressWarnings("unchecked") + protected OpenRegistry getOpenRegistry(Class clazz) { + return (OpenRegistry) registryMap.getOrDefault(clazz, ImmutablePair.ofNull()).getLeft(); + } + @Override public void register(TypeRegistry registry) { registry .registerLoader(ConfigType.class, configTypeRegistry) - .registerLoader(StructureScript.class, scriptRegistry) - .registerLoader(LootTable.class, lootRegistry) .registerLoader(BufferedImage.class, new BufferedImageLoader(loader)) - .registerLoader(NoiseSeeded.class, new NoiseSamplerBuilderLoader(noiseRegistry)) .registerLoader(SingleBiomeProviderTemplate.class, SingleBiomeProviderTemplate::new) .registerLoader(BiomePipelineTemplate.class, () -> new BiomePipelineTemplate(main)) .registerLoader(ImageProviderTemplate.class, () -> new ImageProviderTemplate(getRegistry(BiomeBuilder.class))) - .registerLoader(ImageSamplerTemplate.class, () -> new ImageProviderTemplate(getRegistry(BiomeBuilder.class))); + .registerLoader(ImageSamplerTemplate.class, () -> new ImageProviderTemplate(getRegistry(BiomeBuilder.class))) + .registerLoader(NoiseSeeded.class, new NoiseSamplerBuilderLoader(getOpenRegistry(NoiseProvider.class))); } public BiomeProvider.BiomeProviderBuilder getBiomeProviderBuilder() { return biomeProviderBuilder; } - public CheckedRegistry getScriptRegistry() { - return new CheckedRegistry<>(scriptRegistry); - } - public WorldConfig toWorldConfig(TerraWorld world) { return new WorldConfig(world, this, main); diff --git a/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java b/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java index a9fddf712..11f473efd 100644 --- a/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java +++ b/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java @@ -2,7 +2,6 @@ package com.dfsek.terra.config.pack; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.registry.LockedRegistry; -import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.provider.BiomeProvider; import com.dfsek.terra.carving.UserDefinedCarver; @@ -18,7 +17,6 @@ import java.util.Map; import java.util.Set; public class WorldConfig { - private final LockedRegistry scriptRegistry; private final SamplerCache samplerCache; private final BiomeProvider provider; @@ -35,7 +33,6 @@ public class WorldConfig { pack.getConfigTypeRegistry().forEach(configType -> registryMap.put(configType.getTypeClass(), new LockedRegistry<>(pack.getRegistry(configType.getTypeClass())))); - this.scriptRegistry = new LockedRegistry<>(pack.getScriptRegistry()); OpenRegistry biomeOpenRegistry = new OpenRegistry<>(); pack.getRegistry(BiomeBuilder.class).forEach((id, biome) -> biomeOpenRegistry.add(id, biome.apply(world.getWorld().getSeed()))); @@ -61,10 +58,6 @@ public class WorldConfig { return new HashSet<>(getRegistry(UserDefinedCarver.class).entries()); } - public LockedRegistry getScriptRegistry() { - return scriptRegistry; - } - public BiomeProvider getProvider() { return provider; } diff --git a/common/src/main/java/com/dfsek/terra/registry/config/NoiseRegistry.java b/common/src/main/java/com/dfsek/terra/registry/config/NoiseRegistry.java index ccbfee9ca..ac0bc4b48 100644 --- a/common/src/main/java/com/dfsek/terra/registry/config/NoiseRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/config/NoiseRegistry.java @@ -1,6 +1,5 @@ package com.dfsek.terra.registry.config; -import com.dfsek.tectonic.loading.object.ObjectTemplate; import com.dfsek.terra.api.math.noise.samplers.noise.random.GaussianNoiseSampler; import com.dfsek.terra.api.math.noise.samplers.noise.random.WhiteNoiseSampler; import com.dfsek.terra.api.math.noise.samplers.noise.simplex.OpenSimplex2SSampler; @@ -9,7 +8,7 @@ import com.dfsek.terra.api.math.noise.samplers.noise.simplex.PerlinSampler; import com.dfsek.terra.api.math.noise.samplers.noise.simplex.SimplexSampler; import com.dfsek.terra.api.math.noise.samplers.noise.value.ValueCubicSampler; import com.dfsek.terra.api.math.noise.samplers.noise.value.ValueSampler; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; +import com.dfsek.terra.api.util.seeded.NoiseProvider; import com.dfsek.terra.config.loaders.config.sampler.templates.DomainWarpTemplate; import com.dfsek.terra.config.loaders.config.sampler.templates.ImageSamplerTemplate; import com.dfsek.terra.config.loaders.config.sampler.templates.KernelTemplate; @@ -26,9 +25,7 @@ import com.dfsek.terra.config.loaders.config.sampler.templates.normalizer.Linear import com.dfsek.terra.config.loaders.config.sampler.templates.normalizer.NormalNormalizerTemplate; import com.dfsek.terra.registry.OpenRegistry; -import java.util.function.Supplier; - -public class NoiseRegistry extends OpenRegistry>> { +public class NoiseRegistry extends OpenRegistry { public NoiseRegistry() { add("LINEAR", LinearNormalizerTemplate::new); add("NORMAL", NormalNormalizerTemplate::new); diff --git a/common/src/test/java/biome/DistributionTest.java b/common/src/test/java/biome/DistributionTest.java deleted file mode 100644 index 711aba9c7..000000000 --- a/common/src/test/java/biome/DistributionTest.java +++ /dev/null @@ -1,352 +0,0 @@ -package biome; - -import com.dfsek.tectonic.abstraction.AbstractConfigLoader; -import com.dfsek.tectonic.annotations.Abstractable; -import com.dfsek.tectonic.annotations.Default; -import com.dfsek.tectonic.annotations.Value; -import com.dfsek.tectonic.config.ConfigTemplate; -import com.dfsek.tectonic.config.ValidatedConfigTemplate; -import com.dfsek.tectonic.exception.ConfigException; -import com.dfsek.tectonic.loading.ConfigLoader; -import com.dfsek.tectonic.loading.TypeRegistry; -import com.dfsek.terra.api.TerraPlugin; -import com.dfsek.terra.api.addons.TerraAddon; -import com.dfsek.terra.api.event.EventManager; -import com.dfsek.terra.api.platform.handle.ItemHandle; -import com.dfsek.terra.api.platform.handle.WorldHandle; -import com.dfsek.terra.api.platform.world.Biome; -import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.registry.CheckedRegistry; -import com.dfsek.terra.api.registry.LockedRegistry; -import com.dfsek.terra.api.util.collections.ProbabilityCollection; -import com.dfsek.terra.api.util.logging.DebugLogger; -import com.dfsek.terra.api.util.logging.JavaLogger; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; -import com.dfsek.terra.api.world.biome.Generator; -import com.dfsek.terra.api.world.biome.TerraBiome; -import com.dfsek.terra.api.world.biome.provider.BiomeProvider; -import com.dfsek.terra.config.GenericLoaders; -import com.dfsek.terra.config.PluginConfig; -import com.dfsek.terra.config.builder.BiomeBuilder; -import com.dfsek.terra.config.fileloaders.FolderLoader; -import com.dfsek.terra.config.lang.Language; -import com.dfsek.terra.config.loaders.ProbabilityCollectionLoader; -import com.dfsek.terra.config.loaders.config.BufferedImageLoader; -import com.dfsek.terra.config.loaders.config.biome.BiomeProviderBuilderLoader; -import com.dfsek.terra.config.loaders.config.biome.templates.provider.BiomePipelineTemplate; -import com.dfsek.terra.config.loaders.config.biome.templates.provider.ImageProviderTemplate; -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.pack.ConfigPack; -import com.dfsek.terra.config.templates.AbstractableTemplate; -import com.dfsek.terra.config.templates.BiomeTemplate; -import com.dfsek.terra.registry.config.BiomeRegistry; -import com.dfsek.terra.registry.config.NoiseRegistry; -import com.dfsek.terra.world.TerraWorld; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.image.BufferedImage; -import java.awt.image.ColorModel; -import java.awt.image.WritableRaster; -import java.io.File; -import java.io.IOException; -import java.util.HashSet; -import java.util.Set; -import java.util.concurrent.ThreadLocalRandom; -import java.util.logging.Logger; - -public class DistributionTest { - private static final TerraPlugin MAIN = new TerraPlugin() { - @Override - public WorldHandle getWorldHandle() { - return null; - } - - @Override - public TerraWorld getWorld(World world) { - return null; - } - - @Override - public com.dfsek.terra.api.util.logging.Logger logger() { - return new JavaLogger(Logger.getLogger("Terra")); - } - - @Override - public PluginConfig getTerraConfig() { - return new PluginConfig(); - } - - @Override - public File getDataFolder() { - return null; - } - - @Override - public boolean isDebug() { - return false; - } - - @Override - public Language getLanguage() { - return null; - } - - @Override - public CheckedRegistry getConfigRegistry() { - return null; - } - - @Override - public LockedRegistry getAddons() { - return null; - } - - @Override - public boolean reload() { - return true; - } - - @Override - public ItemHandle getItemHandle() { - return null; - } - - @Override - public void saveDefaultConfig() { - - } - - @Override - public String platformName() { - return null; - } - - @Override - public DebugLogger getDebugLogger() { - return new DebugLogger(new JavaLogger(Logger.getLogger("Terra"))); - } - - @Override - public EventManager getEventManager() { - return null; - } - - @Override - public void register(TypeRegistry registry) { - - } - }; - - - private static BiomeProvider getProvider(long seed) throws ConfigException, IOException { - System.out.println(seed); - File pack = new File("/home/dfsek/Documents/Terra/platforms/bukkit/target/server/plugins/Terra/packs/default/"); - FolderLoader folderLoader = new FolderLoader(pack.toPath()); - - AbstractConfigLoader loader = new AbstractConfigLoader(); - new GenericLoaders(MAIN).register(loader); - - BiomeRegistry biomeRegistry = new BiomeRegistry(); - folderLoader.open("biomes", ".yml").then(inputStreams -> ConfigPack.buildAll((template, main) -> template, biomeRegistry, loader.load(inputStreams, TestBiome::new), MAIN)); - - BiomeProviderTemplate template = new BiomeProviderTemplate(); - ConfigLoader pipeLoader = new ConfigLoader() - .registerLoader(BiomeProvider.BiomeProviderBuilder.class, new BiomeProviderBuilderLoader()) - .registerLoader(ProbabilityCollection.class, new ProbabilityCollectionLoader()) - .registerLoader(BiomeBuilder.class, biomeRegistry) - .registerLoader(BufferedImage.class, new BufferedImageLoader(folderLoader)) - .registerLoader(SingleBiomeProviderTemplate.class, SingleBiomeProviderTemplate::new) - .registerLoader(BiomePipelineTemplate.class, () -> new BiomePipelineTemplate(MAIN)) - .registerLoader(ImageProviderTemplate.class, () -> new ImageProviderTemplate(biomeRegistry)); - new GenericLoaders(MAIN).register(pipeLoader); - - pipeLoader.registerLoader(NoiseSeeded.class, new NoiseSamplerBuilderLoader(new NoiseRegistry())); - - pipeLoader.load(template, folderLoader.get("pack.yml")); - return template.getBiomeProviderBuilder().build(seed); - } - - public static void main(String... args) throws ConfigException, IOException { - JFrame testFrame = new JFrame("Biome Viewer"); - - - final BiomeProvider[] provider = {getProvider(2403)}; - - - int size = 1024; - final BufferedImage[] image = {new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB)}; - for(int x = 0; x < size; x++) { - for(int z = 0; z < size; z++) { - image[0].setRGB(x, z, provider[0].getBiome(x, z).getColor()); - } - } - - JLabel img = new JLabel(new ImageIcon(image[0])); - - testFrame.add(img); - testFrame.pack(); - img.addMouseListener(new MouseListener() { - @Override - public void mouseClicked(MouseEvent e) { - BufferedImage newImage = deepCopy(image[0]); - Graphics graphics = newImage.getGraphics(); - graphics.setColor(Color.WHITE); - graphics.fillRect(0, 0, 512, 24); - graphics.setColor(Color.BLACK); - graphics.setFont(new Font("Monospace", Font.BOLD, 20)); - graphics.drawString(provider[0].getBiome(e.getX(), e.getY()).toString(), 0, 20); - - graphics.setColor(Color.WHITE); - graphics.fillOval(e.getX() - 2, e.getY() - 2, 12, 12); - graphics.setColor(Color.BLACK); - graphics.fillOval(e.getX(), e.getY(), 8, 8); - - img.setIcon(new ImageIcon(newImage)); - } - - @Override - public void mousePressed(MouseEvent e) { - - } - - @Override - public void mouseReleased(MouseEvent e) { - - } - - @Override - public void mouseEntered(MouseEvent e) { - - } - - @Override - public void mouseExited(MouseEvent e) { - - } - }); - - testFrame.addKeyListener(new KeyListener() { - @Override - public void keyTyped(KeyEvent e) { - if(e.getKeyChar() == 's') { - long l = System.nanoTime(); - try { - provider[0] = getProvider(ThreadLocalRandom.current().nextLong()); - } catch(ConfigException | IOException configException) { - configException.printStackTrace(); - } - image[0] = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB); - for(int x = 0; x < size; x++) { - for(int z = 0; z < size; z++) { - image[0].setRGB(x, z, provider[0].getBiome(x, z).getColor()); - } - } - long n = System.nanoTime(); - double t = n - l; - System.out.println("Time: " + t / 1000000 + "ms"); - img.setIcon(new ImageIcon(image[0])); - } - } - - @Override - public void keyPressed(KeyEvent e) { - - } - - @Override - public void keyReleased(KeyEvent e) { - - } - }); - - testFrame.setResizable(false); - testFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); - testFrame.setVisible(true); - - } - - private static BufferedImage deepCopy(BufferedImage bi) { - ColorModel cm = bi.getColorModel(); - boolean isAlphaPremultiplied = cm.isAlphaPremultiplied(); - WritableRaster raster = bi.copyData(null); - return new BufferedImage(cm, raster, isAlphaPremultiplied, null); - } - - private static final class BiomeProviderTemplate implements ConfigTemplate { - @Value("biomes") - BiomeProvider.BiomeProviderBuilder biomeProviderBuilder; - - public BiomeProvider.BiomeProviderBuilder getBiomeProviderBuilder() { - return biomeProviderBuilder; - } - } - - private static final class TestBiome extends AbstractableTemplate implements TerraBiome, ValidatedConfigTemplate, BiomeBuilder { - - @Value("color") - @Default - @Abstractable - private int color; - - @Value("tags") - @Abstractable - @Default - private Set tags = new HashSet<>(); - - @Value("id") - private String id; - - @Override - public ProbabilityCollection getVanillaBiomes() { - return null; - } - - @Override - public BiomeTemplate getTemplate() { - return null; - } - - @Override - public Generator getGenerator(World w) { - return null; - } - - @Override - public int getColor() { - return color; - } - - @Override - public Set getTags() { - return tags; - } - - @Override - public boolean validate() { - color += (255 << 24); // Alpha adjustment - tags.add("BIOME:" + id); - return true; - } - - @Override - public String getID() { - return id; - } - - @Override - public String toString() { - return id; - } - - @Override - public TestBiome apply(Long aLong) { - return this; - } - } -} diff --git a/common/src/test/java/biome/ImageTest.java b/common/src/test/java/biome/ImageTest.java deleted file mode 100644 index ddc96dafc..000000000 --- a/common/src/test/java/biome/ImageTest.java +++ /dev/null @@ -1,218 +0,0 @@ -package biome; - -import com.dfsek.tectonic.abstraction.AbstractConfigLoader; -import com.dfsek.tectonic.annotations.Abstractable; -import com.dfsek.tectonic.annotations.Default; -import com.dfsek.tectonic.annotations.Value; -import com.dfsek.tectonic.config.ConfigTemplate; -import com.dfsek.tectonic.config.ValidatedConfigTemplate; -import com.dfsek.tectonic.exception.ConfigException; -import com.dfsek.terra.api.platform.world.Biome; -import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.util.collections.ProbabilityCollection; -import com.dfsek.terra.api.world.biome.Generator; -import com.dfsek.terra.api.world.biome.TerraBiome; -import com.dfsek.terra.api.world.biome.provider.BiomeProvider; -import com.dfsek.terra.api.world.biome.provider.ImageBiomeProvider; -import com.dfsek.terra.config.fileloaders.FolderLoader; -import com.dfsek.terra.config.pack.ConfigPack; -import com.dfsek.terra.config.templates.AbstractableTemplate; -import com.dfsek.terra.registry.OpenRegistry; -import org.junit.jupiter.api.Test; - -import javax.imageio.ImageIO; -import javax.swing.*; -import java.awt.*; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.image.BufferedImage; -import java.awt.image.ColorModel; -import java.awt.image.WritableRaster; -import java.io.File; -import java.io.IOException; -import java.util.HashSet; -import java.util.Set; -import java.util.concurrent.ThreadLocalRandom; - -public class ImageTest { - private static ImageBiomeProvider getProvider(long seed) throws ConfigException, IOException { - System.out.println(seed); - File pack = new File("/home/dfsek/Documents/Terra/platforms/bukkit/target/server/plugins/Terra/packs/default/"); - FolderLoader folderLoader = new FolderLoader(pack.toPath()); - - AbstractConfigLoader loader = new AbstractConfigLoader(); - - OpenRegistry biomeRegistry = new OpenRegistry() { - }; - folderLoader.open("biomes", ".yml").then(inputStreams -> ConfigPack.buildAll((template, main) -> template, biomeRegistry, loader.load(inputStreams, TestBiome::new), null)); - - return new ImageBiomeProvider(biomeRegistry.entries(), ImageIO.read(ImageTest.class.getResourceAsStream("/map.jpg")), 1, ImageBiomeProvider.Align.CENTER); - } - - @Test - public static void main(String... args) throws ConfigException, IOException { - JFrame testFrame = new JFrame("Biome Viewer"); - - - final BiomeProvider[] provider = {getProvider(2403)}; - - - int size = 1024; - final BufferedImage[] image = {new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB)}; - for(int x = 0; x < size; x++) { - for(int z = 0; z < size; z++) { - image[0].setRGB(x, z, provider[0].getBiome(x, z).getColor()); - } - } - - JLabel img = new JLabel(new ImageIcon(image[0])); - - testFrame.add(img); - testFrame.pack(); - img.addMouseListener(new MouseListener() { - @Override - public void mouseClicked(MouseEvent e) { - BufferedImage newImage = deepCopy(image[0]); - Graphics graphics = newImage.getGraphics(); - graphics.setColor(Color.WHITE); - graphics.fillRect(0, 0, 512, 24); - graphics.setColor(Color.BLACK); - graphics.setFont(new Font("Monospace", Font.BOLD, 20)); - graphics.drawString(provider[0].getBiome(e.getX(), e.getY()).toString(), 0, 20); - - graphics.setColor(Color.WHITE); - graphics.fillOval(e.getX() - 2, e.getY() - 2, 12, 12); - graphics.setColor(Color.BLACK); - graphics.fillOval(e.getX(), e.getY(), 8, 8); - - img.setIcon(new ImageIcon(newImage)); - } - - @Override - public void mousePressed(MouseEvent e) { - - } - - @Override - public void mouseReleased(MouseEvent e) { - - } - - @Override - public void mouseEntered(MouseEvent e) { - - } - - @Override - public void mouseExited(MouseEvent e) { - - } - }); - - testFrame.addKeyListener(new KeyListener() { - @Override - public void keyTyped(KeyEvent e) { - if(e.getKeyChar() == 's') { - try { - provider[0] = getProvider(ThreadLocalRandom.current().nextLong()); - } catch(ConfigException | IOException configException) { - configException.printStackTrace(); - } - image[0] = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB); - for(int x = 0; x < size; x++) { - for(int z = 0; z < size; z++) { - image[0].setRGB(x, z, provider[0].getBiome(x, z).getColor()); - } - } - img.setIcon(new ImageIcon(image[0])); - } - } - - @Override - public void keyPressed(KeyEvent e) { - - } - - @Override - public void keyReleased(KeyEvent e) { - - } - }); - - testFrame.setResizable(false); - testFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); - testFrame.setVisible(true); - - } - - private static BufferedImage deepCopy(BufferedImage bi) { - ColorModel cm = bi.getColorModel(); - boolean isAlphaPremultiplied = cm.isAlphaPremultiplied(); - WritableRaster raster = bi.copyData(null); - return new BufferedImage(cm, raster, isAlphaPremultiplied, null); - } - - private static final class BiomeProviderTemplate implements ConfigTemplate { - @Value("biome-pipeline") - BiomeProvider.BiomeProviderBuilder biomeProviderBuilder; - - public BiomeProvider.BiomeProviderBuilder getBiomeProviderBuilder() { - return biomeProviderBuilder; - } - } - - private static final class TestBiome extends AbstractableTemplate implements TerraBiome, ValidatedConfigTemplate { - - @Value("color") - @Default - @Abstractable - private int color; - - @Value("tags") - @Abstractable - @Default - private Set tags = new HashSet<>(); - - @Value("id") - private String id; - - @Override - public ProbabilityCollection getVanillaBiomes() { - return null; - } - - @Override - public Generator getGenerator(World w) { - return null; - } - - @Override - public int getColor() { - return color; - } - - @Override - public Set getTags() { - return tags; - } - - @Override - public boolean validate() { - color += (255 << 24); // Alpha adjustment - tags.add("BIOME:" + id); - return true; - } - - @Override - public String getID() { - return id; - } - - @Override - public String toString() { - return id; - } - } -}