From 9872606d40e5cc481e7f6196dd5fbec7da16525e Mon Sep 17 00:00:00 2001 From: Bixilon Date: Fri, 3 Jul 2020 23:37:09 +0200 Subject: [PATCH] fix chunk reading for some servers (1.9) --- .../de/bixilon/minosoft/protocol/network/Connection.java | 1 + .../packets/clientbound/play/PacketChunkData.java | 8 ++++++++ .../serverbound/play/PacketPlayerAbilitiesSending.java | 2 +- .../packets/serverbound/play/PacketPlayerDigging.java | 2 +- .../bixilon/minosoft/protocol/protocol/InByteBuffer.java | 4 ++++ src/main/java/de/bixilon/minosoft/util/Util.java | 9 ++------- 6 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/Connection.java b/src/main/java/de/bixilon/minosoft/protocol/network/Connection.java index a9d5455f0..cb23c5dfd 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/Connection.java +++ b/src/main/java/de/bixilon/minosoft/protocol/network/Connection.java @@ -189,6 +189,7 @@ public class Connection { handleThread.start(); } + public PluginChannelHandler getPluginChannelHandler() { return pluginChannelHandler; } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChunkData.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChunkData.java index 31e3f26d8..e5156c534 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChunkData.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChunkData.java @@ -53,6 +53,8 @@ public class PacketChunkData implements ClientboundPacket { boolean groundUpContinuous = buffer.readBoolean(); short sectionBitMask = buffer.readShort(); int size = buffer.readVarInt(); + int lastPos = buffer.getPosition(); + buffer.setPosition(size + lastPos); chunk = ChunkUtil.readChunkPacket(buffer, sectionBitMask, (short) 0, groundUpContinuous, true); return true; @@ -62,13 +64,19 @@ public class PacketChunkData implements ClientboundPacket { boolean groundUpContinuous = buffer.readBoolean(); short sectionBitMask = (short) buffer.readVarInt(); int size = buffer.readVarInt(); + int lastPos = buffer.getPosition(); chunk = ChunkUtil.readChunkPacket(buffer, sectionBitMask, (short) 0, groundUpContinuous, true); + // set position of the byte buffer, because of some reasons HyPixel makes some weired stuff and sends way to much 0 bytes. (~ 190k) + buffer.setPosition(size + lastPos); int blockEntitiesCount = buffer.readVarInt(); for (int i = 0; i < blockEntitiesCount; i++) { CompoundTag tag = buffer.readNBT(); blockEntities.put(new BlockPosition(tag.getIntTag("x").getValue(), (short) tag.getIntTag("y").getValue(), tag.getIntTag("z").getValue()), tag); } + if (buffer.getBytesLeft() > 0) { + Log.debug("ERROR"); + } return true; } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/PacketPlayerAbilitiesSending.java b/src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/PacketPlayerAbilitiesSending.java index 1fcd2b7d1..1d573fed5 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/PacketPlayerAbilitiesSending.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/PacketPlayerAbilitiesSending.java @@ -37,7 +37,7 @@ public class PacketPlayerAbilitiesSending implements ServerboundPacket { case VERSION_1_7_10: case VERSION_1_8: case VERSION_1_9_4: - // only fly matches, everything else ignored + // only fly matters, everything else ignored byte flags = 0; if (flying) { flags |= 0b10; diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/PacketPlayerDigging.java b/src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/PacketPlayerDigging.java index 2acddc119..c90183363 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/PacketPlayerDigging.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/PacketPlayerDigging.java @@ -73,7 +73,7 @@ public class PacketPlayerDigging implements ServerboundPacket { @Override public void log() { - Log.protocol(String.format("Send player digging packet (status=%s, position=%s, face=%d)", status.name(), position.toString(), face)); + Log.protocol(String.format("Send player digging packet (status=%s, position=%s, face=%s)", status.name(), position.toString(), face.name())); } public enum DiggingStatus { diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.java index 26e25c330..9131ad1a4 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.java @@ -378,4 +378,8 @@ public class InByteBuffer { public String toString() { return "dataLen: " + bytes.length + "; pos: " + pos; } + + public byte[] getBytes() { + return bytes; + } } diff --git a/src/main/java/de/bixilon/minosoft/util/Util.java b/src/main/java/de/bixilon/minosoft/util/Util.java index 072b97891..8be45300c 100644 --- a/src/main/java/de/bixilon/minosoft/util/Util.java +++ b/src/main/java/de/bixilon/minosoft/util/Util.java @@ -55,14 +55,9 @@ public class Util { while (!inflater.finished()) { stream.write(buffer, 0, inflater.inflate(buffer)); } - } catch (DataFormatException e) { + stream.close(); + } catch (IOException | DataFormatException e) { e.printStackTrace(); - } finally { - try { - stream.close(); - } catch (IOException e) { - e.printStackTrace(); - } } return new InByteBuffer(stream.toByteArray(), version); }