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); + } +}