From 82c5345693fe21047a61b53507309ec11d2623fa Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 10 Nov 2018 17:28:35 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D1=89?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20NibbleArray=20=D0=B2=20Core?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/mc/world/anvil/AnvilChunk.java | 1 + .../mc/world/anvil/AnvilChunkSection.java | 1 + .../main/java/mc/world/anvil/NibbleArray.java | 32 --------- .../main/java/mc/core/utils/NibbleArray.java | 65 +++++++++++++++++++ 4 files changed, 67 insertions(+), 32 deletions(-) delete mode 100644 anvil-loader/src/main/java/mc/world/anvil/NibbleArray.java create mode 100644 core/src/main/java/mc/core/utils/NibbleArray.java diff --git a/anvil-loader/src/main/java/mc/world/anvil/AnvilChunk.java b/anvil-loader/src/main/java/mc/world/anvil/AnvilChunk.java index a160c98..877d648 100644 --- a/anvil-loader/src/main/java/mc/world/anvil/AnvilChunk.java +++ b/anvil-loader/src/main/java/mc/world/anvil/AnvilChunk.java @@ -5,6 +5,7 @@ import gnu.trove.list.TByteList; import gnu.trove.list.array.TByteArrayList; import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import mc.core.utils.NibbleArray; import mc.core.world.Biome; import mc.core.world.chunk.Chunk; import mc.core.world.chunk.ChunkSection; diff --git a/anvil-loader/src/main/java/mc/world/anvil/AnvilChunkSection.java b/anvil-loader/src/main/java/mc/world/anvil/AnvilChunkSection.java index 80e895f..0278f8c 100644 --- a/anvil-loader/src/main/java/mc/world/anvil/AnvilChunkSection.java +++ b/anvil-loader/src/main/java/mc/world/anvil/AnvilChunkSection.java @@ -4,6 +4,7 @@ import gnu.trove.list.TByteList; import gnu.trove.list.linked.TByteLinkedList; import lombok.Getter; import lombok.Setter; +import mc.core.utils.NibbleArray; import mc.core.world.Biome; import mc.core.world.block.Block; import mc.core.world.chunk.ChunkSection; diff --git a/anvil-loader/src/main/java/mc/world/anvil/NibbleArray.java b/anvil-loader/src/main/java/mc/world/anvil/NibbleArray.java deleted file mode 100644 index 2b8b593..0000000 --- a/anvil-loader/src/main/java/mc/world/anvil/NibbleArray.java +++ /dev/null @@ -1,32 +0,0 @@ -package mc.world.anvil; - -import lombok.RequiredArgsConstructor; -import mc.core.world.block.BlockLocation; - -@RequiredArgsConstructor -public class NibbleArray { - private final byte[] data; - - private int coordsToIndex(int x, int y, int z) { - return y << 8 | z << 4 | x; - } - - private int nibbleIndex(int index) { - return index >> 1; - } - - private boolean isLowerNibble(int index) { - return (index & 1) == 0; - } - - public int get(BlockLocation location) { - return get(location.getX(), location.getY(), location.getZ()); - } - - public int get(int x, int y, int z) { - final int idx = coordsToIndex(x, y, z); - - final int ni = nibbleIndex(idx); - return isLowerNibble(idx) ? this.data[ni] & 15 : this.data[ni] >> 4 & 15; - } -} diff --git a/core/src/main/java/mc/core/utils/NibbleArray.java b/core/src/main/java/mc/core/utils/NibbleArray.java new file mode 100644 index 0000000..e8514f7 --- /dev/null +++ b/core/src/main/java/mc/core/utils/NibbleArray.java @@ -0,0 +1,65 @@ +package mc.core.utils; + +import lombok.RequiredArgsConstructor; +import mc.core.world.block.BlockLocation; + +/** + * Сжатый массив значений 0-15 + */ +@RequiredArgsConstructor +public class NibbleArray { + private final byte[] data; + + public NibbleArray(int capacity) { + this.data = new byte[capacity]; + } + + public NibbleArray() { + this.data = new byte[2048]; + } + + private int coordsToIndex(int x, int y, int z) { + return y << 8 | z << 4 | x; + } + + private int nibbleIndex(int index) { + return index >> 1; + } + + private boolean isLowerNibble(int index) { + return (index & 1) == 0; + } + + public int get(BlockLocation location) { + return get(location.getX(), location.getY(), location.getZ()); + } + + public int get(int x, int y, int z) { + final int idx = coordsToIndex(x, y, z); + + final int ni = nibbleIndex(idx); + return isLowerNibble(idx) ? this.data[ni] & 0x0F : this.data[ni] >> 4 & 0x0F; + } + + public void set(BlockLocation location, int value) { + set(location.getX(), location.getY(), location.getZ(), value); + } + + public void set(int x, int y, int z, int value) { + if (value < 0) value = 0; + else if (value > 15) value = 15; + + final int idx = coordsToIndex(x, y, z); + final int ni = nibbleIndex(idx); + + if (isLowerNibble(idx)) { + this.data[ni] = (byte)(value); + } else { + this.data[ni] = (byte)(this.data[ni] | value << 4); + } + } + + public byte[] getRawData() { + return data; + } +}