mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-18 18:23:06 +00:00
Async gen cap
This commit is contained in:
parent
88b60ea945
commit
265807941a
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user