Registries are pretty cool, I guess

This commit is contained in:
dfsek
2020-11-26 22:05:18 -07:00
parent 16d8d56832
commit 013216ad8c
15 changed files with 152 additions and 33 deletions

View File

@@ -1,10 +0,0 @@
package com.dfsek.terra.biome;
import org.bukkit.block.data.BlockData;
import org.polydev.gaea.world.palette.Palette;
public class PaletteHolder {
public Palette<BlockData> getPalette(int y) {
return null; // TODO: implementation
}
}

View File

@@ -0,0 +1,16 @@
package com.dfsek.terra.biome.palette;
import org.bukkit.block.data.BlockData;
import org.polydev.gaea.world.palette.Palette;
public class PaletteHolder {
private final Palette<BlockData>[] palettes;
protected PaletteHolder(Palette<BlockData>[] palettes) {
this.palettes = palettes;
}
public Palette<BlockData> getPalette(int y) {
return palettes[y];
}
}

View File

@@ -0,0 +1,33 @@
package com.dfsek.terra.biome.palette;
import com.dfsek.terra.util.DataUtil;
import org.bukkit.block.data.BlockData;
import org.polydev.gaea.world.palette.Palette;
import java.util.Map;
import java.util.TreeMap;
public class PaletteHolderBuilder {
private final TreeMap<Integer, Palette<BlockData>> paletteMap = new TreeMap<>();
public PaletteHolderBuilder add(int y, Palette<BlockData> palette) {
paletteMap.put(y, palette);
return this;
}
@SuppressWarnings("unchecked")
public PaletteHolder build() {
Palette<BlockData>[] palettes = new Palette[paletteMap.lastKey() + 1];
for(int y = 0; y <= paletteMap.lastKey(); y++) {
Palette<BlockData> d = DataUtil.BLANK_PALETTE;
for(Map.Entry<Integer, Palette<BlockData>> e : paletteMap.entrySet()) {
if(e.getKey() >= y) {
d = e.getValue();
break;
}
}
palettes[y] = d;
}
return new PaletteHolder(palettes);
}
}

View File

@@ -5,6 +5,7 @@ import com.dfsek.tectonic.exception.ConfigException;
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.carving.CarverPalette;
import com.dfsek.terra.carving.UserDefinedCarver;
import com.dfsek.terra.config.builder.BiomeGridBuilder;
@@ -15,6 +16,7 @@ import com.dfsek.terra.config.factories.CarverFactory;
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.ProbabilityCollectionLoader;
import com.dfsek.terra.config.loaders.RangeLoader;
import com.dfsek.terra.config.loaders.base.CarverPaletteLoader;
@@ -24,6 +26,10 @@ import com.dfsek.terra.config.templates.CarverTemplate;
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.StructureRegistry;
import com.dfsek.terra.util.ConfigUtil;
import org.polydev.gaea.math.ProbabilityCollection;
import org.polydev.gaea.math.Range;
@@ -33,10 +39,7 @@ import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
@@ -45,10 +48,10 @@ import java.util.logging.Level;
*/
public class ConfigPack {
private final ConfigPackTemplate template = new ConfigPackTemplate();
private final Map<String, UserDefinedBiome> biomes = new HashMap<>();
private final Map<String, BiomeGridBuilder> biomeGrids = new HashMap<>();
private final Map<String, StructureTemplate> structures = new HashMap<>();
private final Map<String, UserDefinedCarver> carvers = new HashMap<>();
private final BiomeRegistry biomeRegistry = new BiomeRegistry();
private final BiomeGridRegistry biomeGridRegistry = new BiomeGridRegistry();
private final StructureRegistry structureRegistry = new StructureRegistry();
private final CarverRegistry carverRegistry = new CarverRegistry();
public ConfigPack(File folder) throws ConfigException {
@@ -69,32 +72,33 @@ public class ConfigPack {
abstractConfigLoader.registerLoader(ProbabilityCollection.class, new ProbabilityCollectionLoader())
.registerLoader(Range.class, new RangeLoader())
.registerLoader(CarverPalette.class, new CarverPaletteLoader())
.registerLoader(GridSpawn.class, new GridSpawnLoader());
.registerLoader(GridSpawn.class, new GridSpawnLoader())
.registerLoader(PaletteHolder.class, new PaletteHolderLoader());
List<StructureTemplate> structureTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "structures/single").toPath()), StructureTemplate::new);
structureTemplates.forEach(structure -> {
structures.put(structure.getID(), structure);
structureRegistry.add(structure.getID(), structure);
Debug.info("Loaded structure " + structure.getID());
});
List<CarverTemplate> carverTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "carving").toPath()), CarverTemplate::new);
CarverFactory carverFactory = new CarverFactory();
carverTemplates.forEach(carver -> {
carvers.put(carver.getID(), carverFactory.build(carver));
carverRegistry.add(carver.getID(), carverFactory.build(carver));
Debug.info("Loaded carver " + carver.getID());
});
List<BiomeTemplate> biomeTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "biomes").toPath()), () -> new BiomeTemplate(this));
BiomeFactory biomeFactory = new BiomeFactory();
biomeTemplates.forEach(biome -> {
biomes.put(biome.getID(), biomeFactory.build(biome));
biomeRegistry.add(biome.getID(), biomeFactory.build(biome));
Debug.info("Loaded biome " + biome.getID());
});
List<BiomeGridTemplate> biomeGridTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "grids").toPath()), BiomeGridTemplate::new);
BiomeGridFactory biomeGridFactory = new BiomeGridFactory();
biomeGridTemplates.forEach(grid -> {
biomeGrids.put(grid.getID(), biomeGridFactory.build(grid));
biomeGridRegistry.add(grid.getID(), biomeGridFactory.build(grid));
Debug.info("Loaded BiomeGrid " + grid.getID());
});
@@ -102,38 +106,38 @@ public class ConfigPack {
}
public UserDefinedBiome getBiome(String id) {
return biomes.get(id);
return biomeRegistry.get(id);
}
public BiomeGridBuilder getBiomeGrid(String id) {
return biomeGrids.get(id);
return biomeGridRegistry.get(id);
}
public List<String> getBiomeIDs() {
List<String> biomeIDs = new ArrayList<>();
biomes.forEach((id, biome) -> biomeIDs.add(id));
biomeRegistry.forEach(biome -> biomeIDs.add(biome.getID()));
return biomeIDs;
}
public StructureTemplate getStructure(String id) {
return structures.get(id);
return structureRegistry.get(id);
}
public Set<StructureTemplate> getStructures() {
return new HashSet<>(structures.values());
return structureRegistry.entries();
}
public Collection<UserDefinedCarver> getCarvers() {
return carvers.values();
return carverRegistry.entries();
}
public UserDefinedCarver getCarver(String id) {
return carvers.get(id);
return carverRegistry.get(id);
}
public List<String> getStructureIDs() {
List<String> ids = new ArrayList<>();
structures.forEach((id, structure) -> ids.add(id));
structureRegistry.forEach(structure -> ids.add(structure.getID()));
return ids;
}

