remove most hard coded registries

This commit is contained in:
dfsek 2021-04-11 02:39:21 -07:00
parent 75cb6be36f
commit 4237657dad
29 changed files with 202 additions and 232 deletions

View File

@ -1,10 +1,12 @@
package com.dfsek.terra.api.util.generic.pair; package com.dfsek.terra.api.util.generic.pair;
public class ImmutablePair<L, R> { public final class ImmutablePair<L, R> {
private final L left; private final L left;
private final R right; private final R right;
public ImmutablePair(L left, R right) { private static final ImmutablePair<?, ?> NULL = new ImmutablePair<>(null, null);
private ImmutablePair(L left, R right) {
this.left = left; this.left = left;
this.right = right; this.right = right;
} }
@ -21,7 +23,12 @@ public class ImmutablePair<L, R> {
return left; return left;
} }
@SuppressWarnings("unchecked")
public static <L1, R1> ImmutablePair<L1, R1> ofNull() {
return (ImmutablePair<L1, R1>) NULL;
}
public Pair<L, R> mutable() { public Pair<L, R> mutable() {
return new Pair<>(left, right); return Pair.of(left, right);
} }
} }

View File

@ -4,7 +4,7 @@ public class Pair<L, R> {
private L left; private L left;
private R right; private R right;
public Pair(L left, R right) { private Pair(L left, R right) {
this.left = left; this.left = left;
this.right = right; this.right = right;
} }
@ -30,6 +30,6 @@ public class Pair<L, R> {
} }
public ImmutablePair<L, R> immutable() { public ImmutablePair<L, R> immutable() {
return new ImmutablePair<>(left, right); return ImmutablePair.of(left, right);
} }
} }

View File

