diff --git a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java index 965c33181..75d84cad0 100644 --- a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java @@ -51,6 +51,11 @@ public class ImageBiomeProvider implements BiomeProvider { })); } + @Override + public Iterable getBiomes() { + return colorBiomeMap.values(); + } + public enum Align { CENTER { @Override diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipeline.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipeline.java index 36192f267..a09f36346 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipeline.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipeline.java @@ -8,6 +8,7 @@ package com.dfsek.terra.addons.biome.pipeline; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder; @@ -44,6 +45,14 @@ public class BiomePipeline { return holder; } + public BiomeSource getSource() { + return source; + } + + public List getStages() { + return Collections.unmodifiableList(stages); + } + public int getSize() { return size; } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineProvider.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineProvider.java index 278c0c137..a76193358 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineProvider.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineProvider.java @@ -7,6 +7,8 @@ package com.dfsek.terra.addons.biome.pipeline; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; + import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; @@ -19,6 +21,9 @@ import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import java.util.HashSet; +import java.util.Set; + public class BiomePipelineProvider implements BiomeProvider { private final LoadingCache holderCache; @@ -60,6 +65,17 @@ public class BiomePipelineProvider implements BiomeProvider { z - fdZ * pipeline.getSize()); } + @Override + public Iterable getBiomes() { + Set biomeSet = new HashSet<>(); + pipeline.getSource().getBiomes().forEach(biomeSet::add); + Iterable result = biomeSet; + for(Stage stage : pipeline.getStages()) { + result = stage.getBiomes(result); // pass through all stages + } + return result; + } + private static final class SeededVector { private final int x; private final int z; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeMutator.java index 5b0f3260f..9ad856e19 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeMutator.java @@ -13,6 +13,10 @@ import com.dfsek.terra.api.world.biome.TerraBiome; public interface BiomeMutator { TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed); + default Iterable getBiomes(Iterable biomes) { + return biomes; + } + class ViewPoint { private final BiomeHolder biomes; private final int offX; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Stage.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Stage.java index 0e3d9eba5..bd00ac420 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Stage.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Stage.java @@ -7,9 +7,13 @@ package com.dfsek.terra.addons.biome.pipeline.api; +import com.dfsek.terra.api.world.biome.TerraBiome; + + public interface Stage { BiomeHolder apply(BiomeHolder in, long seed); boolean isExpansion(); + Iterable getBiomes(Iterable biomes); } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderListMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderListMutator.java index c2d966f04..21f3a542e 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderListMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderListMutator.java @@ -7,7 +7,10 @@ package com.dfsek.terra.addons.biome.pipeline.mutator; +import java.util.HashSet; import java.util.Map; +import java.util.Objects; +import java.util.Set; import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator; import com.dfsek.terra.api.noise.NoiseSampler; @@ -53,4 +56,13 @@ public class BorderListMutator implements BiomeMutator { } return origin; } + + @Override + public Iterable getBiomes(Iterable biomes) { + Set biomeSet = new HashSet<>(); + biomes.forEach(biomeSet::add); + biomeSet.addAll(replaceDefault.getContents().stream().filter(Objects::nonNull).toList()); + replace.forEach((biome, collection) -> biomeSet.addAll(collection.getContents())); + return biomeSet; + } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderMutator.java index 9035e7364..974089e48 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderMutator.java @@ -12,6 +12,10 @@ import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.world.biome.TerraBiome; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + public class BorderMutator implements BiomeMutator { private final String border; @@ -44,4 +48,12 @@ public class BorderMutator implements BiomeMutator { } return origin; } + + @Override + public Iterable getBiomes(Iterable biomes) { + Set biomeSet = new HashSet<>(); + biomes.forEach(biomeSet::add); + biomeSet.addAll(replace.getContents().stream().filter(Objects::nonNull).toList()); + return biomeSet; + } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceListMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceListMutator.java index 4cf56f313..7d34f72a1 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceListMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceListMutator.java @@ -7,7 +7,10 @@ package com.dfsek.terra.addons.biome.pipeline.mutator; +import java.util.HashSet; import java.util.Map; +import java.util.Set; +import java.util.stream.Stream; import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator; import com.dfsek.terra.api.noise.NoiseSampler; @@ -42,4 +45,30 @@ public class ReplaceListMutator implements BiomeMutator { } return center; } + + @Override + public Iterable getBiomes(Iterable biomes) { + Set biomeSet = new HashSet<>(); + + Set reject = new HashSet<>(); + + biomes.forEach(biome -> { + if(!biome.getTags().contains(defaultTag) && !replace.containsKey(biome)) { + biomeSet.add(biome); + } else { + reject.add(biome); + } + }); + biomeSet.addAll(replaceDefault.getContents().stream().flatMap(terraBiome -> { + if(terraBiome == null) return reject.stream(); + return Stream.of(terraBiome); + }).toList()); + replace.forEach((biome, collection) -> { + biomeSet.addAll(collection.getContents().stream().map(terraBiome -> { + if(terraBiome == null) return biome; + return terraBiome; + }).toList()); + }); + return biomeSet; + } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceMutator.java index 5ea4de791..69bfea162 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceMutator.java @@ -12,6 +12,10 @@ import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.world.biome.TerraBiome; +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Stream; + public class ReplaceMutator implements BiomeMutator { private final String replaceableTag; @@ -32,4 +36,22 @@ public class ReplaceMutator implements BiomeMutator { } return viewPoint.getBiome(0, 0); } + + @Override + public Iterable getBiomes(Iterable biomes) { + Set biomeSet = new HashSet<>(); + Set reject = new HashSet<>(); + biomes.forEach(biome -> { + if(!biome.getTags().contains(replaceableTag)) { + biomeSet.add(biome); + } else { + reject.add(biome); + } + }); + biomeSet.addAll(replace.getContents().stream().flatMap(terraBiome -> { + if(terraBiome == null) return reject.stream(); + return Stream.of(terraBiome); + }).toList()); + return biomeSet; + } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/BiomeSource.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/BiomeSource.java index 032c8be5c..0423c1c43 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/BiomeSource.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/BiomeSource.java @@ -12,4 +12,6 @@ import com.dfsek.terra.api.world.biome.TerraBiome; public interface BiomeSource { TerraBiome getBiome(double x, double z, long seed); + + Iterable getBiomes(); } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/NoiseSource.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/NoiseSource.java index 3f3fdb280..e4acc9d8d 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/NoiseSource.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/NoiseSource.java @@ -25,4 +25,9 @@ public class NoiseSource implements BiomeSource { public TerraBiome getBiome(double x, double z, long seed) { return biomes.get(sampler, x, z, seed); } + + @Override + public Iterable getBiomes() { + return biomes.getContents(); + } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/ExpanderStage.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/ExpanderStage.java index 008c88d0a..06319ce15 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/ExpanderStage.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/ExpanderStage.java @@ -10,6 +10,9 @@ package com.dfsek.terra.addons.biome.pipeline.stages; import com.dfsek.terra.addons.biome.pipeline.api.BiomeExpander; import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder; import com.dfsek.terra.addons.biome.pipeline.api.Stage; +import com.dfsek.terra.api.world.biome.TerraBiome; + +import java.util.Collections; public class ExpanderStage implements Stage { @@ -29,7 +32,8 @@ public class ExpanderStage implements Stage { return true; } - public enum Type { - FRACTAL + @Override + public Iterable getBiomes(Iterable biomes) { + return biomes; } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/MutatorStage.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/MutatorStage.java index 5bfe6772a..3f7ba2595 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/MutatorStage.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/MutatorStage.java @@ -10,6 +10,7 @@ package com.dfsek.terra.addons.biome.pipeline.stages; import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder; import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator; import com.dfsek.terra.addons.biome.pipeline.api.Stage; +import com.dfsek.terra.api.world.biome.TerraBiome; public class MutatorStage implements Stage { @@ -30,6 +31,11 @@ public class MutatorStage implements Stage { return false; } + @Override + public Iterable getBiomes(Iterable biomes) { + return mutator.getBiomes(biomes); + } + public enum Type { REPLACE, REPLACE_LIST, diff --git a/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProvider.java b/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProvider.java index 8daf6c4c7..ba6f9e1f5 100644 --- a/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProvider.java +++ b/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProvider.java @@ -10,6 +10,8 @@ package com.dfsek.terra.addons.biome.single; import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import java.util.Collections; + public class SingleBiomeProvider implements BiomeProvider { private final TerraBiome biome; @@ -22,4 +24,9 @@ public class SingleBiomeProvider implements BiomeProvider { public TerraBiome getBiome(int x, int z, long seed) { return biome; } + + @Override + public Iterable getBiomes() { + return Collections.singleton(biome); + } } diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeProvider.java b/common/api/core/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeProvider.java index f5df8ba31..7f09b6f3e 100644 --- a/common/api/core/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeProvider.java +++ b/common/api/core/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeProvider.java @@ -22,4 +22,6 @@ public interface BiomeProvider { default TerraBiome getBiome(Vector3 vector3, long seed) { return getBiome(vector3.getBlockX(), vector3.getBlockZ(), seed); } + + Iterable getBiomes(); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitBiomeProvider.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitBiomeProvider.java index c7f991980..d64243b2c 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitBiomeProvider.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitBiomeProvider.java @@ -1,16 +1,16 @@ package com.dfsek.terra.bukkit.generator; -import com.dfsek.terra.api.Handle; - -import com.dfsek.terra.api.world.biome.TerraBiome; - import org.bukkit.block.Biome; import org.bukkit.generator.BiomeProvider; import org.bukkit.generator.WorldInfo; import org.jetbrains.annotations.NotNull; -import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +import com.dfsek.terra.api.Handle; +import com.dfsek.terra.api.world.biome.TerraBiome; public class BukkitBiomeProvider extends BiomeProvider implements Handle { @@ -26,7 +26,12 @@ public class BukkitBiomeProvider extends BiomeProvider implements Handle { @Override public @NotNull List getBiomes(@NotNull WorldInfo worldInfo) { - return Arrays.stream(Biome.values()).toList(); + return StreamSupport.stream(delegate.getBiomes().spliterator(), false) + .flatMap(terraBiome -> terraBiome.getVanillaBiomes() + .getContents() + .stream() + .map(biome -> (Biome) biome.getHandle())) + .collect(Collectors.toList()); } @Override