This commit is contained in:
Daniel Mills 2020-10-22 17:57:01 -04:00
parent a4d72eefbc
commit bfe7cf0ed7
12 changed files with 332 additions and 23 deletions

View File

@ -1,4 +1,3 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" <project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

View File

@ -82,6 +82,7 @@ public class Iris extends MortarPlugin
public Iris() public Iris()
{ {
instance = this;
INMS.get(); INMS.get();
IO.delete(new File("iris")); IO.delete(new File("iris"));
lowMemoryMode = Runtime.getRuntime().maxMemory() < 4000000000L; // 4 * 1000 * 1000 * 1000 // 4gb lowMemoryMode = Runtime.getRuntime().maxMemory() < 4000000000L; // 4 * 1000 * 1000 * 1000 // 4gb

View File

@ -104,14 +104,7 @@ public abstract class ParallelTerrainProvider extends DimensionalTerrainProvider
getMetrics().getTerrain().put(p.getMilliseconds()); getMetrics().getTerrain().put(p.getMilliseconds());
p = PrecisionStopwatch.start(); p = PrecisionStopwatch.start();
onPostGenerate(random, x, z, terrain, height, biomeMap, map); onPostGenerate(random, x, z, terrain, height, biomeMap, map);
return GeneratedChunk.builder() return GeneratedChunk.builder().biomeMap(biomeMap).sliverMap(map).height(height).terrain(terrain).x(x).z(z).build();
.biomeMap(biomeMap)
.sliverMap(map)
.height(height)
.terrain(terrain)
.x(x)
.z(z)
.build();
} }
protected void onClose() protected void onClose()

View File

@ -1,18 +1,131 @@
package com.volmit.iris.generator.scaffold; package com.volmit.iris.generator;
import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
import com.volmit.iris.generator.atomics.HeightHunk;
import com.volmit.iris.generator.atomics.TerrainHunk; import com.volmit.iris.generator.atomics.TerrainHunk;
import com.volmit.iris.generator.scaffold.TerrainStream;
import com.volmit.iris.noise.CNG;
import com.volmit.iris.object.NoiseStyle;
import com.volmit.iris.util.RNG;
public class IrisTerrainStream implements TerrainStream public class IrisTerrainStream implements TerrainStream
{ {
private CNG cng = NoiseStyle.IRIS_DOUBLE.create(new RNG(1234)).scale(0.5);
private static final BlockData STONE = Material.STONE.createBlockData();
@Override @Override
public TerrainHunk generate(int x1, int z1, int x2, int z2) public long getSeed()
{ {
return null; return 0;
} }
@Override @Override
public TerrainHunk generate(int x, int z) public int getHeight()
{ {
return null; return 64;
}
@Override
public int getNoise(int x, int z)
{
return (int) Math.round(cng.fitDouble(0, getHeight() - 1, (double) x, (double) z));
}
@Override
public HeightHunk genNoise(int x1, int z1, int x2, int z2)
{
HeightHunk b = new HeightHunk(x2 - x1, z2 - z1);
for(int i = 0; i < b.getW(); i++)
{
for(int j = 0; j < b.getD(); j++)
{
b.setHeight(i, getNoise(i + x1, j + z1), j);
}
}
return b;
}
@Override
public TerrainHunk genCarving(int x1, int z1, int x2, int z2, HeightHunk noise)
{
TerrainHunk t = new TerrainHunk(noise.getW(), getHeight(), noise.getD(), noise);
for(int i = 0; i < t.getW(); i++)
{
for(int k = 0; k < t.getD(); k++)
{
int height = t.getHeight().getHeight(i, k);
for(int j = 0; j <= height; j++)
{
t.setBlock(i, j, k, STONE);
}
}
}
return t;
}
@Override
public TerrainHunk genTerrain(int x1, int z1, int x2, int z2, TerrainHunk t)
{
boolean hard = false;
int lastHard = 255;
for(int i = 0; i < t.getW(); i++)
{
for(int k = 0; k < t.getW(); k++)
{
int height = t.getHeight().getHeight(i, k);
for(int j = height; j >= 0; j--)
{
boolean _hard = !t.getBlockData(i, j, k).getMaterial().equals(Material.VOID_AIR);
if(!hard && _hard)
{
lastHard = j;
hard = true;
}
else if(hard && (!_hard || j == 0))
{
generateSurface(x1, z1, i, lastHard, k, lastHard - j, t);
hard = false;
}
}
}
}
return t;
}
protected void generateSurface(int ox, int oz, int x, int y, int z, int depth, TerrainHunk t)
{
for(int i = y; i <= (y + depth); i++)
{
if(i == y)
{
t.setBlock(x, i, z, Material.GRASS_BLOCK.createBlockData());
}
}
}
@Override
public TerrainHunk genDecorations(int x1, int z1, int x2, int z2, TerrainHunk hunk)
{
// TODO Auto-generated method stub
return hunk;
}
@Override
public TerrainHunk genParallax(int x1, int z1, int x2, int z2, TerrainHunk hunk)
{
// TODO Auto-generated method stub
return hunk;
} }
} }

