@Override public Biome getBiome(Vector3i pos) { return getBiome(pos.x, pos.y, pos.z); }
@Override public Block getBlock(Vector3i pos) { return getBlock(pos.x, pos.y, pos.z); }
@Override public int getExtraData(int index, Vector3i pos) { return getExtraData(index, pos.x, pos.y, pos.z); }
private ChunkViewCore createWorldView(Region3i region, Vector3i offset) { Chunk[] chunks = new Chunk[region.size().x * region.size().y * region.size().z]; for (Vector3i chunkPos : region) { Chunk chunk = chunkCache.get(chunkPos); if (chunk == null || !chunk.isReady()) { return null; } chunkPos.sub(region.min()); int index = TeraMath.calculate3DArrayIndex(chunkPos, region.size()); chunks[index] = chunk; } return new ChunkViewCoreImpl(chunks, region, offset, blockManager.getBlock(BlockManager.AIR_ID)); }
@Override public void setBlock(int blockX, int blockY, int blockZ, Block type) { if (blockRegion.encompasses(blockX, blockY, blockZ)) { int chunkIndex = relChunkIndex(blockX, blockY, blockZ); chunks[chunkIndex].setBlock(ChunkMath.calcBlockPos(blockX, blockY, blockZ, chunkFilterSize), type); } else { logger.warn("Attempt to modify block outside of the view"); } }
@Test public void testLocalToWorld() { Chunk chunk = createChunk(1, 0, 1); chunk.setBlock(new Vector3i(0, 0, 0), solidBlock); Chunk[] chunks = new Chunk[]{createChunk(0, 0, 0), createChunk(1, 0, 0), createChunk(2, 0, 0), createChunk(0, 0, 1), chunk, createChunk(2, 0, 1), createChunk(0, 0, 2), createChunk(1, 0, 2), createChunk(2, 0, 2)}; ChunkViewCoreImpl chunkView = new ChunkViewCoreImpl(chunks, Region3i.createFromCenterExtents(new Vector3i(1, 0, 1), new Vector3i(1, 0, 1)), new Vector3i(1, 1, 1), airBlock); assertEquals(new Vector3i(ChunkConstants.SIZE_X, ChunkConstants.SIZE_Y, ChunkConstants.SIZE_Z), chunkView.toWorldPos(Vector3i.zero())); }
@Override public byte getLight(Vector3i pos) { return getLight(pos.x, pos.y, pos.z); }
@Override public byte getSunlight(Vector3i pos) { return getSunlight(pos.x, pos.y, pos.z); }
@Override public void setBlock(Vector3i pos, Block type) { setBlock(pos.x, pos.y, pos.z, type); }
@Override public void setBiome(Vector3i pos, Biome biome) { setBiome(pos.x, pos.y, pos.z, biome); }
public ChunkViewCoreImpl(Chunk[] chunks, Region3i chunkRegion, Vector3i offset, Block defaultBlock) { this.chunkRegion = chunkRegion; this.chunks = chunks; this.offset = offset; setChunkSize(new Vector3i(ChunkConstants.SIZE_X, ChunkConstants.SIZE_Y, ChunkConstants.SIZE_Z)); this.defaultBlock = defaultBlock; }
private ChunkViewCore createWorldView(Region3i region, Vector3i offset) { Chunk[] chunks = new Chunk[region.sizeX() * region.sizeY() * region.sizeZ()]; for (Vector3i chunkPos : region) { Chunk chunk = chunkCache.get(chunkPos); if (chunk == null) { return null; } chunkPos.sub(region.minX(), region.minY(), region.minZ()); int index = TeraMath.calculate3DArrayIndex(chunkPos, region.size()); chunks[index] = chunk; } return new ChunkViewCoreImpl(chunks, region, offset, blockManager.getBlock(BlockManager.AIR_ID)); }
@Override public void setExtraData(int index, int blockX, int blockY, int blockZ, int value) { if (blockRegion.encompasses(blockX, blockY, blockZ)) { int chunkIndex = relChunkIndex(blockX, blockY, blockZ); chunks[chunkIndex].setExtraData(index, ChunkMath.calcBlockPos(blockX, blockY, blockZ, chunkFilterSize), value); } else { throw new IllegalStateException("Attempted to modify extra data though an unlocked view"); } }
@Override public byte getLight(float x, float y, float z) { return getLight(TeraMath.floorToInt(x + 0.5f), TeraMath.floorToInt(y + 0.5f), TeraMath.floorToInt(z + 0.5f)); }
@Override public byte getSunlight(float x, float y, float z) { return getSunlight(TeraMath.floorToInt(x + 0.5f), TeraMath.floorToInt(y + 0.5f), TeraMath.floorToInt(z + 0.5f)); }
@Test public void testSimpleWorldView() { Chunk chunk = createChunk(0, 0, 0); chunk.setBlock(new Vector3i(0, 0, 0), solidBlock); ChunkViewCore chunkView = new ChunkViewCoreImpl(new Chunk[]{chunk}, Region3i.createFromCenterExtents(Vector3i.zero(), Vector3i.zero()), new Vector3i(), airBlock); assertEquals(solidBlock, chunkView.getBlock(0, 0, 0)); }
@Override public void setBiome(int blockX, int blockY, int blockZ, Biome biome) { if (blockRegion.encompasses(blockX, blockY, blockZ)) { int chunkIndex = relChunkIndex(blockX, blockY, blockZ); Vector3i pos = ChunkMath.calcBlockPos(blockX, blockY, blockZ, chunkFilterSize); chunks[chunkIndex].setBiome(pos.x, pos.y, pos.z, biome); } else { logger.warn("Attempt to modify biome outside of the view"); } }
@Override public Block getBlock(float x, float y, float z) { return getBlock(TeraMath.floorToInt(x + 0.5f), TeraMath.floorToInt(y + 0.5f), TeraMath.floorToInt(z + 0.5f)); }
@Override public Biome getBiome(float x, float y, float z) { return getBiome(TeraMath.floorToInt(x + 0.5f), TeraMath.floorToInt(y + 0.5f), TeraMath.floorToInt(z + 0.5f)); }
@Test public void testOffsetWorldViewBeforeMainChunk() { Chunk chunk = createChunk(0, 0, 0); chunk.setBlock(new Vector3i(ChunkConstants.SIZE_X - 1, 0, ChunkConstants.SIZE_Z - 1), solidBlock); Chunk[] chunks = new Chunk[]{chunk, createChunk(0, 0, -1), createChunk(1, 0, -1), createChunk(-1, 0, 0), createChunk(0, 0, 0), createChunk(1, 0, 0), createChunk(-1, 0, 1), createChunk(0, 0, 1), createChunk(1, 0, 1)}; ChunkViewCore chunkView = new ChunkViewCoreImpl(chunks, Region3i.createFromCenterExtents(new Vector3i(0, 0, 0), new Vector3i(1, 0, 1)), new Vector3i(1, 0, 1), airBlock); assertEquals(solidBlock, chunkView.getBlock(-1, 0, -1)); }