Async gen cap

This commit is contained in:
Daniel Mills 2020-09-09 06:47:27 -04:00
parent 88b60ea945
commit 265807941a
5 changed files with 95 additions and 16 deletions

View File

@ -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<ChunkPosition, TerrainChunk> 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)
{

View File

@ -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);
}
}
}

View File

@ -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);
}

View File

@ -487,6 +487,8 @@ public class StructureTemplate implements Listener, IObjectPlacer
Location center = getTileBounds(l).getCenter();
TileResult r = structure.getTile(rng, center.getX(), center.getY(), center.getZ());
try
{
int v1 = getVariant(getTileBounds(l), r.getTile());
int v2 = getVariant(getTileBounds(l), tileType);
if(r == null || !r.getTile().getForceObjects().get(v1).getLoadKey().equals(
@ -499,6 +501,12 @@ public class StructureTemplate implements Listener, IObjectPlacer
}
}
catch(Throwable e)
{
}
}
if(isWithinBounds(l))
{
queue(l, () -> updateTile(getTileBounds(l)));