From 96a25f19ab64fbf339dde0c88e62894d58a57465 Mon Sep 17 00:00:00 2001 From: Sitterr Date: Mon, 24 Jun 2024 23:23:44 +0300 Subject: [PATCH] fixed apply() for both BiomeParser118 and BlockParser118 --- .../parsers/impl/anvil118/BiomeParser118.java | 21 ++++++++-- .../parsers/impl/anvil118/BlockParser118.java | 38 ++++++++++++++----- 2 files changed, 46 insertions(+), 13 deletions(-) diff --git a/src/main/java/net/querz/mca/parsers/impl/anvil118/BiomeParser118.java b/src/main/java/net/querz/mca/parsers/impl/anvil118/BiomeParser118.java index c18a1928..95fc7840 100644 --- a/src/main/java/net/querz/mca/parsers/impl/anvil118/BiomeParser118.java +++ b/src/main/java/net/querz/mca/parsers/impl/anvil118/BiomeParser118.java @@ -150,15 +150,28 @@ public void apply() { int newLength = (int) Math.ceil(64D / bytesPerLong); newBiomes = data == null || newLength != data.length ? new long[newLength] : data; - int index = 0; - for (int i = 0; i < newLength; i++) { + for (int i = 0; i < newLength - 1; i++) { long l = 0L; - for (int j = 0; j < bytesPerLong; j++, index++) { - l += parsedIndexes[index]; + for (int j = 0; j < bytesPerLong - 1; j++) { + l += parsedIndexes[(i + 1) * bytesPerLong - j - 1]; l <<= numberOfBits; } + l += parsedIndexes[i * bytesPerLong]; + newBiomes[i] = l; } + { + int i = newLength - 1; + long l = 0L; + int jm = 64 - (newLength - 1) * bytesPerLong; + for (int j = 0; j < jm - 1; j++) { + l += parsedIndexes[i * bytesPerLong + jm - j - 1]; + l <<= numberOfBits; + } + l += parsedIndexes[i * bytesPerLong]; + + newBiomes[newLength - 1] = l; + } data = newBiomes; applyToHandle(palette, data); } diff --git a/src/main/java/net/querz/mca/parsers/impl/anvil118/BlockParser118.java b/src/main/java/net/querz/mca/parsers/impl/anvil118/BlockParser118.java index 46ec5a16..e3c3692e 100644 --- a/src/main/java/net/querz/mca/parsers/impl/anvil118/BlockParser118.java +++ b/src/main/java/net/querz/mca/parsers/impl/anvil118/BlockParser118.java @@ -52,9 +52,9 @@ private void parseIndexes() { int mask = (1 << numberOfBits) - 1; int i = 0; for (long l : data) { - for (int s = 0; s < shortsPerLong && i < 4096; s++) { - parsedIndexes[i++] = (short) (l & mask); - l >>= numberOfBits; + for (int s = 0; s < shortsPerLong && i < 4096; s++, i++) { + parsedIndexes[i] = (short) (l & mask); + l = l >> numberOfBits; } } } @@ -99,6 +99,9 @@ public int getSize() { public void apply() { // collect all used block states Short[] usedBlockStates = new Short[palette.size()]; + if (parsedIndexes == null) { + parseIndexes(); + } for (short b : parsedIndexes) { usedBlockStates[b] = b; } @@ -140,19 +143,36 @@ public void apply() { long[] newBlockStates; int shortsPerLong = Math.floorDiv(64, numberOfBits); + int freePerLong = Math.floorMod(64, numberOfBits); int newLength = (int) Math.ceil(4096D / shortsPerLong); newBlockStates = data == null || newLength != data.length ? new long[newLength] : data; - - int index = 0; - for (int i = 0; i < newLength; i++) { - long l = 0L; - for (int j = 0; j < shortsPerLong; j++, index++) { - l += parsedIndexes[index]; + for (int i = 0; i < newLength - 1; i++) { + long l = 0; + for (int j = 0; j < shortsPerLong - 1; j++) { + l += parsedIndexes[(i + 1) * shortsPerLong - j - 1]; l <<= numberOfBits; } + l += parsedIndexes[i * shortsPerLong]; + if(newBlockStates[i] != l){ + int g =4; + } newBlockStates[i] = l; } + { + int i = newLength - 1; + long l = 0L; + int jm = 4096 - (newLength - 1) * shortsPerLong; + for(int j = 0; j < jm - 1; j++){ + l += parsedIndexes[i * shortsPerLong + jm - j - 1]; + l <<= numberOfBits; + } + l += parsedIndexes[i * shortsPerLong]; + + newBlockStates[newLength - 1] = l; + } + + data = newBlockStates; applyToHandle(palette, data); }