diff --git a/src/main/java/net/md_5/mc/protocol/PacketDefinitions.java b/src/main/java/net/md_5/mc/protocol/PacketDefinitions.java index 5777809c..f34b11c1 100644 --- a/src/main/java/net/md_5/mc/protocol/PacketDefinitions.java +++ b/src/main/java/net/md_5/mc/protocol/PacketDefinitions.java @@ -2,6 +2,9 @@ package net.md_5.mc.protocol; import java.io.DataInput; import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; public class PacketDefinitions { @@ -23,6 +26,11 @@ public class PacketDefinitions { short len = in.readShort(); skip(in, len * 2); } + + @Override + public String toString() { + return "String"; + } }; private static final Instruction ITEM = new Instruction() { @Override @@ -33,6 +41,11 @@ public class PacketDefinitions { SHORT_BYTE.read(in); } } + + @Override + public String toString() { + return "Item"; + } }; private static final Instruction SHORT_ITEM = new ShortHeader(ITEM); private static final Instruction METADATA = new Instruction() { @@ -69,6 +82,11 @@ public class PacketDefinitions { x = in.readByte(); } } + + @Override + public String toString() { + return "Metadata"; + } }; private static final Instruction BULK_CHUNK = new Instruction() { @Override @@ -77,6 +95,11 @@ public class PacketDefinitions { INT_BYTE.read(in); skip(in, count * 12); } + + @Override + public String toString() { + return "Bulk Chunk"; + } }; private static final Instruction UBYTE_BYTE = new Instruction() { @Override @@ -84,6 +107,11 @@ public class PacketDefinitions { int size = in.readUnsignedByte(); skip(in, size); } + + @Override + public String toString() { + return "Unsigned Byte Byte"; + } }; static { @@ -199,6 +227,33 @@ public class PacketDefinitions { opCodes[0xFD] = new Instruction[]{STRING, SHORT_BYTE, SHORT_BYTE}; opCodes[0xFE] = new Instruction[]{}; opCodes[0xFF] = new Instruction[]{STRING}; + + crushInstructions(); + } + + private static void crushInstructions() { + for (int i = 0; i < opCodes.length; i++) { + Instruction[] instructions = opCodes[i]; + if (instructions != null) { + List crushed = new ArrayList(); + int nextJumpSize = 0; + for (Instruction child : instructions) { + if (child instanceof JumpOpCode) { + nextJumpSize += ((JumpOpCode) child).len; + } else { + if (nextJumpSize != 0) { + crushed.add(new JumpOpCode(nextJumpSize)); + } + crushed.add(child); + nextJumpSize = 0; + } + } + if (nextJumpSize != 0) { + crushed.add(new JumpOpCode(nextJumpSize)); + } + opCodes[i] = crushed.toArray(new Instruction[crushed.size()]); + } + } } public static void readPacket(DataInput in) throws IOException { @@ -207,7 +262,7 @@ public class PacketDefinitions { if (instructions == null) { throw new IOException("Unknown packet id " + packetId); } - System.out.println(Integer.toHexString(packetId)); + for (Instruction instruction : instructions) { instruction.read(in); } @@ -222,6 +277,9 @@ public class PacketDefinitions { in.readByte(); } } + + @Override + public abstract String toString(); } static class JumpOpCode extends Instruction { @@ -239,6 +297,11 @@ public class PacketDefinitions { void read(DataInput in) throws IOException { skip(in, len); } + + @Override + public String toString() { + return "Jump(" + len + ")"; + } } static class ByteHeader extends Instruction { @@ -256,6 +319,11 @@ public class PacketDefinitions { child.read(in); } } + + @Override + public String toString() { + return "ByteHeader(" + child + ")"; + } } static class ShortHeader extends Instruction { @@ -273,6 +341,11 @@ public class PacketDefinitions { child.read(in); } } + + @Override + public String toString() { + return "ShortHeader(" + child + ")"; + } } static class IntHeader extends Instruction { @@ -290,5 +363,10 @@ public class PacketDefinitions { child.read(in); } } + + @Override + public String toString() { + return "IntHeader(" + child + ")"; + } } }