0

Merge branch 'feature/login-disconnect' into development

This commit is contained in:
2020-05-18 08:54:38 +03:00
4 changed files with 100 additions and 1 deletions

View File

@@ -5,6 +5,8 @@ import com.google.common.collect.ImmutableBiMap;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import mc.protocol.handshake.client.HandshakePacket; 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.PingPacket;
import mc.protocol.status.client.StatusServerRequest; import mc.protocol.status.client.StatusServerRequest;
import mc.protocol.status.server.StatusServerResponse; import mc.protocol.status.server.StatusServerResponse;
@@ -31,7 +33,16 @@ public enum State {
0x01, PingPacket.class 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) { public static State getById(int id) {
for (State state : State.values()) { for (State state : State.values()) {

View File

@@ -16,12 +16,14 @@ Data types
| | | | Каждый символ может состоять максимум из 4 байт. [3] | | | | | Каждый символ может состоять максимум из 4 байт. [3] |
| | | | Максимальная длина строки - 32767 (3 - это как раз размер VarInt для | | | | | Максимальная длина строки - 32767 (3 - это как раз размер VarInt для |
| | | | этого числа). | | | | | этого числа). |
| Text | >= 1 ; <= (n * 4) + 3 | JSON, закодированный как String | [4] |
| VarInt | >= 1 ; <= 5 | Число от -2147483648 и 2147483647 | 32-bit число с плавающей размерностью от 1 до 5 байт | | VarInt | >= 1 ; <= 5 | Число от -2147483648 и 2147483647 | 32-bit число с плавающей размерностью от 1 до 5 байт |
| VarLong | >= 1 ; <= 10 | Число от -9223372036854775808 и 9223372036854775807 | 64-bit число с плавающей размерностью от 1 до 10 байт | | VarLong | >= 1 ; <= 10 | Число от -9223372036854775808 и 9223372036854775807 | 64-bit число с плавающей размерностью от 1 до 10 байт |
[1] - https://en.wikipedia.org/wiki/Single-precision_floating-point_format [1] - https://en.wikipedia.org/wiki/Single-precision_floating-point_format
[2] - https://en.wikipedia.org/wiki/Double-precision_floating-point_format [2] - https://en.wikipedia.org/wiki/Double-precision_floating-point_format
[3] - http://unicode.org/glossary/#unicode_scalar_value [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 https://wiki.vg/index.php?title=Protocol&oldid=7368#Data_types
*/ */

View File

@@ -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.
*
* <p>Начало авторизации.</p>
*
* <p>Структура пакета
* <pre>
* | FIELD | TYPE | NOTES |
* |-------|--------|------------------|
* | Name | String | Имя/Логин игрока |
* </pre></p>
*
* @see <a href="https://wiki.vg/index.php?title=Protocol&oldid=7368#Login_Start" target="_top">Login start</a>
* @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);
}
}

View File

@@ -0,0 +1,48 @@
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.
*
* <p>Отключение клиента сервером с указанием причины.</p>
*
* <p>Структура пакета
* <pre>
* | FIELD | TYPE | NOTES |
* |--------|------|----------------------------------|
* | Reason | Text | Причина отключения. Опционально. |
* </pre></p>
*
* @see <a href="https://wiki.vg/index.php?title=Protocol&oldid=7368#Login_Start" target="_top">Login start</a>
* @see State
*/
@Data
public class DisconnectPacket implements Packet {
private Text reason;
@Override
public void readSelf(NetInputStream netInputStream) {
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
public void writeSelf(NetOutputStream netOutputStream) {
final String jsonText = JsonUtils.objectToJson(this.reason);
netOutputStream.writeString(jsonText);
}
}