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.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)
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user