diff --git a/src/main/java/ru/windcorp/progressia/client/world/ChunkRenderModel.java b/src/main/java/ru/windcorp/progressia/client/world/ChunkRenderModel.java index 46a3f28..832a7ee 100644 --- a/src/main/java/ru/windcorp/progressia/client/world/ChunkRenderModel.java +++ b/src/main/java/ru/windcorp/progressia/client/world/ChunkRenderModel.java @@ -36,7 +36,7 @@ import ru.windcorp.progressia.client.world.tile.TileRender; import ru.windcorp.progressia.client.world.tile.TileRenderNone; import ru.windcorp.progressia.client.world.tile.TileRenderStack; import ru.windcorp.progressia.common.world.ChunkData; -import ru.windcorp.progressia.common.world.generic.GenericChunk; +import ru.windcorp.progressia.common.world.generic.GenericChunks; import ru.windcorp.progressia.common.world.rels.AxisRotations; import ru.windcorp.progressia.common.world.rels.RelFace; @@ -77,7 +77,7 @@ public class ChunkRenderModel implements Renderable { optimizers.forEach(ChunkRenderOptimizer::startRender); - GenericChunk.forEachBiC(relBlockInChunk -> { + GenericChunks.forEachBiC(relBlockInChunk -> { processBlockAndTiles(relBlockInChunk, sink); }); diff --git a/src/main/java/ru/windcorp/progressia/client/world/WorldRender.java b/src/main/java/ru/windcorp/progressia/client/world/WorldRender.java index 2e674f0..7ff4df6 100644 --- a/src/main/java/ru/windcorp/progressia/client/world/WorldRender.java +++ b/src/main/java/ru/windcorp/progressia/client/world/WorldRender.java @@ -111,6 +111,13 @@ public class WorldRender public Collection getEntities() { return entityModels.values(); } + + @Override + public EntityRenderable getEntity(long entityId) { + EntityData entityData = getData().getEntity(entityId); + if (entityData == null) return null; + return getEntityRenderable(entityData); + } public void render(ShapeRenderHelper renderer) { updateChunks(); diff --git a/src/main/java/ru/windcorp/progressia/client/world/cro/ChunkRenderOptimizerSurface.java b/src/main/java/ru/windcorp/progressia/client/world/cro/ChunkRenderOptimizerSurface.java index 5ede1ef..26ee23c 100644 --- a/src/main/java/ru/windcorp/progressia/client/world/cro/ChunkRenderOptimizerSurface.java +++ b/src/main/java/ru/windcorp/progressia/client/world/cro/ChunkRenderOptimizerSurface.java @@ -38,7 +38,7 @@ import ru.windcorp.progressia.client.world.block.BlockRender; import ru.windcorp.progressia.client.world.tile.TileRender; import ru.windcorp.progressia.common.util.Vectors; import ru.windcorp.progressia.common.world.ChunkData; -import ru.windcorp.progressia.common.world.generic.GenericChunk; +import ru.windcorp.progressia.common.world.generic.GenericChunks; import ru.windcorp.progressia.common.world.rels.RelFace; public class ChunkRenderOptimizerSurface extends ChunkRenderOptimizer { @@ -217,7 +217,7 @@ public class ChunkRenderOptimizerSurface extends ChunkRenderOptimizer { Consumer consumer = shapeParts::add; - GenericChunk.forEachBiC(relBlockInChunk -> { + GenericChunks.forEachBiC(relBlockInChunk -> { processInnerFaces(relBlockInChunk, consumer); processOuterFaces(relBlockInChunk, consumer); }); @@ -316,7 +316,7 @@ public class ChunkRenderOptimizerSurface extends ChunkRenderOptimizer { } private boolean shouldRenderWhenFacing(Vec3i relBlockInChunk, RelFace face) { - if (GenericChunk.containsBiC(relBlockInChunk)) { + if (GenericChunks.containsBiC(relBlockInChunk)) { return shouldRenderWhenFacingLocal(relBlockInChunk, face); } else { return shouldRenderWhenFacingNeighbor(relBlockInChunk, face); diff --git a/src/main/java/ru/windcorp/progressia/client/world/entity/EntityRenderable.java b/src/main/java/ru/windcorp/progressia/client/world/entity/EntityRenderable.java index 24ea147..fcd50f6 100644 --- a/src/main/java/ru/windcorp/progressia/client/world/entity/EntityRenderable.java +++ b/src/main/java/ru/windcorp/progressia/client/world/entity/EntityRenderable.java @@ -71,6 +71,11 @@ public abstract class EntityRenderable implements Renderable, GenericEntity { public String getId() { return getData().getId(); } + + @Override + public long getEntityId() { + return getData().getEntityId(); + } public final Vec3 getLookingAt(Vec3 output) { if (output == null) output = new Vec3(); diff --git a/src/main/java/ru/windcorp/progressia/common/world/ChunkData.java b/src/main/java/ru/windcorp/progressia/common/world/ChunkData.java index 2202f99..728bc80 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/ChunkData.java +++ b/src/main/java/ru/windcorp/progressia/common/world/ChunkData.java @@ -29,7 +29,7 @@ import java.util.Objects; import glm.vec._3.i.Vec3i; import ru.windcorp.progressia.common.world.block.BlockData; -import ru.windcorp.progressia.common.world.generic.GenericChunk; +import ru.windcorp.progressia.common.world.generic.GenericChunks; import ru.windcorp.progressia.common.world.generic.GenericWritableChunk; import ru.windcorp.progressia.common.world.rels.AbsFace; import ru.windcorp.progressia.common.world.rels.BlockFace; @@ -160,7 +160,7 @@ public class ChunkData } private static void checkLocalCoordinates(Vec3i posInChunk) { - if (!GenericChunk.containsBiC(posInChunk)) { + if (!GenericChunks.containsBiC(posInChunk)) { throw new IllegalCoordinatesException( "Coordinates (" + posInChunk.x + "; " + posInChunk.y + "; " + posInChunk.z + ") " + "are not legal chunk coordinates" diff --git a/src/main/java/ru/windcorp/progressia/common/world/WorldData.java b/src/main/java/ru/windcorp/progressia/common/world/WorldData.java index 7fec468..13138c5 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/WorldData.java +++ b/src/main/java/ru/windcorp/progressia/common/world/WorldData.java @@ -34,14 +34,14 @@ import ru.windcorp.progressia.common.world.block.BlockData; import ru.windcorp.progressia.common.world.entity.EntityData; import ru.windcorp.progressia.common.world.generic.ChunkMap; import ru.windcorp.progressia.common.world.generic.ChunkSet; -import ru.windcorp.progressia.common.world.generic.GenericWorld; +import ru.windcorp.progressia.common.world.generic.GenericWritableWorld; import ru.windcorp.progressia.common.world.generic.LongBasedChunkMap; import ru.windcorp.progressia.common.world.tile.TileData; import ru.windcorp.progressia.common.world.tile.TileDataStack; import ru.windcorp.progressia.common.world.tile.TileDataReference; public class WorldData - implements GenericWorld { + implements GenericWritableWorld { private final ChunkMap chunksByPos = new LongBasedChunkMap<>( TCollections.synchronizedMap(new TLongObjectHashMap<>()) @@ -128,6 +128,7 @@ public class WorldData chunksByPos.remove(chunk); } + @Override public void setBlock(Vec3i blockInWorld, BlockData block, boolean notify) { ChunkData chunk = getChunkByBlock(blockInWorld); if (chunk == null) @@ -140,10 +141,12 @@ public class WorldData chunk.setBlock(Coordinates.convertInWorldToInChunk(blockInWorld, null), block, notify); } + @Override public EntityData getEntity(long entityId) { return entitiesById.get(entityId); } + @Override public void addEntity(EntityData entity) { Objects.requireNonNull(entity, "entity"); @@ -164,6 +167,7 @@ public class WorldData getListeners().forEach(l -> l.onEntityAdded(this, entity)); } + @Override public void removeEntity(long entityId) { synchronized (entitiesById) { EntityData entity = entitiesById.get(entityId); @@ -178,6 +182,7 @@ public class WorldData } } + @Override public void removeEntity(EntityData entity) { Objects.requireNonNull(entity, "entity"); diff --git a/src/main/java/ru/windcorp/progressia/common/world/entity/EntityData.java b/src/main/java/ru/windcorp/progressia/common/world/entity/EntityData.java index d54cca1..ed6876d 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/entity/EntityData.java +++ b/src/main/java/ru/windcorp/progressia/common/world/entity/EntityData.java @@ -85,6 +85,7 @@ public class EntityData extends StatefulObject implements Collideable, GenericEn this.velocity.set(velocity); } + @Override public long getEntityId() { return entityId; } diff --git a/src/main/java/ru/windcorp/progressia/common/world/generic/GenericChunk.java b/src/main/java/ru/windcorp/progressia/common/world/generic/GenericChunk.java index 6c15195..f9401d8 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/generic/GenericChunk.java +++ b/src/main/java/ru/windcorp/progressia/common/world/generic/GenericChunk.java @@ -106,20 +106,7 @@ public interface GenericChunk< boolean hasTiles(Vec3i blockInChunk, BlockFace face); default Vec3i resolve(Vec3i relativeCoords, Vec3i output) { - if (output == null) { - output = new Vec3i(); - } - - final int offset = BLOCKS_PER_CHUNK - 1; - - output.set(relativeCoords.x, relativeCoords.y, relativeCoords.z); - output.mul(2).sub(offset); - - AxisRotations.resolve(output, getUp(), output); - - output.add(offset).div(2); - - return output; + return GenericChunks.resolve(relativeCoords, output, getUp()); } default B getBlockRel(Vec3i relativeBlockInChunk) { @@ -240,50 +227,20 @@ public interface GenericChunk< return output; } - public static boolean containsBiC(Vec3i blockInChunk) { - return blockInChunk.x >= 0 && blockInChunk.x < BLOCKS_PER_CHUNK && - blockInChunk.y >= 0 && blockInChunk.y < BLOCKS_PER_CHUNK && - blockInChunk.z >= 0 && blockInChunk.z < BLOCKS_PER_CHUNK; - } - - public static boolean isSurfaceBiC(Vec3i blockInChunk) { - return Util.getBorderHits(blockInChunk) >= 1; - } - - public static boolean isEdgeBiC(Vec3i blockInChunk) { - return Util.getBorderHits(blockInChunk) >= 2; - } - - public static boolean isVertexBiC(Vec3i blockInChunk) { - return Util.getBorderHits(blockInChunk) == 3; - } - default boolean containsBiW(Vec3i blockInWorld) { - return Util.testBiC(blockInWorld, this, GenericChunk::containsBiC); + return GenericChunks.testBiC(blockInWorld, this, GenericChunks::containsBiC); } default boolean isSurfaceBiW(Vec3i blockInWorld) { - return Util.testBiC(blockInWorld, this, GenericChunk::isSurfaceBiC); + return GenericChunks.testBiC(blockInWorld, this, GenericChunks::isSurfaceBiC); } default boolean isEdgeBiW(Vec3i blockInWorld) { - return Util.testBiC(blockInWorld, this, GenericChunk::isEdgeBiC); + return GenericChunks.testBiC(blockInWorld, this, GenericChunks::isEdgeBiC); } default boolean isVertexBiW(Vec3i blockInWorld) { - return Util.testBiC(blockInWorld, this, GenericChunk::isVertexBiC); - } - - public static void forEachBiC(Consumer action) { - VectorUtil.iterateCuboid( - 0, - 0, - 0, - BLOCKS_PER_CHUNK, - BLOCKS_PER_CHUNK, - BLOCKS_PER_CHUNK, - action - ); + return GenericChunks.testBiC(blockInWorld, this, GenericChunks::isVertexBiC); } default void forEachBiW(Consumer action) { @@ -324,7 +281,7 @@ public interface GenericChunk< } default void forEachTileStack(Consumer action) { - forEachBiC(blockInChunk -> { + GenericChunks.forEachBiC(blockInChunk -> { for (AbsFace face : AbsFace.getFaces()) { TS stack = getTilesOrNull(blockInChunk, face); if (stack == null) diff --git a/src/main/java/ru/windcorp/progressia/common/world/generic/GenericChunks.java b/src/main/java/ru/windcorp/progressia/common/world/generic/GenericChunks.java new file mode 100644 index 0000000..ac97578 --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/common/world/generic/GenericChunks.java @@ -0,0 +1,102 @@ +/* + * Progressia + * Copyright (C) 2020-2021 Wind Corporation and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package ru.windcorp.progressia.common.world.generic; + +import java.util.function.Consumer; +import java.util.function.Predicate; + +import glm.vec._3.i.Vec3i; +import ru.windcorp.progressia.common.util.VectorUtil; +import ru.windcorp.progressia.common.util.Vectors; +import ru.windcorp.progressia.common.world.Coordinates; +import ru.windcorp.progressia.common.world.rels.AbsFace; +import ru.windcorp.progressia.common.world.rels.AxisRotations; + +public class GenericChunks { + + public static Vec3i resolve(Vec3i relativeCoords, Vec3i output, AbsFace up) { + if (output == null) { + output = new Vec3i(); + } + + final int offset = GenericChunk.BLOCKS_PER_CHUNK - 1; + + output.set(relativeCoords.x, relativeCoords.y, relativeCoords.z); + output.mul(2).sub(offset); + + AxisRotations.resolve(output, up, output); + + output.add(offset).div(2); + + return output; + } + + private static int getBorderHits(Vec3i blockInChunk) { + int hits = 0; + + if (Coordinates.isOnChunkBorder(blockInChunk.x)) hits++; + if (Coordinates.isOnChunkBorder(blockInChunk.y)) hits++; + if (Coordinates.isOnChunkBorder(blockInChunk.z)) hits++; + + return hits; + } + + static boolean testBiC(Vec3i blockInWorld, GenericChunk chunk, Predicate test) { + Vec3i v = Vectors.grab3i(); + + v = Coordinates.getInWorld(chunk.getPosition(), Vectors.ZERO_3i, v); + v = blockInWorld.sub(v, v); + + boolean result = test.test(v); + + Vectors.release(v); + + return result; + } + + public static boolean containsBiC(Vec3i blockInChunk) { + return blockInChunk.x >= 0 && blockInChunk.x < GenericChunk.BLOCKS_PER_CHUNK && + blockInChunk.y >= 0 && blockInChunk.y < GenericChunk.BLOCKS_PER_CHUNK && + blockInChunk.z >= 0 && blockInChunk.z < GenericChunk.BLOCKS_PER_CHUNK; + } + + public static boolean isSurfaceBiC(Vec3i blockInChunk) { + return GenericChunks.getBorderHits(blockInChunk) >= 1; + } + + public static boolean isEdgeBiC(Vec3i blockInChunk) { + return GenericChunks.getBorderHits(blockInChunk) >= 2; + } + + public static boolean isVertexBiC(Vec3i blockInChunk) { + return GenericChunks.getBorderHits(blockInChunk) == 3; + } + + public static void forEachBiC(Consumer action) { + VectorUtil.iterateCuboid( + 0, + 0, + 0, + GenericChunk.BLOCKS_PER_CHUNK, + GenericChunk.BLOCKS_PER_CHUNK, + GenericChunk.BLOCKS_PER_CHUNK, + action + ); + } + +} diff --git a/src/main/java/ru/windcorp/progressia/common/world/generic/GenericEntity.java b/src/main/java/ru/windcorp/progressia/common/world/generic/GenericEntity.java index c15bd39..3acfc23 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/generic/GenericEntity.java +++ b/src/main/java/ru/windcorp/progressia/common/world/generic/GenericEntity.java @@ -25,6 +25,8 @@ import ru.windcorp.progressia.common.world.Coordinates; public interface GenericEntity { String getId(); + + long getEntityId(); Vec3 getPosition(); diff --git a/src/main/java/ru/windcorp/progressia/common/world/generic/GenericWorld.java b/src/main/java/ru/windcorp/progressia/common/world/generic/GenericWorld.java index c945461..e17cf66 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/generic/GenericWorld.java +++ b/src/main/java/ru/windcorp/progressia/common/world/generic/GenericWorld.java @@ -46,6 +46,8 @@ public interface GenericWorld< Collection getEntities(); + E getEntity(long entityId); + /* * Chunks */ diff --git a/src/main/java/ru/windcorp/progressia/common/world/generic/Util.java b/src/main/java/ru/windcorp/progressia/common/world/generic/GenericWritableWorld.java similarity index 52% rename from src/main/java/ru/windcorp/progressia/common/world/generic/Util.java rename to src/main/java/ru/windcorp/progressia/common/world/generic/GenericWritableWorld.java index f3765d7..b970f89 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/generic/Util.java +++ b/src/main/java/ru/windcorp/progressia/common/world/generic/GenericWritableWorld.java @@ -17,37 +17,29 @@ */ package ru.windcorp.progressia.common.world.generic; -import java.util.function.Predicate; - import glm.vec._3.i.Vec3i; -import ru.windcorp.progressia.common.util.Vectors; -import ru.windcorp.progressia.common.world.Coordinates; +import ru.windcorp.progressia.common.world.block.BlockData; -class Util { - - public static int getBorderHits(Vec3i blockInChunk) { - int hits = 0; - - if (Coordinates.isOnChunkBorder(blockInChunk.x)) hits++; - if (Coordinates.isOnChunkBorder(blockInChunk.y)) hits++; - if (Coordinates.isOnChunkBorder(blockInChunk.z)) hits++; - - return hits; +//@formatter:off +public interface GenericWritableWorld< + B extends GenericBlock, + T extends GenericTile, + TS extends GenericWritableTileStack , + TR extends GenericTileReference , + C extends GenericWritableChunk , + E extends GenericEntity +> + extends GenericWorld { +//@formatter:on + + void setBlock(Vec3i blockInWorld, BlockData block, boolean notify); + + void addEntity(E entity); + + void removeEntity(long entityId); + + default void removeEntity(E entity) { + removeEntity(entity.getEntityId()); } - - public static boolean testBiC(Vec3i blockInWorld, GenericChunk chunk, Predicate test) { - Vec3i v = Vectors.grab3i(); - - v = Coordinates.getInWorld(chunk.getPosition(), Vectors.ZERO_3i, v); - v = blockInWorld.sub(v, v); - - boolean result = test.test(v); - - Vectors.release(v); - - return result; - } - - } diff --git a/src/main/java/ru/windcorp/progressia/common/world/rels/AbsFace.java b/src/main/java/ru/windcorp/progressia/common/world/rels/AbsFace.java index 9ffb5e9..d741bac 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/rels/AbsFace.java +++ b/src/main/java/ru/windcorp/progressia/common/world/rels/AbsFace.java @@ -19,6 +19,7 @@ package ru.windcorp.progressia.common.world.rels; import java.util.Objects; +import java.util.function.Function; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -90,6 +91,17 @@ public final class AbsFace extends AbsRelation implements BlockFace { .build(); } + public static ImmutableMap mapToFaces(Function generator) { + return mapToFaces( + generator.apply(POS_Z), + generator.apply(NEG_Z), + generator.apply(POS_X), + generator.apply(NEG_X), + generator.apply(NEG_Y), + generator.apply(POS_Y) + ); + } + /** * Rounds the provided vector to one of {@link AbsFace}s. The returned face * is pointing in the same general direction as the provided vector. The diff --git a/src/main/java/ru/windcorp/progressia/common/world/rels/RelFace.java b/src/main/java/ru/windcorp/progressia/common/world/rels/RelFace.java index 7f3ddb7..99e97fb 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/rels/RelFace.java +++ b/src/main/java/ru/windcorp/progressia/common/world/rels/RelFace.java @@ -17,6 +17,8 @@ */ package ru.windcorp.progressia.common.world.rels; +import java.util.function.Function; + import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -68,6 +70,17 @@ public class RelFace extends RelRelation implements BlockFace { .put(EAST, east) .build(); } + + public static ImmutableMap mapToFaces(Function generator) { + return mapToFaces( + generator.apply(UP), + generator.apply(DOWN), + generator.apply(NORTH), + generator.apply(SOUTH), + generator.apply(WEST), + generator.apply(EAST) + ); + } private static int nextId = 0; diff --git a/src/main/java/ru/windcorp/progressia/server/world/ChunkTickContext.java b/src/main/java/ru/windcorp/progressia/server/world/ChunkTickContext.java index 0480a6e..64778cd 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/ChunkTickContext.java +++ b/src/main/java/ru/windcorp/progressia/server/world/ChunkTickContext.java @@ -22,7 +22,7 @@ import java.util.function.Consumer; import glm.vec._3.i.Vec3i; import ru.windcorp.progressia.common.world.ChunkData; -import ru.windcorp.progressia.common.world.generic.GenericChunk; +import ru.windcorp.progressia.common.world.generic.GenericChunks; import ru.windcorp.progressia.common.world.rels.AbsFace; import ru.windcorp.progressia.server.world.block.BlockTickContext; @@ -46,7 +46,7 @@ public interface ChunkTickContext extends TickContext { default void forEachBlock(Consumer action) { TickContextMutable context = TickContextMutable.uninitialized(); - GenericChunk.forEachBiC(blockInChunk -> { + GenericChunks.forEachBiC(blockInChunk -> { context.rebuild().withServer(getServer()).withChunk(getChunk()).withBlockInChunk(blockInChunk).build(); action.accept(context); }); diff --git a/src/main/java/ru/windcorp/progressia/server/world/WorldLogic.java b/src/main/java/ru/windcorp/progressia/server/world/WorldLogic.java index 0b80b89..d080551 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/WorldLogic.java +++ b/src/main/java/ru/windcorp/progressia/server/world/WorldLogic.java @@ -90,6 +90,11 @@ public class WorldLogic public Collection getEntities() { return getData().getEntities(); } + + @Override + public EntityData getEntity(long entityId) { + return getData().getEntity(entityId); + } public Evaluation getTickEntitiesTask() { return tickEntitiesTask; diff --git a/src/main/java/ru/windcorp/progressia/test/TestChunkCodec.java b/src/main/java/ru/windcorp/progressia/test/TestChunkCodec.java index 050b94e..0f4dcd2 100644 --- a/src/main/java/ru/windcorp/progressia/test/TestChunkCodec.java +++ b/src/main/java/ru/windcorp/progressia/test/TestChunkCodec.java @@ -38,7 +38,7 @@ import ru.windcorp.progressia.common.world.DecodingException; import ru.windcorp.progressia.common.world.WorldData; import ru.windcorp.progressia.common.world.block.BlockData; import ru.windcorp.progressia.common.world.block.BlockDataRegistry; -import ru.windcorp.progressia.common.world.generic.GenericChunk; +import ru.windcorp.progressia.common.world.generic.GenericChunks; import ru.windcorp.progressia.common.world.io.ChunkCodec; import ru.windcorp.progressia.common.world.rels.RelFace; import ru.windcorp.progressia.common.world.tile.TileData; @@ -125,7 +125,7 @@ public class TestChunkCodec extends ChunkCodec { private void readBlocks(DataInput input, BlockData[] blockPalette, ChunkData chunk) throws IOException { try { - GenericChunk.forEachBiC(guard(v -> { + GenericChunks.forEachBiC(guard(v -> { chunk.setBlock(v, blockPalette[input.readInt()], false); })); } catch (UncheckedIOException e) { @@ -172,7 +172,7 @@ public class TestChunkCodec extends ChunkCodec { private Palette createBlockPalette(ChunkData chunk) { Palette blockPalette = new Palette<>(); - GenericChunk.forEachBiC(v -> blockPalette.add(chunk.getBlock(v))); + GenericChunks.forEachBiC(v -> blockPalette.add(chunk.getBlock(v))); return blockPalette; } @@ -200,7 +200,7 @@ public class TestChunkCodec extends ChunkCodec { private void writeBlocks(ChunkData chunk, Palette blockPalette, DataOutput output) throws IOException { try { - GenericChunk.forEachBiC(guard(v -> { + GenericChunks.forEachBiC(guard(v -> { output.writeInt(blockPalette.getNid(chunk.getBlock(v))); })); } catch (UncheckedIOException e) {