diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 38d982bca..38a1a4f8e 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -18,6 +18,7 @@ dependencies { "shadedApi"("net.jafama:jafama:2.3.2") "shadedApi"("org.yaml:snakeyaml:1.27") "shadedApi"("org.ow2.asm:asm:9.0") + "shadedApi"("commons-io:commons-io:2.6") "compileOnly"("com.googlecode.json-simple:json-simple:1.1") diff --git a/common/src/main/java/com/dfsek/terra/api/core/TerraPlugin.java b/common/src/main/java/com/dfsek/terra/api/core/TerraPlugin.java index 8bd907761..e5dea5f9a 100644 --- a/common/src/main/java/com/dfsek/terra/api/core/TerraPlugin.java +++ b/common/src/main/java/com/dfsek/terra/api/core/TerraPlugin.java @@ -1,5 +1,6 @@ package com.dfsek.terra.api.core; +import com.dfsek.terra.addons.addon.TerraAddon; import com.dfsek.terra.api.LoaderRegistrar; import com.dfsek.terra.api.core.event.EventManager; import com.dfsek.terra.api.platform.handle.ItemHandle; @@ -7,9 +8,10 @@ import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.config.PluginConfig; import com.dfsek.terra.config.lang.Language; +import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.debug.DebugLogger; -import com.dfsek.terra.registry.master.AddonRegistry; -import com.dfsek.terra.registry.master.ConfigRegistry; +import com.dfsek.terra.registry.CheckedRegistry; +import com.dfsek.terra.registry.LockedRegistry; import com.dfsek.terra.world.TerraWorld; import java.io.File; @@ -32,11 +34,11 @@ public interface TerraPlugin extends LoaderRegistrar { Language getLanguage(); - ConfigRegistry getRegistry(); + CheckedRegistry getConfigRegistry(); - AddonRegistry getAddons(); + LockedRegistry getAddons(); - void reload(); + boolean reload(); ItemHandle getItemHandle(); diff --git a/common/src/main/java/com/dfsek/terra/api/world/biome/provider/ImageBiomeProvider.java b/common/src/main/java/com/dfsek/terra/api/world/biome/provider/ImageBiomeProvider.java index 5225d1432..abf5de855 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/biome/provider/ImageBiomeProvider.java +++ b/common/src/main/java/com/dfsek/terra/api/world/biome/provider/ImageBiomeProvider.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api.world.biome.provider; import com.dfsek.terra.api.world.biome.TerraBiome; -import com.dfsek.terra.registry.TerraRegistry; +import com.dfsek.terra.registry.OpenRegistry; import net.jafama.FastMath; import java.awt.*; @@ -15,7 +15,7 @@ public class ImageBiomeProvider implements BiomeProvider, BiomeProvider.BiomePro private final int resolution; private final Align align; - public ImageBiomeProvider(TerraRegistry registry, BufferedImage image, int resolution, Align align) { + public ImageBiomeProvider(OpenRegistry registry, BufferedImage image, int resolution, Align align) { this.image = image; this.resolution = resolution; this.align = align; 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 9ad335ecb..d7c32f3c6 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 @@ -50,7 +50,7 @@ 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.CheckedRegistry; -import com.dfsek.terra.registry.TerraRegistry; +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.FloraRegistry; @@ -197,7 +197,7 @@ public class ConfigPack implements LoaderRegistrar { } } - public static void buildAll(TerraFactory factory, TerraRegistry registry, List configTemplates, TerraPlugin main) throws LoadException { + public static void buildAll(TerraFactory factory, OpenRegistry registry, List configTemplates, TerraPlugin main) throws LoadException { for(C template : configTemplates) registry.add(template.getID(), factory.build(template, main)); } diff --git a/common/src/main/java/com/dfsek/terra/registry/CheckedRegistry.java b/common/src/main/java/com/dfsek/terra/registry/CheckedRegistry.java index 99c4047ae..5d8963f19 100644 --- a/common/src/main/java/com/dfsek/terra/registry/CheckedRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/CheckedRegistry.java @@ -2,7 +2,6 @@ package com.dfsek.terra.registry; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; -import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.terra.registry.exception.DuplicateEntryException; import java.lang.reflect.Type; @@ -11,14 +10,14 @@ import java.util.function.BiConsumer; import java.util.function.Consumer; /** - * Wrapper for a registry that ensures checked access. + * Wrapper for a registry that ensures checked additions. * * @param Type in registry */ -public class CheckedRegistry implements TypeLoader { - private final TerraRegistry registry; +public class CheckedRegistry implements Registry { + private final OpenRegistry registry; - public CheckedRegistry(TerraRegistry registry) { + public CheckedRegistry(OpenRegistry registry) { this.registry = registry; } @@ -47,49 +46,27 @@ public class CheckedRegistry implements TypeLoader { registry.add(identifier, value); } - /** - * Get a value from the registry. - * - * @param identifier Identifier of value. - * @return Value matching the identifier, {@code null} if no value is present. - */ + @Override public T get(String identifier) { return registry.get(identifier); } - /** - * Check if the registry contains a value. - * - * @param identifier Identifier of value. - * @return Whether the registry contains the value. - */ + @Override public boolean contains(String identifier) { return registry.contains(identifier); } - /** - * Perform the given action for every value in the registry. - * - * @param consumer Action to perform on value. - */ + @Override public void forEach(Consumer consumer) { registry.forEach(consumer); } - /** - * Perform an action for every key-value pair in the registry. - * - * @param consumer Action to perform on pair. - */ + @Override public void forEach(BiConsumer consumer) { registry.forEach(consumer); } - /** - * Get the entries of this registry as a {@link Set}. - * - * @return Set containing all entries. - */ + @Override public Set entries() { return registry.entries(); } diff --git a/common/src/main/java/com/dfsek/terra/registry/LockedRegistry.java b/common/src/main/java/com/dfsek/terra/registry/LockedRegistry.java new file mode 100644 index 000000000..709088366 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/registry/LockedRegistry.java @@ -0,0 +1,52 @@ +package com.dfsek.terra.registry; + +import com.dfsek.tectonic.exception.LoadException; +import com.dfsek.tectonic.loading.ConfigLoader; + +import java.lang.reflect.Type; +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +/** + * Wrapper for a registry that forbids all write access. + * + * @param Type in registry + */ +public class LockedRegistry implements Registry { + private final OpenRegistry registry; + + public LockedRegistry(OpenRegistry registry) { + this.registry = registry; + } + + @Override + public T get(String identifier) { + return registry.get(identifier); + } + + @Override + public boolean contains(String identifier) { + return registry.contains(identifier); + } + + @Override + public void forEach(Consumer consumer) { + registry.forEach(consumer); + } + + @Override + public void forEach(BiConsumer consumer) { + registry.forEach(consumer); + } + + @Override + public Set entries() { + return registry.entries(); + } + + @Override + public T load(Type t, Object c, ConfigLoader loader) throws LoadException { + return registry.load(t, c, loader); + } +} diff --git a/common/src/main/java/com/dfsek/terra/registry/TerraRegistry.java b/common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java similarity index 84% rename from common/src/main/java/com/dfsek/terra/registry/TerraRegistry.java rename to common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java index 1d4b1d1d0..5d3fbb5bd 100644 --- a/common/src/main/java/com/dfsek/terra/registry/TerraRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java @@ -13,7 +13,11 @@ import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Consumer; -public abstract class TerraRegistry implements TypeLoader { +/** + * Registry implementation with read/write access. For internal use only. + * @param + */ +public abstract class OpenRegistry implements Registry { private final Map objects = new HashMap<>(); @Override @@ -49,34 +53,27 @@ public abstract class TerraRegistry implements TypeLoader { add(identifier, value); } - /** - * Check if the registry contains a value. - * - * @param identifier Identifier of value. - * @return Whether the registry contains the value. - */ + @Override public boolean contains(String identifier) { return objects.containsKey(identifier); } - /** - * Get a value from the registry. - * - * @param identifier Identifier of value. - * @return Value matching the identifier, {@code null} if no value is present. - */ + @Override public T get(String identifier) { return objects.get(identifier); } + @Override public void forEach(Consumer consumer) { objects.forEach((id, obj) -> consumer.accept(obj)); } + @Override public void forEach(BiConsumer consumer) { objects.forEach(consumer); } + @Override public Set entries() { return new HashSet<>(objects.values()); } diff --git a/common/src/main/java/com/dfsek/terra/registry/Registry.java b/common/src/main/java/com/dfsek/terra/registry/Registry.java new file mode 100644 index 000000000..5289cb39a --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/registry/Registry.java @@ -0,0 +1,46 @@ +package com.dfsek.terra.registry; + +import com.dfsek.tectonic.loading.TypeLoader; + +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +public interface Registry extends TypeLoader { + /** + * Get a value from the registry. + * + * @param identifier Identifier of value. + * @return Value matching the identifier, {@code null} if no value is present. + */ + T get(String identifier); + + /** + * Check if the registry contains a value. + * + * @param identifier Identifier of value. + * @return Whether the registry contains the value. + */ + boolean contains(String identifier); + + /** + * Perform the given action for every value in the registry. + * + * @param consumer Action to perform on value. + */ + void forEach(Consumer consumer); + + /** + * Perform an action for every key-value pair in the registry. + * + * @param consumer Action to perform on pair. + */ + void forEach(BiConsumer consumer); + + /** + * Get the entries of this registry as a {@link Set}. + * + * @return Set containing all entries. + */ + Set entries(); +} diff --git a/common/src/main/java/com/dfsek/terra/registry/config/BiomeRegistry.java b/common/src/main/java/com/dfsek/terra/registry/config/BiomeRegistry.java index 42a093961..924efc3d6 100644 --- a/common/src/main/java/com/dfsek/terra/registry/config/BiomeRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/config/BiomeRegistry.java @@ -3,11 +3,11 @@ package com.dfsek.terra.registry.config; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.terra.api.world.biome.TerraBiome; -import com.dfsek.terra.registry.TerraRegistry; +import com.dfsek.terra.registry.OpenRegistry; import java.lang.reflect.Type; -public class BiomeRegistry extends TerraRegistry { +public class BiomeRegistry extends OpenRegistry { @Override public TerraBiome load(Type type, Object o, ConfigLoader configLoader) throws LoadException { if(o.equals("SELF")) return null; diff --git a/common/src/main/java/com/dfsek/terra/registry/config/CarverRegistry.java b/common/src/main/java/com/dfsek/terra/registry/config/CarverRegistry.java index 46fe3d725..63b80f715 100644 --- a/common/src/main/java/com/dfsek/terra/registry/config/CarverRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/config/CarverRegistry.java @@ -1,7 +1,7 @@ package com.dfsek.terra.registry.config; import com.dfsek.terra.carving.UserDefinedCarver; -import com.dfsek.terra.registry.TerraRegistry; +import com.dfsek.terra.registry.OpenRegistry; -public class CarverRegistry extends TerraRegistry { +public class CarverRegistry extends OpenRegistry { } 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 05482e816..3a3905330 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 @@ -5,14 +5,14 @@ import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.util.world.MaterialSet; import com.dfsek.terra.api.world.flora.Flora; -import com.dfsek.terra.registry.TerraRegistry; +import com.dfsek.terra.registry.OpenRegistry; import com.dfsek.terra.world.population.items.flora.ConstantFlora; import java.util.Arrays; import java.util.Collections; import java.util.concurrent.Callable; -public class FloraRegistry extends TerraRegistry { +public class FloraRegistry extends OpenRegistry { private final TerraPlugin main; public FloraRegistry(TerraPlugin main) { diff --git a/common/src/main/java/com/dfsek/terra/registry/config/FunctionRegistry.java b/common/src/main/java/com/dfsek/terra/registry/config/FunctionRegistry.java index 6e0e465e6..2d140137a 100644 --- a/common/src/main/java/com/dfsek/terra/registry/config/FunctionRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/config/FunctionRegistry.java @@ -1,7 +1,7 @@ package com.dfsek.terra.registry.config; import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; -import com.dfsek.terra.registry.TerraRegistry; +import com.dfsek.terra.registry.OpenRegistry; -public class FunctionRegistry extends TerraRegistry> { +public class FunctionRegistry extends OpenRegistry> { } diff --git a/common/src/main/java/com/dfsek/terra/registry/config/LootRegistry.java b/common/src/main/java/com/dfsek/terra/registry/config/LootRegistry.java index 21358ea41..8c8e987aa 100644 --- a/common/src/main/java/com/dfsek/terra/registry/config/LootRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/config/LootRegistry.java @@ -1,7 +1,7 @@ package com.dfsek.terra.registry.config; import com.dfsek.terra.api.structures.loot.LootTable; -import com.dfsek.terra.registry.TerraRegistry; +import com.dfsek.terra.registry.OpenRegistry; -public class LootRegistry extends TerraRegistry { +public class LootRegistry extends OpenRegistry { } 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 e6625b3e9..d84227455 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 @@ -22,11 +22,11 @@ import com.dfsek.terra.config.loaders.config.sampler.templates.noise.fractal.Rid import com.dfsek.terra.config.loaders.config.sampler.templates.normalizer.ClampNormalizerTemplate; import com.dfsek.terra.config.loaders.config.sampler.templates.normalizer.LinearNormalizerTemplate; import com.dfsek.terra.config.loaders.config.sampler.templates.normalizer.NormalNormalizerTemplate; -import com.dfsek.terra.registry.TerraRegistry; +import com.dfsek.terra.registry.OpenRegistry; import java.util.function.Supplier; -public class NoiseRegistry extends TerraRegistry>> { +public class NoiseRegistry extends OpenRegistry>> { public NoiseRegistry() { add("LINEAR", LinearNormalizerTemplate::new); add("NORMAL", NormalNormalizerTemplate::new); diff --git a/common/src/main/java/com/dfsek/terra/registry/config/OreRegistry.java b/common/src/main/java/com/dfsek/terra/registry/config/OreRegistry.java index 3f8e285df..010a812f2 100644 --- a/common/src/main/java/com/dfsek/terra/registry/config/OreRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/config/OreRegistry.java @@ -1,7 +1,7 @@ package com.dfsek.terra.registry.config; -import com.dfsek.terra.registry.TerraRegistry; +import com.dfsek.terra.registry.OpenRegistry; import com.dfsek.terra.world.population.items.ores.Ore; -public class OreRegistry extends TerraRegistry { +public class OreRegistry extends OpenRegistry { } 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 e13cfb6ba..53a857d9e 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 @@ -4,9 +4,9 @@ import com.dfsek.terra.api.core.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.TerraRegistry; +import com.dfsek.terra.registry.OpenRegistry; -public class PaletteRegistry extends TerraRegistry> { +public class PaletteRegistry extends OpenRegistry> { private final TerraPlugin main; public PaletteRegistry(TerraPlugin main) { this.main = main; diff --git a/common/src/main/java/com/dfsek/terra/registry/config/ScriptRegistry.java b/common/src/main/java/com/dfsek/terra/registry/config/ScriptRegistry.java index d4320f854..a715c5ad9 100644 --- a/common/src/main/java/com/dfsek/terra/registry/config/ScriptRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/config/ScriptRegistry.java @@ -1,7 +1,7 @@ package com.dfsek.terra.registry.config; import com.dfsek.terra.api.structures.script.StructureScript; -import com.dfsek.terra.registry.TerraRegistry; +import com.dfsek.terra.registry.OpenRegistry; -public class ScriptRegistry extends TerraRegistry { +public class ScriptRegistry extends OpenRegistry { } diff --git a/common/src/main/java/com/dfsek/terra/registry/config/StructureRegistry.java b/common/src/main/java/com/dfsek/terra/registry/config/StructureRegistry.java index 523395fa7..56a24711d 100644 --- a/common/src/main/java/com/dfsek/terra/registry/config/StructureRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/config/StructureRegistry.java @@ -1,7 +1,7 @@ package com.dfsek.terra.registry.config; -import com.dfsek.terra.registry.TerraRegistry; +import com.dfsek.terra.registry.OpenRegistry; import com.dfsek.terra.world.population.items.TerraStructure; -public class StructureRegistry extends TerraRegistry { +public class StructureRegistry extends OpenRegistry { } diff --git a/common/src/main/java/com/dfsek/terra/registry/config/TreeRegistry.java b/common/src/main/java/com/dfsek/terra/registry/config/TreeRegistry.java index b444dbc44..bf9fa629f 100644 --- a/common/src/main/java/com/dfsek/terra/registry/config/TreeRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/config/TreeRegistry.java @@ -14,14 +14,14 @@ import com.dfsek.terra.api.world.tree.fractal.trees.ShatteredTree; import com.dfsek.terra.api.world.tree.fractal.trees.SmallShatteredPillar; import com.dfsek.terra.api.world.tree.fractal.trees.SmallShatteredTree; import com.dfsek.terra.api.world.tree.fractal.trees.SpruceTree; -import com.dfsek.terra.registry.TerraRegistry; +import com.dfsek.terra.registry.OpenRegistry; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.Random; import java.util.Set; -public class TreeRegistry extends TerraRegistry { +public class TreeRegistry extends OpenRegistry { private final TerraPlugin main; public TreeRegistry(TerraPlugin main) { diff --git a/common/src/main/java/com/dfsek/terra/registry/master/AddonRegistry.java b/common/src/main/java/com/dfsek/terra/registry/master/AddonRegistry.java index 266a8bb0a..3483b3091 100644 --- a/common/src/main/java/com/dfsek/terra/registry/master/AddonRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/master/AddonRegistry.java @@ -8,7 +8,7 @@ import com.dfsek.terra.addons.loading.AddonLoadException; import com.dfsek.terra.addons.loading.pre.AddonPool; import com.dfsek.terra.addons.loading.pre.PreLoadAddon; import com.dfsek.terra.api.core.TerraPlugin; -import com.dfsek.terra.registry.TerraRegistry; +import com.dfsek.terra.registry.OpenRegistry; import com.dfsek.terra.registry.exception.DuplicateEntryException; import java.io.File; @@ -18,7 +18,7 @@ import java.lang.reflect.InvocationTargetException; import java.util.logging.LogManager; import java.util.logging.Logger; -public class AddonRegistry extends TerraRegistry { +public class AddonRegistry extends OpenRegistry { private final TerraPlugin main; public AddonRegistry(TerraPlugin main) { diff --git a/common/src/main/java/com/dfsek/terra/registry/master/ConfigRegistry.java b/common/src/main/java/com/dfsek/terra/registry/master/ConfigRegistry.java index 0cf923850..17476237c 100644 --- a/common/src/main/java/com/dfsek/terra/registry/master/ConfigRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/master/ConfigRegistry.java @@ -3,7 +3,7 @@ package com.dfsek.terra.registry.master; import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.terra.api.core.TerraPlugin; import com.dfsek.terra.config.pack.ConfigPack; -import com.dfsek.terra.registry.TerraRegistry; +import com.dfsek.terra.registry.OpenRegistry; import java.io.File; import java.io.IOException; @@ -12,7 +12,7 @@ import java.util.zip.ZipFile; /** * Class to hold config packs */ -public class ConfigRegistry extends TerraRegistry { +public class ConfigRegistry extends OpenRegistry { public void load(File folder, TerraPlugin main) throws ConfigException { ConfigPack pack = new ConfigPack(folder, main); add(pack.getTemplate().getID(), pack); diff --git a/common/src/test/java/biome/DistributionTest.java b/common/src/test/java/biome/DistributionTest.java index 2f91fb2a3..abecc1efd 100644 --- a/common/src/test/java/biome/DistributionTest.java +++ b/common/src/test/java/biome/DistributionTest.java @@ -9,6 +9,7 @@ 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.addons.addon.TerraAddon; import com.dfsek.terra.api.core.TerraPlugin; import com.dfsek.terra.api.core.event.EventManager; import com.dfsek.terra.api.math.ProbabilityCollection; @@ -34,10 +35,10 @@ 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.debug.DebugLogger; +import com.dfsek.terra.registry.CheckedRegistry; +import com.dfsek.terra.registry.LockedRegistry; import com.dfsek.terra.registry.config.BiomeRegistry; import com.dfsek.terra.registry.config.NoiseRegistry; -import com.dfsek.terra.registry.master.AddonRegistry; -import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.world.TerraWorld; import javax.swing.*; @@ -99,18 +100,18 @@ public class DistributionTest { } @Override - public ConfigRegistry getRegistry() { + public CheckedRegistry getConfigRegistry() { return null; } @Override - public AddonRegistry getAddons() { + public LockedRegistry getAddons() { return null; } @Override - public void reload() { - + public boolean reload() { + return true; } @Override diff --git a/common/src/test/java/biome/ImageTest.java b/common/src/test/java/biome/ImageTest.java index bf6a9460f..8e52c0ce9 100644 --- a/common/src/test/java/biome/ImageTest.java +++ b/common/src/test/java/biome/ImageTest.java @@ -17,7 +17,7 @@ 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.TerraRegistry; +import com.dfsek.terra.registry.OpenRegistry; import org.junit.jupiter.api.Test; import javax.imageio.ImageIO; @@ -44,7 +44,7 @@ public class ImageTest { AbstractConfigLoader loader = new AbstractConfigLoader(); - TerraRegistry biomeRegistry = new TerraRegistry() { + OpenRegistry biomeRegistry = new OpenRegistry() { }; folderLoader.open("biomes", ".yml").then(inputStreams -> ConfigPack.buildAll((template, main) -> template, biomeRegistry, loader.load(inputStreams, TestBiome::new), null)); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index bbc9a004d..1d3b70dcb 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -32,6 +32,8 @@ import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.lang.Language; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.debug.DebugLogger; +import com.dfsek.terra.registry.CheckedRegistry; +import com.dfsek.terra.registry.LockedRegistry; import com.dfsek.terra.registry.master.AddonRegistry; import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.world.TerraWorld; @@ -55,7 +57,10 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { private final Map generatorMap = new HashMap<>(); private final Map worldMap = new HashMap<>(); private final Map worlds = new HashMap<>(); + private final ConfigRegistry registry = new ConfigRegistry(); + private final CheckedRegistry checkedRegistry = new CheckedRegistry<>(registry); + private final PluginConfig config = new PluginConfig(); private final ItemHandle itemHandle = new BukkitItemHandle(); private WorldHandle handle = new BukkitWorldHandle(); @@ -76,9 +81,14 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { } private final AddonRegistry addonRegistry = new AddonRegistry(new BukkitAddon(this), this); + private final LockedRegistry addonLockedRegistry = new LockedRegistry<>(addonRegistry); - public void reload() { + + public boolean reload() { + config.load(this); + LangUtil.load(config.getLanguage(), this); // Load language. + boolean succeed = registry.loadAll(this); Map newMap = new HashMap<>(); worldMap.forEach((world, tw) -> { ((BukkitChunkGeneratorWrapper) world.getGenerator().getHandle()).getHandle().getCache().clear(); @@ -87,6 +97,7 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { }); worldMap.clear(); worldMap.putAll(newMap); + return succeed; } @Override @@ -221,8 +232,8 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { return LangUtil.getLanguage(); } - public ConfigRegistry getRegistry() { - return registry; + public CheckedRegistry getConfigRegistry() { + return checkedRegistry; } public TerraWorld getWorld(World w) { @@ -258,8 +269,8 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { } @Override - public AddonRegistry getAddons() { - return addonRegistry; + public LockedRegistry getAddons() { + return addonLockedRegistry; } public enum BukkitVersion { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/PacksCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/PacksCommand.java index 2a36c4986..0cdea2157 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/PacksCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/PacksCommand.java @@ -3,7 +3,9 @@ package com.dfsek.terra.bukkit.command.command; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.command.Command; import com.dfsek.terra.config.lang.LangUtil; +import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.pack.ConfigPackTemplate; +import com.dfsek.terra.registry.CheckedRegistry; import com.dfsek.terra.registry.master.ConfigRegistry; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; @@ -29,7 +31,7 @@ public class PacksCommand extends Command { @Override public boolean execute(@NotNull CommandSender commandSender, org.bukkit.command.@NotNull Command command, @NotNull String s, @NotNull String[] strings) { - ConfigRegistry registry = getMain().getRegistry(); + CheckedRegistry registry = getMain().getConfigRegistry(); if(registry.entries().size() == 0) { LangUtil.send("command.packs.none", new BukkitCommandSender(commandSender)); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/ReloadCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/ReloadCommand.java index b6b4093ac..50e6a2cc9 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/ReloadCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/ReloadCommand.java @@ -28,13 +28,10 @@ public class ReloadCommand extends Command implements DebugCommand { @Override public boolean execute(@NotNull CommandSender sender, org.bukkit.command.@NotNull Command command, @NotNull String label, @NotNull String[] args) { - getMain().getTerraConfig().load(getMain()); - LangUtil.load(getMain().getTerraConfig().getLanguage(), getMain()); // Load language. - if(!getMain().getRegistry().loadAll(getMain())) { + if(!getMain().reload()) { LangUtil.send("command.reload-error", new BukkitCommandSender(sender)); return true; } - getMain().reload(); LangUtil.send("command.reload", new BukkitCommandSender(sender)); return true; } 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 50c9da071..b08cad22f 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 @@ -1,6 +1,7 @@ package com.dfsek.terra.fabric; import com.dfsek.tectonic.loading.TypeRegistry; +import com.dfsek.terra.addons.addon.TerraAddon; import com.dfsek.terra.api.core.TerraPlugin; import com.dfsek.terra.api.core.event.EventManager; import com.dfsek.terra.api.core.event.TerraEventManager; @@ -26,6 +27,8 @@ import com.dfsek.terra.fabric.world.FabricWorldHandle; import com.dfsek.terra.fabric.world.TerraBiomeSource; import com.dfsek.terra.fabric.world.features.PopulatorFeature; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; +import com.dfsek.terra.registry.CheckedRegistry; +import com.dfsek.terra.registry.LockedRegistry; import com.dfsek.terra.registry.master.AddonRegistry; import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.world.TerraWorld; @@ -86,8 +89,12 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { private final ItemHandle itemHandle = new FabricItemHandle(); private final WorldHandle worldHandle = new FabricWorldHandle(); private final ConfigRegistry registry = new ConfigRegistry(); + private final CheckedRegistry checkedRegistry = new CheckedRegistry<>(registry); private final AddonRegistry addonRegistry = new AddonRegistry(this); + private final LockedRegistry addonLockedRegistry = new LockedRegistry<>(addonRegistry); + + private File config; private static final Transformer> TREE_TRANSFORMER = new Transformer.Builder>() .addTransform(TerraFabricPlugin::getFeature) @@ -127,7 +134,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { public TerraWorld getWorld(World world) { return worldMap.computeIfAbsent(world.getSeed(), w -> { logger.info("Loading world " + w); - return new TerraWorld(world, getRegistry().get("DEFAULT"), this); + return new TerraWorld(world, getConfigRegistry().get("DEFAULT"), this); }); } @@ -161,18 +168,18 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { } @Override - public ConfigRegistry getRegistry() { - return registry; + public CheckedRegistry getConfigRegistry() { + return checkedRegistry; } @Override - public AddonRegistry getAddons() { - return addonRegistry; + public LockedRegistry getAddons() { + return addonLockedRegistry; } @Override - public void reload() { - + public boolean reload() { + return true; } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java index f73c0f16d..2f0903ab8 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java @@ -18,7 +18,7 @@ import java.util.stream.Collectors; public class TerraBiomeSource extends BiomeSource { public static final Codec PACK_CODEC = (RecordCodecBuilder.create(config -> config.group( Codec.STRING.fieldOf("pack").forGetter(pack -> pack.getTemplate().getID()) - ).apply(config, config.stable(TerraFabricPlugin.getInstance().getRegistry()::get)))); + ).apply(config, config.stable(TerraFabricPlugin.getInstance().getConfigRegistry()::get)))); public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( RegistryLookupCodec.of(Registry.BIOME_KEY).forGetter(source -> source.biomeRegistry), Codec.LONG.fieldOf("seed").stable().forGetter(source -> source.seed), diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java index 16bc8983d..1bb87f0e1 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java @@ -35,7 +35,7 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements com.d private final TerraBiomeSource biomeSource; public static final Codec PACK_CODEC = (RecordCodecBuilder.create(config -> config.group( Codec.STRING.fieldOf("pack").forGetter(pack -> pack.getTemplate().getID()) - ).apply(config, config.stable(TerraFabricPlugin.getInstance().getRegistry()::get)))); + ).apply(config, config.stable(TerraFabricPlugin.getInstance().getConfigRegistry()::get)))); public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( TerraBiomeSource.CODEC.fieldOf("biome_source").forGetter(generator -> generator.biomeSource), Codec.LONG.fieldOf("seed").stable().forGetter(generator -> generator.seed), diff --git a/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java b/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java index aa918951a..9257c40ca 100644 --- a/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java +++ b/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java @@ -1,6 +1,7 @@ package com.dfsek.terra; import com.dfsek.tectonic.loading.TypeRegistry; +import com.dfsek.terra.addons.addon.TerraAddon; import com.dfsek.terra.api.core.TerraPlugin; import com.dfsek.terra.api.core.event.EventManager; import com.dfsek.terra.api.core.event.TerraEventManager; @@ -14,9 +15,12 @@ import com.dfsek.terra.config.GenericLoaders; import com.dfsek.terra.config.PluginConfig; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.lang.Language; +import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.debug.DebugLogger; import com.dfsek.terra.platform.RawBiome; import com.dfsek.terra.platform.RawWorldHandle; +import com.dfsek.terra.registry.CheckedRegistry; +import com.dfsek.terra.registry.LockedRegistry; import com.dfsek.terra.registry.master.AddonRegistry; import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.world.TerraWorld; @@ -28,6 +32,9 @@ import java.util.logging.Logger; public class StandalonePlugin implements TerraPlugin { private final ConfigRegistry registry = new ConfigRegistry(); private final AddonRegistry addonRegistry = new AddonRegistry(this); + + private final LockedRegistry addonLockedRegistry = new LockedRegistry<>(addonRegistry); + private final PluginConfig config = new PluginConfig(); private final RawWorldHandle worldHandle = new RawWorldHandle(); private final EventManager eventManager = new TerraEventManager(this); @@ -77,17 +84,17 @@ public class StandalonePlugin implements TerraPlugin { } @Override - public ConfigRegistry getRegistry() { - return registry; + public CheckedRegistry getConfigRegistry() { + return new CheckedRegistry<>(registry); } @Override - public AddonRegistry getAddons() { - return addonRegistry; + public LockedRegistry getAddons() { + return addonLockedRegistry; } @Override - public void reload() { + public boolean reload() { throw new UnsupportedOperationException(); } diff --git a/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java b/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java index 616cc20ec..d1725b3c5 100644 --- a/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java +++ b/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java @@ -31,7 +31,7 @@ public class Generator { structurePopulator = new StructurePopulator(plugin); treePopulator = new TreePopulator(plugin); orePopulator = new OrePopulator(plugin); - generator = new DefaultChunkGenerator3D(plugin.getRegistry().get("DEFAULT"), plugin, new SamplerCache(plugin)); + generator = new DefaultChunkGenerator3D(plugin.getConfigRegistry().get("DEFAULT"), plugin, new SamplerCache(plugin)); this.seed = seed; }