mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-19 10:43:14 +00:00
Carving Objects
This commit is contained in:
parent
1618d54b70
commit
1bafdf0feb
@ -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<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)
|
||||
{
|
||||
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++)
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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<CarveResult> 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<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)
|
||||
{
|
||||
if(couldCarveBelow(x, y, z))
|
||||
|
@ -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<CaveResult> EMPTY = new KList<>();
|
||||
private FastNoiseDouble gg;
|
||||
|
||||
public GenLayerCave(DimensionalTerrainProvider iris, RNG rng)
|
||||
public GenLayerCave(TopographicTerrainProvider iris, RNG rng)
|
||||
{
|
||||
// @NoArgsConstructor
|
||||
super(iris, rng);
|
||||
|
@ -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<IrisObject> debug = new AtomicCache<>();
|
||||
|
||||
public GenLayerText(DimensionalTerrainProvider iris, RNG rng)
|
||||
public GenLayerText(TopographicTerrainProvider iris, RNG rng)
|
||||
{
|
||||
super(iris, rng);
|
||||
}
|
||||
|
@ -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));
|
||||
|
@ -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<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())
|
||||
{
|
||||
@ -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;
|
||||
|
@ -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.")
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
10
src/main/java/com/volmit/iris/util/CarveResult.java
Normal file
10
src/main/java/com/volmit/iris/util/CarveResult.java
Normal 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;
|
||||
}
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user