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.Provisioned;
import com.volmit.iris.gen.scaffold.TerrainChunk; import com.volmit.iris.gen.scaffold.TerrainChunk;
import com.volmit.iris.gen.scaffold.TerrainProvider; 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.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@ -23,10 +27,31 @@ public class ProvisionBukkit extends ChunkGenerator implements Provisioned
private HeightedFakeWorld fakeworld = null; private HeightedFakeWorld fakeworld = null;
private boolean worldSet = false; private boolean worldSet = false;
private final TerrainProvider provider; private final TerrainProvider provider;
private final KMap<ChunkPosition, TerrainChunk> precache;
public ProvisionBukkit(TerrainProvider provider) public ProvisionBukkit(TerrainProvider provider)
{ {
this.provider = 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 @Override
@ -38,11 +63,27 @@ public class ProvisionBukkit extends ChunkGenerator implements Provisioned
provider.getTarget().setRealWorld(world); 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); TerrainChunk terrain = TerrainChunk.create(world, biome);
getProvider().generate(random, x, z, terrain); getProvider().generate(getRNG(world, x, z), x, z, terrain);
return terrain.getRaw(); return terrain.getRaw();
} }
private Random getRNG(World world, int x, int z)
{
return new RNG(world.getSeed()).nextParallelRNG(x).nextParallelRNG(z);
}
@Override @Override
public boolean canSpawn(World world, int x, int z) 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; import com.volmit.iris.Iris;
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public class IrisTerrainChunk implements TerrainChunk public class LinkedTerrainChunk implements TerrainChunk
{ {
private final Biome[] biome2D; private final Biome[] biome2D;
private final IrisBiomeStorage biome3D; private final IrisBiomeStorage biome3D;
private final ChunkData rawChunkData; private ChunkData rawChunkData;
private final BiomeGrid storage; private final BiomeGrid storage;
public IrisTerrainChunk(int maxHeight) public LinkedTerrainChunk(int maxHeight)
{ {
this(null, maxHeight); this(null, maxHeight);
} }
public IrisTerrainChunk(BiomeGrid storage, int maxHeight) public LinkedTerrainChunk(BiomeGrid storage, int maxHeight)
{ {
this.storage = storage; this.storage = storage;
rawChunkData = createChunkData(maxHeight); rawChunkData = createChunkData(maxHeight);
@ -192,4 +192,30 @@ public class IrisTerrainChunk implements TerrainChunk
{ {
return rawChunkData; 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) public static TerrainChunk create(int maxHeight)
{ {
return new IrisTerrainChunk(maxHeight); return new LinkedTerrainChunk(maxHeight);
} }
public static TerrainChunk create(World world, BiomeGrid grid) 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) 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 * 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 BlockData getBlockData(int x, int y, int z);
public ChunkData getRaw(); public ChunkData getRaw();
public void inject(BiomeGrid biome);
} }

View File

@ -26,7 +26,7 @@ public class IrisObjectTranslate
@DontObfuscate @DontObfuscate
@Desc("The x shift in blocks") @Desc("The x shift in blocks")
private int y = 0; private int y = 0;
@MinNumber(-128) @MinNumber(-128)
@MaxNumber(128) @MaxNumber(128)
@DontObfuscate @DontObfuscate

View File

@ -487,15 +487,23 @@ public class StructureTemplate implements Listener, IObjectPlacer
Location center = getTileBounds(l).getCenter(); Location center = getTileBounds(l).getCenter();
TileResult r = structure.getTile(rng, center.getX(), center.getY(), center.getZ()); TileResult r = structure.getTile(rng, center.getX(), center.getY(), center.getZ());
int v1 = getVariant(getTileBounds(l), r.getTile()); try
int v2 = getVariant(getTileBounds(l), tileType);
if(r == null || !r.getTile().getForceObjects().get(v1).getLoadKey().equals(
tileType.getForceObjects().get(v2)
.getLoadKey()))
{ {
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)
{
} }
} }