diff --git a/pom.xml b/pom.xml
index 71fa26959..75775be05 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
bytecode.ninja
Iris
- 1.0.25
+ 1.0.26
Iris
false
diff --git a/src/main/java/com/minelazz/epicworldgenerator/structures/StructureObject.java b/src/main/java/com/minelazz/epicworldgenerator/structures/StructureObject.java
new file mode 100644
index 000000000..736c534aa
--- /dev/null
+++ b/src/main/java/com/minelazz/epicworldgenerator/structures/StructureObject.java
@@ -0,0 +1,125 @@
+package com.minelazz.epicworldgenerator.structures;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.Serializable;
+
+import org.bukkit.Bukkit;
+import org.bukkit.Material;
+import org.bukkit.block.data.BlockData;
+import org.bukkit.util.BlockVector;
+
+import com.volmit.iris.Iris;
+import com.volmit.iris.object.IrisObject;
+import com.volmit.iris.util.B;
+import com.volmit.iris.util.FastBlockData;
+
+public class StructureObject implements Serializable
+{
+ public static final String MESSAGE0 = "This was created from .ewg serialization files";
+ public static final String MESSAGE1 = "This is not copied code, it is intended to ";
+ public static final String MESSAGE2 = "be used so that people can convert EWG files";
+ public static final String MESSAGE3 = "into .IOB files (iris objects)";
+
+ public static IrisObject convert(File so) throws IOException, ClassNotFoundException
+ {
+ FileInputStream fin = new FileInputStream(so);
+ ObjectInputStream in = new ObjectInputStream(fin);
+ StructureObject o = (StructureObject) in.readObject();
+ int maxX = 0;
+ int maxY = 0;
+ int maxZ = 0;
+ int minX = 0;
+ int minY = 0;
+ int minZ = 0;
+
+ for(SOBlock i : o.blocks)
+ {
+ maxX = maxX < i.x ? i.x : maxX;
+ maxY = maxY < i.y ? i.y : maxY;
+ maxZ = maxZ < i.z ? i.z : maxZ;
+ minX = minX > i.x ? i.x : minX;
+ minY = minY > i.y ? i.y : minY;
+ minZ = minZ > i.z ? i.z : minZ;
+ }
+
+ IrisObject iob = new IrisObject(maxX - minX, maxY - minY, maxZ - minZ);
+
+ for(SOBlock i : o.blocks)
+ {
+ BlockData bdx = null;
+
+ if(i.blockData == null)
+ {
+ FastBlockData f = map(i.id, i.data);
+ bdx = f == null ? null : f.getBlockData();
+ }
+
+ else
+ {
+ bdx = B.get(i.blockData).getBlockData();
+ }
+
+ if(bdx != null)
+ {
+ iob.getBlocks().put(new BlockVector(i.x, i.y, i.z), FastBlockData.of(bdx));
+ Iris.info("Mapped " + i.x + " " + i.y + " " + i.z + " to " + bdx.getAsString(true));
+ }
+ }
+
+ return null;
+ }
+
+ @SuppressWarnings("deprecation")
+ private static final FastBlockData map(int id, int dat)
+ {
+ for(Material i : Material.values())
+ {
+ if(!i.isLegacy())
+ {
+ continue;
+ }
+
+ if(i.getId() == id)
+ {
+ return FastBlockData.of(Bukkit.getUnsafe().fromLegacy(i, (byte) dat));
+ }
+ }
+
+ Iris.warn("Unknown Type " + id + ":" + dat);
+
+ return null;
+ }
+
+ private static final long serialVersionUID = -905274143366977303L;
+
+ public SOBlock[] blocks;
+ public String name;
+
+ public final class SOBlock implements Serializable
+ {
+ private static final long serialVersionUID = 2610063934261982315L;
+ public final int x;
+ public final int y;
+ public final int z;
+ public final int id;
+ public final int data;
+ public String meta;
+ public String blockData;
+ final StructureObject ref;
+
+ public SOBlock(StructureObject structureObject, int x, int y, int z, String string)
+ {
+ this.ref = structureObject;
+ meta = null;
+ this.x = x;
+ this.y = y;
+ this.z = z;
+ id = -1;
+ data = 0;
+ blockData = string;
+ }
+ }
+}
diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java
index e3017e9ce..987c80925 100644
--- a/src/main/java/com/volmit/iris/Iris.java
+++ b/src/main/java/com/volmit/iris/Iris.java
@@ -6,7 +6,6 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
-import com.volmit.iris.link.CitizensLink;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.World.Environment;
@@ -24,6 +23,7 @@ import com.volmit.iris.gen.provisions.ProvisionBukkit;
import com.volmit.iris.gen.scaffold.IrisGenConfiguration;
import com.volmit.iris.gen.scaffold.IrisWorlds;
import com.volmit.iris.gen.scaffold.TerrainTarget;
+import com.volmit.iris.link.CitizensLink;
import com.volmit.iris.link.MultiverseCoreLink;
import com.volmit.iris.link.MythicMobsLink;
import com.volmit.iris.manager.EditManager;
@@ -85,7 +85,7 @@ public class Iris extends MortarPlugin
instance = this;
INMS.get();
IO.delete(new File("iris"));
- lowMemoryMode = Runtime.getRuntime().maxMemory() < 4000000000L; // 4 * 1000 * 1000 * 1000 // 4gb
+ lowMemoryMode = Runtime.getRuntime().maxMemory() < 4000000000L; // 4 * 1000 * 1000 * 1000 // 4g
}
public static int getThreadCount()
diff --git a/src/main/java/com/volmit/iris/gen/v2/IrisComplex.java b/src/main/java/com/volmit/iris/gen/v2/IrisComplex.java
index f156ac823..9fa86a836 100644
--- a/src/main/java/com/volmit/iris/gen/v2/IrisComplex.java
+++ b/src/main/java/com/volmit/iris/gen/v2/IrisComplex.java
@@ -4,9 +4,11 @@ import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
import com.volmit.iris.Iris;
+import com.volmit.iris.gen.layer.GenLayerBiome;
import com.volmit.iris.gen.v2.scaffold.layer.ProceduralStream;
import com.volmit.iris.gen.v2.scaffold.stream.Interpolated;
import com.volmit.iris.manager.IrisDataManager;
+import com.volmit.iris.noise.CNG;
import com.volmit.iris.object.InferredType;
import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.object.IrisBiomePaletteLayer;
@@ -22,12 +24,14 @@ import lombok.Data;
@Data
public class IrisComplex implements DataProvider
{
+ private RNG rng;
private IrisDataManager data;
private KList generators;
private static final BlockData AIR = Material.AIR.createBlockData();
private ProceduralStream regionStream;
private ProceduralStream bridgeStream;
private ProceduralStream landBiomeStream;
+ private ProceduralStream caveBiomeStream;
private ProceduralStream seaBiomeStream;
private ProceduralStream shoreBiomeStream;
private ProceduralStream baseBiomeStream;
@@ -47,7 +51,7 @@ public class IrisComplex implements DataProvider
switch(type)
{
case CAVE:
- break;
+ return caveBiomeStream;
case DEFER:
break;
case LAKE:
@@ -69,6 +73,7 @@ public class IrisComplex implements DataProvider
public void flash(long seed, IrisDimension dimension, IrisDataManager data)
{
+ this.rng = new RNG(seed);
this.data = data;
double fluidHeight = dimension.getFluidHeight();
generators = new KList<>();
@@ -89,24 +94,31 @@ public class IrisComplex implements DataProvider
.select(dimension.getRegions())
.convertCached((s) -> data.getRegionLoader().load(s))
.cache2D(1024);
+ caveBiomeStream = regionStream.convertCached((r)
+ -> dimension.getCaveBiomeStyle().create(rng.nextRNG()).stream()
+ .zoom(r.getCaveBiomeZoom())
+ .selectRarity(r.getCaveBiomes())
+ .convertCached((s) -> data.getBiomeLoader().load(s))
+ ).convertAware2D((str, x, z) -> str.get(x, z))
+ .cache2D(1024);
landBiomeStream = regionStream.convertCached((r)
-> dimension.getLandBiomeStyle().create(rng.nextRNG()).stream()
.zoom(r.getLandBiomeZoom())
- .select(r.getLandBiomes())
+ .selectRarity(r.getLandBiomes())
.convertCached((s) -> data.getBiomeLoader().load(s))
).convertAware2D((str, x, z) -> str.get(x, z))
.cache2D(1024);
seaBiomeStream = regionStream.convertCached((r)
-> dimension.getSeaBiomeStyle().create(rng.nextRNG()).stream()
.zoom(r.getSeaBiomeZoom())
- .select(r.getSeaBiomes())
+ .selectRarity(r.getSeaBiomes())
.convertCached((s) -> data.getBiomeLoader().load(s))
).convertAware2D((str, x, z) -> str.get(x, z))
.cache2D(1024);
shoreBiomeStream = regionStream.convertCached((r)
-> dimension.getShoreBiomeStyle().create(rng.nextRNG()).stream()
.zoom(r.getShoreBiomeZoom())
- .select(r.getShoreBiomes())
+ .selectRarity(r.getShoreBiomes())
.convertCached((s) -> data.getBiomeLoader().load(s))
).convertAware2D((str, x, z) -> str.get(x, z))
.cache2D(1024);
@@ -114,6 +126,7 @@ public class IrisComplex implements DataProvider
.convert((v) -> v >= dimension.getLandChance() ? InferredType.SEA : InferredType.LAND);
baseBiomeStream = bridgeStream.convertAware2D((t, x, z) -> t.equals(InferredType.SEA)
? seaBiomeStream.get(x, z) : landBiomeStream.get(x, z))
+ .convertAware2D(this::implode)
.cache2D(1024);
heightStream = baseBiomeStream.convertAware2D((b, x, z) -> getHeight(b, x, z, seed))
.forceDouble().add(fluidHeight).roundDouble()
@@ -163,6 +176,36 @@ public class IrisComplex implements DataProvider
//@done
}
+ private IrisBiome implode(IrisBiome b, Double x, Double z)
+ {
+ if(b.getChildren().isEmpty())
+ {
+ return b;
+ }
+
+ return implode(b, x, z, 3);
+ }
+
+ private IrisBiome implode(IrisBiome b, Double x, Double z, int max)
+ {
+ if(max < 0)
+ {
+ return b;
+ }
+
+ if(b.getChildren().isEmpty())
+ {
+ return b;
+ }
+
+ CNG childCell = b.getChildrenGenerator(rng, 123, b.getChildShrinkFactor());
+ KList chx = b.getRealChildren(this).copy();
+ chx.add(b);
+ IrisBiome biome = childCell.fitRarity(chx, x, z);
+ biome.setInferredType(b.getInferredType());
+ return implode(biome, x, z, max - 1);
+ }
+
private IrisBiome fixBiomeType(Double height, IrisBiome biome, IrisRegion region, Double x, Double z, double fluidHeight)
{
double sh = region.getShoreHeight(x, z);
diff --git a/src/main/java/com/volmit/iris/gen/v2/scaffold/layer/ProceduralStream.java b/src/main/java/com/volmit/iris/gen/v2/scaffold/layer/ProceduralStream.java
index b5291b35c..b5cbcaed3 100644
--- a/src/main/java/com/volmit/iris/gen/v2/scaffold/layer/ProceduralStream.java
+++ b/src/main/java/com/volmit/iris/gen/v2/scaffold/layer/ProceduralStream.java
@@ -30,6 +30,8 @@ import com.volmit.iris.gen.v2.scaffold.stream.ZoomStream;
import com.volmit.iris.util.Function2;
import com.volmit.iris.util.Function3;
import com.volmit.iris.util.Function4;
+import com.volmit.iris.util.IRare;
+import com.volmit.iris.util.KList;
public interface ProceduralStream extends ProceduralLayer, Interpolated
{
@@ -218,6 +220,26 @@ public interface ProceduralStream extends ProceduralLayer, Interpolated
return new SelectionStream(this, types);
}
+ @SuppressWarnings("unchecked")
+ default ProceduralStream selectRarity(V... types)
+ {
+ KList rarityTypes = new KList<>();
+
+ for(V i : types)
+ {
+ rarityTypes.addMultiple(i, IRare.get(i));
+ }
+
+ return new SelectionStream(this, rarityTypes);
+ }
+
+ default ProceduralStream selectRarity(List types)
+ {
+ KList rarityTypes = new KList<>();
+ types.forEach((i) -> rarityTypes.addMultiple(i, IRare.get(i)));
+ return new SelectionStream(this, rarityTypes);
+ }
+
default ProceduralStream clamp(double min, double max)
{
return new ClampedStream(this, min, max);
diff --git a/src/main/java/com/volmit/iris/object/IrisBiome.java b/src/main/java/com/volmit/iris/object/IrisBiome.java
index 028f228ee..b618decfe 100644
--- a/src/main/java/com/volmit/iris/object/IrisBiome.java
+++ b/src/main/java/com/volmit/iris/object/IrisBiome.java
@@ -7,6 +7,7 @@ import org.bukkit.block.Biome;
import com.volmit.iris.Iris;
import com.volmit.iris.gen.ContextualTerrainProvider;
import com.volmit.iris.gen.atomics.AtomicCache;
+import com.volmit.iris.gen.v2.DataProvider;
import com.volmit.iris.manager.IrisDataManager;
import com.volmit.iris.noise.CNG;
import com.volmit.iris.util.ArrayType;
@@ -611,7 +612,7 @@ public class IrisBiome extends IrisRegistrant implements IRare
return biomeSkyScatter.get(getBiomeGenerator(rng).fit(0, biomeSkyScatter.size() - 1, x, y, z));
}
- public KList getRealChildren(ContextualTerrainProvider g)
+ public KList getRealChildren(DataProvider g)
{
return realChildren.aquire(() ->
{
@@ -619,7 +620,7 @@ public class IrisBiome extends IrisRegistrant implements IRare
for(String i : getChildren())
{
- realChildren.add(g != null ? g.loadBiome(i) : Iris.globaldata.getBiomeLoader().load(i));
+ realChildren.add(g != null ? g.getData().getBiomeLoader().load(i) : Iris.globaldata.getBiomeLoader().load(i));
}
return realChildren;
diff --git a/src/main/java/com/volmit/iris/util/IRare.java b/src/main/java/com/volmit/iris/util/IRare.java
index a5fe84dbc..441fa3baf 100644
--- a/src/main/java/com/volmit/iris/util/IRare.java
+++ b/src/main/java/com/volmit/iris/util/IRare.java
@@ -1,5 +1,11 @@
package com.volmit.iris.util;
-public interface IRare {
+public interface IRare
+{
public int getRarity();
+
+ public static int get(Object v)
+ {
+ return v instanceof IRare ? ((IRare) v).getRarity() : 1;
+ }
}
diff --git a/src/main/java/com/volmit/iris/util/KList.java b/src/main/java/com/volmit/iris/util/KList.java
index 3647b2348..674c5b6f9 100644
--- a/src/main/java/com/volmit/iris/util/KList.java
+++ b/src/main/java/com/volmit/iris/util/KList.java
@@ -51,6 +51,14 @@ public class KList extends ArrayList implements List
return this;
}
+ public void addMultiple(T t, int c)
+ {
+ for(int i = 0; i < c; i++)
+ {
+ add(t);
+ }
+ }
+
private KList add(Enumeration e)
{
while(e.hasMoreElements())
@@ -688,7 +696,7 @@ public class KList extends ArrayList implements List
add(t);
return true;
}
-
+
return false;
}