From 5824aebc378a53b3f39465fad01a10f46a1894a6 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Sat, 20 Jun 2020 15:14:04 +0200 Subject: [PATCH] fix some more chunk bugs (maybe there are even more) --- .../de/bixilon/minosoft/game/datatypes/world/Chunk.java | 6 +++++- .../minosoft/game/datatypes/world/InChunkLocation.java | 2 +- .../de/bixilon/minosoft/game/datatypes/world/World.java | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/world/Chunk.java b/src/main/java/de/bixilon/minosoft/game/datatypes/world/Chunk.java index 82ad64b5c..e472f3c80 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/world/Chunk.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/world/Chunk.java @@ -34,13 +34,17 @@ public class Chunk { } public Blocks getBlock(int x, int y, int z) { - if (x > 16 || y > 255 || z > 16 || x < 0 || y < 0 || z < 0) { + if (x > 15 || y > 255 || z > 15 || x < 0 || y < 0 || z < 0) { throw new IllegalArgumentException(String.format("Invalid chunk location %s %s %s", x, y, z)); } byte section = (byte) (y / 16); return nibbles.get(section).getBlock(x, y % 16, z); } + public Blocks getBlock(InChunkLocation location) { + return getBlock(location.getX(), location.getY(), location.getZ()); + } + public void setBlock(int x, int y, int z, Blocks block) { byte section = (byte) (y / 16); createSection(section); diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/world/InChunkLocation.java b/src/main/java/de/bixilon/minosoft/game/datatypes/world/InChunkLocation.java index f677279f4..06c9c3bb4 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/world/InChunkLocation.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/world/InChunkLocation.java @@ -25,7 +25,7 @@ public class InChunkLocation { // x 0 - 16 // y 0 - 255 // z 0 - 16 - if (x > 16 || y > 255 || z > 16 || x < 0 || y < 0 || z < 0) { + if (x > 15 || y > 255 || z > 15 || x < 0 || y < 0 || z < 0) { throw new IllegalArgumentException(String.format("Invalid chunk location %s %s %s", x, y, z)); } this.x = x; diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/world/World.java b/src/main/java/de/bixilon/minosoft/game/datatypes/world/World.java index 9dd84ed78..dd25ffce2 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/world/World.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/world/World.java @@ -53,14 +53,14 @@ public class World { public Blocks getBlock(BlockPosition pos) { ChunkLocation loc = pos.getChunkLocation(); if (getChunk(loc) != null) { - return getChunk(loc).getBlock(pos.getX() % 16, pos.getY(), pos.getZ() % 16); + return getChunk(loc).getBlock(pos.getInChunkLocation()); } return Blocks.AIR; } public void setBlock(BlockPosition pos, Blocks block) { if (getChunk(pos.getChunkLocation()) != null) { - getChunk(pos.getChunkLocation()).setBlock(pos.getX() % 16, pos.getY(), pos.getZ() % 16, block); + getChunk(pos.getChunkLocation()).setBlock(pos.getInChunkLocation(), block); } // do nothing if chunk is unloaded }