mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-12-29 20:19:06 +00:00
Rivers & Lakes
This commit is contained in:
@@ -114,7 +114,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
|
||||
}
|
||||
|
||||
KList<BlockData> layers = biome.generateLayers(rx, rz, masterRandom, height, height - getFluidHeight());
|
||||
KList<BlockData> seaLayers = biome.isSea() || biome.isShore() ? biome.generateSeaLayers(rx, rz, masterRandom, fluidHeight - height) : new KList<>();
|
||||
KList<BlockData> seaLayers = biome.isAquatic() || biome.isShore() ? biome.generateSeaLayers(rx, rz, masterRandom, fluidHeight - height) : new KList<>();
|
||||
boolean caverning = false;
|
||||
KList<Integer> cavernHeights = new KList<>();
|
||||
int lastCavernHeight = -1;
|
||||
@@ -510,34 +510,33 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
|
||||
double wz = getModifiedZ(x, z);
|
||||
IrisRegion region = sampleRegion(x, z);
|
||||
double sh = region.getShoreHeight(wx, wz);
|
||||
double shMax = getFluidHeight() + (sh / 2);
|
||||
double shMin = getFluidHeight() - (sh / 2);
|
||||
IrisBiome current = sampleBiome(x, z);
|
||||
InferredType aquaticType = current.isAquatic() ? (current.isSea() ? InferredType.SEA : current.isRiver() ? InferredType.RIVER : InferredType.LAKE) : InferredType.SEA;
|
||||
boolean sea = height <= getFluidHeight();
|
||||
boolean shore = height >= shMin && height <= shMax;
|
||||
boolean land = height > getFluidHeight();
|
||||
|
||||
if(current.isShore() && height > sh)
|
||||
// Remove rivers, lakes & sea from land
|
||||
if(current.isAquatic() && land)
|
||||
{
|
||||
return glBiome.generateData(InferredType.LAND, wx, wz, x, z, region);
|
||||
current = glBiome.generateData(InferredType.LAND, wx, wz, x, z, region);
|
||||
}
|
||||
|
||||
if(current.isShore() || current.isLand() && height <= getDimension().getFluidHeight())
|
||||
// Remove land from underwater
|
||||
if(current.isLand() && sea)
|
||||
{
|
||||
return glBiome.generateData(InferredType.SEA, wx, wz, x, z, region);
|
||||
current = glBiome.generateData(aquaticType, wx, wz, x, z, region);
|
||||
}
|
||||
|
||||
if(current.isSea() && height > getDimension().getFluidHeight())
|
||||
// Add shores to land
|
||||
if(shore)
|
||||
{
|
||||
return glBiome.generateData(InferredType.LAND, wx, wz, x, z, region);
|
||||
current = glBiome.generateData(InferredType.SHORE, wx, wz, x, z, region);
|
||||
}
|
||||
|
||||
if(height <= getDimension().getFluidHeight())
|
||||
{
|
||||
return glBiome.generateData(InferredType.SEA, wx, wz, x, z, region);
|
||||
}
|
||||
|
||||
if(height <= getDimension().getFluidHeight() + sh)
|
||||
{
|
||||
return glBiome.generateData(InferredType.SHORE, wx, wz, x, z, region);
|
||||
}
|
||||
|
||||
return glBiome.generateRegionData(wx, wz, x, z, region);
|
||||
return current;
|
||||
}
|
||||
|
||||
public IrisBiome sampleCaveBiome(int x, int z)
|
||||
@@ -586,22 +585,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
|
||||
return focus();
|
||||
}
|
||||
|
||||
return getCache().getBiome(x, z, () ->
|
||||
{
|
||||
double wx = getModifiedX(x, z);
|
||||
double wz = getModifiedZ(x, z);
|
||||
IrisRegion region = sampleRegion(x, z);
|
||||
int height = (int) Math.round(noise);
|
||||
double sh = region.getShoreHeight(wx, wz);
|
||||
IrisBiome current = sampleTrueBiomeBase(x, z, height);
|
||||
|
||||
if(current.isSea() && height > getDimension().getFluidHeight() - sh)
|
||||
{
|
||||
return glBiome.generateData(InferredType.SHORE, wx, wz, x, z, region);
|
||||
}
|
||||
|
||||
return current;
|
||||
});
|
||||
return getCache().getBiome(x, z, () -> sampleTrueBiomeBase(x, z, (int) Math.round(noise)));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -10,6 +10,7 @@ import org.bukkit.block.data.BlockData;
|
||||
import org.bukkit.generator.ChunkGenerator.BiomeGrid;
|
||||
import org.bukkit.generator.ChunkGenerator.ChunkData;
|
||||
|
||||
import com.volmit.iris.Iris;
|
||||
import com.volmit.iris.object.IrisBiome;
|
||||
import com.volmit.iris.util.B;
|
||||
import com.volmit.iris.util.HeightMap;
|
||||
@@ -118,6 +119,7 @@ public class AtomicSliver
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
setSilently(h, d);
|
||||
modified = true;
|
||||
lock.lock();
|
||||
@@ -134,6 +136,7 @@ public class AtomicSliver
|
||||
|
||||
if(d == null)
|
||||
{
|
||||
Iris.warn("Null set at " + h + " of " + x + " " + z);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -361,14 +364,16 @@ public class AtomicSliver
|
||||
return;
|
||||
}
|
||||
lock.lock();
|
||||
for(int i = 0; i < 256; i++)
|
||||
|
||||
for(int i : block.keySet())
|
||||
{
|
||||
if(block.get(i) != null && !block.get(i).equals(AIR))
|
||||
BlockData b = block.get(i);
|
||||
if(b != null)
|
||||
{
|
||||
BlockData b = block.get(i);
|
||||
currentData.setBlock(x, i, z, b);
|
||||
}
|
||||
}
|
||||
|
||||
lock.unlock();
|
||||
}
|
||||
|
||||
|
||||
@@ -22,20 +22,28 @@ public class GenLayerBiome extends GenLayer
|
||||
{
|
||||
private CNG regionGenerator;
|
||||
private CNG bridgeGenerator;
|
||||
private RNG lakeRandom;
|
||||
private RNG riverRandom;
|
||||
private BiomeDataProvider seaProvider;
|
||||
private BiomeDataProvider landProvider;
|
||||
private BiomeDataProvider shoreProvider;
|
||||
private BiomeDataProvider caveProvider;
|
||||
private BiomeDataProvider riverProvider;
|
||||
private BiomeDataProvider lakeProvider;
|
||||
private DimensionChunkGenerator iris;
|
||||
|
||||
public GenLayerBiome(DimensionChunkGenerator iris, RNG rng)
|
||||
{
|
||||
super(iris, rng);
|
||||
this.iris = iris;
|
||||
riverRandom = iris.getMasterRandom().nextParallelRNG(-324778);
|
||||
lakeRandom = iris.getMasterRandom().nextParallelRNG(-868778);
|
||||
seaProvider = new BiomeDataProvider(this, InferredType.SEA, rng);
|
||||
landProvider = new BiomeDataProvider(this, InferredType.LAND, rng);
|
||||
shoreProvider = new BiomeDataProvider(this, InferredType.SHORE, rng);
|
||||
caveProvider = new BiomeDataProvider(this, InferredType.CAVE, rng);
|
||||
riverProvider = new BiomeDataProvider(this, InferredType.RIVER, rng);
|
||||
lakeProvider = new BiomeDataProvider(this, InferredType.LAKE, rng);
|
||||
regionGenerator = iris.getDimension().getRegionStyle().create(rng.nextParallelRNG(1188519)).bake().scale(1D / iris.getDimension().getRegionZoom());
|
||||
bridgeGenerator = iris.getDimension().getContinentalStyle().create(rng.nextParallelRNG(1541462)).bake().scale(1D / iris.getDimension().getContinentZoom());
|
||||
}
|
||||
@@ -86,6 +94,16 @@ public class GenLayerBiome extends GenLayer
|
||||
return caveProvider;
|
||||
}
|
||||
|
||||
else if(type.equals(InferredType.RIVER))
|
||||
{
|
||||
return riverProvider;
|
||||
}
|
||||
|
||||
else if(type.equals(InferredType.LAKE))
|
||||
{
|
||||
return lakeProvider;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
Iris.error("Cannot find a BiomeDataProvider for type " + type.name());
|
||||
@@ -99,12 +117,13 @@ public class GenLayerBiome extends GenLayer
|
||||
return generateData(getType(bx, bz, regionData), bx, bz, rawX, rawZ, regionData);
|
||||
}
|
||||
|
||||
public InferredType getType(double bx, double bz, IrisRegion regionData)
|
||||
public InferredType getType(double bx, double bz, IrisRegion region)
|
||||
{
|
||||
double x = bx;
|
||||
double z = bz;
|
||||
double c = iris.getDimension().getLandChance();
|
||||
InferredType bridge;
|
||||
|
||||
if(c >= 1)
|
||||
{
|
||||
bridge = InferredType.LAND;
|
||||
@@ -117,6 +136,16 @@ public class GenLayerBiome extends GenLayer
|
||||
|
||||
bridge = bridgeGenerator.fitDouble(0, 1, x, z) < c ? InferredType.LAND : InferredType.SEA;
|
||||
|
||||
if(bridge.equals(InferredType.LAND) && region.isLake(lakeRandom, x, z))
|
||||
{
|
||||
bridge = InferredType.LAKE;
|
||||
}
|
||||
|
||||
if(bridge.equals(InferredType.LAND) && region.isRiver(riverRandom, x, z))
|
||||
{
|
||||
bridge = InferredType.RIVER;
|
||||
}
|
||||
|
||||
return bridge;
|
||||
}
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ public class PostFloatingNibDeleter extends IrisPostBlockFilter
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
int ha = highestTerrainBlock(x + 1, z);
|
||||
int hb = highestTerrainBlock(x, z + 1);
|
||||
int hc = highestTerrainBlock(x - 1, z);
|
||||
|
||||
Reference in New Issue
Block a user