diff --git a/src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java b/src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java index bfc19e222..ba32821e0 100644 --- a/src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java +++ b/src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java @@ -12,6 +12,10 @@ import com.volmit.iris.gen.scaffold.HeightedFakeWorld; import com.volmit.iris.gen.scaffold.Provisioned; import com.volmit.iris.gen.scaffold.TerrainChunk; import com.volmit.iris.gen.scaffold.TerrainProvider; +import com.volmit.iris.util.ChunkPosition; +import com.volmit.iris.util.J; +import com.volmit.iris.util.KMap; +import com.volmit.iris.util.RNG; import lombok.Data; import lombok.EqualsAndHashCode; @@ -23,10 +27,31 @@ public class ProvisionBukkit extends ChunkGenerator implements Provisioned private HeightedFakeWorld fakeworld = null; private boolean worldSet = false; private final TerrainProvider provider; + private final KMap precache; public ProvisionBukkit(TerrainProvider provider) { this.provider = provider; + precache = new KMap<>(); + } + + public void generate(World world, int x, int z) + { + world.loadChunk(x, z, true); + world.unloadChunkRequest(x, z); + } + + public void generateAsync(World world, int x, int z) + { + ChunkPosition c = new ChunkPosition(x, z); + + if(!precache.containsKey(c)) + { + TerrainChunk snapshot = TerrainChunk.create(world); + snapshot.setRaw(generateChunkData(world, getRNG(world, x, z), x, z, snapshot)); + precache.put(c, snapshot); + J.s(() -> generate(world, x, z)); + } } @Override @@ -38,11 +63,27 @@ public class ProvisionBukkit extends ChunkGenerator implements Provisioned provider.getTarget().setRealWorld(world); } + if(precache.size() > 0) + { + ChunkPosition c = new ChunkPosition(x, z); + if(precache.containsKey(c)) + { + TerrainChunk snapshot = precache.remove(c); + snapshot.inject(biome); + return snapshot; + } + } + TerrainChunk terrain = TerrainChunk.create(world, biome); - getProvider().generate(random, x, z, terrain); + getProvider().generate(getRNG(world, x, z), x, z, terrain); return terrain.getRaw(); } + private Random getRNG(World world, int x, int z) + { + return new RNG(world.getSeed()).nextParallelRNG(x).nextParallelRNG(z); + } + @Override public boolean canSpawn(World world, int x, int z) { diff --git a/src/main/java/com/volmit/iris/gen/scaffold/IrisTerrainChunk.java b/src/main/java/com/volmit/iris/gen/scaffold/LinkedTerrainChunk.java similarity index 86% rename from src/main/java/com/volmit/iris/gen/scaffold/IrisTerrainChunk.java rename to src/main/java/com/volmit/iris/gen/scaffold/LinkedTerrainChunk.java index d98c1d73c..9a5d8f06e 100644 --- a/src/main/java/com/volmit/iris/gen/scaffold/IrisTerrainChunk.java +++ b/src/main/java/com/volmit/iris/gen/scaffold/LinkedTerrainChunk.java @@ -11,19 +11,19 @@ import org.bukkit.material.MaterialData; import com.volmit.iris.Iris; @SuppressWarnings("deprecation") -public class IrisTerrainChunk implements TerrainChunk +public class LinkedTerrainChunk implements TerrainChunk { private final Biome[] biome2D; private final IrisBiomeStorage biome3D; - private final ChunkData rawChunkData; + private ChunkData rawChunkData; private final BiomeGrid storage; - public IrisTerrainChunk(int maxHeight) + public LinkedTerrainChunk(int maxHeight) { this(null, maxHeight); } - public IrisTerrainChunk(BiomeGrid storage, int maxHeight) + public LinkedTerrainChunk(BiomeGrid storage, int maxHeight) { this.storage = storage; rawChunkData = createChunkData(maxHeight); @@ -192,4 +192,30 @@ public class IrisTerrainChunk implements TerrainChunk { return rawChunkData; } + + @Override + public void setRaw(ChunkData data) + { + rawChunkData = data; + } + + @Override + public void inject(BiomeGrid biome) + { + if(biome2D != null) + { + for(int i = 0; i < 16; i++) + { + for(int j = 0; j < 16; j++) + { + biome.setBiome(i, j, getBiome(i, j)); + } + } + } + + else if(biome3D != null) + { + biome3D.inject(biome); + } + } } diff --git a/src/main/java/com/volmit/iris/gen/scaffold/TerrainChunk.java b/src/main/java/com/volmit/iris/gen/scaffold/TerrainChunk.java index b5fd84818..6d7dfa286 100644 --- a/src/main/java/com/volmit/iris/gen/scaffold/TerrainChunk.java +++ b/src/main/java/com/volmit/iris/gen/scaffold/TerrainChunk.java @@ -15,7 +15,7 @@ public interface TerrainChunk extends BiomeGrid, ChunkData public static TerrainChunk create(int maxHeight) { - return new IrisTerrainChunk(maxHeight); + return new LinkedTerrainChunk(maxHeight); } public static TerrainChunk create(World world, BiomeGrid grid) @@ -25,9 +25,11 @@ public interface TerrainChunk extends BiomeGrid, ChunkData public static TerrainChunk create(int maxHeight, BiomeGrid grid) { - return new IrisTerrainChunk(grid, maxHeight); + return new LinkedTerrainChunk(grid, maxHeight); } + public void setRaw(ChunkData data); + /** * Get biome at x, z within chunk being generated * @@ -126,4 +128,6 @@ public interface TerrainChunk extends BiomeGrid, ChunkData public BlockData getBlockData(int x, int y, int z); public ChunkData getRaw(); + + public void inject(BiomeGrid biome); } diff --git a/src/main/java/com/volmit/iris/object/IrisObjectTranslate.java b/src/main/java/com/volmit/iris/object/IrisObjectTranslate.java index ee5c58a8e..0ff7704fa 100644 --- a/src/main/java/com/volmit/iris/object/IrisObjectTranslate.java +++ b/src/main/java/com/volmit/iris/object/IrisObjectTranslate.java @@ -26,7 +26,7 @@ public class IrisObjectTranslate @DontObfuscate @Desc("The x shift in blocks") private int y = 0; - + @MinNumber(-128) @MaxNumber(128) @DontObfuscate diff --git a/src/main/java/com/volmit/iris/structure/StructureTemplate.java b/src/main/java/com/volmit/iris/structure/StructureTemplate.java index f4d23005b..706b26539 100644 --- a/src/main/java/com/volmit/iris/structure/StructureTemplate.java +++ b/src/main/java/com/volmit/iris/structure/StructureTemplate.java @@ -487,15 +487,23 @@ public class StructureTemplate implements Listener, IObjectPlacer Location center = getTileBounds(l).getCenter(); TileResult r = structure.getTile(rng, center.getX(), center.getY(), center.getZ()); - int v1 = getVariant(getTileBounds(l), r.getTile()); - int v2 = getVariant(getTileBounds(l), tileType); - if(r == null || !r.getTile().getForceObjects().get(v1).getLoadKey().equals( - - tileType.getForceObjects().get(v2) - - .getLoadKey())) + try { - continue; + int v1 = getVariant(getTileBounds(l), r.getTile()); + int v2 = getVariant(getTileBounds(l), tileType); + if(r == null || !r.getTile().getForceObjects().get(v1).getLoadKey().equals( + + tileType.getForceObjects().get(v2) + + .getLoadKey())) + { + continue; + } + } + + catch(Throwable e) + { + } }