diff --git a/src/main/java/com/dfsek/terra/config/loaders/config/OreHolderLoader.java b/src/main/java/com/dfsek/terra/config/loaders/config/OreHolderLoader.java new file mode 100644 index 000000000..859d3c467 --- /dev/null +++ b/src/main/java/com/dfsek/terra/config/loaders/config/OreHolderLoader.java @@ -0,0 +1,26 @@ +package com.dfsek.terra.config.loaders.config; + +import com.dfsek.tectonic.exception.LoadException; +import com.dfsek.tectonic.loading.ConfigLoader; +import com.dfsek.tectonic.loading.TypeLoader; +import com.dfsek.terra.generation.items.ores.Ore; +import com.dfsek.terra.generation.items.ores.OreConfig; +import com.dfsek.terra.generation.items.ores.OreHolder; + +import java.lang.reflect.Type; +import java.util.Map; + +@SuppressWarnings("unchecked") +public class OreHolderLoader implements TypeLoader { + @Override + public OreHolder load(Type type, Object o, ConfigLoader configLoader) throws LoadException { + OreHolder holder = new OreHolder(); + Map map = (Map) o; + + for(Map.Entry entry : map.entrySet()) { + holder.add((Ore) configLoader.loadType(Ore.class, entry.getKey()), (OreConfig) configLoader.loadType(OreConfig.class, entry.getValue())); + } + + return holder; + } +} 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 cf24bae4d..8a369b04d 100644 --- a/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java +++ b/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java @@ -11,8 +11,7 @@ import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.generation.items.TerraStructure; import com.dfsek.terra.generation.items.flora.FloraLayer; -import com.dfsek.terra.generation.items.ores.Ore; -import com.dfsek.terra.generation.items.ores.OreConfig; +import com.dfsek.terra.generation.items.ores.OreHolder; import com.dfsek.terra.generation.items.tree.TreeLayer; import com.dfsek.terra.math.BlankFunction; import org.bukkit.Material; @@ -62,7 +61,7 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf @Value("ores") @Abstractable @Default - private Map ores = new HashMap<>(); + private OreHolder oreHolder = new OreHolder(); @Value("ocean.level") @Abstractable @Default @@ -192,8 +191,8 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf return noiseEquation; } - public Map getOres() { - return ores; + public OreHolder getOreHolder() { + return oreHolder; } @Override diff --git a/src/main/java/com/dfsek/terra/generation/items/ores/OreHolder.java b/src/main/java/com/dfsek/terra/generation/items/ores/OreHolder.java new file mode 100644 index 000000000..fde4fb7ab --- /dev/null +++ b/src/main/java/com/dfsek/terra/generation/items/ores/OreHolder.java @@ -0,0 +1,40 @@ +package com.dfsek.terra.generation.items.ores; + +import org.polydev.gaea.util.GlueList; + +import java.util.List; +import java.util.function.BiConsumer; + +/** + * Holds ordered list of ores mapped to their configs. + */ +public class OreHolder { + private final List entries = new GlueList<>(); + + public void forEach(BiConsumer consumer) { + entries.forEach(entry -> consumer.accept(entry.getOre(), entry.getConfig())); + } + + public OreHolder add(Ore ore, OreConfig config) { + entries.add(new Entry(ore, config)); + return this; + } + + private static final class Entry { + private final Ore ore; + private final OreConfig config; + + private Entry(Ore ore, OreConfig config) { + this.ore = ore; + this.config = config; + } + + public OreConfig getConfig() { + return config; + } + + public Ore getOre() { + return ore; + } + } +} diff --git a/src/main/java/com/dfsek/terra/population/OrePopulator.java b/src/main/java/com/dfsek/terra/population/OrePopulator.java index 6d2cc93d3..5590241f2 100644 --- a/src/main/java/com/dfsek/terra/population/OrePopulator.java +++ b/src/main/java/com/dfsek/terra/population/OrePopulator.java @@ -10,28 +10,33 @@ import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import org.polydev.gaea.biome.Biome; import org.polydev.gaea.generation.GenerationPhase; +import org.polydev.gaea.math.MathUtil; import org.polydev.gaea.population.GaeaBlockPopulator; import org.polydev.gaea.profiler.ProfileFuture; +import org.polydev.gaea.util.FastRandom; import java.util.Random; public class OrePopulator extends GaeaBlockPopulator { @SuppressWarnings("try") @Override - public void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk chunk) { + public void populate(@NotNull World world, @NotNull Random r, @NotNull Chunk chunk) { try(ProfileFuture ignored = TerraProfiler.fromWorld(world).measure("OreTime")) { TerraWorld tw = TerraWorld.getWorld(world); if(!tw.isSafe()) return; for(int cx = -1; cx <= 1; cx++) { for(int cz = -1; cz <= 1; cz++) { + Random random = new FastRandom(MathUtil.getCarverChunkSeed(chunk.getX() + cx, chunk.getZ() + cz, world.getSeed())); int originX = ((chunk.getX() + cx) << 4); int originZ = ((chunk.getZ() + cz) << 4); Biome b = TerraWorld.getWorld(world).getGrid().getBiome(originX + 8, originZ + 8, GenerationPhase.POPULATE); BiomeTemplate config = ((UserDefinedBiome) b).getConfig(); - config.getOres().forEach((ore, oreConfig) -> { + int finalCx = cx; + int finalCz = cz; + config.getOreHolder().forEach((ore, oreConfig) -> { int amount = oreConfig.getAmount().get(random); for(int i = 0; i < amount; i++) { - Vector location = new Vector(random.nextInt(16), oreConfig.getHeight().get(random), random.nextInt(16)); + Vector location = new Vector(random.nextInt(16) + 16 * finalCx, oreConfig.getHeight().get(random), random.nextInt(16) + 16 * finalCz); ore.generate(location, chunk, random); } }); diff --git a/src/main/java/com/dfsek/terra/util/ConfigUtil.java b/src/main/java/com/dfsek/terra/util/ConfigUtil.java index 9adf44629..6c225bb4d 100644 --- a/src/main/java/com/dfsek/terra/util/ConfigUtil.java +++ b/src/main/java/com/dfsek/terra/util/ConfigUtil.java @@ -11,6 +11,7 @@ import com.dfsek.terra.config.loaders.config.FloraLayerLoader; import com.dfsek.terra.config.loaders.config.GridSpawnLoader; import com.dfsek.terra.config.loaders.config.NoiseBuilderLoader; import com.dfsek.terra.config.loaders.config.OreConfigLoader; +import com.dfsek.terra.config.loaders.config.OreHolderLoader; import com.dfsek.terra.config.loaders.config.TreeLayerLoader; import com.dfsek.terra.config.loaders.palette.CarverPaletteLoader; import com.dfsek.terra.config.loaders.palette.PaletteHolderLoader; @@ -20,6 +21,7 @@ import com.dfsek.terra.generation.items.flora.FloraLayer; import com.dfsek.terra.generation.items.flora.TerraFlora; import com.dfsek.terra.generation.items.ores.Ore; import com.dfsek.terra.generation.items.ores.OreConfig; +import com.dfsek.terra.generation.items.ores.OreHolder; import com.dfsek.terra.generation.items.tree.TreeLayer; import com.dfsek.terra.procgen.GridSpawn; import org.bukkit.Bukkit; @@ -51,6 +53,7 @@ public final class ConfigUtil { .registerLoader(NoiseBuilder.class, new NoiseBuilderLoader()) .registerLoader(TreeLayer.class, new TreeLayerLoader()) .registerLoader(MaterialSet.class, new MaterialSetLoader()) + .registerLoader(OreHolder.class, new OreHolderLoader()) .registerLoader(TerraFlora.Search.class, (t, o, l) -> TerraFlora.Search.valueOf((String) o)); } }