From 3660b2e5e8c57fae0179c48f90cb9af0156467e1 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Fri, 1 May 2020 19:35:54 +0300 Subject: [PATCH 1/3] =?UTF-8?q?=D0=BD=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C=D1=88?= =?UTF-8?q?=D0=BE=D0=B9=20=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=B8=D0=BD=D0=B3=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/mc/protocol/Packet.java | 3 ++ src/main/java/mc/protocol/State.java | 46 +++++++++++-------- .../handshake/client/HandshakePacket.java | 4 +- .../protocol/{ => io}/DecoderException.java | 2 +- .../mc/protocol/{ => io}/NetInputStream.java | 6 ++- .../mc/protocol/{ => io}/NetOutputStream.java | 4 +- .../coder/ByteArrayNetOutputStream.java | 4 +- .../{ => io}/coder/ProtocolDecoder.java | 4 +- .../{ => io}/coder/ProtocolEncoder.java | 7 ++- .../status/client/StatusServerRequest.java | 4 +- .../status/server/StatusServerResponse.java | 4 +- 11 files changed, 54 insertions(+), 34 deletions(-) rename src/main/java/mc/protocol/{ => io}/DecoderException.java (85%) rename src/main/java/mc/protocol/{ => io}/NetInputStream.java (96%) rename src/main/java/mc/protocol/{ => io}/NetOutputStream.java (98%) rename src/main/java/mc/protocol/{ => io}/coder/ByteArrayNetOutputStream.java (90%) rename src/main/java/mc/protocol/{ => io}/coder/ProtocolDecoder.java (95%) rename src/main/java/mc/protocol/{ => io}/coder/ProtocolEncoder.java (86%) diff --git a/src/main/java/mc/protocol/Packet.java b/src/main/java/mc/protocol/Packet.java index f1ee9d7..2b3809a 100644 --- a/src/main/java/mc/protocol/Packet.java +++ b/src/main/java/mc/protocol/Packet.java @@ -1,5 +1,8 @@ package mc.protocol; +import mc.protocol.io.NetInputStream; +import mc.protocol.io.NetOutputStream; + public interface Packet { void readSelf(NetInputStream netInputStream); diff --git a/src/main/java/mc/protocol/State.java b/src/main/java/mc/protocol/State.java index bce5511..df5038a 100644 --- a/src/main/java/mc/protocol/State.java +++ b/src/main/java/mc/protocol/State.java @@ -2,10 +2,8 @@ package mc.protocol; import com.google.common.collect.BiMap; import com.google.common.collect.ImmutableBiMap; -import lombok.AccessLevel; import lombok.Getter; import lombok.RequiredArgsConstructor; -import lombok.Setter; import mc.protocol.handshake.client.HandshakePacket; import mc.protocol.status.client.StatusServerRequest; import mc.protocol.status.server.StatusServerResponse; @@ -13,20 +11,23 @@ import mc.protocol.status.server.StatusServerResponse; @RequiredArgsConstructor public enum State { - HANDSHAKING(-1){{ - setServerBoundPackets(ImmutableBiMap.of( - 0x00, HandshakePacket.class - )); - }}, + HANDSHAKING(-1, + // server bound + ImmutableBiMap.of( + 0x00, HandshakePacket.class + ) + ), PLAY(0), - STATUS(1){{ - setServerBoundPackets(ImmutableBiMap.of( - 0x00, StatusServerRequest.class - )); - setClientBoundPackets(ImmutableBiMap.of( - 0x00, StatusServerResponse.class - )); - }}, + STATUS(1, + // server bound + ImmutableBiMap.of( + 0x00, StatusServerRequest.class + ), + // client bound + ImmutableBiMap.of( + 0x00, StatusServerResponse.class + ) + ), LOGIN(2); public static State getById(int id) { @@ -42,11 +43,20 @@ public enum State { @Getter private final int id; - @Setter(value = AccessLevel.PROTECTED) + private BiMap> serverBoundPackets; + private BiMap> clientBoundPackets; - @Setter(value = AccessLevel.PROTECTED) - private BiMap> serverBoundPackets; + State(int id, BiMap> serverBoundPackets) { + this.id = id; + this.serverBoundPackets = serverBoundPackets; + } + + State(int id, BiMap> serverBoundPackets, BiMap> clientBoundPackets) { + this.id = id; + this.serverBoundPackets = serverBoundPackets; + this.clientBoundPackets = clientBoundPackets; + } public Class getPacketById(PacketDirection direction, int id) { if (direction == PacketDirection.CLIENT_BOUND) { diff --git a/src/main/java/mc/protocol/handshake/client/HandshakePacket.java b/src/main/java/mc/protocol/handshake/client/HandshakePacket.java index 2d2f148..3b94b12 100644 --- a/src/main/java/mc/protocol/handshake/client/HandshakePacket.java +++ b/src/main/java/mc/protocol/handshake/client/HandshakePacket.java @@ -1,10 +1,10 @@ package mc.protocol.handshake.client; import lombok.Data; -import mc.protocol.NetInputStream; -import mc.protocol.NetOutputStream; import mc.protocol.Packet; import mc.protocol.State; +import mc.protocol.io.NetInputStream; +import mc.protocol.io.NetOutputStream; @Data public class HandshakePacket implements Packet { diff --git a/src/main/java/mc/protocol/DecoderException.java b/src/main/java/mc/protocol/io/DecoderException.java similarity index 85% rename from src/main/java/mc/protocol/DecoderException.java rename to src/main/java/mc/protocol/io/DecoderException.java index ac45ea2..a30ee19 100644 --- a/src/main/java/mc/protocol/DecoderException.java +++ b/src/main/java/mc/protocol/io/DecoderException.java @@ -1,4 +1,4 @@ -package mc.protocol; +package mc.protocol.io; public class DecoderException extends RuntimeException { diff --git a/src/main/java/mc/protocol/NetInputStream.java b/src/main/java/mc/protocol/io/NetInputStream.java similarity index 96% rename from src/main/java/mc/protocol/NetInputStream.java rename to src/main/java/mc/protocol/io/NetInputStream.java index 968dfb8..fa2169e 100644 --- a/src/main/java/mc/protocol/NetInputStream.java +++ b/src/main/java/mc/protocol/io/NetInputStream.java @@ -1,4 +1,4 @@ -package mc.protocol; +package mc.protocol.io; import java.io.IOException; import java.io.InputStream; @@ -39,7 +39,7 @@ public abstract class NetInputStream extends InputStream { if (length == 0) { return ""; } else if (length > maxLength) { - throw new DecoderException("String length exceeds maximum length: " + length + " > " + maxLength); + throw new DecoderException("String length exceeds maximum length: " + length + " > " + maxLength); } else if (length < 0) { throw new DecoderException("String length less zero!"); } @@ -101,6 +101,8 @@ public abstract class NetInputStream extends InputStream { } public abstract byte readByte(); + public abstract int readBytes(byte[] buffer, int offset, int lengtn); + public abstract int readShort(); } diff --git a/src/main/java/mc/protocol/NetOutputStream.java b/src/main/java/mc/protocol/io/NetOutputStream.java similarity index 98% rename from src/main/java/mc/protocol/NetOutputStream.java rename to src/main/java/mc/protocol/io/NetOutputStream.java index aa0ca68..0435ad0 100644 --- a/src/main/java/mc/protocol/NetOutputStream.java +++ b/src/main/java/mc/protocol/io/NetOutputStream.java @@ -1,4 +1,4 @@ -package mc.protocol; +package mc.protocol.io; import java.io.IOException; import java.io.OutputStream; @@ -84,6 +84,8 @@ public abstract class NetOutputStream extends OutputStream { } public abstract void writeByte(int value); + public abstract void writeBytes(byte[] buffer, int offset, int lengtn); + public abstract void writeShort(int value); } diff --git a/src/main/java/mc/protocol/coder/ByteArrayNetOutputStream.java b/src/main/java/mc/protocol/io/coder/ByteArrayNetOutputStream.java similarity index 90% rename from src/main/java/mc/protocol/coder/ByteArrayNetOutputStream.java rename to src/main/java/mc/protocol/io/coder/ByteArrayNetOutputStream.java index 9329ffa..f42ee07 100644 --- a/src/main/java/mc/protocol/coder/ByteArrayNetOutputStream.java +++ b/src/main/java/mc/protocol/io/coder/ByteArrayNetOutputStream.java @@ -1,6 +1,6 @@ -package mc.protocol.coder; +package mc.protocol.io.coder; -import mc.protocol.NetOutputStream; +import mc.protocol.io.NetOutputStream; import java.io.ByteArrayOutputStream; diff --git a/src/main/java/mc/protocol/coder/ProtocolDecoder.java b/src/main/java/mc/protocol/io/coder/ProtocolDecoder.java similarity index 95% rename from src/main/java/mc/protocol/coder/ProtocolDecoder.java rename to src/main/java/mc/protocol/io/coder/ProtocolDecoder.java index 9715c7b..ff2b348 100644 --- a/src/main/java/mc/protocol/coder/ProtocolDecoder.java +++ b/src/main/java/mc/protocol/io/coder/ProtocolDecoder.java @@ -1,4 +1,4 @@ -package mc.protocol.coder; +package mc.protocol.io.coder; /* Packet format: @@ -13,10 +13,10 @@ https://wiki.vg/index.php?title=Protocol&oldid=7368#Without_compression */ import lombok.RequiredArgsConstructor; -import mc.protocol.NetInputStream; import mc.protocol.Packet; import mc.protocol.PacketDirection; import mc.protocol.State; +import mc.protocol.io.NetInputStream; import java.util.Objects; diff --git a/src/main/java/mc/protocol/coder/ProtocolEncoder.java b/src/main/java/mc/protocol/io/coder/ProtocolEncoder.java similarity index 86% rename from src/main/java/mc/protocol/coder/ProtocolEncoder.java rename to src/main/java/mc/protocol/io/coder/ProtocolEncoder.java index a30170f..d1c7731 100644 --- a/src/main/java/mc/protocol/coder/ProtocolEncoder.java +++ b/src/main/java/mc/protocol/io/coder/ProtocolEncoder.java @@ -1,7 +1,10 @@ -package mc.protocol.coder; +package mc.protocol.io.coder; import lombok.RequiredArgsConstructor; -import mc.protocol.*; +import mc.protocol.Packet; +import mc.protocol.PacketDirection; +import mc.protocol.State; +import mc.protocol.io.NetOutputStream; import java.util.Objects; diff --git a/src/main/java/mc/protocol/status/client/StatusServerRequest.java b/src/main/java/mc/protocol/status/client/StatusServerRequest.java index 4bf640a..eb94b10 100644 --- a/src/main/java/mc/protocol/status/client/StatusServerRequest.java +++ b/src/main/java/mc/protocol/status/client/StatusServerRequest.java @@ -1,8 +1,8 @@ package mc.protocol.status.client; -import mc.protocol.NetInputStream; -import mc.protocol.NetOutputStream; import mc.protocol.Packet; +import mc.protocol.io.NetInputStream; +import mc.protocol.io.NetOutputStream; public class StatusServerRequest implements Packet { diff --git a/src/main/java/mc/protocol/status/server/StatusServerResponse.java b/src/main/java/mc/protocol/status/server/StatusServerResponse.java index ea78013..2ad0c01 100644 --- a/src/main/java/mc/protocol/status/server/StatusServerResponse.java +++ b/src/main/java/mc/protocol/status/server/StatusServerResponse.java @@ -1,9 +1,9 @@ package mc.protocol.status.server; import lombok.Data; -import mc.protocol.NetInputStream; -import mc.protocol.NetOutputStream; import mc.protocol.Packet; +import mc.protocol.io.NetInputStream; +import mc.protocol.io.NetOutputStream; @Data public class StatusServerResponse implements Packet { From 4e5b92d8cd6a05a1a2a2dfd2d5de94aa34c618b5 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 2 May 2020 01:04:21 +0300 Subject: [PATCH 2/3] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/mc/protocol/EmptyPacket.java | 17 +++++++++++ .../handshake/client/HandshakePacket.java | 20 +++++++++++++ .../mc/protocol/io/coder/ProtocolDecoder.java | 12 -------- .../mc/protocol/io/coder/ProtocolEncoder.java | 12 -------- .../mc/protocol/io/coder/package-info.java | 13 +++++++++ .../java/mc/protocol/io/package-info.java | 29 +++++++++++++++++++ .../status/client/StatusServerRequest.java | 20 +++++-------- .../status/server/StatusServerResponse.java | 14 +++++++++ 8 files changed, 100 insertions(+), 37 deletions(-) create mode 100644 src/main/java/mc/protocol/EmptyPacket.java create mode 100644 src/main/java/mc/protocol/io/coder/package-info.java create mode 100644 src/main/java/mc/protocol/io/package-info.java diff --git a/src/main/java/mc/protocol/EmptyPacket.java b/src/main/java/mc/protocol/EmptyPacket.java new file mode 100644 index 0000000..15c98b7 --- /dev/null +++ b/src/main/java/mc/protocol/EmptyPacket.java @@ -0,0 +1,17 @@ +package mc.protocol; + +import mc.protocol.io.NetInputStream; +import mc.protocol.io.NetOutputStream; + +public abstract class EmptyPacket implements Packet { + + @Override + public void readSelf(NetInputStream netInputStream) { + // empty + } + + @Override + public void writeSelf(NetOutputStream netOutputStream) { + // empty + } +} diff --git a/src/main/java/mc/protocol/handshake/client/HandshakePacket.java b/src/main/java/mc/protocol/handshake/client/HandshakePacket.java index 3b94b12..6f72ed9 100644 --- a/src/main/java/mc/protocol/handshake/client/HandshakePacket.java +++ b/src/main/java/mc/protocol/handshake/client/HandshakePacket.java @@ -6,6 +6,26 @@ import mc.protocol.State; import mc.protocol.io.NetInputStream; import mc.protocol.io.NetOutputStream; +/** + * Handshake packet. + * + *

Данный пакет заставляет сервер переключить текущий {@link State}

+ * + *

Структура пакета + *

+ * | FIELD            | TYPE           | NOTES                                        |
+ * |------------------|----------------|----------------------------------------------|
+ * | Protocol version | VarInt         | Версия протокола [1]                         |
+ * | Server address   | Stirng         | Hostname или IP                              |
+ * | Server port      | Unsigned Short | Порт сервера                                 |
+ * | Next stage       | VarInt         | ID State на который необходимо переключиться |
+ *
+ * [1] - Protocol version numbers
+ * 

+ * + * @see Handshake + * @see State + */ @Data public class HandshakePacket implements Packet { diff --git a/src/main/java/mc/protocol/io/coder/ProtocolDecoder.java b/src/main/java/mc/protocol/io/coder/ProtocolDecoder.java index ff2b348..4acad4c 100644 --- a/src/main/java/mc/protocol/io/coder/ProtocolDecoder.java +++ b/src/main/java/mc/protocol/io/coder/ProtocolDecoder.java @@ -1,17 +1,5 @@ package mc.protocol.io.coder; -/* -Packet format: - -| FIELD | TYPE | NOTES | -+------------+--------+-----------------------------------+ -| SIZE | VarInt | = sizeOf(id) + sizeOf(byte_array) | -| PACKET ID | VarInt | | -| BYTE ARRAY | bytes | | - -https://wiki.vg/index.php?title=Protocol&oldid=7368#Without_compression -*/ - import lombok.RequiredArgsConstructor; import mc.protocol.Packet; import mc.protocol.PacketDirection; diff --git a/src/main/java/mc/protocol/io/coder/ProtocolEncoder.java b/src/main/java/mc/protocol/io/coder/ProtocolEncoder.java index d1c7731..973cf8d 100644 --- a/src/main/java/mc/protocol/io/coder/ProtocolEncoder.java +++ b/src/main/java/mc/protocol/io/coder/ProtocolEncoder.java @@ -8,18 +8,6 @@ import mc.protocol.io.NetOutputStream; import java.util.Objects; -/* -Packet format: - -| FIELD | TYPE | NOTES | -+------------+--------+-----------------------------------+ -| SIZE | VarInt | = sizeOf(id) + sizeOf(byte_array) | -| PACKET ID | VarInt | | -| BYTE ARRAY | bytes | | - -https://wiki.vg/index.php?title=Protocol&oldid=7368#Without_compression -*/ - @RequiredArgsConstructor public class ProtocolEncoder { diff --git a/src/main/java/mc/protocol/io/coder/package-info.java b/src/main/java/mc/protocol/io/coder/package-info.java new file mode 100644 index 0000000..aa5d0b8 --- /dev/null +++ b/src/main/java/mc/protocol/io/coder/package-info.java @@ -0,0 +1,13 @@ +/* +Формат пакета без компрессии + +| FIELD | TYPE | NOTES | +|-------------|--------|-----------------------------------| +| SIZE | VarInt | = sizeOf(id) + sizeOf(byte_array) | +| PACKET ID | VarInt | | +| PACKET DATA | bytes | | + +https://wiki.vg/index.php?title=Protocol&oldid=7368#Without_compression +*/ + +package mc.protocol.io.coder; \ No newline at end of file diff --git a/src/main/java/mc/protocol/io/package-info.java b/src/main/java/mc/protocol/io/package-info.java new file mode 100644 index 0000000..80569dc --- /dev/null +++ b/src/main/java/mc/protocol/io/package-info.java @@ -0,0 +1,29 @@ +/* +Data types + +| Type | Size (bytes) | Кодирование | Коментарий | +|----------------|-----------------------|-----------------------------------------------------|--------------------------------------------------------------------------| +| Boolean | 1 | True или False | True = 0x01; False = 0x00 | +| Byte | 1 | Число от -128 до 127 | 8-bit число со знаком | +| Unsigned Byte | 1 | Число от 0 до 255 | 8-bit без знаковое число | +| Short | 2 | Число от -32768 до 32767 | 16-bit число со знаком | +| Unsigned Short | 2 | Число от -32768 до 32767 | 16-bit без знаковое число | +| Int | 4 | Число от -2147483648 и 2147483647 | 32-bit число со знаком | +| Long | 8 | Число от -9223372036854775808 и 9223372036854775807 | 64-bit число со знаком | +| Float | 4 | 32-bit число одинарной точности (IEEE 754-2008) | [1] | +| Double | 8 | 64-bit число одинарной точности (IEEE 754-2008) | [2] | +| String (n) | >= 1 ; <= (n * 4) + 3 | Последовательность Unicode scalar values | В начале пишется длина строки в VarInt, после чего записываются символы. | +| | | | Каждый символ может состоять максимум из 4 байт. [3] | +| | | | Максимальная длина строки - 32767 (3 - это как раз размер VarInt для | +| | | | этого числа). | +| VarInt | >= 1 ; <= 5 | Число от -2147483648 и 2147483647 | 32-bit число с плавающей размерностью от 1 до 5 байт | +| VarLong | >= 1 ; <= 10 | Число от -9223372036854775808 и 9223372036854775807 | 64-bit число с плавающей размерностью от 1 до 10 байт | + +[1] - https://en.wikipedia.org/wiki/Single-precision_floating-point_format +[2] - https://en.wikipedia.org/wiki/Double-precision_floating-point_format +[3] - http://unicode.org/glossary/#unicode_scalar_value + +https://wiki.vg/index.php?title=Protocol&oldid=7368#Data_types + */ + +package mc.protocol.io; \ No newline at end of file diff --git a/src/main/java/mc/protocol/status/client/StatusServerRequest.java b/src/main/java/mc/protocol/status/client/StatusServerRequest.java index eb94b10..59ae612 100644 --- a/src/main/java/mc/protocol/status/client/StatusServerRequest.java +++ b/src/main/java/mc/protocol/status/client/StatusServerRequest.java @@ -1,18 +1,12 @@ package mc.protocol.status.client; -import mc.protocol.Packet; -import mc.protocol.io.NetInputStream; -import mc.protocol.io.NetOutputStream; +import mc.protocol.EmptyPacket; -public class StatusServerRequest implements Packet { +/** + * Status server packet, request. + * + *

Клиент запрашивает получение информации о сервере

+ */ +public class StatusServerRequest extends EmptyPacket { - @Override - public void readSelf(NetInputStream netInputStream) { - // empty - } - - @Override - public void writeSelf(NetOutputStream netOutputStream) { - // empty - } } diff --git a/src/main/java/mc/protocol/status/server/StatusServerResponse.java b/src/main/java/mc/protocol/status/server/StatusServerResponse.java index 2ad0c01..f540f12 100644 --- a/src/main/java/mc/protocol/status/server/StatusServerResponse.java +++ b/src/main/java/mc/protocol/status/server/StatusServerResponse.java @@ -5,6 +5,20 @@ import mc.protocol.Packet; import mc.protocol.io.NetInputStream; import mc.protocol.io.NetOutputStream; +/** + * Status server packet, response. + * + *

Информация о сервере

+ * + *

Структура пакета + *

+ * | FIELD         | TYPE   | NOTES                                   |
+ * |---------------|--------|-----------------------------------------|
+ * | JSON Response | String | Информация о сервере в JSON формате [1] |
+ *
+ * [1] - Server List Ping: Response
+ * 

+ */ @Data public class StatusServerResponse implements Packet { From 996293192c83a372204efafdaaa4417a5940f80b Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 2 May 2020 01:58:18 +0300 Subject: [PATCH 3/3] =?UTF-8?q?gradle:=20=D1=83=D0=B1=D0=B8=D1=80=D0=B0?= =?UTF-8?q?=D0=B5=D0=BC=20wrapper=20task?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit потому что у нас уже есть wrapper properties --- build.gradle | 5 ----- 1 file changed, 5 deletions(-) diff --git a/build.gradle b/build.gradle index 0a9a4dd..3dd56ba 100644 --- a/build.gradle +++ b/build.gradle @@ -1,10 +1,5 @@ apply plugin: 'java' -wrapper { - gradleVersion = '5.3' - distributionType = Wrapper.DistributionType.BIN -} - project.group = projectGroup project.version = projectVersion