registry stuff

This commit is contained in:
dfsek 2021-02-22 10:32:38 -07:00
parent 05cd0b625c
commit 46a08e49f5
31 changed files with 213 additions and 113 deletions

View File

@ -18,6 +18,7 @@ dependencies {
"shadedApi"("net.jafama:jafama:2.3.2") "shadedApi"("net.jafama:jafama:2.3.2")
"shadedApi"("org.yaml:snakeyaml:1.27") "shadedApi"("org.yaml:snakeyaml:1.27")
"shadedApi"("org.ow2.asm:asm:9.0") "shadedApi"("org.ow2.asm:asm:9.0")
"shadedApi"("commons-io:commons-io:2.6")
"compileOnly"("com.googlecode.json-simple:json-simple:1.1") "compileOnly"("com.googlecode.json-simple:json-simple:1.1")

View File

@ -1,5 +1,6 @@
package com.dfsek.terra.api.core; package com.dfsek.terra.api.core;
import com.dfsek.terra.addons.addon.TerraAddon;
import com.dfsek.terra.api.LoaderRegistrar; import com.dfsek.terra.api.LoaderRegistrar;
import com.dfsek.terra.api.core.event.EventManager; import com.dfsek.terra.api.core.event.EventManager;
import com.dfsek.terra.api.platform.handle.ItemHandle; 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.api.platform.world.World;
import com.dfsek.terra.config.PluginConfig; import com.dfsek.terra.config.PluginConfig;
import com.dfsek.terra.config.lang.Language; import com.dfsek.terra.config.lang.Language;
import com.dfsek.terra.config.pack.ConfigPack;
import com.dfsek.terra.debug.DebugLogger; import com.dfsek.terra.debug.DebugLogger;
import com.dfsek.terra.registry.master.AddonRegistry; import com.dfsek.terra.registry.CheckedRegistry;
import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.registry.LockedRegistry;
import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.TerraWorld;
import java.io.File; import java.io.File;
@ -32,11 +34,11 @@ public interface TerraPlugin extends LoaderRegistrar {
Language getLanguage(); Language getLanguage();
ConfigRegistry getRegistry(); CheckedRegistry<ConfigPack> getConfigRegistry();
AddonRegistry getAddons(); LockedRegistry<TerraAddon> getAddons();
void reload(); boolean reload();
ItemHandle getItemHandle(); ItemHandle getItemHandle();

View File

@ -1,7 +1,7 @@
package com.dfsek.terra.api.world.biome.provider; package com.dfsek.terra.api.world.biome.provider;
import com.dfsek.terra.api.world.biome.TerraBiome; 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 net.jafama.FastMath;
import java.awt.*; import java.awt.*;
@ -15,7 +15,7 @@ public class ImageBiomeProvider implements BiomeProvider, BiomeProvider.BiomePro
private final int resolution; private final int resolution;
private final Align align; private final Align align;
public ImageBiomeProvider(TerraRegistry<TerraBiome> registry, BufferedImage image, int resolution, Align align) { public ImageBiomeProvider(OpenRegistry<TerraBiome> registry, BufferedImage image, int resolution, Align align) {
this.image = image; this.image = image;
this.resolution = resolution; this.resolution = resolution;
this.align = align; this.align = align;

View File

@ -50,7 +50,7 @@ import com.dfsek.terra.config.templates.PaletteTemplate;
import com.dfsek.terra.config.templates.StructureTemplate; import com.dfsek.terra.config.templates.StructureTemplate;
import com.dfsek.terra.config.templates.TreeTemplate; import com.dfsek.terra.config.templates.TreeTemplate;
import com.dfsek.terra.registry.CheckedRegistry; 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.BiomeRegistry;
import com.dfsek.terra.registry.config.CarverRegistry; import com.dfsek.terra.registry.config.CarverRegistry;
import com.dfsek.terra.registry.config.FloraRegistry; import com.dfsek.terra.registry.config.FloraRegistry;
@ -197,7 +197,7 @@ public class ConfigPack implements LoaderRegistrar {
} }
} }
public static <C extends AbstractableTemplate, O> void buildAll(TerraFactory<C, O> factory, TerraRegistry<O> registry, List<C> configTemplates, TerraPlugin main) throws LoadException { public static <C extends AbstractableTemplate, O> void buildAll(TerraFactory<C, O> factory, OpenRegistry<O> registry, List<C> configTemplates, TerraPlugin main) throws LoadException {
for(C template : configTemplates) registry.add(template.getID(), factory.build(template, main)); for(C template : configTemplates) registry.add(template.getID(), factory.build(template, main));
} }

View File

@ -2,7 +2,6 @@ package com.dfsek.terra.registry;
import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.exception.LoadException;
import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.ConfigLoader;
import com.dfsek.tectonic.loading.TypeLoader;
import com.dfsek.terra.registry.exception.DuplicateEntryException; import com.dfsek.terra.registry.exception.DuplicateEntryException;
import java.lang.reflect.Type; import java.lang.reflect.Type;
@ -11,14 +10,14 @@ import java.util.function.BiConsumer;
import java.util.function.Consumer; import java.util.function.Consumer;
/** /**
* Wrapper for a registry that ensures checked access. * Wrapper for a registry that ensures checked additions.
* *
* @param <T> Type in registry * @param <T> Type in registry
*/ */
public class CheckedRegistry<T> implements TypeLoader<T> { public class CheckedRegistry<T> implements Registry<T> {
private final TerraRegistry<T> registry; private final OpenRegistry<T> registry;
public CheckedRegistry(TerraRegistry<T> registry) { public CheckedRegistry(OpenRegistry<T> registry) {
this.registry = registry; this.registry = registry;
} }
@ -47,49 +46,27 @@ public class CheckedRegistry<T> implements TypeLoader<T> {
registry.add(identifier, value); registry.add(identifier, value);
} }
/** @Override
* Get a value from the registry.
*
* @param identifier Identifier of value.
* @return Value matching the identifier, {@code null} if no value is present.
*/
public T get(String identifier) { public T get(String identifier) {
return registry.get(identifier); return registry.get(identifier);
} }
/** @Override
* Check if the registry contains a value.
*
* @param identifier Identifier of value.
* @return Whether the registry contains the value.
*/
public boolean contains(String identifier) { public boolean contains(String identifier) {
return registry.contains(identifier); return registry.contains(identifier);
} }
/** @Override
* Perform the given action for every value in the registry.
*
* @param consumer Action to perform on value.
*/
public void forEach(Consumer<T> consumer) { public void forEach(Consumer<T> consumer) {
registry.forEach(consumer); registry.forEach(consumer);
} }
/** @Override
* Perform an action for every key-value pair in the registry.
*
* @param consumer Action to perform on pair.
*/
public void forEach(BiConsumer<String, T> consumer) { public void forEach(BiConsumer<String, T> consumer) {
registry.forEach(consumer); registry.forEach(consumer);
} }
/** @Override
* Get the entries of this registry as a {@link Set}.
*
* @return Set containing all entries.
*/
public Set<T> entries() { public Set<T> entries() {
return registry.entries(); return registry.entries();
} }

View File

@ -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 <T> Type in registry
*/
public class LockedRegistry<T> implements Registry<T> {
private final OpenRegistry<T> registry;
public LockedRegistry(OpenRegistry<T> 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<T> consumer) {
registry.forEach(consumer);
}
@Override
public void forEach(BiConsumer<String, T> consumer) {
registry.forEach(consumer);
}
@Override
public Set<T> entries() {
return registry.entries();
}
@Override
public T load(Type t, Object c, ConfigLoader loader) throws LoadException {
return registry.load(t, c, loader);
}
}

View File

@ -13,7 +13,11 @@ import java.util.Set;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import java.util.function.Consumer; import java.util.function.Consumer;
public abstract class TerraRegistry<T> implements TypeLoader<T> { /**
* Registry implementation with read/write access. For internal use only.
* @param <T>
*/
public abstract class OpenRegistry<T> implements Registry<T> {
private final Map<String, T> objects = new HashMap<>(); private final Map<String, T> objects = new HashMap<>();
@Override @Override
@ -49,34 +53,27 @@ public abstract class TerraRegistry<T> implements TypeLoader<T> {
add(identifier, value); add(identifier, value);
} }
/** @Override
* Check if the registry contains a value.
*
* @param identifier Identifier of value.
* @return Whether the registry contains the value.
*/
public boolean contains(String identifier) { public boolean contains(String identifier) {
return objects.containsKey(identifier); return objects.containsKey(identifier);
} }
/** @Override
* Get a value from the registry.
*
* @param identifier Identifier of value.
* @return Value matching the identifier, {@code null} if no value is present.
*/
public T get(String identifier) { public T get(String identifier) {
return objects.get(identifier); return objects.get(identifier);
} }
@Override
public void forEach(Consumer<T> consumer) { public void forEach(Consumer<T> consumer) {
objects.forEach((id, obj) -> consumer.accept(obj)); objects.forEach((id, obj) -> consumer.accept(obj));
} }
@Override
public void forEach(BiConsumer<String, T> consumer) { public void forEach(BiConsumer<String, T> consumer) {
objects.forEach(consumer); objects.forEach(consumer);
} }
@Override
public Set<T> entries() { public Set<T> entries() {
return new HashSet<>(objects.values()); return new HashSet<>(objects.values());
} }

View File

@ -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<T> extends TypeLoader<T> {
/**
* 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<T> consumer);
/**
* Perform an action for every key-value pair in the registry.
*
* @param consumer Action to perform on pair.
*/
void forEach(BiConsumer<String, T> consumer);
/**
* Get the entries of this registry as a {@link Set}.
*
* @return Set containing all entries.
*/
Set<T> entries();
}

View File

@ -3,11 +3,11 @@ package com.dfsek.terra.registry.config;
import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.exception.LoadException;
import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.ConfigLoader;
import com.dfsek.terra.api.world.biome.TerraBiome; 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; import java.lang.reflect.Type;
public class BiomeRegistry extends TerraRegistry<TerraBiome> { public class BiomeRegistry extends OpenRegistry<TerraBiome> {
@Override @Override
public TerraBiome load(Type type, Object o, ConfigLoader configLoader) throws LoadException { public TerraBiome load(Type type, Object o, ConfigLoader configLoader) throws LoadException {
if(o.equals("SELF")) return null; if(o.equals("SELF")) return null;

View File

@ -1,7 +1,7 @@
package com.dfsek.terra.registry.config; package com.dfsek.terra.registry.config;
import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.carving.UserDefinedCarver;
import com.dfsek.terra.registry.TerraRegistry; import com.dfsek.terra.registry.OpenRegistry;
public class CarverRegistry extends TerraRegistry<UserDefinedCarver> { public class CarverRegistry extends OpenRegistry<UserDefinedCarver> {
} }

View File

@ -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.platform.block.MaterialData;
import com.dfsek.terra.api.util.world.MaterialSet; import com.dfsek.terra.api.util.world.MaterialSet;
import com.dfsek.terra.api.world.flora.Flora; 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 com.dfsek.terra.world.population.items.flora.ConstantFlora;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
public class FloraRegistry extends TerraRegistry<Flora> { public class FloraRegistry extends OpenRegistry<Flora> {
private final TerraPlugin main; private final TerraPlugin main;
public FloraRegistry(TerraPlugin main) { public FloraRegistry(TerraPlugin main) {

View File

@ -1,7 +1,7 @@
package com.dfsek.terra.registry.config; package com.dfsek.terra.registry.config;
import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; 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<FunctionBuilder<?>> { public class FunctionRegistry extends OpenRegistry<FunctionBuilder<?>> {
} }

View File

@ -1,7 +1,7 @@
package com.dfsek.terra.registry.config; package com.dfsek.terra.registry.config;
import com.dfsek.terra.api.structures.loot.LootTable; 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<LootTable> { public class LootRegistry extends OpenRegistry<LootTable> {
} }

View File

@ -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.ClampNormalizerTemplate;
import com.dfsek.terra.config.loaders.config.sampler.templates.normalizer.LinearNormalizerTemplate; 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.config.loaders.config.sampler.templates.normalizer.NormalNormalizerTemplate;
import com.dfsek.terra.registry.TerraRegistry; import com.dfsek.terra.registry.OpenRegistry;
import java.util.function.Supplier; import java.util.function.Supplier;
public class NoiseRegistry extends TerraRegistry<Supplier<ObjectTemplate<NoiseSeeded>>> { public class NoiseRegistry extends OpenRegistry<Supplier<ObjectTemplate<NoiseSeeded>>> {
public NoiseRegistry() { public NoiseRegistry() {
add("LINEAR", LinearNormalizerTemplate::new); add("LINEAR", LinearNormalizerTemplate::new);
add("NORMAL", NormalNormalizerTemplate::new); add("NORMAL", NormalNormalizerTemplate::new);

View File

@ -1,7 +1,7 @@
package com.dfsek.terra.registry.config; 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; import com.dfsek.terra.world.population.items.ores.Ore;
public class OreRegistry extends TerraRegistry<Ore> { public class OreRegistry extends OpenRegistry<Ore> {
} }

View File

@ -4,9 +4,9 @@ import com.dfsek.terra.api.core.TerraPlugin;
import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.BlockData;
import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.Palette;
import com.dfsek.terra.api.world.palette.SinglePalette; 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<Palette<BlockData>> { public class PaletteRegistry extends OpenRegistry<Palette<BlockData>> {
private final TerraPlugin main; private final TerraPlugin main;
public PaletteRegistry(TerraPlugin main) { public PaletteRegistry(TerraPlugin main) {
this.main = main; this.main = main;

View File

@ -1,7 +1,7 @@
package com.dfsek.terra.registry.config; package com.dfsek.terra.registry.config;
import com.dfsek.terra.api.structures.script.StructureScript; 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<StructureScript> { public class ScriptRegistry extends OpenRegistry<StructureScript> {
} }

View File

@ -1,7 +1,7 @@
package com.dfsek.terra.registry.config; 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; import com.dfsek.terra.world.population.items.TerraStructure;
public class StructureRegistry extends TerraRegistry<TerraStructure> { public class StructureRegistry extends OpenRegistry<TerraStructure> {
} }

View File

@ -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.SmallShatteredPillar;
import com.dfsek.terra.api.world.tree.fractal.trees.SmallShatteredTree; import com.dfsek.terra.api.world.tree.fractal.trees.SmallShatteredTree;
import com.dfsek.terra.api.world.tree.fractal.trees.SpruceTree; 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.Constructor;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.util.Random; import java.util.Random;
import java.util.Set; import java.util.Set;
public class TreeRegistry extends TerraRegistry<Tree> { public class TreeRegistry extends OpenRegistry<Tree> {
private final TerraPlugin main; private final TerraPlugin main;
public TreeRegistry(TerraPlugin main) { public TreeRegistry(TerraPlugin main) {

View File

@ -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.AddonPool;
import com.dfsek.terra.addons.loading.pre.PreLoadAddon; import com.dfsek.terra.addons.loading.pre.PreLoadAddon;
import com.dfsek.terra.api.core.TerraPlugin; 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 com.dfsek.terra.registry.exception.DuplicateEntryException;
import java.io.File; import java.io.File;
@ -18,7 +18,7 @@ import java.lang.reflect.InvocationTargetException;
import java.util.logging.LogManager; import java.util.logging.LogManager;
import java.util.logging.Logger; import java.util.logging.Logger;
public class AddonRegistry extends TerraRegistry<TerraAddon> { public class AddonRegistry extends OpenRegistry<TerraAddon> {
private final TerraPlugin main; private final TerraPlugin main;
public AddonRegistry(TerraPlugin main) { public AddonRegistry(TerraPlugin main) {

View File

@ -3,7 +3,7 @@ package com.dfsek.terra.registry.master;
import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.exception.ConfigException;
import com.dfsek.terra.api.core.TerraPlugin; import com.dfsek.terra.api.core.TerraPlugin;
import com.dfsek.terra.config.pack.ConfigPack; 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.File;
import java.io.IOException; import java.io.IOException;
@ -12,7 +12,7 @@ import java.util.zip.ZipFile;
/** /**
* Class to hold config packs * Class to hold config packs
*/ */
public class ConfigRegistry extends TerraRegistry<ConfigPack> { public class ConfigRegistry extends OpenRegistry<ConfigPack> {
public void load(File folder, TerraPlugin main) throws ConfigException { public void load(File folder, TerraPlugin main) throws ConfigException {
ConfigPack pack = new ConfigPack(folder, main); ConfigPack pack = new ConfigPack(folder, main);
add(pack.getTemplate().getID(), pack); add(pack.getTemplate().getID(), pack);

View File

@ -9,6 +9,7 @@ import com.dfsek.tectonic.config.ValidatedConfigTemplate;
import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.exception.ConfigException;
import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.ConfigLoader;
import com.dfsek.tectonic.loading.TypeRegistry; 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.TerraPlugin;
import com.dfsek.terra.api.core.event.EventManager; import com.dfsek.terra.api.core.event.EventManager;
import com.dfsek.terra.api.math.ProbabilityCollection; 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.pack.ConfigPack;
import com.dfsek.terra.config.templates.AbstractableTemplate; import com.dfsek.terra.config.templates.AbstractableTemplate;
import com.dfsek.terra.debug.DebugLogger; 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.BiomeRegistry;
import com.dfsek.terra.registry.config.NoiseRegistry; 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 com.dfsek.terra.world.TerraWorld;
import javax.swing.*; import javax.swing.*;
@ -99,18 +100,18 @@ public class DistributionTest {
} }
@Override @Override
public ConfigRegistry getRegistry() { public CheckedRegistry<ConfigPack> getConfigRegistry() {
return null; return null;
} }
@Override @Override
public AddonRegistry getAddons() { public LockedRegistry<TerraAddon> getAddons() {
return null; return null;
} }
@Override @Override
public void reload() { public boolean reload() {
return true;
} }
@Override @Override

View File

@ -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.fileloaders.FolderLoader;
import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.pack.ConfigPack;
import com.dfsek.terra.config.templates.AbstractableTemplate; 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 org.junit.jupiter.api.Test;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
@ -44,7 +44,7 @@ public class ImageTest {
AbstractConfigLoader loader = new AbstractConfigLoader(); AbstractConfigLoader loader = new AbstractConfigLoader();
TerraRegistry<TerraBiome> biomeRegistry = new TerraRegistry<TerraBiome>() { OpenRegistry<TerraBiome> biomeRegistry = new OpenRegistry<TerraBiome>() {
}; };
folderLoader.open("biomes", ".yml").then(inputStreams -> ConfigPack.buildAll((template, main) -> template, biomeRegistry, loader.load(inputStreams, TestBiome::new), null)); folderLoader.open("biomes", ".yml").then(inputStreams -> ConfigPack.buildAll((template, main) -> template, biomeRegistry, loader.load(inputStreams, TestBiome::new), null));

View File

@ -32,6 +32,8 @@ import com.dfsek.terra.config.lang.LangUtil;
import com.dfsek.terra.config.lang.Language; import com.dfsek.terra.config.lang.Language;
import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.pack.ConfigPack;
import com.dfsek.terra.debug.DebugLogger; 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.AddonRegistry;
import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.registry.master.ConfigRegistry;
import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.TerraWorld;
@ -55,7 +57,10 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin {
private final Map<String, DefaultChunkGenerator3D> generatorMap = new HashMap<>(); private final Map<String, DefaultChunkGenerator3D> generatorMap = new HashMap<>();
private final Map<World, TerraWorld> worldMap = new HashMap<>(); private final Map<World, TerraWorld> worldMap = new HashMap<>();
private final Map<String, ConfigPack> worlds = new HashMap<>(); private final Map<String, ConfigPack> worlds = new HashMap<>();
private final ConfigRegistry registry = new ConfigRegistry(); private final ConfigRegistry registry = new ConfigRegistry();
private final CheckedRegistry<ConfigPack> checkedRegistry = new CheckedRegistry<>(registry);
private final PluginConfig config = new PluginConfig(); private final PluginConfig config = new PluginConfig();
private final ItemHandle itemHandle = new BukkitItemHandle(); private final ItemHandle itemHandle = new BukkitItemHandle();
private WorldHandle handle = new BukkitWorldHandle(); 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 AddonRegistry addonRegistry = new AddonRegistry(new BukkitAddon(this), this);
private final LockedRegistry<TerraAddon> 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<World, TerraWorld> newMap = new HashMap<>(); Map<World, TerraWorld> newMap = new HashMap<>();
worldMap.forEach((world, tw) -> { worldMap.forEach((world, tw) -> {
((BukkitChunkGeneratorWrapper) world.getGenerator().getHandle()).getHandle().getCache().clear(); ((BukkitChunkGeneratorWrapper) world.getGenerator().getHandle()).getHandle().getCache().clear();
@ -87,6 +97,7 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin {
}); });
worldMap.clear(); worldMap.clear();
worldMap.putAll(newMap); worldMap.putAll(newMap);
return succeed;
} }
@Override @Override
@ -221,8 +232,8 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin {
return LangUtil.getLanguage(); return LangUtil.getLanguage();
} }
public ConfigRegistry getRegistry() { public CheckedRegistry<ConfigPack> getConfigRegistry() {
return registry; return checkedRegistry;
} }
public TerraWorld getWorld(World w) { public TerraWorld getWorld(World w) {
@ -258,8 +269,8 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin {
} }
@Override @Override
public AddonRegistry getAddons() { public LockedRegistry<TerraAddon> getAddons() {
return addonRegistry; return addonLockedRegistry;
} }
public enum BukkitVersion { public enum BukkitVersion {

View File

@ -3,7 +3,9 @@ package com.dfsek.terra.bukkit.command.command;
import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.BukkitCommandSender;
import com.dfsek.terra.bukkit.command.Command; import com.dfsek.terra.bukkit.command.Command;
import com.dfsek.terra.config.lang.LangUtil; 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.config.pack.ConfigPackTemplate;
import com.dfsek.terra.registry.CheckedRegistry;
import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.registry.master.ConfigRegistry;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -29,7 +31,7 @@ public class PacksCommand extends Command {
@Override @Override
public boolean execute(@NotNull CommandSender commandSender, org.bukkit.command.@NotNull Command command, @NotNull String s, @NotNull String[] strings) { public boolean execute(@NotNull CommandSender commandSender, org.bukkit.command.@NotNull Command command, @NotNull String s, @NotNull String[] strings) {
ConfigRegistry registry = getMain().getRegistry(); CheckedRegistry<ConfigPack> registry = getMain().getConfigRegistry();
if(registry.entries().size() == 0) { if(registry.entries().size() == 0) {
LangUtil.send("command.packs.none", new BukkitCommandSender(commandSender)); LangUtil.send("command.packs.none", new BukkitCommandSender(commandSender));

View File

@ -28,13 +28,10 @@ public class ReloadCommand extends Command implements DebugCommand {
@Override @Override
public boolean execute(@NotNull CommandSender sender, org.bukkit.command.@NotNull Command command, @NotNull String label, @NotNull String[] args) { public boolean execute(@NotNull CommandSender sender, org.bukkit.command.@NotNull Command command, @NotNull String label, @NotNull String[] args) {
getMain().getTerraConfig().load(getMain()); if(!getMain().reload()) {
LangUtil.load(getMain().getTerraConfig().getLanguage(), getMain()); // Load language.
if(!getMain().getRegistry().loadAll(getMain())) {
LangUtil.send("command.reload-error", new BukkitCommandSender(sender)); LangUtil.send("command.reload-error", new BukkitCommandSender(sender));
return true; return true;
} }
getMain().reload();
LangUtil.send("command.reload", new BukkitCommandSender(sender)); LangUtil.send("command.reload", new BukkitCommandSender(sender));
return true; return true;
} }

View File

@ -1,6 +1,7 @@
package com.dfsek.terra.fabric; package com.dfsek.terra.fabric;
import com.dfsek.tectonic.loading.TypeRegistry; 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.TerraPlugin;
import com.dfsek.terra.api.core.event.EventManager; import com.dfsek.terra.api.core.event.EventManager;
import com.dfsek.terra.api.core.event.TerraEventManager; 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.TerraBiomeSource;
import com.dfsek.terra.fabric.world.features.PopulatorFeature; import com.dfsek.terra.fabric.world.features.PopulatorFeature;
import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; 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.AddonRegistry;
import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.registry.master.ConfigRegistry;
import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.TerraWorld;
@ -86,8 +89,12 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer {
private final ItemHandle itemHandle = new FabricItemHandle(); private final ItemHandle itemHandle = new FabricItemHandle();
private final WorldHandle worldHandle = new FabricWorldHandle(); private final WorldHandle worldHandle = new FabricWorldHandle();
private final ConfigRegistry registry = new ConfigRegistry(); private final ConfigRegistry registry = new ConfigRegistry();
private final CheckedRegistry<ConfigPack> checkedRegistry = new CheckedRegistry<>(registry);
private final AddonRegistry addonRegistry = new AddonRegistry(this); private final AddonRegistry addonRegistry = new AddonRegistry(this);
private final LockedRegistry<TerraAddon> addonLockedRegistry = new LockedRegistry<>(addonRegistry);
private File config; private File config;
private static final Transformer<String, ConfiguredFeature<?, ?>> TREE_TRANSFORMER = new Transformer.Builder<String, ConfiguredFeature<?, ?>>() private static final Transformer<String, ConfiguredFeature<?, ?>> TREE_TRANSFORMER = new Transformer.Builder<String, ConfiguredFeature<?, ?>>()
.addTransform(TerraFabricPlugin::getFeature) .addTransform(TerraFabricPlugin::getFeature)
@ -127,7 +134,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer {
public TerraWorld getWorld(World world) { public TerraWorld getWorld(World world) {
return worldMap.computeIfAbsent(world.getSeed(), w -> { return worldMap.computeIfAbsent(world.getSeed(), w -> {
logger.info("Loading world " + 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 @Override
public ConfigRegistry getRegistry() { public CheckedRegistry<ConfigPack> getConfigRegistry() {
return registry; return checkedRegistry;
} }
@Override @Override
public AddonRegistry getAddons() { public LockedRegistry<TerraAddon> getAddons() {
return addonRegistry; return addonLockedRegistry;
} }
@Override @Override
public void reload() { public boolean reload() {
return true;
} }
@Override @Override

View File

@ -18,7 +18,7 @@ import java.util.stream.Collectors;
public class TerraBiomeSource extends BiomeSource { public class TerraBiomeSource extends BiomeSource {
public static final Codec<ConfigPack> PACK_CODEC = (RecordCodecBuilder.create(config -> config.group( public static final Codec<ConfigPack> PACK_CODEC = (RecordCodecBuilder.create(config -> config.group(
Codec.STRING.fieldOf("pack").forGetter(pack -> pack.getTemplate().getID()) 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<TerraBiomeSource> CODEC = RecordCodecBuilder.create(instance -> instance.group( public static final Codec<TerraBiomeSource> CODEC = RecordCodecBuilder.create(instance -> instance.group(
RegistryLookupCodec.of(Registry.BIOME_KEY).forGetter(source -> source.biomeRegistry), RegistryLookupCodec.of(Registry.BIOME_KEY).forGetter(source -> source.biomeRegistry),
Codec.LONG.fieldOf("seed").stable().forGetter(source -> source.seed), Codec.LONG.fieldOf("seed").stable().forGetter(source -> source.seed),

View File

@ -35,7 +35,7 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements com.d
private final TerraBiomeSource biomeSource; private final TerraBiomeSource biomeSource;
public static final Codec<ConfigPack> PACK_CODEC = (RecordCodecBuilder.create(config -> config.group( public static final Codec<ConfigPack> PACK_CODEC = (RecordCodecBuilder.create(config -> config.group(
Codec.STRING.fieldOf("pack").forGetter(pack -> pack.getTemplate().getID()) 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<FabricChunkGeneratorWrapper> CODEC = RecordCodecBuilder.create(instance -> instance.group( public static final Codec<FabricChunkGeneratorWrapper> CODEC = RecordCodecBuilder.create(instance -> instance.group(
TerraBiomeSource.CODEC.fieldOf("biome_source").forGetter(generator -> generator.biomeSource), TerraBiomeSource.CODEC.fieldOf("biome_source").forGetter(generator -> generator.biomeSource),
Codec.LONG.fieldOf("seed").stable().forGetter(generator -> generator.seed), Codec.LONG.fieldOf("seed").stable().forGetter(generator -> generator.seed),

View File

@ -1,6 +1,7 @@
package com.dfsek.terra; package com.dfsek.terra;
import com.dfsek.tectonic.loading.TypeRegistry; 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.TerraPlugin;
import com.dfsek.terra.api.core.event.EventManager; import com.dfsek.terra.api.core.event.EventManager;
import com.dfsek.terra.api.core.event.TerraEventManager; 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.PluginConfig;
import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.lang.LangUtil;
import com.dfsek.terra.config.lang.Language; import com.dfsek.terra.config.lang.Language;
import com.dfsek.terra.config.pack.ConfigPack;
import com.dfsek.terra.debug.DebugLogger; import com.dfsek.terra.debug.DebugLogger;
import com.dfsek.terra.platform.RawBiome; import com.dfsek.terra.platform.RawBiome;
import com.dfsek.terra.platform.RawWorldHandle; 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.AddonRegistry;
import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.registry.master.ConfigRegistry;
import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.TerraWorld;
@ -28,6 +32,9 @@ import java.util.logging.Logger;
public class StandalonePlugin implements TerraPlugin { public class StandalonePlugin implements TerraPlugin {
private final ConfigRegistry registry = new ConfigRegistry(); private final ConfigRegistry registry = new ConfigRegistry();
private final AddonRegistry addonRegistry = new AddonRegistry(this); private final AddonRegistry addonRegistry = new AddonRegistry(this);
private final LockedRegistry<TerraAddon> addonLockedRegistry = new LockedRegistry<>(addonRegistry);
private final PluginConfig config = new PluginConfig(); private final PluginConfig config = new PluginConfig();
private final RawWorldHandle worldHandle = new RawWorldHandle(); private final RawWorldHandle worldHandle = new RawWorldHandle();
private final EventManager eventManager = new TerraEventManager(this); private final EventManager eventManager = new TerraEventManager(this);
@ -77,17 +84,17 @@ public class StandalonePlugin implements TerraPlugin {
} }
@Override @Override
public ConfigRegistry getRegistry() { public CheckedRegistry<ConfigPack> getConfigRegistry() {
return registry; return new CheckedRegistry<>(registry);
} }
@Override @Override
public AddonRegistry getAddons() { public LockedRegistry<TerraAddon> getAddons() {
return addonRegistry; return addonLockedRegistry;
} }
@Override @Override
public void reload() { public boolean reload() {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }

View File

@ -31,7 +31,7 @@ public class Generator {
structurePopulator = new StructurePopulator(plugin); structurePopulator = new StructurePopulator(plugin);
treePopulator = new TreePopulator(plugin); treePopulator = new TreePopulator(plugin);
orePopulator = new OrePopulator(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; this.seed = seed;
} }