Carving Objects

This commit is contained in:
Daniel Mills 2020-09-11 12:59:37 -04:00
parent 1618d54b70
commit 1bafdf0feb
12 changed files with 161 additions and 22 deletions

View File

@ -21,6 +21,7 @@ import com.volmit.iris.object.IrisRegion;
import com.volmit.iris.object.IrisStructurePlacement; import com.volmit.iris.object.IrisStructurePlacement;
import com.volmit.iris.object.IrisTextPlacement; import com.volmit.iris.object.IrisTextPlacement;
import com.volmit.iris.util.BiomeMap; import com.volmit.iris.util.BiomeMap;
import com.volmit.iris.util.CarveResult;
import com.volmit.iris.util.CaveResult; import com.volmit.iris.util.CaveResult;
import com.volmit.iris.util.ChunkPosition; import com.volmit.iris.util.ChunkPosition;
import com.volmit.iris.util.HeightMap; import com.volmit.iris.util.HeightMap;
@ -240,6 +241,7 @@ public abstract class ParallaxTerrainProvider extends TopographicTerrainProvider
g = placeMutations(ro, random, i, j, g); g = placeMutations(ro, random, i, j, g);
g = placeText(random, r, b, i, j, g); g = placeText(random, r, b, i, j, g);
g = placeObjects(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 = placeCaveObjects(ro, random, i, j, g);
g = placeStructures(randomx, r, b, 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()) 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()) for(IrisObjectPlacement k : r.getObjects())
@ -315,6 +317,43 @@ public abstract class ParallaxTerrainProvider extends TopographicTerrainProvider
return g; return g;
} }
private int placeCarveObjects(RNG random, IrisRegion r, IrisBiome b, int i, int j, int g)
{
if(!getGlCarve().isCouldCarve())
{
return g;
}
KList<CarveResult> 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) private int placeCaveObjects(RNG ro, RNG random, int i, int j, int g)
{ {
if(!getDimension().isCaves()) 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) public void placeCaveObject(IrisObjectPlacement o, int x, int z, RNG rng)
{ {
for(int i = 0; i < o.getTriesForChunk(rng); i++) for(int i = 0; i < o.getTriesForChunk(rng); i++)

View File

@ -348,6 +348,11 @@ public abstract class TopographicTerrainProvider extends ParallelTerrainProvider
protected void onGenerate(RNG random, int x, int z, TerrainChunk terrain) protected void onGenerate(RNG random, int x, int z, TerrainChunk terrain)
{ {
super.onGenerate(random, x, z, 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) 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) 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) public void generateDeposits(RNG rx, TerrainChunk terrain, int x, int z)
{ {
PrecisionStopwatch p = PrecisionStopwatch.start(); 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); IrisRegion region = sampleRegion((x * 16) + 7, (z * 16) + 7);
IrisBiome biome = sampleTrueBiome((x * 16) + 7, (z * 16) + 7); IrisBiome biome = sampleTrueBiome((x * 16) + 7, (z * 16) + 7);

View File

@ -3,6 +3,7 @@ package com.volmit.iris.gen.layer;
import com.volmit.iris.Iris; import com.volmit.iris.Iris;
import com.volmit.iris.IrisSettings; import com.volmit.iris.IrisSettings;
import com.volmit.iris.gen.DimensionalTerrainProvider; import com.volmit.iris.gen.DimensionalTerrainProvider;
import com.volmit.iris.gen.TopographicTerrainProvider;
import com.volmit.iris.noise.CNG; import com.volmit.iris.noise.CNG;
import com.volmit.iris.object.InferredType; import com.volmit.iris.object.InferredType;
import com.volmit.iris.object.IrisBiome; import com.volmit.iris.object.IrisBiome;
@ -33,7 +34,7 @@ public class GenLayerBiome extends GenLayer
private BiomeDataProvider lakeProvider; private BiomeDataProvider lakeProvider;
private DimensionalTerrainProvider iris; private DimensionalTerrainProvider iris;
public GenLayerBiome(@NonNull DimensionalTerrainProvider iris, @NonNull RNG rng) public GenLayerBiome(@NonNull TopographicTerrainProvider iris, @NonNull RNG rng)
{ {
super(iris, rng); super(iris, rng);
this.iris = iris; this.iris = iris;

View File

@ -1,17 +1,28 @@
package com.volmit.iris.gen.layer; 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.object.IrisCarveLayer;
import com.volmit.iris.util.CarveResult;
import com.volmit.iris.util.GenLayer; import com.volmit.iris.util.GenLayer;
import com.volmit.iris.util.KList;
import com.volmit.iris.util.RNG; import com.volmit.iris.util.RNG;
import lombok.Getter;
public class GenLayerCarve extends GenLayer public class GenLayerCarve extends GenLayer
{ {
private static final KList<CarveResult> EMPTY_LIST = new KList<>();
@Getter
private boolean couldCarve; private boolean couldCarve;
@Getter
private int minimum; private int minimum;
@Getter
private int maximum; private int maximum;
public GenLayerCarve(DimensionalTerrainProvider iris, RNG rng) public GenLayerCarve(TopographicTerrainProvider iris, RNG rng)
{ {
super(iris, rng); super(iris, rng);
@ -36,6 +47,46 @@ public class GenLayerCarve extends GenLayer
return couldCarve && y <= maximum; return couldCarve && y <= maximum;
} }
public KList<CarveResult> getCarveLayers(int x, int z)
{
if(!couldCarve)
{
return EMPTY_LIST;
}
KList<CarveResult> 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) public int getSurfaceCarve(int x, int y, int z)
{ {
if(couldCarveBelow(x, y, z)) if(couldCarveBelow(x, y, z))

View File

@ -5,8 +5,8 @@ import java.util.function.Function;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import com.volmit.iris.gen.DimensionalTerrainProvider;
import com.volmit.iris.gen.IrisTerrainProvider; import com.volmit.iris.gen.IrisTerrainProvider;
import com.volmit.iris.gen.TopographicTerrainProvider;
import com.volmit.iris.gen.atomics.AtomicSliver; import com.volmit.iris.gen.atomics.AtomicSliver;
import com.volmit.iris.noise.FastNoiseDouble; import com.volmit.iris.noise.FastNoiseDouble;
import com.volmit.iris.noise.FastNoiseDouble.CellularDistanceFunction; import com.volmit.iris.noise.FastNoiseDouble.CellularDistanceFunction;
@ -27,7 +27,7 @@ public class GenLayerCave extends GenLayer
private static final KList<CaveResult> EMPTY = new KList<>(); private static final KList<CaveResult> EMPTY = new KList<>();
private FastNoiseDouble gg; private FastNoiseDouble gg;
public GenLayerCave(DimensionalTerrainProvider iris, RNG rng) public GenLayerCave(TopographicTerrainProvider iris, RNG rng)
{ {
// @NoArgsConstructor // @NoArgsConstructor
super(iris, rng); super(iris, rng);

View File

@ -8,7 +8,7 @@ import java.awt.image.BufferedImage;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import com.volmit.iris.Iris; 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.gen.atomics.AtomicCache;
import com.volmit.iris.object.IrisMaterialPalette; import com.volmit.iris.object.IrisMaterialPalette;
import com.volmit.iris.object.IrisObject; import com.volmit.iris.object.IrisObject;
@ -22,7 +22,7 @@ public class GenLayerText extends GenLayer
private AtomicCache<IrisObject> debug = new AtomicCache<>(); private AtomicCache<IrisObject> debug = new AtomicCache<>();
public GenLayerText(DimensionalTerrainProvider iris, RNG rng) public GenLayerText(TopographicTerrainProvider iris, RNG rng)
{ {
super(iris, rng); super(iris, rng);
} }

View File

@ -1,5 +1,6 @@
package com.volmit.iris.object; package com.volmit.iris.object;
import org.bukkit.Material;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import org.bukkit.generator.ChunkGenerator.ChunkData; import org.bukkit.generator.ChunkGenerator.ChunkData;
import org.bukkit.util.BlockVector; 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.TopographicTerrainProvider;
import com.volmit.iris.gen.atomics.AtomicCache; import com.volmit.iris.gen.atomics.AtomicCache;
import com.volmit.iris.util.ArrayType; import com.volmit.iris.util.ArrayType;
import com.volmit.iris.util.B;
import com.volmit.iris.util.Desc; import com.volmit.iris.util.Desc;
import com.volmit.iris.util.DontObfuscate; import com.volmit.iris.util.DontObfuscate;
import com.volmit.iris.util.HeightMap; 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) if(allow)
{ {
data.setBlock(nx, ny, nz, clump.getBlocks().get(j)); data.setBlock(nx, ny, nz, clump.getBlocks().get(j));

View File

@ -20,6 +20,7 @@ import org.bukkit.util.BlockVector;
import com.volmit.iris.Iris; import com.volmit.iris.Iris;
import com.volmit.iris.util.B; import com.volmit.iris.util.B;
import com.volmit.iris.util.BlockPosition; import com.volmit.iris.util.BlockPosition;
import com.volmit.iris.util.CarveResult;
import com.volmit.iris.util.ChunkPosition; import com.volmit.iris.util.ChunkPosition;
import com.volmit.iris.util.IObjectPlacer; import com.volmit.iris.util.IObjectPlacer;
import com.volmit.iris.util.IrisLock; import com.volmit.iris.util.IrisLock;
@ -328,12 +329,21 @@ public class IrisObject extends IrisRegistrant
place(x, -1, z, placer, config, rng); 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<BlockPosition> 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<BlockPosition> listener, CarveResult c)
{ {
if(config.isSmartBore()) if(config.isSmartBore())
{ {
@ -357,7 +367,7 @@ public class IrisObject extends IrisRegistrant
{ {
if(config.getMode().equals(ObjectPlaceMode.CENTER_HEIGHT)) 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)) 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()) if(config.isUnderwater() && y + rty + ty >= placer.getFluidHeight())
{ {
return -1; return -1;

View File

@ -105,7 +105,7 @@ public class IrisObjectPlacement
@DontObfuscate @DontObfuscate
@Desc("If set to true, Blocks placed underwater that could be waterlogged are waterlogged.") @Desc("If set to true, Blocks placed underwater that could be waterlogged are waterlogged.")
private boolean waterloggable = true; private boolean waterloggable = false;
@DontObfuscate @DontObfuscate
@Desc("If set to true, objects will place on the fluid height level Such as boats.") @Desc("If set to true, objects will place on the fluid height level Such as boats.")

View File

@ -144,7 +144,7 @@ public class IrisStructurePlacement
} }
o = o != null ? o : load(g, t.getTile().getObjects().get(rnp.nextInt(t.getTile().getObjects().size()))); 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);
} }
} }

View File

@ -0,0 +1,10 @@
package com.volmit.iris.util;
import lombok.Value;
@Value
public class CarveResult
{
private final int surface;
private final int height;
}

View File

@ -1,13 +1,13 @@
package com.volmit.iris.util; package com.volmit.iris.util;
import com.volmit.iris.gen.DimensionalTerrainProvider; import com.volmit.iris.gen.TopographicTerrainProvider;
public abstract class GenLayer public abstract class GenLayer
{ {
protected final RNG rng; 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.iris = iris;
this.rng = rng; this.rng = rng;