From 013216ad8c8d0244212fcb42509df4b534f13dba Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 26 Nov 2020 22:05:18 -0700 Subject: [PATCH] Registries are pretty cool, I guess --- .../com/dfsek/terra/biome/PaletteHolder.java | 10 ----- .../terra/biome/palette/PaletteHolder.java | 16 +++++++ .../biome/palette/PaletteHolderBuilder.java | 33 ++++++++++++++ .../dfsek/terra/config/base/ConfigPack.java | 44 ++++++++++--------- .../config/builder/GeneratorBuilder.java | 2 +- .../config/loaders/PaletteHolderLoader.java | 28 ++++++++++++ .../com/dfsek/terra/config/loaders/Types.java | 5 +++ .../terra/config/templates/BiomeTemplate.java | 2 +- .../generation/config/WorldGenerator.java | 2 +- .../terra/registry/BiomeGridRegistry.java | 6 +++ .../dfsek/terra/registry/BiomeRegistry.java | 6 +++ .../dfsek/terra/registry/CarverRegistry.java | 6 +++ .../dfsek/terra/registry/PaletteRegistry.java | 8 ++++ .../terra/registry/StructureRegistry.java | 6 +++ .../dfsek/terra/registry/TerraRegistry.java | 11 +++++ 15 files changed, 152 insertions(+), 33 deletions(-) delete mode 100644 src/main/java/com/dfsek/terra/biome/PaletteHolder.java create mode 100644 src/main/java/com/dfsek/terra/biome/palette/PaletteHolder.java create mode 100644 src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java create mode 100644 src/main/java/com/dfsek/terra/config/loaders/PaletteHolderLoader.java create mode 100644 src/main/java/com/dfsek/terra/registry/BiomeGridRegistry.java create mode 100644 src/main/java/com/dfsek/terra/registry/BiomeRegistry.java create mode 100644 src/main/java/com/dfsek/terra/registry/CarverRegistry.java create mode 100644 src/main/java/com/dfsek/terra/registry/PaletteRegistry.java create mode 100644 src/main/java/com/dfsek/terra/registry/StructureRegistry.java diff --git a/src/main/java/com/dfsek/terra/biome/PaletteHolder.java b/src/main/java/com/dfsek/terra/biome/PaletteHolder.java deleted file mode 100644 index 2625bd506..000000000 --- a/src/main/java/com/dfsek/terra/biome/PaletteHolder.java +++ /dev/null @@ -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 getPalette(int y) { - return null; // TODO: implementation - } -} diff --git a/src/main/java/com/dfsek/terra/biome/palette/PaletteHolder.java b/src/main/java/com/dfsek/terra/biome/palette/PaletteHolder.java new file mode 100644 index 000000000..3dd6cf88d --- /dev/null +++ b/src/main/java/com/dfsek/terra/biome/palette/PaletteHolder.java @@ -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[] palettes; + + protected PaletteHolder(Palette[] palettes) { + this.palettes = palettes; + } + + public Palette getPalette(int y) { + return palettes[y]; + } +} diff --git a/src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java b/src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java new file mode 100644 index 000000000..940226076 --- /dev/null +++ b/src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java @@ -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> paletteMap = new TreeMap<>(); + + public PaletteHolderBuilder add(int y, Palette palette) { + paletteMap.put(y, palette); + return this; + } + + @SuppressWarnings("unchecked") + public PaletteHolder build() { + Palette[] palettes = new Palette[paletteMap.lastKey() + 1]; + for(int y = 0; y <= paletteMap.lastKey(); y++) { + Palette d = DataUtil.BLANK_PALETTE; + for(Map.Entry> e : paletteMap.entrySet()) { + if(e.getKey() >= y) { + d = e.getValue(); + break; + } + } + palettes[y] = d; + } + return new PaletteHolder(palettes); + } +} diff --git a/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index 61dd4fd03..726763a67 100644 --- a/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -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 biomes = new HashMap<>(); - private final Map biomeGrids = new HashMap<>(); - private final Map structures = new HashMap<>(); - private final Map 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 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 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 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 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 getBiomeIDs() { List 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 getStructures() { - return new HashSet<>(structures.values()); + return structureRegistry.entries(); } public Collection getCarvers() { - return carvers.values(); + return carverRegistry.entries(); } public UserDefinedCarver getCarver(String id) { - return carvers.get(id); + return carverRegistry.get(id); } public List getStructureIDs() { List ids = new ArrayList<>(); - structures.forEach((id, structure) -> ids.add(id)); + structureRegistry.forEach(structure -> ids.add(structure.getID())); return ids; } diff --git a/src/main/java/com/dfsek/terra/config/builder/GeneratorBuilder.java b/src/main/java/com/dfsek/terra/config/builder/GeneratorBuilder.java index a6b045787..ff292e82a 100644 --- a/src/main/java/com/dfsek/terra/config/builder/GeneratorBuilder.java +++ b/src/main/java/com/dfsek/terra/config/builder/GeneratorBuilder.java @@ -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; diff --git a/src/main/java/com/dfsek/terra/config/loaders/PaletteHolderLoader.java b/src/main/java/com/dfsek/terra/config/loaders/PaletteHolderLoader.java new file mode 100644 index 000000000..a9722bbca --- /dev/null +++ b/src/main/java/com/dfsek/terra/config/loaders/PaletteHolderLoader.java @@ -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 { + @Override + public PaletteHolder load(Type type, Object o, ConfigLoader configLoader) throws LoadException { + List> palette = (List>) o; + PaletteHolderBuilder builder = new PaletteHolderBuilder(); + for(Map layer : palette) { + for(Map.Entry entry : layer.entrySet()) { + builder.add(entry.getValue(), (Palette) configLoader.loadType(Types.BLOCK_DATA_PALETTE, entry.getKey())); + } + } + return builder.build(); + } +} diff --git a/src/main/java/com/dfsek/terra/config/loaders/Types.java b/src/main/java/com/dfsek/terra/config/loaders/Types.java index 6c408847c..8140ae526 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/Types.java +++ b/src/main/java/com/dfsek/terra/config/loaders/Types.java @@ -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 materialSet; + private Palette blockDataPalette; private ProbabilityCollection materialProbabilityCollection; private static Type getType(String dummyFieldName) { diff --git a/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java b/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java index d03e37d2a..44eb98bde 100644 --- a/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java +++ b/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java @@ -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; diff --git a/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java b/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java index 3d9f1d85e..287157921 100644 --- a/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java +++ b/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java @@ -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; diff --git a/src/main/java/com/dfsek/terra/registry/BiomeGridRegistry.java b/src/main/java/com/dfsek/terra/registry/BiomeGridRegistry.java new file mode 100644 index 000000000..f83192979 --- /dev/null +++ b/src/main/java/com/dfsek/terra/registry/BiomeGridRegistry.java @@ -0,0 +1,6 @@ +package com.dfsek.terra.registry; + +import com.dfsek.terra.config.builder.BiomeGridBuilder; + +public class BiomeGridRegistry extends TerraRegistry { +} diff --git a/src/main/java/com/dfsek/terra/registry/BiomeRegistry.java b/src/main/java/com/dfsek/terra/registry/BiomeRegistry.java new file mode 100644 index 000000000..66c59dc3c --- /dev/null +++ b/src/main/java/com/dfsek/terra/registry/BiomeRegistry.java @@ -0,0 +1,6 @@ +package com.dfsek.terra.registry; + +import com.dfsek.terra.biome.UserDefinedBiome; + +public class BiomeRegistry extends TerraRegistry { +} diff --git a/src/main/java/com/dfsek/terra/registry/CarverRegistry.java b/src/main/java/com/dfsek/terra/registry/CarverRegistry.java new file mode 100644 index 000000000..8de7fa2da --- /dev/null +++ b/src/main/java/com/dfsek/terra/registry/CarverRegistry.java @@ -0,0 +1,6 @@ +package com.dfsek.terra.registry; + +import com.dfsek.terra.carving.UserDefinedCarver; + +public class CarverRegistry extends TerraRegistry { +} diff --git a/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java b/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java new file mode 100644 index 000000000..13c380214 --- /dev/null +++ b/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java @@ -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> { + +} diff --git a/src/main/java/com/dfsek/terra/registry/StructureRegistry.java b/src/main/java/com/dfsek/terra/registry/StructureRegistry.java new file mode 100644 index 000000000..570989960 --- /dev/null +++ b/src/main/java/com/dfsek/terra/registry/StructureRegistry.java @@ -0,0 +1,6 @@ +package com.dfsek.terra.registry; + +import com.dfsek.terra.config.templates.StructureTemplate; + +public class StructureRegistry extends TerraRegistry { +} diff --git a/src/main/java/com/dfsek/terra/registry/TerraRegistry.java b/src/main/java/com/dfsek/terra/registry/TerraRegistry.java index d52a71b10..37e4bc742 100644 --- a/src/main/java/com/dfsek/terra/registry/TerraRegistry.java +++ b/src/main/java/com/dfsek/terra/registry/TerraRegistry.java @@ -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 { private final Map objects = new HashMap<>(); @@ -38,4 +41,12 @@ public abstract class TerraRegistry { public T get(String id) { return objects.get(id); } + + public void forEach(Consumer consumer) { + objects.forEach((id, obj) -> consumer.accept(obj)); + } + + public Set entries() { + return new HashSet<>(objects.values()); + } }