@ -1,14 +1,13 @@
package com.dfsek.terra.api.util.world; package com.dfsek.terra.api.util.world;
import com.dfsek.terra.api.math.MathUtil; import com.dfsek.terra.api.math.MathUtil;
import com.dfsek.terra.api.platform.block.BlockData;
import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.Palette;
import com.dfsek.terra.api.world.palette.holder.PaletteHolder; import com.dfsek.terra.api.world.palette.holder.PaletteHolder;
import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.config.templates.BiomeTemplate;
import com.dfsek.terra.world.generation.math.samplers.Sampler; import com.dfsek.terra.world.generation.math.samplers.Sampler;
public final class PaletteUtil { public final class PaletteUtil {
public static Palette<BlockData> getPalette(int x, int y, int z, BiomeTemplate c, Sampler sampler) { public static Palette getPalette(int x, int y, int z, BiomeTemplate c, Sampler sampler) {
PaletteHolder slant = c.getSlantPalette(); PaletteHolder slant = c.getSlantPalette();
if(slant != null && MathUtil.derivative(sampler, x, y, z) > c.getSlantThreshold()) { if(slant != null && MathUtil.derivative(sampler, x, y, z) > c.getSlantThreshold()) {
return slant.getPalette(y); return slant.getPalette(y);

View File

@ -1,7 +1,6 @@
package com.dfsek.terra.api.world.biome; package com.dfsek.terra.api.world.biome;
import com.dfsek.terra.api.math.noise.NoiseSampler; import com.dfsek.terra.api.math.noise.NoiseSampler;
import com.dfsek.terra.api.platform.block.BlockData;
import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.Palette;
public interface Generator { public interface Generator {
@ -35,7 +34,7 @@ public interface Generator {
* *
* @return BlocPalette - The biome's palette. * @return BlocPalette - The biome's palette.
*/ */
Palette<BlockData> getPalette(int y); Palette getPalette(int y);
NoiseSampler getBiomeNoise(); NoiseSampler getBiomeNoise();

View File

@ -1,10 +1,11 @@
package com.dfsek.terra.api.world.palette; package com.dfsek.terra.api.world.palette;
import com.dfsek.terra.api.math.noise.NoiseSampler; import com.dfsek.terra.api.math.noise.NoiseSampler;
import com.dfsek.terra.api.platform.block.BlockData;
import java.util.List; import java.util.List;
public class NoisePalette<E> extends Palette<E> { public class NoisePalette extends Palette {
private final NoiseSampler sampler; private final NoiseSampler sampler;
private final boolean is2D; private final boolean is2D;
@ -14,11 +15,11 @@ public class NoisePalette<E> extends Palette<E> {
} }
@Override @Override
public E get(int layer, double x, double y, double z) { public BlockData get(int layer, double x, double y, double z) {
PaletteLayer<E> paletteLayer; PaletteLayer paletteLayer;
if(layer > this.getSize()) paletteLayer = this.getLayers().get(this.getLayers().size() - 1); if(layer > this.getSize()) paletteLayer = this.getLayers().get(this.getLayers().size() - 1);
else { else {
List<PaletteLayer<E>> pl = getLayers(); List<PaletteLayer> pl = getLayers();
if(layer >= pl.size()) paletteLayer = pl.get(pl.size() - 1); if(layer >= pl.size()) paletteLayer = pl.get(pl.size() - 1);
else paletteLayer = pl.get(layer); else paletteLayer = pl.get(layer);
} }

View File

@ -1,6 +1,7 @@
package com.dfsek.terra.api.world.palette; package com.dfsek.terra.api.world.palette;
import com.dfsek.terra.api.math.noise.NoiseSampler; import com.dfsek.terra.api.math.noise.NoiseSampler;
import com.dfsek.terra.api.platform.block.BlockData;
import com.dfsek.terra.api.util.GlueList; import com.dfsek.terra.api.util.GlueList;
import com.dfsek.terra.api.util.collections.ProbabilityCollection; import com.dfsek.terra.api.util.collections.ProbabilityCollection;
@ -11,8 +12,8 @@ import java.util.Random;
* A class representation of a "slice" of the world. * A class representation of a "slice" of the world.
* Used to get a section of blocks, based on the depth at which they are found. * Used to get a section of blocks, based on the depth at which they are found.
*/ */
public abstract class Palette<E> { public abstract class Palette {
private final List<PaletteLayer<E>> pallet = new GlueList<>(); private final List<PaletteLayer> pallet = new GlueList<>();
/** /**
* Constructs a blank palette. * Constructs a blank palette.
@ -21,16 +22,16 @@ public abstract class Palette<E> {
} }
public com.dfsek.terra.api.world.palette.Palette<E> add(E m, int layers, NoiseSampler sampler) { public com.dfsek.terra.api.world.palette.Palette add(BlockData m, int layers, NoiseSampler sampler) {
for(int i = 0; i < layers; i++) { for(int i = 0; i < layers; i++) {
pallet.add(new PaletteLayer<>(m, sampler)); pallet.add(new PaletteLayer(m, sampler));
} }
return this; return this;
} }
public com.dfsek.terra.api.world.palette.Palette<E> add(ProbabilityCollection<E> m, int layers, NoiseSampler sampler) { public com.dfsek.terra.api.world.palette.Palette add(ProbabilityCollection<BlockData> m, int layers, NoiseSampler sampler) {
for(int i = 0; i < layers; i++) { for(int i = 0; i < layers; i++) {
pallet.add(new PaletteLayer<>(m, sampler)); pallet.add(new PaletteLayer(m, sampler));
} }
return this; return this;
} }
@ -41,25 +42,25 @@ public abstract class Palette<E> {
* @param layer - The layer at which to fetch the material. * @param layer - The layer at which to fetch the material.
* @return BlockData - The material fetched. * @return BlockData - The material fetched.
*/ */
public abstract E get(int layer, double x, double y, double z); public abstract BlockData get(int layer, double x, double y, double z);
public int getSize() { public int getSize() {
return pallet.size(); return pallet.size();
} }
public List<PaletteLayer<E>> getLayers() { public List<PaletteLayer> getLayers() {
return pallet; return pallet;
} }
/** /**
* Class representation of a layer of a BlockPalette. * Class representation of a layer of a BlockPalette.
*/ */
public static class PaletteLayer<E> { public static class PaletteLayer {
private final boolean col; // Is layer using a collection? private final boolean col; // Is layer using a collection?
private ProbabilityCollection<E> collection; private ProbabilityCollection<BlockData> collection;
private final NoiseSampler sampler; private final NoiseSampler sampler;
private E m; private BlockData m;
/** /**
* Constructs a PaletteLayerHolder with a ProbabilityCollection of materials and a number of layers. * Constructs a PaletteLayerHolder with a ProbabilityCollection of materials and a number of layers.
@ -67,7 +68,7 @@ public abstract class Palette<E> {
* @param type The collection of materials to choose from. * @param type The collection of materials to choose from.
* @param sampler Noise sampler to use * @param sampler Noise sampler to use
*/ */
public PaletteLayer(ProbabilityCollection<E> type, NoiseSampler sampler) { public PaletteLayer(ProbabilityCollection<BlockData> type, NoiseSampler sampler) {
this.sampler = sampler; this.sampler = sampler;
this.col = true; this.col = true;
this.collection = type; this.collection = type;
@ -79,7 +80,7 @@ public abstract class Palette<E> {
* @param type The material to use. * @param type The material to use.
* @param sampler Noise sampler to use * @param sampler Noise sampler to use
*/ */
public PaletteLayer(E type, NoiseSampler sampler) { public PaletteLayer(BlockData type, NoiseSampler sampler) {
this.sampler = sampler; this.sampler = sampler;
this.col = false; this.col = false;
this.m = type; this.m = type;
@ -94,18 +95,18 @@ public abstract class Palette<E> {
* *
* @return Material - the material.. * @return Material - the material..
*/ */
public E get(Random random) { public BlockData get(Random random) {
if(col) return this.collection.get(random); if(col) return this.collection.get(random);
return m; return m;
} }
public E get(NoiseSampler random, double x, double y, double z, boolean is2D) { public BlockData get(NoiseSampler random, double x, double y, double z, boolean is2D) {
if(col && is2D) return this.collection.get(random, x, z); if(col && is2D) return this.collection.get(random, x, z);
else if(col) return this.collection.get(random, x, y, z); else if(col) return this.collection.get(random, x, y, z);
return m; return m;
} }
public ProbabilityCollection<E> getCollection() { public ProbabilityCollection<BlockData> getCollection() {
return collection; return collection;
} }
} }

View File

@ -1,14 +1,16 @@
package com.dfsek.terra.api.world.palette; package com.dfsek.terra.api.world.palette;
public class SinglePalette<E> extends Palette<E> { import com.dfsek.terra.api.platform.block.BlockData;
private final E item;
public SinglePalette(E item) { public class SinglePalette extends Palette {
private final BlockData item;
public SinglePalette(BlockData item) {
this.item = item; this.item = item;
} }
@Override @Override
public E get(int layer, double x, double y, double z) { public BlockData get(int layer, double x, double y, double z) {
return item; return item;
} }
} }

View File

@ -1,16 +1,15 @@
package com.dfsek.terra.api.world.palette.holder; package com.dfsek.terra.api.world.palette.holder;
import com.dfsek.terra.api.platform.block.BlockData;
import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.Palette;
public class PaletteHolder { public class PaletteHolder {
private final Palette<BlockData>[] palettes; private final Palette[] palettes;
protected PaletteHolder(Palette<BlockData>[] palettes) { protected PaletteHolder(Palette[] palettes) {
this.palettes = palettes; this.palettes = palettes;
} }
public Palette<BlockData> getPalette(int y) { public Palette getPalette(int y) {
return palettes[y]; return palettes[y];
} }
} }

View File

@ -1,6 +1,5 @@
package com.dfsek.terra.api.world.palette.holder; package com.dfsek.terra.api.world.palette.holder;
import com.dfsek.terra.api.platform.block.BlockData;
import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.Palette;
import net.jafama.FastMath; import net.jafama.FastMath;
@ -8,19 +7,19 @@ import java.util.Map;
import java.util.TreeMap; import java.util.TreeMap;
public class PaletteHolderBuilder { public class PaletteHolderBuilder {
private final TreeMap<Integer, Palette<BlockData>> paletteMap = new TreeMap<>(); private final TreeMap<Integer, Palette> paletteMap = new TreeMap<>();
public PaletteHolderBuilder add(int y, Palette<BlockData> palette) { public PaletteHolderBuilder add(int y, Palette palette) {
paletteMap.put(y, palette); paletteMap.put(y, palette);
return this; return this;
} }
@SuppressWarnings({"unchecked", "rawtypes", "RedundantSuppression"}) @SuppressWarnings({"unchecked", "rawtypes", "RedundantSuppression"})
public PaletteHolder build() { public PaletteHolder build() {
Palette<BlockData>[] palettes = new Palette[paletteMap.lastKey() + 1]; Palette[] palettes = new Palette[paletteMap.lastKey() + 1];
for(int y = 0; y <= FastMath.max(paletteMap.lastKey(), 255); y++) { for(int y = 0; y <= FastMath.max(paletteMap.lastKey(), 255); y++) {
Palette<BlockData> d = null; Palette d = null;
for(Map.Entry<Integer, Palette<BlockData>> e : paletteMap.entrySet()) { for(Map.Entry<Integer, Palette> e : paletteMap.entrySet()) {
if(e.getKey() >= y) { if(e.getKey() >= y) {
d = e.getValue(); d = e.getValue();
break; break;

View File

@ -2,7 +2,6 @@ package com.dfsek.terra.config.factories;
import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.math.noise.samplers.noise.random.WhiteNoiseSampler; import com.dfsek.terra.api.math.noise.samplers.noise.random.WhiteNoiseSampler;
import com.dfsek.terra.api.platform.block.BlockData;
import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.api.world.flora.Flora;
import com.dfsek.terra.api.world.palette.NoisePalette; import com.dfsek.terra.api.world.palette.NoisePalette;
import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.Palette;
@ -13,7 +12,7 @@ import com.dfsek.terra.world.population.items.flora.TerraFlora;
public class FloraFactory implements ConfigFactory<FloraTemplate, Flora> { public class FloraFactory implements ConfigFactory<FloraTemplate, Flora> {
@Override @Override
public TerraFlora build(FloraTemplate config, TerraPlugin main) { public TerraFlora build(FloraTemplate config, TerraPlugin main) {
Palette<BlockData> palette = new NoisePalette<>(new WhiteNoiseSampler(2403), false); Palette palette = new NoisePalette(new WhiteNoiseSampler(2403), false);
for(PaletteLayerHolder layer : config.getFloraPalette()) { for(PaletteLayerHolder layer : config.getFloraPalette()) {
palette.add(layer.getLayer(), layer.getSize(), layer.getSampler()); palette.add(layer.getLayer(), layer.getSize(), layer.getSampler());
} }

View File

@ -1,16 +1,15 @@
package com.dfsek.terra.config.factories; package com.dfsek.terra.config.factories;
import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.platform.block.BlockData;
import com.dfsek.terra.api.world.palette.NoisePalette; import com.dfsek.terra.api.world.palette.NoisePalette;
import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.Palette;
import com.dfsek.terra.api.world.palette.holder.PaletteLayerHolder; import com.dfsek.terra.api.world.palette.holder.PaletteLayerHolder;
import com.dfsek.terra.config.templates.PaletteTemplate; import com.dfsek.terra.config.templates.PaletteTemplate;
public class PaletteFactory implements ConfigFactory<PaletteTemplate, Palette<BlockData>> { public class PaletteFactory implements ConfigFactory<PaletteTemplate, Palette> {
@Override @Override
public Palette<BlockData> build(PaletteTemplate config, TerraPlugin main) { public Palette build(PaletteTemplate config, TerraPlugin main) {
NoisePalette<BlockData> palette = new NoisePalette<>(config.getNoise().apply(2403L), config.getNoise().getDimensions() == 2); NoisePalette palette = new NoisePalette(config.getNoise().apply(2403L), config.getNoise().getDimensions() == 2);
for(PaletteLayerHolder layer : config.getPalette()) { for(PaletteLayerHolder layer : config.getPalette()) {
palette.add(layer.getLayer(), layer.getSize(), layer.getSampler()); palette.add(layer.getLayer(), layer.getSize(), layer.getSampler());
} }

View File

@ -5,7 +5,6 @@ import com.dfsek.terra.api.platform.world.Tree;
import com.dfsek.terra.api.util.collections.ProbabilityCollection; import com.dfsek.terra.api.util.collections.ProbabilityCollection;
import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.TerraBiome;
import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.api.world.flora.Flora;
import com.dfsek.terra.api.world.palette.Palette;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.Map; import java.util.Map;
@ -15,7 +14,6 @@ import java.util.Map;
*/ */
@SuppressWarnings("unused") @SuppressWarnings("unused")
public final class Types { public final class Types {
public static final Type BLOCK_DATA_PALETTE_TYPE;
public static final Type BLOCK_DATA_PROBABILITY_COLLECTION_TYPE; public static final Type BLOCK_DATA_PROBABILITY_COLLECTION_TYPE;
public static final Type FLORA_PROBABILITY_COLLECTION_TYPE; public static final Type FLORA_PROBABILITY_COLLECTION_TYPE;
public static final Type TREE_PROBABILITY_COLLECTION_TYPE; public static final Type TREE_PROBABILITY_COLLECTION_TYPE;
@ -23,7 +21,6 @@ public final class Types {
public static final Type TERRA_BIOME_TERRA_BIOME_PROBABILITY_COLLECTION_MAP; public static final Type TERRA_BIOME_TERRA_BIOME_PROBABILITY_COLLECTION_MAP;
static { static {
BLOCK_DATA_PALETTE_TYPE = getType("blockDataPalette");
BLOCK_DATA_PROBABILITY_COLLECTION_TYPE = getType("blockDataProbabilityCollection"); BLOCK_DATA_PROBABILITY_COLLECTION_TYPE = getType("blockDataProbabilityCollection");
FLORA_PROBABILITY_COLLECTION_TYPE = getType("floraProbabilityCollection"); FLORA_PROBABILITY_COLLECTION_TYPE = getType("floraProbabilityCollection");
TREE_PROBABILITY_COLLECTION_TYPE = getType("treeProbabilityCollection"); TREE_PROBABILITY_COLLECTION_TYPE = getType("treeProbabilityCollection");
@ -31,7 +28,6 @@ public final class Types {
TERRA_BIOME_TERRA_BIOME_PROBABILITY_COLLECTION_MAP = getType("terraBiomeProbabilityCollectionMap"); TERRA_BIOME_TERRA_BIOME_PROBABILITY_COLLECTION_MAP = getType("terraBiomeProbabilityCollectionMap");
} }
private Palette<BlockData> blockDataPalette;
private ProbabilityCollection<BlockData> blockDataProbabilityCollection; private ProbabilityCollection<BlockData> blockDataProbabilityCollection;
private ProbabilityCollection<Flora> floraProbabilityCollection; private ProbabilityCollection<Flora> floraProbabilityCollection;
private ProbabilityCollection<Tree> treeProbabilityCollection; private ProbabilityCollection<Tree> treeProbabilityCollection;

View File

@ -3,11 +3,9 @@ package com.dfsek.terra.config.loaders.palette;
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.tectonic.loading.TypeLoader;
import com.dfsek.terra.api.platform.block.BlockData;
import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.Palette;
import com.dfsek.terra.api.world.palette.holder.PaletteHolder; import com.dfsek.terra.api.world.palette.holder.PaletteHolder;
import com.dfsek.terra.api.world.palette.holder.PaletteHolderBuilder; import com.dfsek.terra.api.world.palette.holder.PaletteHolderBuilder;
import com.dfsek.terra.config.loaders.Types;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.List; import java.util.List;
@ -21,7 +19,7 @@ public class PaletteHolderLoader implements TypeLoader<PaletteHolder> {
PaletteHolderBuilder builder = new PaletteHolderBuilder(); PaletteHolderBuilder builder = new PaletteHolderBuilder();
for(Map<String, Integer> layer : palette) { for(Map<String, Integer> layer : palette) {
for(Map.Entry<String, Integer> entry : layer.entrySet()) { for(Map.Entry<String, Integer> entry : layer.entrySet()) {
builder.add(entry.getValue(), (Palette<BlockData>) configLoader.loadType(Types.BLOCK_DATA_PALETTE_TYPE, entry.getKey())); builder.add(entry.getValue(), (Palette) configLoader.loadType(Palette.class, entry.getKey()));
} }
} }
return builder.build(); return builder.build();

View File

@ -8,22 +8,16 @@ import com.dfsek.tectonic.exception.ConfigException;
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.TypeRegistry; import com.dfsek.tectonic.loading.TypeRegistry;
import com.dfsek.tectonic.loading.object.ObjectTemplate;
import com.dfsek.terra.api.LoaderRegistrar; import com.dfsek.terra.api.LoaderRegistrar;
import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.event.events.config.ConfigPackPostLoadEvent; import com.dfsek.terra.api.event.events.config.ConfigPackPostLoadEvent;
import com.dfsek.terra.api.event.events.config.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.events.config.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.platform.block.BlockData;
import com.dfsek.terra.api.platform.world.Tree;
import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.CheckedRegistry;
import com.dfsek.terra.api.structures.loot.LootTable; import com.dfsek.terra.api.structures.loot.LootTable;
import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.api.structures.script.StructureScript;
import com.dfsek.terra.api.util.generic.pair.ImmutablePair;
import com.dfsek.terra.api.util.seeded.NoiseSeeded; import com.dfsek.terra.api.util.seeded.NoiseSeeded;
import com.dfsek.terra.api.world.biome.provider.BiomeProvider; import com.dfsek.terra.api.world.biome.provider.BiomeProvider;
import com.dfsek.terra.api.world.flora.Flora;
import com.dfsek.terra.api.world.palette.Palette;
import com.dfsek.terra.carving.UserDefinedCarver;
import com.dfsek.terra.config.builder.BiomeBuilder; import com.dfsek.terra.config.builder.BiomeBuilder;
import com.dfsek.terra.config.dummy.DummyWorld; import com.dfsek.terra.config.dummy.DummyWorld;
import com.dfsek.terra.config.factories.ConfigFactory; import com.dfsek.terra.config.factories.ConfigFactory;
@ -40,21 +34,13 @@ import com.dfsek.terra.config.prototype.ConfigType;
import com.dfsek.terra.config.prototype.ProtoConfig; import com.dfsek.terra.config.prototype.ProtoConfig;
import com.dfsek.terra.config.templates.AbstractableTemplate; import com.dfsek.terra.config.templates.AbstractableTemplate;
import com.dfsek.terra.registry.OpenRegistry; import com.dfsek.terra.registry.OpenRegistry;
import com.dfsek.terra.registry.config.BiomeRegistry;
import com.dfsek.terra.registry.config.CarverRegistry;
import com.dfsek.terra.registry.config.ConfigTypeRegistry; import com.dfsek.terra.registry.config.ConfigTypeRegistry;
import com.dfsek.terra.registry.config.FloraRegistry;
import com.dfsek.terra.registry.config.FunctionRegistry; import com.dfsek.terra.registry.config.FunctionRegistry;
import com.dfsek.terra.registry.config.LootRegistry; import com.dfsek.terra.registry.config.LootRegistry;
import com.dfsek.terra.registry.config.NoiseRegistry; import com.dfsek.terra.registry.config.NoiseRegistry;
import com.dfsek.terra.registry.config.OreRegistry;
import com.dfsek.terra.registry.config.PaletteRegistry;
import com.dfsek.terra.registry.config.ScriptRegistry; import com.dfsek.terra.registry.config.ScriptRegistry;
import com.dfsek.terra.registry.config.StructureRegistry;
import com.dfsek.terra.registry.config.TreeRegistry;
import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.TerraWorld;
import com.dfsek.terra.world.population.items.TerraStructure; import com.dfsek.terra.world.population.items.TerraStructure;
import com.dfsek.terra.world.population.items.ores.Ore;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.json.simple.parser.ParseException; import org.json.simple.parser.ParseException;
@ -73,8 +59,6 @@ import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipFile; import java.util.zip.ZipFile;
@ -84,17 +68,12 @@ import java.util.zip.ZipFile;
public class ConfigPack implements LoaderRegistrar { public class ConfigPack implements LoaderRegistrar {
private final ConfigPackTemplate template = new ConfigPackTemplate(); private final ConfigPackTemplate template = new ConfigPackTemplate();
private final BiomeRegistry biomeRegistry = new BiomeRegistry(); private final Map<Class<?>, ImmutablePair<OpenRegistry<?>, CheckedRegistry<?>>> registryMap = new HashMap<>();
private final StructureRegistry structureRegistry = new StructureRegistry();
private final PaletteRegistry paletteRegistry;
private final FloraRegistry floraRegistry;
private final OreRegistry oreRegistry = new OreRegistry();
private final TreeRegistry treeRegistry;
private final ScriptRegistry scriptRegistry = new ScriptRegistry(); private final ScriptRegistry scriptRegistry = new ScriptRegistry();
private final LootRegistry lootRegistry = new LootRegistry(); private final LootRegistry lootRegistry = new LootRegistry();
private final CarverRegistry carverRegistry = new CarverRegistry();
private final NoiseRegistry noiseRegistry = new NoiseRegistry(); private final NoiseRegistry noiseRegistry = new NoiseRegistry();
private final FunctionRegistry functionRegistry = new FunctionRegistry(); private final FunctionRegistry functionRegistry = new FunctionRegistry();
@ -112,10 +91,12 @@ public class ConfigPack implements LoaderRegistrar {
public ConfigPack(File folder, TerraPlugin main) throws ConfigException { public ConfigPack(File folder, TerraPlugin main) throws ConfigException {
try { try {
floraRegistry = new FloraRegistry(main); this.configTypeRegistry = new ConfigTypeRegistry(this, main, (id, configType) -> {
paletteRegistry = new PaletteRegistry(main); OpenRegistry<?> openRegistry = configType.registrySupplier().get();
treeRegistry = new TreeRegistry(); selfLoader.registerLoader(configType.getTypeClass(), openRegistry);
this.configTypeRegistry = new ConfigTypeRegistry(this, main); abstractConfigLoader.registerLoader(configType.getTypeClass(), openRegistry);
registryMap.put(configType.getTypeClass(), ImmutablePair.of(openRegistry, new CheckedRegistry<>(openRegistry)));
});
this.loader = new FolderLoader(folder.toPath()); this.loader = new FolderLoader(folder.toPath());
this.main = main; this.main = main;
long l = System.nanoTime(); long l = System.nanoTime();
@ -151,19 +132,18 @@ public class ConfigPack implements LoaderRegistrar {
public ConfigPack(ZipFile file, TerraPlugin main) throws ConfigException { public ConfigPack(ZipFile file, TerraPlugin main) throws ConfigException {
try { try {
floraRegistry = new FloraRegistry(main); this.configTypeRegistry = new ConfigTypeRegistry(this, main, (id, configType) -> {
paletteRegistry = new PaletteRegistry(main); OpenRegistry<?> openRegistry = configType.registrySupplier().get();
treeRegistry = new TreeRegistry(); selfLoader.registerLoader(configType.getTypeClass(), openRegistry);
this.configTypeRegistry = new ConfigTypeRegistry(this, main); abstractConfigLoader.registerLoader(configType.getTypeClass(), openRegistry);
registryMap.put(configType.getTypeClass(), ImmutablePair.of(openRegistry, new CheckedRegistry<>(openRegistry)));
});
this.loader = new ZIPLoader(file); this.loader = new ZIPLoader(file);
this.main = main; this.main = main;
long l = System.nanoTime(); long l = System.nanoTime();
register(abstractConfigLoader);
register(selfLoader); register(selfLoader);
main.register(selfLoader); main.register(selfLoader);
main.register(abstractConfigLoader);
try { try {
ZipEntry pack = null; ZipEntry pack = null;
@ -202,12 +182,7 @@ public class ConfigPack implements LoaderRegistrar {
} }
private void checkDeadEntries(TerraPlugin main) { private void checkDeadEntries(TerraPlugin main) {
biomeRegistry.getDeadEntries().forEach((id, value) -> main.getDebugLogger().warn("Dead entry in biome registry: '" + id + "'")); registryMap.forEach((clazz, pair) -> pair.getLeft().getDeadEntries().forEach((id, value) -> main.getDebugLogger().warn("Dead entry in '" + clazz + "' registry: '" + id + "'")));
paletteRegistry.getDeadEntries().forEach((id, value) -> main.getDebugLogger().warn("Dead entry in palette registry: '" + id + "'"));
floraRegistry.getDeadEntries().forEach((id, value) -> main.getDebugLogger().warn("Dead entry in flora registry: '" + id + "'"));
carverRegistry.getDeadEntries().forEach((id, value) -> main.getDebugLogger().warn("Dead entry in carver registry: '" + id + "'"));
treeRegistry.getDeadEntries().forEach((id, value) -> main.getDebugLogger().warn("Dead entry in tree registry: '" + id + "'"));
oreRegistry.getDeadEntries().forEach((id, value) -> main.getDebugLogger().warn("Dead entry in ore registry: '" + id + "'"));
} }
@ -242,7 +217,7 @@ public class ConfigPack implements LoaderRegistrar {
loader.open("", ".yml").thenEntries(entries -> entries.forEach(stream -> configurations.add(new Configuration(stream.getValue(), stream.getKey())))); loader.open("", ".yml").thenEntries(entries -> entries.forEach(stream -> configurations.add(new Configuration(stream.getValue(), stream.getKey()))));
Map<ConfigType<? extends ConfigTemplate>, List<Configuration>> configs = new HashMap<>(); Map<ConfigType<? extends ConfigTemplate, ?>, List<Configuration>> configs = new HashMap<>();
for(Configuration configuration : configurations) { for(Configuration configuration : configurations) {
ProtoConfig config = new ProtoConfig(); ProtoConfig config = new ProtoConfig();
@ -250,7 +225,7 @@ public class ConfigPack implements LoaderRegistrar {
configs.computeIfAbsent(config.getType(), configType -> new ArrayList<>()).add(configuration); configs.computeIfAbsent(config.getType(), configType -> new ArrayList<>()).add(configuration);
} }
for(ConfigType<?> configType : configTypeRegistry.entries()) { for(ConfigType<?, ?> configType : configTypeRegistry.entries()) {
for(ConfigTemplate config : abstractConfigLoader.loadConfigs(configs.getOrDefault(configType, Collections.emptyList()), () -> configType.getTemplate(this, main))) { for(ConfigTemplate config : abstractConfigLoader.loadConfigs(configs.getOrDefault(configType, Collections.emptyList()), () -> configType.getTemplate(this, main))) {
((ConfigType) configType).callback(this, main, config); ((ConfigType) configType).callback(this, main, config);
} }
@ -260,16 +235,9 @@ public class ConfigPack implements LoaderRegistrar {
main.logger().info("Loaded config pack \"" + template.getID() + "\" v" + template.getVersion() + " by " + template.getAuthor() + " in " + (System.nanoTime() - start) / 1000000D + "ms."); main.logger().info("Loaded config pack \"" + template.getID() + "\" v" + template.getVersion() + " by " + template.getAuthor() + " in " + (System.nanoTime() - start) / 1000000D + "ms.");
} }
public TerraStructure getStructure(String id) {
return structureRegistry.get(id);
}
public Set<TerraStructure> getStructures() { public Set<TerraStructure> getStructures() {
return new HashSet<>(structureRegistry.entries()); return new HashSet<>(getRegistry(TerraStructure.class).entries());
}
public List<String> getStructureIDs() {
return structureRegistry.entries().stream().map(terraStructure -> terraStructure.getTemplate().getID()).collect(Collectors.toList());
} }
public ConfigPackTemplate getTemplate() { public ConfigPackTemplate getTemplate() {
@ -280,30 +248,24 @@ public class ConfigPack implements LoaderRegistrar {
return varScope; return varScope;
} }
@SuppressWarnings("unchecked")
public <T> CheckedRegistry<T> getRegistry(Class<T> clazz) {
return (CheckedRegistry<T>) registryMap.getOrDefault(clazz, ImmutablePair.ofNull()).getRight();
}
@Override @Override
public void register(TypeRegistry registry) { public void register(TypeRegistry registry) {
registry registry
.registerLoader(ConfigType.class, configTypeRegistry) .registerLoader(ConfigType.class, configTypeRegistry)
.registerLoader(Palette.class, paletteRegistry)
.registerLoader(BiomeBuilder.class, biomeRegistry)
.registerLoader(Flora.class, floraRegistry)
.registerLoader(Ore.class, oreRegistry)
.registerLoader(Tree.class, treeRegistry)
.registerLoader(StructureScript.class, scriptRegistry) .registerLoader(StructureScript.class, scriptRegistry)
.registerLoader(TerraStructure.class, structureRegistry)
.registerLoader(LootTable.class, lootRegistry) .registerLoader(LootTable.class, lootRegistry)
.registerLoader(UserDefinedCarver.class, carverRegistry)
.registerLoader(BufferedImage.class, new BufferedImageLoader(loader)) .registerLoader(BufferedImage.class, new BufferedImageLoader(loader))
.registerLoader(NoiseSeeded.class, new NoiseSamplerBuilderLoader(noiseRegistry)) .registerLoader(NoiseSeeded.class, new NoiseSamplerBuilderLoader(noiseRegistry))
.registerLoader(SingleBiomeProviderTemplate.class, SingleBiomeProviderTemplate::new) .registerLoader(SingleBiomeProviderTemplate.class, SingleBiomeProviderTemplate::new)
.registerLoader(BiomePipelineTemplate.class, () -> new BiomePipelineTemplate(main)) .registerLoader(BiomePipelineTemplate.class, () -> new BiomePipelineTemplate(main))
.registerLoader(ImageProviderTemplate.class, () -> new ImageProviderTemplate(biomeRegistry)) .registerLoader(ImageProviderTemplate.class, () -> new ImageProviderTemplate(getRegistry(BiomeBuilder.class)))
.registerLoader(ImageSamplerTemplate.class, () -> new ImageProviderTemplate(biomeRegistry)); .registerLoader(ImageSamplerTemplate.class, () -> new ImageProviderTemplate(getRegistry(BiomeBuilder.class)));
}
public Set<UserDefinedCarver> getCarvers() {
return new HashSet<>(carverRegistry.entries());
} }
public BiomeProvider.BiomeProviderBuilder getBiomeProviderBuilder() { public BiomeProvider.BiomeProviderBuilder getBiomeProviderBuilder() {
@ -314,55 +276,20 @@ public class ConfigPack implements LoaderRegistrar {
return new CheckedRegistry<>(scriptRegistry); return new CheckedRegistry<>(scriptRegistry);
} }
public CheckedRegistry<BiomeBuilder> getBiomeRegistry() {
return new CheckedRegistry<>(biomeRegistry);
}
public CheckedRegistry<Tree> getTreeRegistry() {
return new CheckedRegistry<>(treeRegistry);
}
public CheckedRegistry<FunctionBuilder<?>> getFunctionRegistry() {
return new CheckedRegistry<>(functionRegistry);
}
public CheckedRegistry<Supplier<ObjectTemplate<NoiseSeeded>>> getNormalizerRegistry() {
return new CheckedRegistry<>(noiseRegistry);
}
public CheckedRegistry<UserDefinedCarver> getCarverRegistry() {
return new CheckedRegistry<>(carverRegistry);
}
public CheckedRegistry<Flora> getFloraRegistry() {
return new CheckedRegistry<>(floraRegistry);
}
public CheckedRegistry<LootTable> getLootRegistry() { public CheckedRegistry<LootTable> getLootRegistry() {
return new CheckedRegistry<>(lootRegistry); return new CheckedRegistry<>(lootRegistry);
} }
public CheckedRegistry<Ore> getOreRegistry() {
return new CheckedRegistry<>(oreRegistry);
}
public CheckedRegistry<Palette<BlockData>> getPaletteRegistry() { public WorldConfig toWorldConfig(TerraWorld world) {
return new CheckedRegistry<>(paletteRegistry);
}
public CheckedRegistry<TerraStructure> getStructureRegistry() {
return new CheckedRegistry<>(structureRegistry);
}
public WorldConfig toWorldConfig(TerraWorld world){
return new WorldConfig(world, this, main); return new WorldConfig(world, this, main);
} }
public CheckedRegistry<ConfigType<?>> getConfigTypeRegistry() { public CheckedRegistry<ConfigType<?, ?>> getConfigTypeRegistry() {
return new CheckedRegistry<ConfigType<?>>(configTypeRegistry) { return new CheckedRegistry<ConfigType<?, ?>>(configTypeRegistry) {
@Override @Override
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public void addUnchecked(String identifier, ConfigType<?> value) { public void addUnchecked(String identifier, ConfigType<?, ?> value) {
if(contains(identifier)) throw new UnsupportedOperationException("Cannot override values in ConfigTypeRegistry!"); if(contains(identifier)) throw new UnsupportedOperationException("Cannot override values in ConfigTypeRegistry!");
} }
}; };

View File

@ -1,7 +1,6 @@
package com.dfsek.terra.config.pack; package com.dfsek.terra.config.pack;
import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.platform.block.BlockData;
import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.platform.world.Tree;
import com.dfsek.terra.api.registry.LockedRegistry; import com.dfsek.terra.api.registry.LockedRegistry;
import com.dfsek.terra.api.structures.loot.LootTable; import com.dfsek.terra.api.structures.loot.LootTable;
@ -11,6 +10,7 @@ import com.dfsek.terra.api.world.biome.provider.BiomeProvider;
import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.api.world.flora.Flora;
import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.Palette;
import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.carving.UserDefinedCarver;
import com.dfsek.terra.config.builder.BiomeBuilder;
import com.dfsek.terra.registry.OpenRegistry; import com.dfsek.terra.registry.OpenRegistry;
import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.TerraWorld;
import com.dfsek.terra.world.generation.math.SamplerCache; import com.dfsek.terra.world.generation.math.SamplerCache;
@ -29,7 +29,7 @@ public class WorldConfig {
private final LockedRegistry<Flora> floraRegistry; private final LockedRegistry<Flora> floraRegistry;
private final LockedRegistry<LootTable> lootRegistry; private final LockedRegistry<LootTable> lootRegistry;
private final LockedRegistry<Ore> oreRegistry; private final LockedRegistry<Ore> oreRegistry;
private final LockedRegistry<Palette<BlockData>> paletteRegistry; private final LockedRegistry<Palette> paletteRegistry;
private final LockedRegistry<TerraStructure> structureRegistry; private final LockedRegistry<TerraStructure> structureRegistry;
private final BiomeProvider provider; private final BiomeProvider provider;
@ -44,16 +44,16 @@ public class WorldConfig {
this.scriptRegistry = new LockedRegistry<>(pack.getScriptRegistry()); this.scriptRegistry = new LockedRegistry<>(pack.getScriptRegistry());
OpenRegistry<TerraBiome> biomeOpenRegistry = new OpenRegistry<>(); OpenRegistry<TerraBiome> biomeOpenRegistry = new OpenRegistry<>();
pack.getBiomeRegistry().forEach((id, biome) -> biomeOpenRegistry.add(id, biome.apply(world.getWorld().getSeed()))); pack.getRegistry(BiomeBuilder.class).forEach((id, biome) -> biomeOpenRegistry.add(id, biome.apply(world.getWorld().getSeed())));
this.biomeRegistry = new LockedRegistry<>(biomeOpenRegistry); this.biomeRegistry = new LockedRegistry<>(biomeOpenRegistry);
this.carverRegistry = new LockedRegistry<>(pack.getCarverRegistry()); this.carverRegistry = new LockedRegistry<>(pack.getRegistry(UserDefinedCarver.class));
this.treeRegistry = new LockedRegistry<>(pack.getTreeRegistry()); this.treeRegistry = new LockedRegistry<>(pack.getRegistry(Tree.class));
this.floraRegistry = new LockedRegistry<>(pack.getFloraRegistry()); this.floraRegistry = new LockedRegistry<>(pack.getRegistry(Flora.class));
this.lootRegistry = new LockedRegistry<>(pack.getLootRegistry()); this.lootRegistry = new LockedRegistry<>(pack.getLootRegistry());
this.oreRegistry = new LockedRegistry<>(pack.getOreRegistry()); this.oreRegistry = new LockedRegistry<>(pack.getRegistry(Ore.class));
this.paletteRegistry = new LockedRegistry<>(pack.getPaletteRegistry()); this.paletteRegistry = new LockedRegistry<>(pack.getRegistry(Palette.class));
this.structureRegistry = new LockedRegistry<>(pack.getStructureRegistry()); this.structureRegistry = new LockedRegistry<>(pack.getRegistry(TerraStructure.class));
this.provider = pack.getBiomeProviderBuilder().build(world.getWorld().getSeed()); this.provider = pack.getBiomeProviderBuilder().build(world.getWorld().getSeed());
} }
@ -98,7 +98,7 @@ public class WorldConfig {
return oreRegistry; return oreRegistry;
} }
public LockedRegistry<Palette<BlockData>> getPaletteRegistry() { public LockedRegistry<Palette> getPaletteRegistry() {
return paletteRegistry; return paletteRegistry;
} }

View File

@ -4,9 +4,16 @@ import com.dfsek.tectonic.config.ConfigTemplate;
import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.exception.LoadException;
import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.pack.ConfigPack;
import com.dfsek.terra.registry.OpenRegistry;
public interface ConfigType<T extends ConfigTemplate> { import java.util.function.Supplier;
public interface ConfigType<T extends ConfigTemplate, R> {
T getTemplate(ConfigPack pack, TerraPlugin main); T getTemplate(ConfigPack pack, TerraPlugin main);
void callback(ConfigPack pack, TerraPlugin main, T loadedConfig) throws LoadException; void callback(ConfigPack pack, TerraPlugin main, T loadedConfig) throws LoadException;
Class<R> getTypeClass();
Supplier<OpenRegistry<R>> registrySupplier();
} }

View File

@ -8,14 +8,14 @@ public class ProtoConfig implements ConfigTemplate {
private String id; private String id;
@Value("type") @Value("type")
private ConfigType<?> type; private ConfigType<?, ?> type;
public String getId() { public String getId() {
return id; return id;
} }
public ConfigType<?> getType() { public ConfigType<?, ?> getType() {
return type; return type;
} }
} }

View File

@ -13,7 +13,6 @@ import com.dfsek.terra.api.math.noise.NoiseSampler;
import com.dfsek.terra.api.math.noise.samplers.noise.ConstantSampler; import com.dfsek.terra.api.math.noise.samplers.noise.ConstantSampler;
import com.dfsek.terra.api.math.paralithic.BlankFunction; import com.dfsek.terra.api.math.paralithic.BlankFunction;
import com.dfsek.terra.api.math.paralithic.defined.UserDefinedFunction; import com.dfsek.terra.api.math.paralithic.defined.UserDefinedFunction;
import com.dfsek.terra.api.platform.block.BlockData;
import com.dfsek.terra.api.platform.block.BlockType; import com.dfsek.terra.api.platform.block.BlockType;
import com.dfsek.terra.api.platform.world.Biome; import com.dfsek.terra.api.platform.world.Biome;
import com.dfsek.terra.api.util.GlueList; import com.dfsek.terra.api.util.GlueList;
@ -124,7 +123,7 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf
@Value("ocean.palette") @Value("ocean.palette")
@Abstractable @Abstractable
@Default @Default
private Palette<BlockData> oceanPalette; private Palette oceanPalette;
@Value("elevation.equation") @Value("elevation.equation")
@Default @Default
@ -159,12 +158,12 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf
@Value("slabs.palettes") @Value("slabs.palettes")
@Abstractable @Abstractable
@Default @Default
private Map<BlockType, Palette<BlockData>> slabPalettes; private Map<BlockType, Palette> slabPalettes;
@Value("slabs.stair-palettes") @Value("slabs.stair-palettes")
@Abstractable @Abstractable
@Default @Default
private Map<BlockType, Palette<BlockData>> stairPalettes; private Map<BlockType, Palette> stairPalettes;
@Value("slant.threshold") @Value("slant.threshold")
@Abstractable @Abstractable
@ -247,14 +246,6 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf
return doSlabs; return doSlabs;
} }
public Map<BlockType, Palette<BlockData>> getSlabPalettes() {
return slabPalettes;
}
public Map<BlockType, Palette<BlockData>> getStairPalettes() {
return stairPalettes;
}
public BiomeTemplate(ConfigPack pack, TerraPlugin main) { public BiomeTemplate(ConfigPack pack, TerraPlugin main) {
this.pack = pack; this.pack = pack;
biomeNoise = new NoiseSeeded() { biomeNoise = new NoiseSeeded() {
@ -268,7 +259,15 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf
return 2; return 2;
} }
}; };
oceanPalette = new SinglePalette<>(main.getWorldHandle().createBlockData("minecraft:water")); oceanPalette = new SinglePalette(main.getWorldHandle().createBlockData("minecraft:water"));
}
public Map<BlockType, Palette> getSlabPalettes() {
return slabPalettes;
}
public Map<BlockType, Palette> getStairPalettes() {
return stairPalettes;
} }
public NoiseSeeded getBiomeNoise() { public NoiseSeeded getBiomeNoise() {
@ -291,7 +290,7 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf
return seaLevel; return seaLevel;
} }
public Palette<BlockData> getOceanPalette() { public Palette getOceanPalette() {
return oceanPalette; return oceanPalette;
} }

View File

@ -21,6 +21,7 @@ import java.util.stream.Collectors;
*/ */
public class OpenRegistry<T> implements Registry<T> { public class OpenRegistry<T> implements Registry<T> {
private final Map<String, Entry<T>> objects; private final Map<String, Entry<T>> objects;
private static final Entry<?> NULL = new Entry<>(null);
public OpenRegistry() { public OpenRegistry() {
objects = new HashMap<>(); objects = new HashMap<>();
@ -72,9 +73,10 @@ public class OpenRegistry<T> implements Registry<T> {
return objects.containsKey(identifier); return objects.containsKey(identifier);
} }
@SuppressWarnings("unchecked")
@Override @Override
public T get(String identifier) { public T get(String identifier) {
return objects.get(identifier).getValue(); return objects.getOrDefault(identifier, (Entry<T>) NULL).getValue();
} }
@Override @Override
@ -89,7 +91,7 @@ public class OpenRegistry<T> implements Registry<T> {
@Override @Override
public Collection<T> entries() { public Collection<T> entries() {
return objects.values().stream().map(Entry::getRaw).collect(Collectors.toSet()); return objects.values().stream().map(Entry::getRaw).collect(Collectors.toList());
} }
@Override @Override

View File

@ -3,7 +3,11 @@ package com.dfsek.terra.registry.config;
import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.tectonic.config.ConfigTemplate;
import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.exception.LoadException;
import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.platform.world.Tree;
import com.dfsek.terra.api.world.flora.Flora;
import com.dfsek.terra.api.world.palette.Palette;
import com.dfsek.terra.carving.UserDefinedCarver;
import com.dfsek.terra.config.builder.BiomeBuilder;
import com.dfsek.terra.config.factories.BiomeFactory; import com.dfsek.terra.config.factories.BiomeFactory;
import com.dfsek.terra.config.factories.CarverFactory; import com.dfsek.terra.config.factories.CarverFactory;
import com.dfsek.terra.config.factories.ConfigFactory; import com.dfsek.terra.config.factories.ConfigFactory;
@ -23,25 +27,36 @@ import com.dfsek.terra.config.templates.PaletteTemplate;
import com.dfsek.terra.config.templates.StructureTemplate; import com.dfsek.terra.config.templates.StructureTemplate;
import com.dfsek.terra.config.templates.TreeTemplate; import com.dfsek.terra.config.templates.TreeTemplate;
import com.dfsek.terra.registry.OpenRegistry; import com.dfsek.terra.registry.OpenRegistry;
import com.dfsek.terra.world.population.items.TerraStructure;
import com.dfsek.terra.world.population.items.ores.Ore;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.function.Function; import java.util.function.BiConsumer;
import java.util.function.Supplier; import java.util.function.Supplier;
public class ConfigTypeRegistry extends OpenRegistry<ConfigType<?>> { public class ConfigTypeRegistry extends OpenRegistry<ConfigType<?, ?>> {
public ConfigTypeRegistry(ConfigPack pack, TerraPlugin main) { private final BiConsumer<String, ConfigType<?, ?>> callback;
public ConfigTypeRegistry(ConfigPack pack, TerraPlugin main, BiConsumer<String, ConfigType<?, ?>> callback) {
super(new LinkedHashMap<>()); // Ordered super(new LinkedHashMap<>()); // Ordered
add("PALETTE", new ConfigBuilder<>(pack.getPaletteRegistry(), new PaletteFactory(), PaletteTemplate::new)); this.callback = callback;
add("ORE", new ConfigBuilder<>(pack.getOreRegistry(), new OreFactory(), OreTemplate::new)); add("PALETTE", new ConfigBuilder<>(new PaletteFactory(), PaletteTemplate::new, Palette.class, () -> new PaletteRegistry(main)));
add("FLORA", new ConfigBuilder<>(pack.getFloraRegistry(), new FloraFactory(), FloraTemplate::new)); add("ORE", new ConfigBuilder<>(new OreFactory(), OreTemplate::new, Ore.class, OreRegistry::new));
add("CARVER", new ConfigBuilder<>(pack.getCarverRegistry(), new CarverFactory(pack), CarverTemplate::new)); add("FLORA", new ConfigBuilder<>(new FloraFactory(), FloraTemplate::new, Flora.class, () -> new FloraRegistry(main)));
add("STRUCTURE", new ConfigBuilder<>(pack.getStructureRegistry(), new StructureFactory(), StructureTemplate::new)); add("CARVER", new ConfigBuilder<>(new CarverFactory(pack), CarverTemplate::new, UserDefinedCarver.class, CarverRegistry::new));
add("TREE", new ConfigBuilder<>(pack.getTreeRegistry(), new TreeFactory(), TreeTemplate::new)); add("STRUCTURE", new ConfigBuilder<>(new StructureFactory(), StructureTemplate::new, TerraStructure.class, StructureRegistry::new));
add("BIOME", new ConfigBuilder<>(pack.getBiomeRegistry(), new BiomeFactory(pack), () -> new BiomeTemplate(pack, main))); add("TREE", new ConfigBuilder<>(new TreeFactory(), TreeTemplate::new, Tree.class, TreeRegistry::new));
add("BIOME", new ConfigBuilder<>(new BiomeFactory(pack), () -> new BiomeTemplate(pack, main), BiomeBuilder.class, BiomeRegistry::new));
add("PACK", new PackBuilder()); add("PACK", new PackBuilder());
} }
private static final class PackBuilder implements ConfigType<ConfigTemplate> { @Override
protected boolean add(String identifier, Entry<ConfigType<?, ?>> value) {
callback.accept(identifier, value.getValue());
return super.add(identifier, value);
}
private static final class PackBuilder implements ConfigType<ConfigTemplate, ConfigPack> {
@Override @Override
public ConfigTemplate getTemplate(ConfigPack pack, TerraPlugin main) { public ConfigTemplate getTemplate(ConfigPack pack, TerraPlugin main) {
@ -53,17 +68,29 @@ public class ConfigTypeRegistry extends OpenRegistry<ConfigType<?>> {
public void callback(ConfigPack pack, TerraPlugin main, ConfigTemplate loadedConfig) { public void callback(ConfigPack pack, TerraPlugin main, ConfigTemplate loadedConfig) {
} }
@Override
public Class<ConfigPack> getTypeClass() {
return ConfigPack.class;
} }
private static final class ConfigBuilder<T extends AbstractableTemplate, O> implements ConfigType<T> { @Override
private final CheckedRegistry<O> registry; public Supplier<OpenRegistry<ConfigPack>> registrySupplier() {
return OpenRegistry::new;
}
}
private static final class ConfigBuilder<T extends AbstractableTemplate, O> implements ConfigType<T, O> {
private final ConfigFactory<T, O> factory; private final ConfigFactory<T, O> factory;
private final Supplier<T> provider; private final Supplier<T> provider;
private final Class<O> clazz;
private final Supplier<OpenRegistry<O>> registrySupplier;
private ConfigBuilder(CheckedRegistry<O> registry, ConfigFactory<T, O> factory, Supplier<T> provider) { private ConfigBuilder(ConfigFactory<T, O> factory, Supplier<T> provider, Class<O> clazz, Supplier<OpenRegistry<O>> registrySupplier) {
this.registry = registry;
this.factory = factory; this.factory = factory;
this.provider = provider; this.provider = provider;
this.clazz = clazz;
this.registrySupplier = registrySupplier;
} }
@Override @Override
@ -74,7 +101,17 @@ public class ConfigTypeRegistry extends OpenRegistry<ConfigType<?>> {
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@Override @Override
public void callback(ConfigPack pack, TerraPlugin main, T loadedConfig) throws LoadException { public void callback(ConfigPack pack, TerraPlugin main, T loadedConfig) throws LoadException {
registry.addUnchecked(loadedConfig.getID(), factory.build(loadedConfig, main)); pack.getRegistry(clazz).addUnchecked(loadedConfig.getID(), factory.build(loadedConfig, main));
}
@Override
public Class<O> getTypeClass() {
return clazz;
}
@Override
public Supplier<OpenRegistry<O>> registrySupplier() {
return registrySupplier;
} }
} }
} }

View File

@ -1,22 +1,21 @@
package com.dfsek.terra.registry.config; package com.dfsek.terra.registry.config;
import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.platform.block.BlockData;
import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.Palette;
import com.dfsek.terra.api.world.palette.SinglePalette; import com.dfsek.terra.api.world.palette.SinglePalette;
import com.dfsek.terra.registry.OpenRegistry; import com.dfsek.terra.registry.OpenRegistry;
public class PaletteRegistry extends OpenRegistry<Palette<BlockData>> { public class PaletteRegistry extends OpenRegistry<Palette> {
private final TerraPlugin main; private final TerraPlugin main;
public PaletteRegistry(TerraPlugin main) { public PaletteRegistry(TerraPlugin main) {
this.main = main; this.main = main;
} }
@Override @Override
public Palette<BlockData> get(String identifier) { public Palette get(String identifier) {
if(identifier.startsWith("BLOCK:")) if(identifier.startsWith("BLOCK:"))
return new SinglePalette<>(main.getWorldHandle().createBlockData(identifier.substring(6))); // Return single palette for BLOCK: shortcut. return new SinglePalette(main.getWorldHandle().createBlockData(identifier.substring(6))); // Return single palette for BLOCK: shortcut.
return super.get(identifier); return super.get(identifier);
} }
} }

View File

@ -75,7 +75,7 @@ public class TerraWorld {
*/ */
public BlockData getUngeneratedBlock(int x, int y, int z) { public BlockData getUngeneratedBlock(int x, int y, int z) {
UserDefinedBiome biome = (UserDefinedBiome) provider.getBiome(x, z); UserDefinedBiome biome = (UserDefinedBiome) provider.getBiome(x, z);
Palette<BlockData> palette = biome.getGenerator(world).getPalette(y); Palette palette = biome.getGenerator(world).getPalette(y);
Sampler sampler = config.getSamplerCache().get(x, z); Sampler sampler = config.getSamplerCache().get(x, z);
int fdX = FastMath.floorMod(x, 16); int fdX = FastMath.floorMod(x, 16);
int fdZ = FastMath.floorMod(z, 16); int fdZ = FastMath.floorMod(z, 16);

View File

@ -1,7 +1,6 @@
package com.dfsek.terra.world.generation; package com.dfsek.terra.world.generation;
import com.dfsek.terra.api.math.noise.NoiseSampler; import com.dfsek.terra.api.math.noise.NoiseSampler;
import com.dfsek.terra.api.platform.block.BlockData;
import com.dfsek.terra.api.world.biome.Generator; import com.dfsek.terra.api.world.biome.Generator;
import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.Palette;
import com.dfsek.terra.api.world.palette.holder.PaletteHolder; import com.dfsek.terra.api.world.palette.holder.PaletteHolder;
@ -67,7 +66,7 @@ public class WorldGenerator implements Generator {
* @return BlockPalette - The biome's palette. * @return BlockPalette - The biome's palette.
*/ */
@Override @Override
public Palette<BlockData> getPalette(int y) { public Palette getPalette(int y) {
return palettes.getPalette(y); return palettes.getPalette(y);
} }
@ -86,7 +85,7 @@ public class WorldGenerator implements Generator {
return blendStep; return blendStep;
} }
public Palette<BlockData> getSlantPalette(int y) { public Palette getSlantPalette(int y) {
return slantPalettes.getPalette(y); return slantPalettes.getPalette(y);
} }
} }

View File

@ -112,7 +112,7 @@ public class DefaultChunkGenerator2D implements TerraChunkGenerator {
TerraBiome b = grid.getBiome(xOrig + x, zOrig + z); TerraBiome b = grid.getBiome(xOrig + x, zOrig + z);
BiomeTemplate c = ((UserDefinedBiome) b).getConfig(); BiomeTemplate c = ((UserDefinedBiome) b).getConfig();
Palette<BlockData> seaPalette = c.getOceanPalette(); Palette seaPalette = c.getOceanPalette();
int height = FastMath.min((int) sampler.sample(x, 0, z), world.getMaxHeight() - 1); int height = FastMath.min((int) sampler.sample(x, 0, z), world.getMaxHeight() - 1);

View File

@ -45,7 +45,7 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator {
private final ConfigPack configPack; private final ConfigPack configPack;
private final TerraPlugin main; private final TerraPlugin main;
private final BlockType water; private final BlockType water;
private final SinglePalette<BlockData> blank; private final SinglePalette blank;
private final List<TerraBlockPopulator> blockPopulators = new ArrayList<>(); private final List<TerraBlockPopulator> blockPopulators = new ArrayList<>();
private final Carver carver; private final Carver carver;
@ -63,7 +63,7 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator {
carver = new NoiseCarver(new Range(0, 255), main.getWorldHandle().createBlockData("minecraft:air"), main); carver = new NoiseCarver(new Range(0, 255), main.getWorldHandle().createBlockData("minecraft:air"), main);
water = main.getWorldHandle().createBlockData("minecraft:water").getBlockType(); water = main.getWorldHandle().createBlockData("minecraft:water").getBlockType();
blank = new SinglePalette<>(main.getWorldHandle().createBlockData("minecraft:air")); blank = new SinglePalette(main.getWorldHandle().createBlockData("minecraft:air"));
} }
@Override @Override
@ -124,7 +124,7 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator {
BiomeTemplate c = ((UserDefinedBiome) b).getConfig(); BiomeTemplate c = ((UserDefinedBiome) b).getConfig();
int sea = c.getSeaLevel(); int sea = c.getSeaLevel();
Palette<BlockData> seaPalette = c.getOceanPalette(); Palette seaPalette = c.getOceanPalette();
boolean justSet = false; boolean justSet = false;
BlockData data = null; BlockData data = null;
@ -162,11 +162,11 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator {
} }
} }
private void prepareBlockPartFloor(BlockData down, BlockData orig, ChunkData chunk, Vector3 block, Map<BlockType, Palette<BlockData>> slabs, private void prepareBlockPartFloor(BlockData down, BlockData orig, ChunkData chunk, Vector3 block, Map<BlockType, Palette> slabs,
Map<BlockType, Palette<BlockData>> stairs, double thresh, Sampler sampler) { Map<BlockType, Palette> stairs, double thresh, Sampler sampler) {
if(sampler.sample(block.getX(), block.getY() - 0.4, block.getZ()) > thresh) { if(sampler.sample(block.getX(), block.getY() - 0.4, block.getZ()) > thresh) {
if(stairs != null) { if(stairs != null) {
Palette<BlockData> stairPalette = stairs.get(down.getBlockType()); Palette stairPalette = stairs.get(down.getBlockType());
if(stairPalette != null) { if(stairPalette != null) {
BlockData stair = stairPalette.get(0, block.getX(), block.getY(), block.getZ()).clone(); BlockData stair = stairPalette.get(0, block.getX(), block.getY(), block.getZ()).clone();
if(stair instanceof Stairs) { if(stair instanceof Stairs) {
@ -183,11 +183,11 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator {
} }
} }
private void prepareBlockPartCeiling(BlockData up, BlockData orig, ChunkData chunk, Vector3 block, Map<BlockType, Palette<BlockData>> slabs, private void prepareBlockPartCeiling(BlockData up, BlockData orig, ChunkData chunk, Vector3 block, Map<BlockType, Palette> slabs,
Map<BlockType, Palette<BlockData>> stairs, double thresh, Sampler sampler) { Map<BlockType, Palette> stairs, double thresh, Sampler sampler) {
if(sampler.sample(block.getX(), block.getY() + 0.4, block.getZ()) > thresh) { if(sampler.sample(block.getX(), block.getY() + 0.4, block.getZ()) > thresh) {
if(stairs != null) { if(stairs != null) {
Palette<BlockData> stairPalette = stairs.get(up.getBlockType()); Palette stairPalette = stairs.get(up.getBlockType());
if(stairPalette != null) { if(stairPalette != null) {
BlockData stair = stairPalette.get(0, block.getX(), block.getY(), block.getZ()).clone(); BlockData stair = stairPalette.get(0, block.getX(), block.getY(), block.getZ()).clone();
if(stair instanceof Stairs) { if(stair instanceof Stairs) {

View File

@ -22,7 +22,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
public class TerraFlora implements Flora { public class TerraFlora implements Flora {
private final Palette<BlockData> floraPalette; private final Palette floraPalette;
private final boolean physics; private final boolean physics;
private final boolean ceiling; private final boolean ceiling;
@ -43,7 +43,7 @@ public class TerraFlora implements Flora {
private final TerraPlugin main; private final TerraPlugin main;
public TerraFlora(Palette<BlockData> floraPalette, boolean physics, boolean ceiling, MaterialSet irrigable, MaterialSet spawnable, MaterialSet replaceable, MaterialSet testRotation, int maxPlacements, Search search, boolean spawnBlacklist, int irrigableOffset, TerraPlugin main) { public TerraFlora(Palette floraPalette, boolean physics, boolean ceiling, MaterialSet irrigable, MaterialSet spawnable, MaterialSet replaceable, MaterialSet testRotation, int maxPlacements, Search search, boolean spawnBlacklist, int irrigableOffset, TerraPlugin main) {
this.floraPalette = floraPalette; this.floraPalette = floraPalette;
this.physics = physics; this.physics = physics;
this.testRotation = testRotation; this.testRotation = testRotation;

View File

@ -28,6 +28,6 @@ public class BukkitWorldHandle implements WorldHandle {
@Override @Override
public Pair<Location, Location> getSelectedLocation(Player player) { public Pair<Location, Location> getSelectedLocation(Player player) {
org.bukkit.Location[] locations = WorldEditUtil.getSelectionLocations(BukkitAdapter.adapt(player)); org.bukkit.Location[] locations = WorldEditUtil.getSelectionLocations(BukkitAdapter.adapt(player));
return new Pair<>(BukkitAdapter.adapt(locations[0]), BukkitAdapter.adapt(locations[1])); return Pair.of(BukkitAdapter.adapt(locations[0]), BukkitAdapter.adapt(locations[1]));
} }
} }

View File

@ -5,6 +5,7 @@ import com.dfsek.terra.api.event.EventListener;
import com.dfsek.terra.api.event.annotations.Global; import com.dfsek.terra.api.event.annotations.Global;
import com.dfsek.terra.api.event.annotations.Priority; import com.dfsek.terra.api.event.annotations.Priority;
import com.dfsek.terra.api.event.events.config.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.events.config.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.platform.world.Tree;
import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.bukkit.world.BukkitAdapter;
import com.dfsek.terra.bukkit.world.BukkitTree; import com.dfsek.terra.bukkit.world.BukkitTree;
import com.dfsek.terra.registry.exception.DuplicateEntryException; import com.dfsek.terra.registry.exception.DuplicateEntryException;
@ -23,8 +24,8 @@ public class TerraListener implements EventListener {
for(TreeType value : TreeType.values()) { for(TreeType value : TreeType.values()) {
try { try {
String id = BukkitAdapter.TREE_TRANSFORMER.translate(value); String id = BukkitAdapter.TREE_TRANSFORMER.translate(value);
event.getPack().getTreeRegistry().add(id, new BukkitTree(value, main)); event.getPack().getRegistry(Tree.class).add(id, new BukkitTree(value, main));
event.getPack().getTreeRegistry().get(id); // Platform trees should never be marked "dead" event.getPack().getRegistry(Tree.class).get(id); // Platform trees should never be marked "dead"
} catch(DuplicateEntryException ignore) { // If another addon has already registered trees, do nothing. } catch(DuplicateEntryException ignore) { // If another addon has already registered trees, do nothing.
} }
} }

View File

@ -311,7 +311,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer {
RegistryKey<ConfiguredFeature<?, ?>> floraKey = RegistryKey.of(Registry.CONFIGURED_FEATURE_WORLDGEN, new Identifier("terra", "flora_populator")); RegistryKey<ConfiguredFeature<?, ?>> floraKey = RegistryKey.of(Registry.CONFIGURED_FEATURE_WORLDGEN, new Identifier("terra", "flora_populator"));
Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, floraKey.getValue(), POPULATOR_CONFIGURED_FEATURE); Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, floraKey.getValue(), POPULATOR_CONFIGURED_FEATURE);
registry.forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> Registry.register(BuiltinRegistries.BIOME, new Identifier("terra", createBiomeID(pack, id)), createBiome(biome)))); // Register all Terra biomes. registry.forEach(pack -> pack.getRegistry(BiomeBuilder.class).forEach((id, biome) -> Registry.register(BuiltinRegistries.BIOME, new Identifier("terra", createBiomeID(pack, id)), createBiome(biome)))); // Register all Terra biomes.
Registry.register(Registry.CHUNK_GENERATOR, new Identifier("terra:terra"), FabricChunkGeneratorWrapper.CODEC); Registry.register(Registry.CHUNK_GENERATOR, new Identifier("terra:terra"), FabricChunkGeneratorWrapper.CODEC);
Registry.register(Registry.BIOME_SOURCE, new Identifier("terra:terra"), TerraBiomeSource.CODEC); Registry.register(Registry.BIOME_SOURCE, new Identifier("terra:terra"), TerraBiomeSource.CODEC);
@ -408,7 +408,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer {
@Priority(Priority.LOWEST) @Priority(Priority.LOWEST)
@Global @Global
public void injectTrees(ConfigPackPreLoadEvent event) { public void injectTrees(ConfigPackPreLoadEvent event) {
CheckedRegistry<Tree> treeRegistry = event.getPack().getTreeRegistry(); CheckedRegistry<Tree> treeRegistry = event.getPack().getRegistry(Tree.class);
injectTree(treeRegistry, "BROWN_MUSHROOM", ConfiguredFeatures.HUGE_BROWN_MUSHROOM); injectTree(treeRegistry, "BROWN_MUSHROOM", ConfiguredFeatures.HUGE_BROWN_MUSHROOM);
injectTree(treeRegistry, "RED_MUSHROOM", ConfiguredFeatures.HUGE_RED_MUSHROOM); injectTree(treeRegistry, "RED_MUSHROOM", ConfiguredFeatures.HUGE_RED_MUSHROOM);
injectTree(treeRegistry, "JUNGLE", ConfiguredFeatures.MEGA_JUNGLE_TREE); injectTree(treeRegistry, "JUNGLE", ConfiguredFeatures.MEGA_JUNGLE_TREE);