View File

@ -0,0 +1,64 @@
package com.volmit.iris.generator.atomics;
public class HeightHunk extends Hunk<Byte>
{
public HeightHunk(int w, int d)
{
super(w, 1, d);
}
public void setHeight(int x, int y, int z)
{
set(x, 0, z, (byte) (y + Byte.MIN_VALUE));
}
public int getHeight(int x, int z)
{
return get(x, 0, z) - Byte.MIN_VALUE;
}
@SafeVarargs
public static HeightHunk combined(Byte defaultNode, HeightHunk... hunks)
{
int w = 0;
int d = 0;
for(HeightHunk i : hunks)
{
w = Math.max(w, i.getW());
d = Math.max(d, i.getD());
}
HeightHunk b = new HeightHunk(w, d);
b.fill((byte) (defaultNode + Byte.MIN_VALUE));
for(HeightHunk i : hunks)
{
b.insert(i);
}
return b;
}
@SafeVarargs
public static HeightHunk combined(HeightHunk... hunks)
{
int w = 0;
int d = 0;
for(HeightHunk i : hunks)
{
w = Math.max(w, i.getW());
d = Math.max(d, i.getD());
}
HeightHunk b = new HeightHunk(w, d);
for(HeightHunk i : hunks)
{
b.insert(i);
}
return b;
}
}

View File

