mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2026-04-05 23:36:12 +00:00
Biome specific generators
This commit is contained in:
@@ -8,12 +8,10 @@ import org.bukkit.World;
|
||||
import org.bukkit.block.Biome;
|
||||
import org.bukkit.generator.BlockPopulator;
|
||||
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import ninja.bytecode.iris.Iris;
|
||||
import ninja.bytecode.iris.controller.PackController;
|
||||
import ninja.bytecode.iris.generator.genobject.GenObjectDecorator;
|
||||
import ninja.bytecode.iris.generator.genobject.GenObjectGroup;
|
||||
import ninja.bytecode.iris.generator.layer.GenLayerBase;
|
||||
import ninja.bytecode.iris.generator.layer.BiomeNoiseGenerator;
|
||||
import ninja.bytecode.iris.generator.layer.GenLayerBiome;
|
||||
import ninja.bytecode.iris.generator.layer.GenLayerCarving;
|
||||
import ninja.bytecode.iris.generator.layer.GenLayerCaverns;
|
||||
@@ -21,6 +19,7 @@ import ninja.bytecode.iris.generator.layer.GenLayerCaves;
|
||||
import ninja.bytecode.iris.generator.layer.GenLayerCliffs;
|
||||
import ninja.bytecode.iris.generator.layer.GenLayerLayeredNoise;
|
||||
import ninja.bytecode.iris.generator.layer.GenLayerSnow;
|
||||
import ninja.bytecode.iris.pack.BiomeType;
|
||||
import ninja.bytecode.iris.pack.CompiledDimension;
|
||||
import ninja.bytecode.iris.pack.IrisBiome;
|
||||
import ninja.bytecode.iris.pack.IrisRegion;
|
||||
@@ -30,7 +29,6 @@ import ninja.bytecode.iris.util.IrisInterpolation;
|
||||
import ninja.bytecode.iris.util.MB;
|
||||
import ninja.bytecode.iris.util.ParallelChunkGenerator;
|
||||
import ninja.bytecode.shuriken.collections.GList;
|
||||
import ninja.bytecode.shuriken.collections.GMap;
|
||||
import ninja.bytecode.shuriken.logging.L;
|
||||
import ninja.bytecode.shuriken.math.CNG;
|
||||
import ninja.bytecode.shuriken.math.M;
|
||||
@@ -59,24 +57,21 @@ public class IrisGenerator extends ParallelChunkGenerator
|
||||
|
||||
private double[][][] scatterCache;
|
||||
private CNG scatter;
|
||||
public GMap<String, IrisBiome> biomeCache = new GMap<>();
|
||||
private MB WATER = new MB(Material.STATIONARY_WATER);
|
||||
private MB ICE = new MB(Material.ICE);
|
||||
private MB PACKED_ICE = new MB(Material.PACKED_ICE);
|
||||
private MB WATER = new MB(Material.STATIONARY_WATER);
|
||||
private MB BEDROCK = new MB(Material.BEDROCK);
|
||||
private GList<IrisBiome> internal;
|
||||
private GenLayerLayeredNoise glLNoise;
|
||||
private GenLayerBiome glBiome;
|
||||
private GenLayerCaves glCaves;
|
||||
private GenLayerCarving glCarving;
|
||||
private GenLayerCaverns glCaverns;
|
||||
private GenLayerSnow glSnow;
|
||||
private GenLayerBase glBase;
|
||||
private BiomeNoiseGenerator glBase;
|
||||
private GenLayerCliffs glCliffs;
|
||||
private RNG rTerrain;
|
||||
private CompiledDimension dim;
|
||||
private World world;
|
||||
private GMap<String, GenObjectGroup> schematicCache = new GMap<>();
|
||||
|
||||
public IrisGenerator()
|
||||
{
|
||||
@@ -87,26 +82,6 @@ public class IrisGenerator extends ParallelChunkGenerator
|
||||
{
|
||||
this.dim = dim;
|
||||
L.i("Preparing Dimension: " + dim.getName() + " With " + dim.getBiomes().size() + " Biomes...");
|
||||
internal = IrisBiome.getAllBiomes();
|
||||
|
||||
for(IrisBiome i : dim.getBiomes())
|
||||
{
|
||||
for(IrisBiome j : internal.copy())
|
||||
{
|
||||
if(j.getName().equals(i.getName()))
|
||||
{
|
||||
internal.remove(j);
|
||||
L.i(ChatColor.LIGHT_PURPLE + "Internal Biome: " + ChatColor.WHITE + j.getName() + ChatColor.LIGHT_PURPLE + " overwritten by dimension " + ChatColor.WHITE + dim.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal.addAll(dim.getBiomes());
|
||||
|
||||
for(IrisBiome i : internal)
|
||||
{
|
||||
biomeCache.put(i.getName(), i);
|
||||
}
|
||||
}
|
||||
|
||||
public int scatterInt(int x, int y, int z, int bound)
|
||||
@@ -124,17 +99,11 @@ public class IrisGenerator extends ParallelChunkGenerator
|
||||
return scatter(x, y, z) > chance;
|
||||
}
|
||||
|
||||
public GList<IrisBiome> getLoadedBiomes()
|
||||
{
|
||||
return internal;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInit(World world, Random random)
|
||||
{
|
||||
this.world = world;
|
||||
rTerrain = new RNG(world.getSeed());
|
||||
glBase = new GenLayerBase(this, world, random, rTerrain.nextParallelRNG(1));
|
||||
glLNoise = new GenLayerLayeredNoise(this, world, random, rTerrain.nextParallelRNG(2));
|
||||
glBiome = new GenLayerBiome(this, world, random, rTerrain.nextParallelRNG(4), dim.getBiomes());
|
||||
glCaves = new GenLayerCaves(this, world, random, rTerrain.nextParallelRNG(-1));
|
||||
@@ -162,9 +131,9 @@ public class IrisGenerator extends ParallelChunkGenerator
|
||||
|
||||
int m = 0;
|
||||
|
||||
for(IrisBiome i : biomeCache.values())
|
||||
for(IrisBiome i : getDimension().getBiomes())
|
||||
{
|
||||
i.seal(getRTerrain().nextParallelRNG(1922 - m++));
|
||||
i.seal(getRTerrain().nextParallelRNG(3922 - m++));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -181,7 +150,7 @@ public class IrisGenerator extends ParallelChunkGenerator
|
||||
|
||||
public IrisBiome biome(String name)
|
||||
{
|
||||
return biomeCache.get(name);
|
||||
return getDimension().getBiomeByName(name);
|
||||
}
|
||||
|
||||
public double getOffsetX(double x)
|
||||
@@ -273,7 +242,7 @@ public class IrisGenerator extends ParallelChunkGenerator
|
||||
IrisBiome nbiome = height < 63 ? getOcean(biome, height) : biome;
|
||||
biome = nbiome;
|
||||
biome = height > 61 && height < 65 ? frozen ? biome : getBeach(biome) : biome;
|
||||
biome = height > 63 && biome.isCore() ? getBeach(biome) : biome;
|
||||
biome = height > 63 && biome.getType().equals(BiomeType.FLUID) ? getBeach(biome) : biome;
|
||||
|
||||
for(int i = 0; i < max; i++)
|
||||
{
|
||||
@@ -382,17 +351,7 @@ public class IrisGenerator extends ParallelChunkGenerator
|
||||
{
|
||||
IrisBiome biome = glBiome.getBiome(x, z);
|
||||
double h = Iris.settings.gen.baseHeight + biome.getHeight();
|
||||
|
||||
if(Iris.settings.performance.baseNoise)
|
||||
{
|
||||
h += (glBase.getHeight(x, z) * 0.5) - (0.08);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
h += 0.00001;
|
||||
}
|
||||
|
||||
h += biome.getGenerator().getHeight(x, z);
|
||||
plan.setHeight(x, z, h);
|
||||
return h;
|
||||
}
|
||||
@@ -405,16 +364,6 @@ public class IrisGenerator extends ParallelChunkGenerator
|
||||
return world;
|
||||
}
|
||||
|
||||
public GMap<String, GenObjectGroup> getSchematicCache()
|
||||
{
|
||||
return schematicCache;
|
||||
}
|
||||
|
||||
public void setSchematicCache(GMap<String, GenObjectGroup> schematicCache)
|
||||
{
|
||||
this.schematicCache = schematicCache;
|
||||
}
|
||||
|
||||
public RNG getRTerrain()
|
||||
{
|
||||
return rTerrain;
|
||||
|
||||
@@ -35,7 +35,7 @@ public class GenObjectDecorator extends BlockPopulator
|
||||
this.g = generator;
|
||||
populationCache = new GMap<>();
|
||||
|
||||
for(IrisBiome i : generator.getLoadedBiomes())
|
||||
for(IrisBiome i : generator.getDimension().getBiomes())
|
||||
{
|
||||
GMap<GenObjectGroup, Double> gc = new GMap<>();
|
||||
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
package ninja.bytecode.iris.generator.layer;
|
||||
|
||||
import ninja.bytecode.iris.pack.IrisBiome;
|
||||
import ninja.bytecode.iris.util.GenLayer;
|
||||
import ninja.bytecode.shuriken.math.CNG;
|
||||
import ninja.bytecode.shuriken.math.RNG;
|
||||
|
||||
public class BiomeNoiseGenerator
|
||||
{
|
||||
protected IrisBiome biome;
|
||||
protected CNG gen;
|
||||
private double block = 1D / 255D;
|
||||
|
||||
public BiomeNoiseGenerator(RNG rng, IrisBiome biome)
|
||||
{
|
||||
this.biome = biome;
|
||||
//@builder
|
||||
gen = new CNG(rng.nextParallelRNG(31289 - biome.getName().length() * biome.getRealBiome().ordinal()), 1D, 1)
|
||||
.scale(0.0075 * biome.getGenScale())
|
||||
.fractureWith(new CNG(rng.nextParallelRNG(2922 * biome.getName().length() - biome.getRealBiome().ordinal()), 1D, 1)
|
||||
.scale(0.0075 * biome.getGenSwirlScale()), 20D * biome.getGenSwirl());
|
||||
//@done
|
||||
}
|
||||
|
||||
public double getHeight(double x, double z)
|
||||
{
|
||||
if(biome.getGenAmplifier() == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
double r = block * 52;
|
||||
double m = biome.getGenAmplifier() < 1D ? (r - (biome.getGenAmplifier() * r)) : 0;
|
||||
return (gen.noise(x, z) * biome.getGenAmplifier() * r) + m;
|
||||
}
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
package ninja.bytecode.iris.generator.layer;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
import org.bukkit.World;
|
||||
|
||||
import ninja.bytecode.iris.Iris;
|
||||
import ninja.bytecode.iris.generator.IrisGenerator;
|
||||
import ninja.bytecode.iris.util.GenLayer;
|
||||
import ninja.bytecode.shuriken.math.CNG;
|
||||
import ninja.bytecode.shuriken.math.M;
|
||||
import ninja.bytecode.shuriken.math.RNG;
|
||||
|
||||
public class GenLayerBase extends GenLayer
|
||||
{
|
||||
private CNG gen;
|
||||
private CNG fracture;
|
||||
private CNG hfracture;
|
||||
private CNG height;
|
||||
private CNG superheight;
|
||||
|
||||
public GenLayerBase(IrisGenerator iris, World world, Random random, RNG rng)
|
||||
{
|
||||
//@builder
|
||||
super(iris, world, random, rng);
|
||||
hfracture = new CNG(rng.nextParallelRNG(6), 1, 2)
|
||||
.scale(0.0024);
|
||||
gen = new CNG(rng.nextParallelRNG(7), 0.24D, 7)
|
||||
.scale(0.0072)
|
||||
.amp(0.5)
|
||||
.freq(1.1)
|
||||
.fractureWith(new CNG(rng.nextParallelRNG(8), 1, 6)
|
||||
.scale(0.0007)
|
||||
.injectWith(CNG.MULTIPLY)
|
||||
.child(new CNG(rng.nextParallelRNG(9), 0.745, 2)
|
||||
.scale(0.001)), 44);
|
||||
height = new CNG(rng.nextParallelRNG(10), 1, 8)
|
||||
.scale(0.0017601 * Iris.settings.gen.heightScale)
|
||||
.fractureWith(new CNG(rng.nextParallelRNG(11), 1, 6)
|
||||
.scale(0.0174)
|
||||
.fractureWith(new CNG(rng.nextParallelRNG(12), 1, 1)
|
||||
.scale(0.0034), 31)
|
||||
.scale(0.066), 58);
|
||||
superheight = new CNG(rng.nextParallelRNG(13), 1, 6)
|
||||
.scale(0.0125)
|
||||
.fractureWith(new CNG(rng.nextParallelRNG(14), 1, 1)
|
||||
.scale(0.013), 250);
|
||||
fracture = new CNG(rng.nextParallelRNG(15), 0.6D, 4)
|
||||
.scale(0.01);
|
||||
//@done
|
||||
}
|
||||
|
||||
public double getHeight(double x, double z)
|
||||
{
|
||||
return M.clip(Math.pow(height.noise(x + (hfracture.noise(x, z) * Iris.settings.gen.heightFracture), z + (hfracture.noise(z, x) * Iris.settings.gen.heightFracture)), Iris.settings.gen.heightExponentBase + (superheight.noise(x, z) * Iris.settings.gen.heightExponentMultiplier)) * Iris.settings.gen.heightMultiplier, 0D, 1D);
|
||||
}
|
||||
|
||||
@Override
|
||||
public double generateLayer(double gnoise, double dx, double dz)
|
||||
{
|
||||
double noise = gnoise + getHeight(dx, dz);
|
||||
double fnoise = fracture.noise(dx, dz);
|
||||
dx += (fnoise * 44);
|
||||
dz -= (fnoise * 44);
|
||||
return ((noise * 0.185) + (gen.noise(dx, dz) * (0.15 + (noise * 0.65))));
|
||||
}
|
||||
}
|
||||
@@ -28,9 +28,16 @@ public class GenLayerBiome extends GenLayer
|
||||
public GenLayerBiome(IrisGenerator iris, World world, Random random, RNG rng, GList<IrisBiome> biomes)
|
||||
{
|
||||
super(iris, world, random, rng);
|
||||
island = new CNG(rng.nextParallelRNG(10334), 1D, 3).scale(0.003 * Iris.settings.gen.landScale).fractureWith(new CNG(rng.nextParallelRNG(34), 1D, 12).scale(0.6), 180);
|
||||
fracture = new CNG(rng.nextParallelRNG(28), 1D, 24).scale(0.0021).fractureWith(new CNG(rng.nextParallelRNG(34), 1D, 12).scale(0.01), 12250);
|
||||
factory = (g) -> g.fractureWith(new CNG(rng.nextParallelRNG(29), 1D, 4).scale(0.02), 56);
|
||||
//@builder
|
||||
island = new CNG(rng.nextParallelRNG(10334), 1D, 1)
|
||||
.scale(0.003 * Iris.settings.gen.landScale)
|
||||
.fractureWith(new CNG(rng.nextParallelRNG(1211), 1D, 1).scale(0.0001 * Iris.settings.gen.landScale), 600);
|
||||
fracture = new CNG(rng.nextParallelRNG(28), 1D, 4).scale(0.0021)
|
||||
.fractureWith(new CNG(rng.nextParallelRNG(34), 1D, 2)
|
||||
.scale(0.01), 12250);
|
||||
factory = (g) -> g.fractureWith(new CNG(rng.nextParallelRNG(29), 1D, 4)
|
||||
.scale(0.02), 56);
|
||||
//@done
|
||||
regions = new GMap<>();
|
||||
|
||||
for(IrisBiome i : biomes)
|
||||
@@ -61,18 +68,6 @@ public class GenLayerBiome extends GenLayer
|
||||
v += 13 - i.getName().length();
|
||||
i.setGen(new EnumPolygonGenerator<IrisBiome>(rng.nextParallelRNG(33 + v), 0.000255 * i.getBiomes().size() * Iris.settings.gen.biomeScale, 1, i.getBiomes().toArray(new IrisBiome[i.getBiomes().size()]), factory));
|
||||
}
|
||||
|
||||
int m = 0;
|
||||
|
||||
for(IrisRegion i : regions.values())
|
||||
{
|
||||
for(IrisBiome j : i.getBiomes())
|
||||
{
|
||||
j.seal(iris.getRTerrain().nextParallelRNG(3922 - m++));
|
||||
}
|
||||
|
||||
i.getBeach().seal(iris.getRTerrain().nextParallelRNG(3922 - m++));
|
||||
}
|
||||
}
|
||||
|
||||
public boolean hasBorder(int checks, double distance, double... dims)
|
||||
@@ -142,7 +137,7 @@ public class GenLayerBiome extends GenLayer
|
||||
cbi = getRegionGenerator(x, z).getChoice(x, z);
|
||||
}
|
||||
|
||||
else if(land < 0.4)
|
||||
else if(land < 0.1)
|
||||
{
|
||||
cbi = iris.biome("Deep Ocean");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user