From 3b49cad2a0a9233617387c827dc982dfa887fdd0 Mon Sep 17 00:00:00 2001
From: DmitriyMX
Date: Sun, 17 May 2020 22:53:04 +0300
Subject: [PATCH 1/2] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?=
=?UTF-8?q?=D0=BD=D1=8B=20=D0=BF=D0=B0=D0=BA=D0=B5=D1=82=D1=8B=20LoginStar?=
=?UTF-8?q?t=20=D0=B8=20Disconnect?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/main/java/mc/protocol/State.java | 13 +++++-
.../java/mc/protocol/io/package-info.java | 2 +
.../login/client/LoginStartPacket.java | 38 ++++++++++++++++
.../login/server/DisconnectPacket.java | 44 +++++++++++++++++++
4 files changed, 96 insertions(+), 1 deletion(-)
create mode 100644 src/main/java/mc/protocol/login/client/LoginStartPacket.java
create mode 100644 src/main/java/mc/protocol/login/server/DisconnectPacket.java
diff --git a/src/main/java/mc/protocol/State.java b/src/main/java/mc/protocol/State.java
index f154075..d42a1b8 100644
--- a/src/main/java/mc/protocol/State.java
+++ b/src/main/java/mc/protocol/State.java
@@ -5,6 +5,8 @@ import com.google.common.collect.ImmutableBiMap;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import mc.protocol.handshake.client.HandshakePacket;
+import mc.protocol.login.client.LoginStartPacket;
+import mc.protocol.login.server.DisconnectPacket;
import mc.protocol.status.PingPacket;
import mc.protocol.status.client.StatusServerRequest;
import mc.protocol.status.server.StatusServerResponse;
@@ -31,7 +33,16 @@ public enum State {
0x01, PingPacket.class
)
),
- LOGIN(2);
+ LOGIN(2,
+ // server bound
+ ImmutableBiMap.of(
+ 0x00, LoginStartPacket.class
+ ),
+ // client bound
+ ImmutableBiMap.of(
+ 0x00, DisconnectPacket.class
+ )
+ );
public static State getById(int id) {
for (State state : State.values()) {
diff --git a/src/main/java/mc/protocol/io/package-info.java b/src/main/java/mc/protocol/io/package-info.java
index 80569dc..388d39a 100644
--- a/src/main/java/mc/protocol/io/package-info.java
+++ b/src/main/java/mc/protocol/io/package-info.java
@@ -16,12 +16,14 @@ Data types
| | | | Каждый символ может состоять максимум из 4 байт. [3] |
| | | | Максимальная длина строки - 32767 (3 - это как раз размер VarInt для |
| | | | этого числа). |
+| Text | >= 1 ; <= (n * 4) + 3 | JSON, закодированный как String | [4] |
| 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
+[4] - https://wiki.vg/index.php?title=Chat&oldid=8329
https://wiki.vg/index.php?title=Protocol&oldid=7368#Data_types
*/
diff --git a/src/main/java/mc/protocol/login/client/LoginStartPacket.java b/src/main/java/mc/protocol/login/client/LoginStartPacket.java
new file mode 100644
index 0000000..f235376
--- /dev/null
+++ b/src/main/java/mc/protocol/login/client/LoginStartPacket.java
@@ -0,0 +1,38 @@
+package mc.protocol.login.client;
+
+import lombok.Data;
+import mc.protocol.Packet;
+import mc.protocol.State;
+import mc.protocol.io.NetInputStream;
+import mc.protocol.io.NetOutputStream;
+
+/**
+ * Login start packet.
+ *
+ * Начало авторизации.
+ *
+ * Структура пакета
+ *
+ * | FIELD | TYPE | NOTES |
+ * |-------|--------|------------------|
+ * | Name | String | Имя/Логин игрока |
+ *
+ *
+ * @see Login start
+ * @see State
+ */
+@Data
+public class LoginStartPacket implements Packet {
+
+ private String name;
+
+ @Override
+ public void readSelf(NetInputStream netInputStream) {
+ this.name = netInputStream.readString();
+ }
+
+ @Override
+ public void writeSelf(NetOutputStream netOutputStream) {
+ netOutputStream.writeString(name);
+ }
+}
diff --git a/src/main/java/mc/protocol/login/server/DisconnectPacket.java b/src/main/java/mc/protocol/login/server/DisconnectPacket.java
new file mode 100644
index 0000000..97b894f
--- /dev/null
+++ b/src/main/java/mc/protocol/login/server/DisconnectPacket.java
@@ -0,0 +1,44 @@
+package mc.protocol.login.server;
+
+import lombok.Data;
+import mc.protocol.Packet;
+import mc.protocol.State;
+import mc.protocol.io.DecoderException;
+import mc.protocol.io.NetInputStream;
+import mc.protocol.io.NetOutputStream;
+import mc.protocol.text.Text;
+import mc.protocol.utils.json.JsonUtils;
+
+/**
+ * Diconnect packet.
+ *
+ * Отключение клиента сервером с указанием причины.
+ *
+ * Структура пакета
+ *
+ * | FIELD | TYPE | NOTES |
+ * |--------|------|----------------------------------|
+ * | Reason | Text | Причина отключения. Опционально. |
+ *
+ *
+ * @see Login start
+ * @see State
+ */
+@Data
+public class DisconnectPacket implements Packet {
+
+ private Text reason;
+
+ @Override
+ public void readSelf(NetInputStream netInputStream) {
+ final String jsonText = netInputStream.readString();
+ this.reason = JsonUtils.jsonToObject(jsonText, Text.class)
+ .orElseThrow(() -> new DecoderException("Error decode reason:\n" + jsonText));
+ }
+
+ @Override
+ public void writeSelf(NetOutputStream netOutputStream) {
+ final String jsonText = JsonUtils.objectToJson(this.reason);
+ netOutputStream.writeString(jsonText);
+ }
+}
From 366c06dcb59291a792a974d75fa2df4e59d64ca4 Mon Sep 17 00:00:00 2001
From: DmitriyMX
Date: Sun, 17 May 2020 23:26:00 +0300
Subject: [PATCH 2/2] =?UTF-8?q?fix=20=D1=87=D1=82=D0=B5=D0=BD=D0=B8=D0=B5?=
=?UTF-8?q?=20DisconnectPacket?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../mc/protocol/login/server/DisconnectPacket.java | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/src/main/java/mc/protocol/login/server/DisconnectPacket.java b/src/main/java/mc/protocol/login/server/DisconnectPacket.java
index 97b894f..bf0d0e0 100644
--- a/src/main/java/mc/protocol/login/server/DisconnectPacket.java
+++ b/src/main/java/mc/protocol/login/server/DisconnectPacket.java
@@ -31,9 +31,13 @@ public class DisconnectPacket implements Packet {
@Override
public void readSelf(NetInputStream netInputStream) {
- final String jsonText = netInputStream.readString();
- this.reason = JsonUtils.jsonToObject(jsonText, Text.class)
- .orElseThrow(() -> new DecoderException("Error decode reason:\n" + jsonText));
+ final String rawString = netInputStream.readString();
+ if (rawString.startsWith("{") && rawString.endsWith("}")) {
+ this.reason = JsonUtils.jsonToObject(rawString, Text.class)
+ .orElseThrow(() -> new DecoderException("Error decode reason:\n" + rawString));
+ } else {
+ this.reason = Text.of(rawString);
+ }
}
@Override