@ -2,6 +2,10 @@ package com.volmit.iris.generator.atomics;
import org.bouncycastle.util.Arrays; import org.bouncycastle.util.Arrays;
import com.volmit.iris.util.Function3;
import com.volmit.iris.util.Supplier2;
import com.volmit.iris.util.Supplier3;
import lombok.Data; import lombok.Data;
@Data @Data
@ -132,6 +136,25 @@ public class Hunk<T>
} }
} }
public void set(int x, int z, int y1, int y2, T t)
{
set(x, x, y1, y2, z, z, t);
}
public void set(int x1, int y1, int z1, int x2, int y2, int z2, T t)
{
for(int i = x1; i <= x2; i++)
{
for(int j = y1; j <= y2; j++)
{
for(int k = z1; k <= z2; k++)
{
set(i, j, k, t);
}
}
}
}
public void set(int x, int y, int z, T t) public void set(int x, int y, int z, T t)
{ {
data[index(x, y, z)] = t; data[index(x, y, z)] = t;
@ -162,6 +185,45 @@ public class Hunk<T>
return (z * w * h) + (y * w) + x; return (z * w * h) + (y * w) + x;
} }
public void fill(int ox, int oy, int oz, Function3<Integer, Integer, Integer, T> f)
{
for(int i = ox; i < ox + getW(); i++)
{
for(int j = oy; j < oy + getH(); j++)
{
for(int k = oz; k < oz + getD(); k++)
{
set(i - ox, j - oy, k - oz, f.apply(i, j, k));
}
}
}
}
public void forEach(Supplier3<Integer, Integer, Integer> t)
{
for(int i = 0; i < getW(); i++)
{
for(int j = 0; j < getH(); j++)
{
for(int k = 0; k < getD(); k++)
{
t.get(i, j, k);
}
}
}
}
public void forEachXZ(Supplier2<Integer, Integer> t)
{
for(int i = 0; i < getW(); i++)
{
for(int k = 0; k < getD(); k++)
{
t.get(i, k);
}
}
}
public void fill(T t) public void fill(T t)
{ {
Arrays.fill(data, t); Arrays.fill(data, t);

View File

@ -7,12 +7,32 @@ import org.bukkit.generator.ChunkGenerator.BiomeGrid;
import org.bukkit.generator.ChunkGenerator.ChunkData; import org.bukkit.generator.ChunkGenerator.ChunkData;
import org.bukkit.material.MaterialData; import org.bukkit.material.MaterialData;
import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.util.KList;
import lombok.Getter;
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public class TerrainHunk extends Hunk<TerrainNode> implements BiomeGrid, ChunkData public class TerrainHunk extends Hunk<TerrainNode> implements BiomeGrid, ChunkData
{ {
@Getter
private HeightHunk height;
@Getter
private Hunk<IrisBiome> biome;
public TerrainHunk(int w, int h, int d) public TerrainHunk(int w, int h, int d)
{ {
super(w, h, d); super(w, h, d);
this.height = new HeightHunk(w, d);
this.biome = new Hunk<IrisBiome>(w, h, d);
}
public TerrainHunk(int w, int h, int d, HeightHunk hh)
{
super(w, h, d);
this.height = hh;
this.biome = new Hunk<IrisBiome>(w, h, d);
} }
@Override @Override
@ -110,7 +130,7 @@ public class TerrainHunk extends Hunk<TerrainNode> implements BiomeGrid, ChunkDa
if(n == null) if(n == null)
{ {
return Material.STONE.createBlockData(); return Material.VOID_AIR.createBlockData();
} }
return n.getBlockData(); return n.getBlockData();
@ -153,15 +173,21 @@ public class TerrainHunk extends Hunk<TerrainNode> implements BiomeGrid, ChunkDa
set(x, y, z, bio); set(x, y, z, bio);
} }
@SuppressWarnings("unchecked")
@SafeVarargs @SafeVarargs
public static TerrainHunk combined(TerrainNode defaultNode, TerrainHunk... hunks) public static TerrainHunk combined(TerrainNode defaultNode, TerrainHunk... hunks)
{ {
KList<HeightHunk> hhunks = new KList<>();
KList<Hunk<IrisBiome>> bhunks = new KList<>();
int w = 0; int w = 0;
int h = 0; int h = 0;
int d = 0; int d = 0;
for(TerrainHunk i : hunks) for(TerrainHunk i : hunks)
{ {
hhunks.add(i.getHeight());
bhunks.add(i.getBiome());
w = Math.max(w, i.getW()); w = Math.max(w, i.getW());
h = Math.max(h, i.getH()); h = Math.max(h, i.getH());
d = Math.max(d, i.getD()); d = Math.max(d, i.getD());
@ -175,18 +201,26 @@ public class TerrainHunk extends Hunk<TerrainNode> implements BiomeGrid, ChunkDa
b.insert(i); b.insert(i);
} }
b.height = HeightHunk.combined((byte) 0, hhunks.toArray(new HeightHunk[hhunks.size()]));
b.biome = Hunk.combined(null, hhunks.toArray(new Hunk[hhunks.size()]));
return b; return b;
} }
@SuppressWarnings("unchecked")
@SafeVarargs @SafeVarargs
public static TerrainHunk combined(TerrainHunk... hunks) public static TerrainHunk combined(TerrainHunk... hunks)
{ {
KList<HeightHunk> hhunks = new KList<>();
KList<Hunk<IrisBiome>> bhunks = new KList<>();
int w = 0; int w = 0;
int h = 0; int h = 0;
int d = 0; int d = 0;
for(TerrainHunk i : hunks) for(TerrainHunk i : hunks)
{ {
hhunks.add(i.getHeight());
bhunks.add(i.getBiome());
w = Math.max(w, i.getW()); w = Math.max(w, i.getW());
h = Math.max(h, i.getH()); h = Math.max(h, i.getH());
d = Math.max(d, i.getD()); d = Math.max(d, i.getD());
@ -199,6 +233,9 @@ public class TerrainHunk extends Hunk<TerrainNode> implements BiomeGrid, ChunkDa
b.insert(i); b.insert(i);
} }
b.height = HeightHunk.combined((byte) 0, hhunks.toArray(new HeightHunk[hhunks.size()]));
b.biome = Hunk.combined(null, hhunks.toArray(new Hunk[hhunks.size()]));
return b; return b;
} }
} }

