mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-18 18:23:06 +00:00
New biome system
This commit is contained in:
parent
199a26afbc
commit
5d6348b83c
@ -7,6 +7,7 @@ import org.bukkit.ChatColor;
|
|||||||
import org.bukkit.Chunk;
|
import org.bukkit.Chunk;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.block.Biome;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandExecutor;
|
import org.bukkit.command.CommandExecutor;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
|
@ -12,7 +12,7 @@ public class Settings
|
|||||||
public static class PerformanceSettings
|
public static class PerformanceSettings
|
||||||
{
|
{
|
||||||
public PerformanceMode performanceMode = PerformanceMode.DOUBLE_CPU;
|
public PerformanceMode performanceMode = PerformanceMode.DOUBLE_CPU;
|
||||||
public ObjectMode objectMode = ObjectMode.NONE;
|
public ObjectMode objectMode = ObjectMode.PARALLAX;
|
||||||
public boolean fastMode = false;
|
public boolean fastMode = false;
|
||||||
public int threadPriority = Thread.MAX_PRIORITY;
|
public int threadPriority = Thread.MAX_PRIORITY;
|
||||||
public int threadCount = 4;
|
public int threadCount = 4;
|
||||||
|
@ -126,11 +126,19 @@ public class PackController implements IrisController
|
|||||||
|
|
||||||
if(j.isSnowy())
|
if(j.isSnowy())
|
||||||
{
|
{
|
||||||
GenObjectGroup ggx = genObjectGroups.get(k).copy("-snowy-" + j.getSnow());
|
try
|
||||||
ggx.applySnowFilter((int) (j.getSnow() * 4));
|
{
|
||||||
d.registerObject(ggx);
|
GenObjectGroup ggx = genObjectGroups.get(k).copy("-snowy-" + j.getSnow());
|
||||||
j.getSchematicGroups().put(ggx.getName(), j.getSchematicGroups().get(k));
|
ggx.applySnowFilter((int) (j.getSnow() * 4));
|
||||||
j.getSchematicGroups().remove(k);
|
d.registerObject(ggx);
|
||||||
|
j.getSchematicGroups().put(ggx.getName(), j.getSchematicGroups().get(k));
|
||||||
|
j.getSchematicGroups().remove(k);
|
||||||
|
}
|
||||||
|
|
||||||
|
catch(Throwable e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,6 @@ import ninja.bytecode.iris.util.InterpolationMode;
|
|||||||
import ninja.bytecode.iris.util.IrisInterpolation;
|
import ninja.bytecode.iris.util.IrisInterpolation;
|
||||||
import ninja.bytecode.iris.util.MB;
|
import ninja.bytecode.iris.util.MB;
|
||||||
import ninja.bytecode.iris.util.ObjectMode;
|
import ninja.bytecode.iris.util.ObjectMode;
|
||||||
import ninja.bytecode.iris.util.PolygonGenerator;
|
|
||||||
import ninja.bytecode.iris.util.SChunkVector;
|
import ninja.bytecode.iris.util.SChunkVector;
|
||||||
import ninja.bytecode.shuriken.bench.PrecisionStopwatch;
|
import ninja.bytecode.shuriken.bench.PrecisionStopwatch;
|
||||||
import ninja.bytecode.shuriken.collections.GList;
|
import ninja.bytecode.shuriken.collections.GList;
|
||||||
@ -122,8 +121,8 @@ public class IrisGenerator extends ParallaxWorldGenerator
|
|||||||
}
|
}
|
||||||
random = new Random(world.getSeed());
|
random = new Random(world.getSeed());
|
||||||
rTerrain = new RNG(world.getSeed());
|
rTerrain = new RNG(world.getSeed());
|
||||||
swirl = new CNG(rTerrain.nextParallelRNG(0), 40, 1).scale(0.012);
|
swirl = new CNG(rTerrain.nextParallelRNG(0), 40, 1).scale(0.007);
|
||||||
beach = new CNG(rTerrain.nextParallelRNG(0), 6, 1).scale(0.15);
|
beach = new CNG(rTerrain.nextParallelRNG(0), 3, 1).scale(0.15);
|
||||||
glLNoise = new GenLayerLayeredNoise(this, world, random, rTerrain.nextParallelRNG(2));
|
glLNoise = new GenLayerLayeredNoise(this, world, random, rTerrain.nextParallelRNG(2));
|
||||||
glBiome = new GenLayerBiome(this, world, random, rTerrain.nextParallelRNG(4), dim.getBiomes());
|
glBiome = new GenLayerBiome(this, world, random, rTerrain.nextParallelRNG(4), dim.getBiomes());
|
||||||
glSnow = new GenLayerSnow(this, world, random, rTerrain.nextParallelRNG(5));
|
glSnow = new GenLayerSnow(this, world, random, rTerrain.nextParallelRNG(5));
|
||||||
@ -282,7 +281,46 @@ public class IrisGenerator extends ParallaxWorldGenerator
|
|||||||
return hits;
|
return hits;
|
||||||
}
|
}
|
||||||
|
|
||||||
PolygonGenerator pg = new PolygonGenerator(RNG.r, 2, 0.013, 1, (g) -> g);
|
public IrisBiome getBiome(int x, int z)
|
||||||
|
{
|
||||||
|
IrisBiome biome = glBiome.getBiome(x, z);
|
||||||
|
int height = computeHeight((int) x, (int) z, new ChunkPlan(), biome);
|
||||||
|
biome = getBiome((int) x, height, (int) z);
|
||||||
|
|
||||||
|
return biome;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IrisBiome getBiome(int x, int y, int z)
|
||||||
|
{
|
||||||
|
int seaLevel = Iris.settings.gen.seaLevel;
|
||||||
|
boolean land = y >= seaLevel;
|
||||||
|
int beachHeight = land ? 1 + (int) Math.round(seaLevel + beach.noise(x, z)) : seaLevel;
|
||||||
|
boolean beach = y <= beachHeight && land;
|
||||||
|
IrisBiome biome = glBiome.getBiome(x, z);
|
||||||
|
IrisBiome realBiome = glBiome.getBiome(x, z, true);
|
||||||
|
boolean nearAquatic = glBiome.isNearAquatic(x, z);
|
||||||
|
IrisRegion region = getRegion(realBiome);
|
||||||
|
|
||||||
|
// Remove Oceans from biomes above sea level
|
||||||
|
if(land && biome.getType().equals(BiomeType.FLUID))
|
||||||
|
{
|
||||||
|
biome = realBiome;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add Beaches & Shores
|
||||||
|
if(beach && biome.getType().equals(BiomeType.LAND))
|
||||||
|
{
|
||||||
|
biome = nearAquatic ? region.getBeach() : region.getShore();
|
||||||
|
}
|
||||||
|
|
||||||
|
// // Replace biomes under sea level with lakes
|
||||||
|
if(!land && biome.getType().equals(BiomeType.LAND))
|
||||||
|
{
|
||||||
|
biome = region.getLake();
|
||||||
|
}
|
||||||
|
|
||||||
|
return biome;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Biome onGenColumn(int wxxf, int wzxf, int x, int z, ChunkPlan plan, AtomicChunkData data, boolean surfaceOnly)
|
public Biome onGenColumn(int wxxf, int wzxf, int x, int z, ChunkPlan plan, AtomicChunkData data, boolean surfaceOnly)
|
||||||
@ -301,19 +339,10 @@ public class IrisGenerator extends ParallaxWorldGenerator
|
|||||||
int highest = 0;
|
int highest = 0;
|
||||||
int seaLevel = Iris.settings.gen.seaLevel;
|
int seaLevel = Iris.settings.gen.seaLevel;
|
||||||
IrisBiome biome = glBiome.getBiome(wxx, wzx);
|
IrisBiome biome = glBiome.getBiome(wxx, wzx);
|
||||||
IrisBiome realBiome = glBiome.getBiome(wxx, wzx, true);
|
|
||||||
IrisRegion region = getRegion(realBiome);
|
|
||||||
MB FLUID = biome.getFluid();
|
|
||||||
int height = computeHeight(wxx, wzx, plan, biome);
|
int height = computeHeight(wxx, wzx, plan, biome);
|
||||||
int max = Math.max(height, seaLevel);
|
int max = Math.max(height, seaLevel);
|
||||||
boolean land = height >= seaLevel;
|
biome = getBiome(wxx, height, wzx);
|
||||||
int beachHeight = land ? (int) Math.round(seaLevel + beach.noise(wx, wz)) : seaLevel;
|
MB FLUID = biome.getFluid();
|
||||||
boolean beach = height <= beachHeight + 2 && land;
|
|
||||||
biome = land && biome.getType().equals(BiomeType.FLUID) ? region.getBeach() : biome;
|
|
||||||
biome = !land && biome.getType().equals(BiomeType.LAND) ? region.getLake() : biome;
|
|
||||||
biome = beach && !land && biome.getType().equals(BiomeType.FLUID) ? region.getShore() : biome;
|
|
||||||
// biome = !beach && land && biome.getType().equals(BiomeType.FRONT) ? realBiome
|
|
||||||
// : biome;
|
|
||||||
|
|
||||||
for(int i = surfaceOnly ? max > seaLevel ? max - 2 : height - 2 : 0; i < max; i++)
|
for(int i = surfaceOnly ? max > seaLevel ? max - 2 : height - 2 : 0; i < max; i++)
|
||||||
{
|
{
|
||||||
|
@ -20,6 +20,7 @@ import ninja.bytecode.shuriken.collections.GMap;
|
|||||||
|
|
||||||
public class WorldReactor
|
public class WorldReactor
|
||||||
{
|
{
|
||||||
|
private static GList<ChronoQueue> q = new GList<>();
|
||||||
private final World world;
|
private final World world;
|
||||||
|
|
||||||
public WorldReactor(World world)
|
public WorldReactor(World world)
|
||||||
@ -29,7 +30,15 @@ public class WorldReactor
|
|||||||
|
|
||||||
public void generateRegionNormal(Player p, boolean force, double mst, Consumer<Double> progress, Runnable done)
|
public void generateRegionNormal(Player p, boolean force, double mst, Consumer<Double> progress, Runnable done)
|
||||||
{
|
{
|
||||||
|
for(ChronoQueue i : WorldReactor.q)
|
||||||
|
{
|
||||||
|
i.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
WorldReactor.q.clear();
|
||||||
|
|
||||||
ChronoQueue q = new ChronoQueue(mst, 10240);
|
ChronoQueue q = new ChronoQueue(mst, 10240);
|
||||||
|
WorldReactor.q.add(q);
|
||||||
FinalDouble of = new FinalDouble(0D);
|
FinalDouble of = new FinalDouble(0D);
|
||||||
FinalDouble max = new FinalDouble(0D);
|
FinalDouble max = new FinalDouble(0D);
|
||||||
GMap<SMCAVector, Double> d = new GMap<>();
|
GMap<SMCAVector, Double> d = new GMap<>();
|
||||||
|
@ -584,7 +584,7 @@ public class GenObject
|
|||||||
{
|
{
|
||||||
BlockVector mbv = highest.toBlockVector().add(new Vector(0, 1, 0)).toBlockVector();
|
BlockVector mbv = highest.toBlockVector().add(new Vector(0, 1, 0)).toBlockVector();
|
||||||
added = true;
|
added = true;
|
||||||
getSchematic().put(new SBlockVector(mbv), MB.of(Material.SNOW, RNG.r.nextInt((int) M.clip(factor, 0, 8))));
|
getSchematic().put(new SBlockVector(mbv), MB.of(Material.SNOW, RNG.r.nextInt((int) M.clip(factor, 1, 8))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@ public class GenLayerBiome extends GenLayer
|
|||||||
.scale(0.01), 30));
|
.scale(0.01), 30));
|
||||||
ocean = new PolygonGenerator(rng.nextParallelRNG(-11), 6, 0.005, 1, (g)->g.fractureWith(new CNG(rng.nextParallelRNG(34), 1D, 2)
|
ocean = new PolygonGenerator(rng.nextParallelRNG(-11), 6, 0.005, 1, (g)->g.fractureWith(new CNG(rng.nextParallelRNG(34), 1D, 2)
|
||||||
.scale(0.01), 150));
|
.scale(0.01), 150));
|
||||||
fuzz = new CNG(rng.nextParallelRNG(9112), 1D * 8 * Iris.settings.gen.biomeEdgeFuzzScale, 1).scale(6.5);
|
fuzz = new CNG(rng.nextParallelRNG(9112), 1D * 12 * Iris.settings.gen.biomeEdgeFuzzScale, 1).scale(6.5);
|
||||||
fracture = new CNG(rng.nextParallelRNG(28), 1D, 4).scale(0.0021 * Iris.settings.gen.biomeEdgeScrambleScale)
|
fracture = new CNG(rng.nextParallelRNG(28), 1D, 4).scale(0.0021 * Iris.settings.gen.biomeEdgeScrambleScale)
|
||||||
.fractureWith(new CNG(rng.nextParallelRNG(34), 1D, 2)
|
.fractureWith(new CNG(rng.nextParallelRNG(34), 1D, 2)
|
||||||
.scale(0.01), 12250);
|
.scale(0.01), 12250);
|
||||||
@ -89,6 +89,48 @@ public class GenLayerBiome extends GenLayer
|
|||||||
return getBiome(wxx, wzx, false);
|
return getBiome(wxx, wzx, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isNearAquatic(int wxx, int wzx)
|
||||||
|
{
|
||||||
|
double wx = Math.round((double) wxx * (Iris.settings.gen.horizontalZoom / 1.90476190476)) * Iris.settings.gen.biomeScale;
|
||||||
|
double wz = Math.round((double) wzx * (Iris.settings.gen.horizontalZoom / 1.90476190476)) * Iris.settings.gen.biomeScale;
|
||||||
|
double xf = wx + ((fracture.noise(wx, wz) / 2D) * 200D * Iris.settings.gen.biomeEdgeScrambleRange);
|
||||||
|
double zf = wz - ((fracture.noise(wz, wx) / 2D) * 200D * Iris.settings.gen.biomeEdgeScrambleRange);
|
||||||
|
double x = xf - fuzz.noise(wx, wz);
|
||||||
|
double z = zf + fuzz.noise(wz, wx);
|
||||||
|
|
||||||
|
if(ocean.getIndex(x, z) == 0)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(channel.hasBorder(3, 44, xf, zf))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ocean.getClosestNeighbor(x, z) > 0.2)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(channel.getClosestNeighbor(x, z) > 0.2)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ocean.hasBorder(3, 7, x, z) || ocean.hasBorder(3, 3, x, z))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(channel.hasBorder(3, 7, xf, zf) || channel.hasBorder(3, 3, xf, zf))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public IrisBiome getBiome(double wxx, double wzx, boolean real)
|
public IrisBiome getBiome(double wxx, double wzx, boolean real)
|
||||||
{
|
{
|
||||||
double wx = Math.round((double) wxx * (Iris.settings.gen.horizontalZoom / 1.90476190476)) * Iris.settings.gen.biomeScale;
|
double wx = Math.round((double) wxx * (Iris.settings.gen.horizontalZoom / 1.90476190476)) * Iris.settings.gen.biomeScale;
|
||||||
|
@ -38,7 +38,7 @@ public class IrisRegion
|
|||||||
J.attempt(() -> ocean = Iris.getController(PackController.class).getBiomeById(o.getString("ocean")));
|
J.attempt(() -> ocean = Iris.getController(PackController.class).getBiomeById(o.getString("ocean")));
|
||||||
J.attempt(() -> beach = Iris.getController(PackController.class).getBiomeById(o.getString("beach")));
|
J.attempt(() -> beach = Iris.getController(PackController.class).getBiomeById(o.getString("beach")));
|
||||||
J.attempt(() -> lake = Iris.getController(PackController.class).getBiomeById(o.getString("lake")));
|
J.attempt(() -> lake = Iris.getController(PackController.class).getBiomeById(o.getString("lake")));
|
||||||
J.attempt(() -> lakeBeach = Iris.getController(PackController.class).getBiomeById(o.getString("lakeBeach")));
|
J.attempt(() -> lakeBeach = Iris.getController(PackController.class).getBiomeById(o.getString("shore")));
|
||||||
J.attempt(() -> channel = Iris.getController(PackController.class).getBiomeById(o.getString("channel")));
|
J.attempt(() -> channel = Iris.getController(PackController.class).getBiomeById(o.getString("channel")));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ import org.bukkit.Bukkit;
|
|||||||
|
|
||||||
import ninja.bytecode.iris.Iris;
|
import ninja.bytecode.iris.Iris;
|
||||||
import ninja.bytecode.shuriken.bench.PrecisionStopwatch;
|
import ninja.bytecode.shuriken.bench.PrecisionStopwatch;
|
||||||
|
import ninja.bytecode.shuriken.execution.J;
|
||||||
import ninja.bytecode.shuriken.execution.Queue;
|
import ninja.bytecode.shuriken.execution.Queue;
|
||||||
import ninja.bytecode.shuriken.execution.ShurikenQueue;
|
import ninja.bytecode.shuriken.execution.ShurikenQueue;
|
||||||
import ninja.bytecode.shuriken.logging.L;
|
import ninja.bytecode.shuriken.logging.L;
|
||||||
@ -29,7 +30,7 @@ public class ChronoQueue
|
|||||||
|
|
||||||
public void close()
|
public void close()
|
||||||
{
|
{
|
||||||
Bukkit.getScheduler().cancelTask(j);
|
J.attempt(() -> Bukkit.getScheduler().cancelTask(j));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void dieSlowly()
|
public void dieSlowly()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user