View File

@@ -1,6 +1,6 @@
package com.dfsek.terra.config.builder;
import com.dfsek.terra.biome.PaletteHolder;
import com.dfsek.terra.biome.palette.PaletteHolder;
import com.dfsek.terra.generation.config.NoiseBuilder;
import com.dfsek.terra.generation.config.WorldGenerator;
import parsii.eval.Scope;

View File

@@ -0,0 +1,28 @@
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.PaletteHolder;
import com.dfsek.terra.biome.palette.PaletteHolderBuilder;
import org.bukkit.block.data.BlockData;
import org.polydev.gaea.world.palette.Palette;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
@SuppressWarnings("unchecked")
public class PaletteHolderLoader implements TypeLoader<PaletteHolder> {
@Override
public PaletteHolder load(Type type, Object o, ConfigLoader configLoader) throws LoadException {
List<Map<String, Integer>> palette = (List<Map<String, Integer>>) o;
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()));
}
}
return builder.build();
}
}

View File

@@ -1,7 +1,9 @@
package com.dfsek.terra.config.loaders;
import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
import org.polydev.gaea.math.ProbabilityCollection;
import org.polydev.gaea.world.palette.Palette;
import java.lang.reflect.Type;
import java.util.Set;
@@ -13,13 +15,16 @@ 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;
static {
MATERIAL_SET_TYPE = getType("materialSet");
MATERIAL_PROBABILITY_COLLECTION_TYPE = getType("materialProbabilityCollection");
BLOCK_DATA_PALETTE = getType("blockDataPalette");
}
private Set<Material> materialSet;
private Palette<BlockData> blockDataPalette;
private ProbabilityCollection<Material> materialProbabilityCollection;
private static Type getType(String dummyFieldName) {

View File

@@ -4,7 +4,7 @@ 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 com.dfsek.terra.biome.PaletteHolder;
import com.dfsek.terra.biome.palette.PaletteHolder;
import com.dfsek.terra.carving.UserDefinedCarver;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.generation.items.ores.Ore;

View File

@@ -1,6 +1,6 @@
package com.dfsek.terra.generation.config;
import com.dfsek.terra.biome.PaletteHolder;
import com.dfsek.terra.biome.palette.PaletteHolder;
import com.dfsek.terra.math.NoiseFunction2;
import com.dfsek.terra.math.NoiseFunction3;
import com.dfsek.terra.math.RandomFunction;

View File

@@ -0,0 +1,6 @@
package com.dfsek.terra.registry;
import com.dfsek.terra.config.builder.BiomeGridBuilder;
public class BiomeGridRegistry extends TerraRegistry<BiomeGridBuilder> {
}

View File

@@ -0,0 +1,6 @@
package com.dfsek.terra.registry;
import com.dfsek.terra.biome.UserDefinedBiome;
public class BiomeRegistry extends TerraRegistry<UserDefinedBiome> {
}

View File

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

View File

@@ -0,0 +1,8 @@
package com.dfsek.terra.registry;
import org.bukkit.block.data.BlockData;
import org.polydev.gaea.world.palette.Palette;
public class PaletteRegistry extends TerraRegistry<Palette<BlockData>> {
}

View File

@@ -0,0 +1,6 @@
package com.dfsek.terra.registry;
import com.dfsek.terra.config.templates.StructureTemplate;
public class StructureRegistry extends TerraRegistry<StructureTemplate> {
}

View File

@@ -1,7 +1,10 @@
package com.dfsek.terra.registry;
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> {
private final Map<String, T> objects = new HashMap<>();
@@ -38,4 +41,12 @@ public abstract class TerraRegistry<T> {
public T get(String id) {
return objects.get(id);
}
public void forEach(Consumer<T> consumer) {
objects.forEach((id, obj) -> consumer.accept(obj));
}
public Set<T> entries() {
return new HashSet<>(objects.values());
}
}