From 0d8e81775c084aeb0dbe4d5b3d072d324810079b Mon Sep 17 00:00:00 2001 From: Bixilon Date: Sat, 20 Jun 2020 15:08:52 +0200 Subject: [PATCH] fix chunk position bug (negative coordinates) and loading bug --- .../game/datatypes/world/BlockPosition.java | 16 ++++++++----- .../minosoft/game/datatypes/world/Chunk.java | 13 +++++++---- .../game/datatypes/world/ChunkNibble.java | 23 ------------------- 3 files changed, 18 insertions(+), 34 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/world/BlockPosition.java b/src/main/java/de/bixilon/minosoft/game/datatypes/world/BlockPosition.java index 728c6e379..f3922067f 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/world/BlockPosition.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/world/BlockPosition.java @@ -60,11 +60,15 @@ public class BlockPosition { return x * y * z; } - public byte getSectionHeight() { - return (byte) (getY() / 16); - } - - public ChunkNibbleLocation getNibbleLocation() { - return new ChunkNibbleLocation(getX() % 16, getY() % 16, getZ() % 16); + public InChunkLocation getInChunkLocation() { + int x = getX() % 16; + if (x < 0) { + x = 16 + x; + } + int z = getZ() % 16; + if (z < 0) { + z = 16 + z; + } + return new InChunkLocation(x, getY(), z); } } 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 515875ce0..82ad64b5c 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 @@ -24,9 +24,13 @@ import java.util.Map; */ public class Chunk { private final HashMap nibbles; + private final HashMap signs; + private final HashMap blockEntityMeta; public Chunk(HashMap chunks) { this.nibbles = chunks; + signs = new HashMap<>(); + blockEntityMeta = new HashMap<>(); } public Blocks getBlock(int x, int y, int z) { @@ -63,19 +67,18 @@ public class Chunk { } public void updateSign(BlockPosition position, String[] lines) { - nibbles.get(position.getSectionHeight()).updateSign(position.getNibbleLocation(), lines); + signs.put(position.getInChunkLocation(), lines); } public String[] getSignText(BlockPosition position) { - return nibbles.get(position.getSectionHeight()).getSignText(position.getNibbleLocation()); - + return signs.get(position.getInChunkLocation()); } public void setBlockEntityData(BlockPosition position, CompoundTag nbt) { - nibbles.get(position.getSectionHeight()).setBlockEntityData(position.getNibbleLocation(), nbt); + blockEntityMeta.put(position.getInChunkLocation(), nbt); } public CompoundTag getBlockEntityData(BlockPosition position) { - return nibbles.get(position.getSectionHeight()).getBlockEntityData(position.getNibbleLocation()); + return blockEntityMeta.get(position.getInChunkLocation()); } } diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/world/ChunkNibble.java b/src/main/java/de/bixilon/minosoft/game/datatypes/world/ChunkNibble.java index 10426eaa7..579c97ab9 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/world/ChunkNibble.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/world/ChunkNibble.java @@ -14,7 +14,6 @@ package de.bixilon.minosoft.game.datatypes.world; import de.bixilon.minosoft.game.datatypes.blocks.Blocks; -import de.bixilon.minosoft.nbt.tag.CompoundTag; import java.util.HashMap; @@ -23,20 +22,14 @@ import java.util.HashMap; */ public class ChunkNibble { private final HashMap blocks; - private final HashMap signs; - private final HashMap blockEntityMeta; public ChunkNibble(HashMap blocks) { this.blocks = blocks; - this.signs = new HashMap<>(); - blockEntityMeta = new HashMap<>(); } public ChunkNibble() { // empty this.blocks = new HashMap<>(); - this.signs = new HashMap<>(); - blockEntityMeta = new HashMap<>(); } public Blocks getBlock(ChunkNibbleLocation loc) { @@ -54,20 +47,4 @@ public class ChunkNibble { public void setBlock(ChunkNibbleLocation location, Blocks block) { blocks.put(location, block); } - - public void updateSign(ChunkNibbleLocation location, String[] lines) { - signs.put(location, lines); - } - - public String[] getSignText(ChunkNibbleLocation location) { - return signs.get(location); - } - - public void setBlockEntityData(ChunkNibbleLocation nibbleLocation, CompoundTag nbt) { - blockEntityMeta.put(nibbleLocation, nbt); - } - - public CompoundTag getBlockEntityData(ChunkNibbleLocation nibbleLocation) { - return blockEntityMeta.get(nibbleLocation); - } }