More loaders 'n stuff

This commit is contained in:
dfsek
2020-11-27 00:59:15 -07:00
parent 013216ad8c
commit 717ece9d1f
9 changed files with 130 additions and 15 deletions

View File

@@ -0,0 +1,22 @@
package com.dfsek.terra.biome.palette;
import org.bukkit.block.data.BlockData;
import org.polydev.gaea.math.ProbabilityCollection;
public class PaletteLayer {
private final ProbabilityCollection<BlockData> layer;
private final int size;
public PaletteLayer(ProbabilityCollection<BlockData> layer, int size) {
this.layer = layer;
this.size = size;
}
public ProbabilityCollection<BlockData> getLayer() {
return layer;
}
public int getSize() {
return size;
}
}

View File

@@ -6,6 +6,7 @@ import com.dfsek.tectonic.loading.ConfigLoader;
import com.dfsek.terra.Debug;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.biome.palette.PaletteHolder;
import com.dfsek.terra.biome.palette.PaletteLayer;
import com.dfsek.terra.carving.CarverPalette;
import com.dfsek.terra.carving.UserDefinedCarver;
import com.dfsek.terra.config.builder.BiomeGridBuilder;
@@ -13,26 +14,31 @@ import com.dfsek.terra.config.exception.FileMissingException;
import com.dfsek.terra.config.factories.BiomeFactory;
import com.dfsek.terra.config.factories.BiomeGridFactory;
import com.dfsek.terra.config.factories.CarverFactory;
import com.dfsek.terra.config.factories.PaletteFactory;
import com.dfsek.terra.config.lang.LangUtil;
import com.dfsek.terra.config.loaders.GridSpawnLoader;
import com.dfsek.terra.config.loaders.NoiseBuilderLoader;
import com.dfsek.terra.config.loaders.PaletteHolderLoader;
import com.dfsek.terra.config.loaders.PaletteLayerLoader;
import com.dfsek.terra.config.loaders.ProbabilityCollectionLoader;
import com.dfsek.terra.config.loaders.RangeLoader;
import com.dfsek.terra.config.loaders.base.CarverPaletteLoader;
import com.dfsek.terra.config.templates.BiomeGridTemplate;
import com.dfsek.terra.config.templates.BiomeTemplate;
import com.dfsek.terra.config.templates.CarverTemplate;
import com.dfsek.terra.config.templates.PaletteTemplate;
import com.dfsek.terra.config.templates.StructureTemplate;
import com.dfsek.terra.generation.config.NoiseBuilder;
import com.dfsek.terra.procgen.GridSpawn;
import com.dfsek.terra.registry.BiomeGridRegistry;
import com.dfsek.terra.registry.BiomeRegistry;
import com.dfsek.terra.registry.CarverRegistry;
import com.dfsek.terra.registry.PaletteRegistry;
import com.dfsek.terra.registry.StructureRegistry;
import com.dfsek.terra.util.ConfigUtil;
import org.polydev.gaea.math.ProbabilityCollection;
import org.polydev.gaea.math.Range;
import org.polydev.gaea.world.palette.Palette;
import java.io.File;
import java.io.FileInputStream;
@@ -52,6 +58,7 @@ public class ConfigPack {
private final BiomeGridRegistry biomeGridRegistry = new BiomeGridRegistry();
private final StructureRegistry structureRegistry = new StructureRegistry();
private final CarverRegistry carverRegistry = new CarverRegistry();
private final PaletteRegistry paletteRegistry = new PaletteRegistry();
public ConfigPack(File folder) throws ConfigException {
@@ -73,7 +80,16 @@ public class ConfigPack {
.registerLoader(Range.class, new RangeLoader())
.registerLoader(CarverPalette.class, new CarverPaletteLoader())
.registerLoader(GridSpawn.class, new GridSpawnLoader())
.registerLoader(PaletteHolder.class, new PaletteHolderLoader());
.registerLoader(PaletteHolder.class, new PaletteHolderLoader())
.registerLoader(PaletteLayer.class, new PaletteLayerLoader())
.registerLoader(Palette.class, paletteRegistry);
List<PaletteTemplate> paletteTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "palettes").toPath()), PaletteTemplate::new);
PaletteFactory paletteFactory = new PaletteFactory();
paletteTemplates.forEach(palette -> {
paletteRegistry.add(palette.getID(), paletteFactory.build(palette));
Debug.info("Loaded palette " + palette.getID());
});
List<StructureTemplate> structureTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "structures/single").toPath()), StructureTemplate::new);
structureTemplates.forEach(structure -> {

View File

@@ -0,0 +1,27 @@
package com.dfsek.terra.config.factories;
import com.dfsek.terra.biome.palette.PaletteLayer;
import com.dfsek.terra.config.templates.PaletteTemplate;
import org.bukkit.block.data.BlockData;
import org.polydev.gaea.math.FastNoiseLite;
import org.polydev.gaea.util.FastRandom;
import org.polydev.gaea.world.palette.Palette;
import org.polydev.gaea.world.palette.RandomPalette;
import org.polydev.gaea.world.palette.SimplexPalette;
public class PaletteFactory implements TerraFactory<PaletteTemplate, Palette<BlockData>> {
@Override
public Palette<BlockData> build(PaletteTemplate config) {
Palette<BlockData> palette;
if(config.isSimplex()) {
FastNoiseLite noise = new FastNoiseLite((int) config.getSeed());
noise.setFrequency(config.getFrequency());
palette = new SimplexPalette<>(noise);
} else palette = new RandomPalette<>(new FastRandom(config.getSeed()));
for(PaletteLayer layer : config.getPalette()) {
palette.add(layer.getLayer(), layer.getSize());
}
return palette;
}
}

View File

@@ -20,7 +20,7 @@ public class PaletteHolderLoader implements TypeLoader<PaletteHolder> {
PaletteHolderBuilder builder = new PaletteHolderBuilder();
for(Map<String, Integer> layer : palette) {
for(Map.Entry<String, Integer> entry : layer.entrySet()) {
builder.add(entry.getValue(), (Palette<BlockData>) configLoader.loadType(Types.BLOCK_DATA_PALETTE, entry.getKey()));
builder.add(entry.getValue(), (Palette<BlockData>) configLoader.loadType(Types.BLOCK_DATA_PALETTE_TYPE, entry.getKey()));
}
}
return builder.build();

View File

@@ -0,0 +1,21 @@
package com.dfsek.terra.config.loaders;
import com.dfsek.tectonic.exception.LoadException;
import com.dfsek.tectonic.loading.ConfigLoader;
import com.dfsek.tectonic.loading.TypeLoader;
import com.dfsek.terra.biome.palette.PaletteLayer;
import org.bukkit.block.data.BlockData;
import org.polydev.gaea.math.ProbabilityCollection;
import java.lang.reflect.Type;
import java.util.Map;
@SuppressWarnings("unchecked")
public class PaletteLayerLoader implements TypeLoader<PaletteLayer> {
@Override
public PaletteLayer load(Type type, Object o, ConfigLoader configLoader) throws LoadException {
Map<String, Object> map = (Map<String, Object>) o;
ProbabilityCollection<BlockData> collection = (ProbabilityCollection<BlockData>) configLoader.loadType(Types.BLOCK_DATA_PROBABILITY_COLLECTION_TYPE, map.get("materials"));
return new PaletteLayer(collection, (Integer) map.get("layers"));
}
}

View File

@@ -7,21 +7,33 @@ import org.polydev.gaea.math.ProbabilityCollection;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
@SuppressWarnings("unchecked")
public class ProbabilityCollectionLoader implements TypeLoader<ProbabilityCollection<Object>> {
@Override
public ProbabilityCollection<Object> load(Type type, Object o, ConfigLoader configLoader) throws LoadException {
Map<Object, Integer> map = (Map<Object, Integer>) o;
ProbabilityCollection<Object> collection = new ProbabilityCollection<>();
if(type instanceof ParameterizedType) {
ParameterizedType pType = (ParameterizedType) type;
Type generic = pType.getActualTypeArguments()[0];
for(Map.Entry<Object, Integer> entry : map.entrySet()) {
collection.add(configLoader.loadType(generic, entry.getKey()), entry.getValue());
}
if(o instanceof Map) {
Map<Object, Integer> map = (Map<Object, Integer>) o;
for(Map.Entry<Object, Integer> entry : map.entrySet()) {
collection.add(configLoader.loadType(generic, entry.getKey()), entry.getValue());
}
} else if(o instanceof List) {
List<Map<Object, Integer>> map = (List<Map<Object, Integer>>) o;
for(Map<Object, Integer> l : map) {
for(Map.Entry<Object, Integer> entry : l.entrySet()) {
collection.add(configLoader.loadType(generic, entry.getKey()), entry.getValue());
}
}
} else throw new LoadException("Malformed Probability Collection: " + o);
} else throw new LoadException("Unable to load config! Could not retrieve parameterized type: " + type);

View File

@@ -15,17 +15,20 @@ import java.util.Set;
public final class Types {
public static final Type MATERIAL_SET_TYPE;
public static final Type MATERIAL_PROBABILITY_COLLECTION_TYPE;
public static final Type BLOCK_DATA_PALETTE;
public static final Type BLOCK_DATA_PALETTE_TYPE;
public static final Type BLOCK_DATA_PROBABILITY_COLLECTION_TYPE;
static {
MATERIAL_SET_TYPE = getType("materialSet");
MATERIAL_PROBABILITY_COLLECTION_TYPE = getType("materialProbabilityCollection");
BLOCK_DATA_PALETTE = getType("blockDataPalette");
BLOCK_DATA_PALETTE_TYPE = getType("blockDataPalette");
BLOCK_DATA_PROBABILITY_COLLECTION_TYPE = getType("blockDataProbabilityCollection");
}
private Set<Material> materialSet;
private Palette<BlockData> blockDataPalette;
private ProbabilityCollection<Material> materialProbabilityCollection;
private ProbabilityCollection<BlockData> blockDataProbabilityCollection;
private static Type getType(String dummyFieldName) {
try {

View File

@@ -4,17 +4,18 @@ import com.dfsek.tectonic.annotations.Abstractable;
import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Value;
import com.dfsek.tectonic.config.ConfigTemplate;
import org.bukkit.block.data.BlockData;
import org.polydev.gaea.world.palette.Palette;
import com.dfsek.terra.biome.palette.PaletteLayer;
import java.util.List;
@SuppressWarnings({"FieldMayBeFinal", "unused"})
public class PaletteTemplate implements ConfigTemplate {
@Value("id")
private String id;
@Value("palette")
@Value("layers")
@Abstractable
private Palette<BlockData> palette;
private List<PaletteLayer> palette;
@Value("simplex")
@Abstractable
@@ -31,7 +32,7 @@ public class PaletteTemplate implements ConfigTemplate {
@Default
private long seed = 0;
public String getId() {
public String getID() {
return id;
}
@@ -43,7 +44,11 @@ public class PaletteTemplate implements ConfigTemplate {
return seed;
}
public Palette<BlockData> getPalette() {
public List<PaletteLayer> getPalette() {
return palette;
}
public boolean isSimplex() {
return simplex;
}
}

View File

@@ -1,14 +1,23 @@
package com.dfsek.terra.registry;
import com.dfsek.tectonic.loading.ConfigLoader;
import com.dfsek.tectonic.loading.TypeLoader;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
public abstract class TerraRegistry<T> {
public abstract class TerraRegistry<T> implements TypeLoader<T> {
private final Map<String, T> objects = new HashMap<>();
@Override
public T load(Type type, Object o, ConfigLoader configLoader) {
return get((String) o);
}
/**
* Add an object to the registry with a name.
*