View File

@ -20,17 +20,17 @@ public class TerrainNode
public TerrainNode(Biome biome, BlockData block) public TerrainNode(Biome biome, BlockData block)
{ {
this((byte) (biome.ordinal() + Byte.MIN_VALUE), (short) (paletteOf(block) + Short.MIN_VALUE)); this((byte) (biome.ordinal()), (short) (paletteOf(block)));
} }
public TerrainNode setBlockData(BlockData block) public TerrainNode setBlockData(BlockData block)
{ {
return new TerrainNode(biome, (short) (paletteOf(block) + Short.MIN_VALUE)); return new TerrainNode(biome, (short) (paletteOf(block)));
} }
public TerrainNode setBiome(Biome biome) public TerrainNode setBiome(Biome biome)
{ {
return new TerrainNode((byte) (biome.ordinal() + Byte.MIN_VALUE), block); return new TerrainNode((byte) (biome.ordinal()), block);
} }
public BlockData getBlockData() public BlockData getBlockData()

View File

@ -1,10 +1,23 @@
package com.volmit.iris.generator.scaffold; package com.volmit.iris.generator.scaffold;
import com.volmit.iris.generator.atomics.HeightHunk;
import com.volmit.iris.generator.atomics.TerrainHunk; import com.volmit.iris.generator.atomics.TerrainHunk;
public interface TerrainStream public interface TerrainStream
{ {
public TerrainHunk generate(int x1, int z1, int x2, int z2); public long getSeed();
public TerrainHunk generate(int x, int z); public int getHeight();
public int getNoise(int x, int z);
public HeightHunk genNoise(int x1, int z1, int x2, int z2);
public TerrainHunk genTerrain(int x1, int z1, int x2, int z2, TerrainHunk noise);
public TerrainHunk genCarving(int x1, int z1, int x2, int z2, HeightHunk noise);
public TerrainHunk genDecorations(int x1, int z1, int x2, int z2, TerrainHunk hunk);
public TerrainHunk genParallax(int x1, int z1, int x2, int z2, TerrainHunk hunk);
} }

View File

@ -19,8 +19,8 @@ public abstract class MortarCommand implements ICommand
private String description; private String description;
/** /**
* Override this with a super constructor as most commands shouldn't change these * Override this with a super constructor as most commands shouldn't change
* parameters * these parameters
* *
* @param node * @param node
* the node (primary node) i.e. volume * the node (primary node) i.e. volume
@ -92,6 +92,21 @@ public abstract class MortarCommand implements ICommand
requiredPermissions.add(node); requiredPermissions.add(node);
} }
public void rejectAny(MortarSender sender, String[] a)
{
if(a.length > 0)
{
String m = "";
for(String i : a)
{
m += i + " ";
}
sender.sendMessage("Unknown Parameters: " + m);
}
}
@Override @Override
public String getNode() public String getNode()
{ {

View File

@ -0,0 +1,6 @@
package com.volmit.iris.util;
public interface Supplier2<T, TT>
{
public void get(T t, TT tt);
}

View File

@ -0,0 +1,6 @@
package com.volmit.iris.util;
public interface Supplier3<T, TT, TTT>
{
public void get(T t, TT tt, TTT ttt);
}