diff --git a/src/main/java/com/volmit/iris/layer/BiomeDataProvider.java b/src/main/java/com/volmit/iris/layer/BiomeDataProvider.java index ecfabaf74..420ad2d51 100644 --- a/src/main/java/com/volmit/iris/layer/BiomeDataProvider.java +++ b/src/main/java/com/volmit/iris/layer/BiomeDataProvider.java @@ -2,8 +2,8 @@ package com.volmit.iris.layer; import com.volmit.iris.object.InferredType; import com.volmit.iris.object.IrisRegion; +import com.volmit.iris.util.BiomeRarityCellGenerator; import com.volmit.iris.util.BiomeResult; -import com.volmit.iris.util.CellGenerator; import com.volmit.iris.util.RNG; import lombok.Data; @@ -12,14 +12,14 @@ import lombok.Data; public class BiomeDataProvider { private InferredType type; - private CellGenerator generator; + private BiomeRarityCellGenerator generator; private GenLayerBiome layer; public BiomeDataProvider(GenLayerBiome layer, InferredType type, RNG rng) { this.type = type; this.layer = layer; - generator = new CellGenerator(rng.nextParallelRNG(4645079 + (type.ordinal() * 23845))); + generator = new BiomeRarityCellGenerator(rng.nextParallelRNG(4645079 + (type.ordinal() * 23845))); } public BiomeResult generatePureData(double bx, double bz, int rawX, int rawZ, IrisRegion regionData) diff --git a/src/main/java/com/volmit/iris/layer/GenLayerBiome.java b/src/main/java/com/volmit/iris/layer/GenLayerBiome.java index cf94440bc..b788c8402 100644 --- a/src/main/java/com/volmit/iris/layer/GenLayerBiome.java +++ b/src/main/java/com/volmit/iris/layer/GenLayerBiome.java @@ -7,6 +7,7 @@ import com.volmit.iris.object.IrisBiome; import com.volmit.iris.object.IrisRegion; import com.volmit.iris.object.IrisRegionRidge; import com.volmit.iris.object.IrisRegionSpot; +import com.volmit.iris.util.BiomeRarityCellGenerator; import com.volmit.iris.util.BiomeResult; import com.volmit.iris.util.CellGenerator; import com.volmit.iris.util.GenLayer; @@ -119,7 +120,7 @@ public class GenLayerBiome extends GenLayer return bridgeGenerator.getIndex(x, z, 5) == 1 ? InferredType.SEA : InferredType.LAND; } - public BiomeResult generateBiomeData(double bx, double bz, IrisRegion regionData, CellGenerator cell, KList biomes, InferredType inferredType) + public BiomeResult generateBiomeData(double bx, double bz, IrisRegion regionData, BiomeRarityCellGenerator cell, KList biomes, InferredType inferredType) { if(biomes.isEmpty()) { @@ -128,7 +129,7 @@ public class GenLayerBiome extends GenLayer double x = bx / iris.getDimension().getBiomeZoom(); double z = bz / iris.getDimension().getBiomeZoom(); - IrisBiome biome = biomes.get(cell.getIndex(x, z, biomes.size())); + IrisBiome biome = cell.get(x, z, biomes); biome.setInferredType(inferredType); return implode(bx, bz, regionData, cell, new BiomeResult(biome, cell.getDistance(x, z))); @@ -155,12 +156,12 @@ public class GenLayerBiome extends GenLayer return pureResult; } - public BiomeResult implode(double bx, double bz, IrisRegion regionData, CellGenerator parentCell, BiomeResult parent) + public BiomeResult implode(double bx, double bz, IrisRegion regionData, BiomeRarityCellGenerator parentCell, BiomeResult parent) { return implode(bx, bz, regionData, parentCell, parent, 1); } - public BiomeResult implode(double bx, double bz, IrisRegion regionData, CellGenerator parentCell, BiomeResult parent, int hits) + public BiomeResult implode(double bx, double bz, IrisRegion regionData, BiomeRarityCellGenerator parentCell, BiomeResult parent, int hits) { if(hits > 9) { @@ -174,15 +175,10 @@ public class GenLayerBiome extends GenLayer { if(!parent.getBiome().getRealChildren().isEmpty()) { - CellGenerator childCell = parent.getBiome().getChildrenGenerator(rng, 123, parentCell.getCellScale() * parent.getBiome().getChildShrinkFactor()); - int r = childCell.getIndex(x, z, parent.getBiome().getRealChildren().size() + 1); - - if(r == parent.getBiome().getRealChildren().size()) - { - return new BiomeResult(parent.getBiome(), childCell.getDistance(x, z)); - } - - IrisBiome biome = parent.getBiome().getRealChildren().get(r); + BiomeRarityCellGenerator childCell = parent.getBiome().getChildrenGenerator(rng, 123, parentCell.getCellScale() * parent.getBiome().getChildShrinkFactor()); + KList chx = parent.getBiome().getRealChildren().copy(); + chx.add(parent.getBiome()); + IrisBiome biome = childCell.get(x, z, chx); biome.setInferredType(parent.getBiome().getInferredType()); return implode(bx, bz, regionData, childCell, new BiomeResult(biome, childCell.getDistance(x, z)), hits + 1); diff --git a/src/main/java/com/volmit/iris/object/IrisBiome.java b/src/main/java/com/volmit/iris/object/IrisBiome.java index 878165c54..905281bb6 100644 --- a/src/main/java/com/volmit/iris/object/IrisBiome.java +++ b/src/main/java/com/volmit/iris/object/IrisBiome.java @@ -6,8 +6,8 @@ import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; import com.volmit.iris.Iris; +import com.volmit.iris.util.BiomeRarityCellGenerator; import com.volmit.iris.util.CNG; -import com.volmit.iris.util.CellGenerator; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; import com.volmit.iris.util.KList; @@ -96,7 +96,7 @@ public class IrisBiome extends IrisRegistrant private KList deposits = new KList<>(); private transient ReentrantLock lock = new ReentrantLock(); - private transient CellGenerator childrenCell; + private transient BiomeRarityCellGenerator childrenCell; private transient InferredType inferredType; private transient CNG biomeGenerator; private transient int maxHeight = Integer.MIN_VALUE; @@ -134,11 +134,11 @@ public class IrisBiome extends IrisRegistrant return biomeGenerator; } - public CellGenerator getChildrenGenerator(RNG random, int sig, double scale) + public BiomeRarityCellGenerator getChildrenGenerator(RNG random, int sig, double scale) { if(childrenCell == null) { - childrenCell = new CellGenerator(random.nextParallelRNG(sig * 213)); + childrenCell = new BiomeRarityCellGenerator(random.nextParallelRNG(sig * 2137)); childrenCell.setCellScale(scale); } diff --git a/src/main/java/com/volmit/iris/util/BiomeRarityCellGenerator.java b/src/main/java/com/volmit/iris/util/BiomeRarityCellGenerator.java new file mode 100644 index 000000000..6a556553a --- /dev/null +++ b/src/main/java/com/volmit/iris/util/BiomeRarityCellGenerator.java @@ -0,0 +1,65 @@ +package com.volmit.iris.util; + +import com.volmit.iris.object.IrisBiome; + +public class BiomeRarityCellGenerator extends CellGenerator +{ + public BiomeRarityCellGenerator(RNG rng) + { + super(rng); + } + + public IrisBiome get(double x, double z, KList b) + { + if(b.size() == 0) + { + return null; + } + + if(b.size() == 1) + { + return b.get(0); + } + + KList rarityMapped = new KList<>(); + boolean o = false; + int max = 1; + for(IrisBiome i : b) + { + if(i.getRarity() > max) + { + max = i.getRarity(); + } + } + + max++; + + for(IrisBiome i : b) + { + for(int j = 0; j < max - i.getRarity(); j++) + { + if(o = !o) + { + rarityMapped.add(i); + } + + else + { + rarityMapped.add(0, i); + } + } + } + + if(rarityMapped.size() == 1) + { + return rarityMapped.get(0); + } + + if(rarityMapped.isEmpty()) + { + throw new RuntimeException("BAD RARITY MAP! RELATED TO: " + b.toString(", or possibly ")); + } + + return rarityMapped.get(getIndex(x, z, rarityMapped.size())); + } +}