diff --git a/src/main/java/com/volmit/iris/gen/ParallaxTerrainProvider.java b/src/main/java/com/volmit/iris/gen/ParallaxTerrainProvider.java index a08b5dddf..b152e0d4f 100644 --- a/src/main/java/com/volmit/iris/gen/ParallaxTerrainProvider.java +++ b/src/main/java/com/volmit/iris/gen/ParallaxTerrainProvider.java @@ -21,6 +21,7 @@ import com.volmit.iris.object.IrisRegion; import com.volmit.iris.object.IrisStructurePlacement; import com.volmit.iris.object.IrisTextPlacement; import com.volmit.iris.util.BiomeMap; +import com.volmit.iris.util.CarveResult; import com.volmit.iris.util.CaveResult; import com.volmit.iris.util.ChunkPosition; import com.volmit.iris.util.HeightMap; @@ -240,6 +241,7 @@ public abstract class ParallaxTerrainProvider extends TopographicTerrainProvider g = placeMutations(ro, random, i, j, g); g = placeText(random, r, b, i, j, g); g = placeObjects(random, r, b, i, j, g); + g = placeCarveObjects(random, r, b, i, j, g); g = placeCaveObjects(ro, random, i, j, g); g = placeStructures(randomx, r, b, i, j, g); }); @@ -304,7 +306,7 @@ public abstract class ParallaxTerrainProvider extends TopographicTerrainProvider { for(IrisObjectPlacement k : b.getObjects()) { - placeObject(k, i, j, random.nextParallelRNG((34 * ((i * 30) + (j * 30) + g++) * i * j) + i - j + 3569222)); + placeObject(k, i, j, random.nextParallelRNG((34 * ((i * 30) + (j * 30) + g++) * i * j) + i - j + 3566522)); } for(IrisObjectPlacement k : r.getObjects()) @@ -315,6 +317,43 @@ public abstract class ParallaxTerrainProvider extends TopographicTerrainProvider return g; } + private int placeCarveObjects(RNG random, IrisRegion r, IrisBiome b, int i, int j, int g) + { + if(!getGlCarve().isCouldCarve()) + { + return g; + } + + KList layers = getGlCarve().getCarveLayers((i * 16) + random.nextInt(16), (j * 16) + random.nextInt(16)); + + if(layers.isEmpty()) + { + return g + 2; + } + + for(CarveResult c : layers) + { + g = placeCarveObjects(random, r, b, i, j, g, c); + } + + return g; + } + + private int placeCarveObjects(RNG random, IrisRegion r, IrisBiome b, int i, int j, int g, CarveResult c) + { + for(IrisObjectPlacement k : b.getObjects()) + { + placeCarveObject(k, i, j, random.nextParallelRNG((34 * ((i * 30) + (j * 30) + g++) * i * j) + i - j + 3569221 + g), c); + } + + for(IrisObjectPlacement k : r.getObjects()) + { + placeCarveObject(k, i, j, random.nextParallelRNG((34 * ((i * 30) + (j * 30) + g++) * i * j) + i - j + 3561222 + g), c); + } + + return g; + } + private int placeCaveObjects(RNG ro, RNG random, int i, int j, int g) { if(!getDimension().isCaves()) @@ -370,6 +409,15 @@ public abstract class ParallaxTerrainProvider extends TopographicTerrainProvider } } + public void placeCarveObject(IrisObjectPlacement o, int x, int z, RNG rng, CarveResult c) + { + for(int i = 0; i < o.getTriesForChunk(rng); i++) + { + rng = rng.nextParallelRNG((i * 3 + 8) - 23040); + o.getSchematic(this, rng).place((x * 16) + rng.nextInt(16), (z * 16) + rng.nextInt(16), this, o, rng, c); + } + } + public void placeCaveObject(IrisObjectPlacement o, int x, int z, RNG rng) { for(int i = 0; i < o.getTriesForChunk(rng); i++) diff --git a/src/main/java/com/volmit/iris/gen/TopographicTerrainProvider.java b/src/main/java/com/volmit/iris/gen/TopographicTerrainProvider.java index ac02c7c67..de81def14 100644 --- a/src/main/java/com/volmit/iris/gen/TopographicTerrainProvider.java +++ b/src/main/java/com/volmit/iris/gen/TopographicTerrainProvider.java @@ -348,6 +348,11 @@ public abstract class TopographicTerrainProvider extends ParallelTerrainProvider protected void onGenerate(RNG random, int x, int z, TerrainChunk terrain) { super.onGenerate(random, x, z, terrain); + + if(!getDimension().isVanillaCaves()) + { + generateDeposits(random.nextParallelRNG(x * ((z * 39) + 10000)).nextParallelRNG(z + z - x), terrain, x, z); + } } private void decorateLand(IrisBiome biome, AtomicSliver sliver, double wx, int k, double wz, int rx, int rz, BlockData block) @@ -538,16 +543,13 @@ public abstract class TopographicTerrainProvider extends ParallelTerrainProvider protected void onPreParallaxPostGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map) { - if(!getDimension().isVanillaCaves()) - { - generateDeposits(random.nextParallelRNG(x).nextParallelRNG(z), terrain, x, z); - } + } public void generateDeposits(RNG rx, TerrainChunk terrain, int x, int z) { PrecisionStopwatch p = PrecisionStopwatch.start(); - RNG ro = rx.nextParallelRNG((x * x * x) - z); + RNG ro = rx.nextParallelRNG(x * x).nextParallelRNG(z * z); IrisRegion region = sampleRegion((x * 16) + 7, (z * 16) + 7); IrisBiome biome = sampleTrueBiome((x * 16) + 7, (z * 16) + 7); diff --git a/src/main/java/com/volmit/iris/gen/layer/GenLayerBiome.java b/src/main/java/com/volmit/iris/gen/layer/GenLayerBiome.java index 8c991f13c..f8d6026e1 100644 --- a/src/main/java/com/volmit/iris/gen/layer/GenLayerBiome.java +++ b/src/main/java/com/volmit/iris/gen/layer/GenLayerBiome.java @@ -3,6 +3,7 @@ package com.volmit.iris.gen.layer; import com.volmit.iris.Iris; import com.volmit.iris.IrisSettings; import com.volmit.iris.gen.DimensionalTerrainProvider; +import com.volmit.iris.gen.TopographicTerrainProvider; import com.volmit.iris.noise.CNG; import com.volmit.iris.object.InferredType; import com.volmit.iris.object.IrisBiome; @@ -33,7 +34,7 @@ public class GenLayerBiome extends GenLayer private BiomeDataProvider lakeProvider; private DimensionalTerrainProvider iris; - public GenLayerBiome(@NonNull DimensionalTerrainProvider iris, @NonNull RNG rng) + public GenLayerBiome(@NonNull TopographicTerrainProvider iris, @NonNull RNG rng) { super(iris, rng); this.iris = iris; diff --git a/src/main/java/com/volmit/iris/gen/layer/GenLayerCarve.java b/src/main/java/com/volmit/iris/gen/layer/GenLayerCarve.java index 9c4ba8f3e..064ed766f 100644 --- a/src/main/java/com/volmit/iris/gen/layer/GenLayerCarve.java +++ b/src/main/java/com/volmit/iris/gen/layer/GenLayerCarve.java @@ -1,17 +1,28 @@ package com.volmit.iris.gen.layer; -import com.volmit.iris.gen.DimensionalTerrainProvider; +import com.volmit.iris.gen.TopographicTerrainProvider; import com.volmit.iris.object.IrisCarveLayer; +import com.volmit.iris.util.CarveResult; import com.volmit.iris.util.GenLayer; +import com.volmit.iris.util.KList; import com.volmit.iris.util.RNG; +import lombok.Getter; + public class GenLayerCarve extends GenLayer { + private static final KList EMPTY_LIST = new KList<>(); + + @Getter private boolean couldCarve; + + @Getter private int minimum; + + @Getter private int maximum; - public GenLayerCarve(DimensionalTerrainProvider iris, RNG rng) + public GenLayerCarve(TopographicTerrainProvider iris, RNG rng) { super(iris, rng); @@ -36,6 +47,46 @@ public class GenLayerCarve extends GenLayer return couldCarve && y <= maximum; } + public KList getCarveLayers(int x, int z) + { + if(!couldCarve) + { + return EMPTY_LIST; + } + + KList surfaces = new KList<>(); + int terrainHeight = (int) Math.round(iris.getTerrainHeight(x, z)); + boolean carving = false; + int lastCarve = terrainHeight + 1; + + for(int i = Math.min(maximum, terrainHeight); i >= Math.max(minimum, 0); i--) + { + if(i <= 0 || i > 255) + { + continue; + } + + boolean nowCarving = isCarved(x, i, z); + + if(carving && !nowCarving) + { + if(lastCarve - i > 2 && !(i < terrainHeight && lastCarve - i > terrainHeight)) + { + surfaces.add(new CarveResult(i, lastCarve - i)); + } + } + + if(nowCarving && !carving) + { + lastCarve = i; + } + + carving = nowCarving; + } + + return surfaces; + } + public int getSurfaceCarve(int x, int y, int z) { if(couldCarveBelow(x, y, z)) diff --git a/src/main/java/com/volmit/iris/gen/layer/GenLayerCave.java b/src/main/java/com/volmit/iris/gen/layer/GenLayerCave.java index fcd0a2cae..a6f994473 100644 --- a/src/main/java/com/volmit/iris/gen/layer/GenLayerCave.java +++ b/src/main/java/com/volmit/iris/gen/layer/GenLayerCave.java @@ -5,8 +5,8 @@ import java.util.function.Function; import org.bukkit.Material; import org.bukkit.block.data.BlockData; -import com.volmit.iris.gen.DimensionalTerrainProvider; import com.volmit.iris.gen.IrisTerrainProvider; +import com.volmit.iris.gen.TopographicTerrainProvider; import com.volmit.iris.gen.atomics.AtomicSliver; import com.volmit.iris.noise.FastNoiseDouble; import com.volmit.iris.noise.FastNoiseDouble.CellularDistanceFunction; @@ -27,7 +27,7 @@ public class GenLayerCave extends GenLayer private static final KList EMPTY = new KList<>(); private FastNoiseDouble gg; - public GenLayerCave(DimensionalTerrainProvider iris, RNG rng) + public GenLayerCave(TopographicTerrainProvider iris, RNG rng) { // @NoArgsConstructor super(iris, rng); diff --git a/src/main/java/com/volmit/iris/gen/layer/GenLayerText.java b/src/main/java/com/volmit/iris/gen/layer/GenLayerText.java index 994013605..0c41315b5 100644 --- a/src/main/java/com/volmit/iris/gen/layer/GenLayerText.java +++ b/src/main/java/com/volmit/iris/gen/layer/GenLayerText.java @@ -8,7 +8,7 @@ import java.awt.image.BufferedImage; import org.bukkit.block.data.BlockData; import com.volmit.iris.Iris; -import com.volmit.iris.gen.DimensionalTerrainProvider; +import com.volmit.iris.gen.TopographicTerrainProvider; import com.volmit.iris.gen.atomics.AtomicCache; import com.volmit.iris.object.IrisMaterialPalette; import com.volmit.iris.object.IrisObject; @@ -22,7 +22,7 @@ public class GenLayerText extends GenLayer private AtomicCache debug = new AtomicCache<>(); - public GenLayerText(DimensionalTerrainProvider iris, RNG rng) + public GenLayerText(TopographicTerrainProvider iris, RNG rng) { super(iris, rng); } diff --git a/src/main/java/com/volmit/iris/object/IrisDepositGenerator.java b/src/main/java/com/volmit/iris/object/IrisDepositGenerator.java index c5380181c..a24ed04c6 100644 --- a/src/main/java/com/volmit/iris/object/IrisDepositGenerator.java +++ b/src/main/java/com/volmit/iris/object/IrisDepositGenerator.java @@ -1,5 +1,6 @@ package com.volmit.iris.object; +import org.bukkit.Material; import org.bukkit.block.data.BlockData; import org.bukkit.generator.ChunkGenerator.ChunkData; import org.bukkit.util.BlockVector; @@ -7,6 +8,7 @@ import org.bukkit.util.BlockVector; import com.volmit.iris.gen.TopographicTerrainProvider; import com.volmit.iris.gen.atomics.AtomicCache; import com.volmit.iris.util.ArrayType; +import com.volmit.iris.util.B; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; import com.volmit.iris.util.HeightMap; @@ -228,6 +230,16 @@ public class IrisDepositGenerator } } + if(!safe && allow) + { + BlockData b = data.getBlockData(nx, ny, nz); + + if(b.getMaterial().equals(Material.ICE) || b.getMaterial().equals(Material.PACKED_ICE) || b.getMaterial().equals(B.mat("BLUE_ICE")) || b.getMaterial().equals(B.mat("FROSTED_ICE")) || b.getMaterial().equals(Material.SAND) || b.getMaterial().equals(Material.RED_SAND) || !B.isSolid(b.getMaterial())) + { + allow = false; + } + } + if(allow) { data.setBlock(nx, ny, nz, clump.getBlocks().get(j)); diff --git a/src/main/java/com/volmit/iris/object/IrisObject.java b/src/main/java/com/volmit/iris/object/IrisObject.java index 6817eb856..b034f0661 100644 --- a/src/main/java/com/volmit/iris/object/IrisObject.java +++ b/src/main/java/com/volmit/iris/object/IrisObject.java @@ -20,6 +20,7 @@ import org.bukkit.util.BlockVector; import com.volmit.iris.Iris; import com.volmit.iris.util.B; import com.volmit.iris.util.BlockPosition; +import com.volmit.iris.util.CarveResult; import com.volmit.iris.util.ChunkPosition; import com.volmit.iris.util.IObjectPlacer; import com.volmit.iris.util.IrisLock; @@ -328,12 +329,21 @@ public class IrisObject extends IrisRegistrant place(x, -1, z, placer, config, rng); } - public int place(int x, int yv, int z, IObjectPlacer placer, IrisObjectPlacement config, RNG rng) + public void place(int x, int z, IObjectPlacer placer, IrisObjectPlacement config, RNG rng, CarveResult c) { - return place(x, yv, z, placer, config, rng, null); + if(shitty) + { + return; + } + place(x, -1, z, placer, config, rng, null, c); } - public int place(int x, int yv, int z, IObjectPlacer placer, IrisObjectPlacement config, RNG rng, Consumer listener) + public int place(int x, int yv, int z, IObjectPlacer placer, IrisObjectPlacement config, RNG rng) + { + return place(x, yv, z, placer, config, rng, null, null); + } + + public int place(int x, int yv, int z, IObjectPlacer placer, IrisObjectPlacement config, RNG rng, Consumer listener, CarveResult c) { if(config.isSmartBore()) { @@ -357,7 +367,7 @@ public class IrisObject extends IrisRegistrant { if(config.getMode().equals(ObjectPlaceMode.CENTER_HEIGHT)) { - y = placer.getHighest(x, z, config.isUnderwater()) + rty; + y = (c != null ? c.getSurface() : placer.getHighest(x, z, config.isUnderwater())) + rty; } else if(config.getMode().equals(ObjectPlaceMode.MAX_HEIGHT) || config.getMode().equals(ObjectPlaceMode.STILT)) @@ -462,6 +472,11 @@ public class IrisObject extends IrisRegistrant } } + if(c != null && Math.max(0, h + yrand + ty) + 1 >= c.getHeight()) + { + return -1; + } + if(config.isUnderwater() && y + rty + ty >= placer.getFluidHeight()) { return -1; diff --git a/src/main/java/com/volmit/iris/object/IrisObjectPlacement.java b/src/main/java/com/volmit/iris/object/IrisObjectPlacement.java index 7b90d8135..a91143976 100644 --- a/src/main/java/com/volmit/iris/object/IrisObjectPlacement.java +++ b/src/main/java/com/volmit/iris/object/IrisObjectPlacement.java @@ -105,7 +105,7 @@ public class IrisObjectPlacement @DontObfuscate @Desc("If set to true, Blocks placed underwater that could be waterlogged are waterlogged.") - private boolean waterloggable = true; + private boolean waterloggable = false; @DontObfuscate @Desc("If set to true, objects will place on the fluid height level Such as boats.") diff --git a/src/main/java/com/volmit/iris/object/IrisStructurePlacement.java b/src/main/java/com/volmit/iris/object/IrisStructurePlacement.java index b74e25e53..daf95168c 100644 --- a/src/main/java/com/volmit/iris/object/IrisStructurePlacement.java +++ b/src/main/java/com/volmit/iris/object/IrisStructurePlacement.java @@ -144,7 +144,7 @@ public class IrisStructurePlacement } o = o != null ? o : load(g, t.getTile().getObjects().get(rnp.nextInt(t.getTile().getObjects().size()))); - o.place(Math.floorDiv(i, s) * s, height == -1 ? -1 : h, Math.floorDiv(j, s) * s, g, t.getPlacement(), rng, (gg) -> g.getParallaxChunk(gg.getChunkX(), gg.getChunkZ()).setStructure(gg.getY(), t.getStructure(), t.getTile())); + o.place(Math.floorDiv(i, s) * s, height == -1 ? -1 : h, Math.floorDiv(j, s) * s, g, t.getPlacement(), rng, (gg) -> g.getParallaxChunk(gg.getChunkX(), gg.getChunkZ()).setStructure(gg.getY(), t.getStructure(), t.getTile()), null); } } diff --git a/src/main/java/com/volmit/iris/util/CarveResult.java b/src/main/java/com/volmit/iris/util/CarveResult.java new file mode 100644 index 000000000..e0b1d1878 --- /dev/null +++ b/src/main/java/com/volmit/iris/util/CarveResult.java @@ -0,0 +1,10 @@ +package com.volmit.iris.util; + +import lombok.Value; + +@Value +public class CarveResult +{ + private final int surface; + private final int height; +} diff --git a/src/main/java/com/volmit/iris/util/GenLayer.java b/src/main/java/com/volmit/iris/util/GenLayer.java index 3fdf96c9d..383975a46 100644 --- a/src/main/java/com/volmit/iris/util/GenLayer.java +++ b/src/main/java/com/volmit/iris/util/GenLayer.java @@ -1,13 +1,13 @@ package com.volmit.iris.util; -import com.volmit.iris.gen.DimensionalTerrainProvider; +import com.volmit.iris.gen.TopographicTerrainProvider; public abstract class GenLayer { protected final RNG rng; - protected final DimensionalTerrainProvider iris; + protected final TopographicTerrainProvider iris; - public GenLayer(DimensionalTerrainProvider iris, RNG rng) + public GenLayer(TopographicTerrainProvider iris, RNG rng) { this.iris = iris; this.rng = rng;