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

@@ -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<ConfigPack> getConfigRegistry();
AddonRegistry getAddons();
LockedRegistry<TerraAddon> getAddons();
void reload();
boolean reload();
ItemHandle getItemHandle();

View File

@@ -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<TerraBiome> registry, BufferedImage image, int resolution, Align align) {
public ImageBiomeProvider(OpenRegistry<TerraBiome> registry, BufferedImage image, int resolution, Align align) {
this.image = image;
this.resolution = resolution;
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.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 <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));
}

View File

@@ -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 <T> Type in registry
*/
public class CheckedRegistry<T> implements TypeLoader<T> {
private final TerraRegistry<T> registry;
public class CheckedRegistry<T> implements Registry<T> {
private final OpenRegistry<T> registry;
public CheckedRegistry(TerraRegistry<T> registry) {
public CheckedRegistry(OpenRegistry<T> registry) {
this.registry = registry;
}
@@ -47,49 +46,27 @@ public class CheckedRegistry<T> implements TypeLoader<T> {
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<T> 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<String, T> consumer) {
registry.forEach(consumer);
}
/**
* Get the entries of this registry as a {@link Set}.
*
* @return Set containing all entries.
*/
@Override
public Set<T> 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.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<>();
@Override
@@ -49,34 +53,27 @@ public abstract class TerraRegistry<T> implements TypeLoader<T> {
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<T> consumer) {
objects.forEach((id, obj) -> consumer.accept(obj));
}
@Override
public void forEach(BiConsumer<String, T> consumer) {
objects.forEach(consumer);
}
@Override
public Set<T> entries() {
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.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<TerraBiome> {
public class BiomeRegistry extends OpenRegistry<TerraBiome> {
@Override
public TerraBiome load(Type type, Object o, ConfigLoader configLoader) throws LoadException {
if(o.equals("SELF")) return null;

View File

@@ -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<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.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<Flora> {
public class FloraRegistry extends OpenRegistry<Flora> {
private final TerraPlugin main;
public FloraRegistry(TerraPlugin main) {

View File

@@ -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<FunctionBuilder<?>> {
public class FunctionRegistry extends OpenRegistry<FunctionBuilder<?>> {
}

View File

@@ -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<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.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<Supplier<ObjectTemplate<NoiseSeeded>>> {
public class NoiseRegistry extends OpenRegistry<Supplier<ObjectTemplate<NoiseSeeded>>> {
public NoiseRegistry() {
add("LINEAR", LinearNormalizerTemplate::new);
add("NORMAL", NormalNormalizerTemplate::new);

View File

@@ -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<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.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<Palette<BlockData>> {
public class PaletteRegistry extends OpenRegistry<Palette<BlockData>> {
private final TerraPlugin main;
public PaletteRegistry(TerraPlugin main) {
this.main = main;

View File

@@ -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<StructureScript> {
public class ScriptRegistry extends OpenRegistry<StructureScript> {
}

View File

@@ -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<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.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<Tree> {
public class TreeRegistry extends OpenRegistry<Tree> {
private final 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.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<TerraAddon> {
public class AddonRegistry extends OpenRegistry<TerraAddon> {
private final 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.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<ConfigPack> {
public class ConfigRegistry extends OpenRegistry<ConfigPack> {
public void load(File folder, TerraPlugin main) throws ConfigException {
ConfigPack pack = new ConfigPack(folder, main);
add(pack.getTemplate().getID(), pack);