Archived
0

refactoring: Packets

This commit is contained in:
2021-05-10 03:15:11 +03:00
parent 70d8efe421
commit f9a71250b1
39 changed files with 184 additions and 253 deletions

View File

@@ -5,6 +5,7 @@ dependencies {
implementation libs.netty.transport implementation libs.netty.transport
implementation libs.netty.codec implementation libs.netty.codec
implementation libs.json
testImplementation libs.lang3 testImplementation libs.lang3
} }

View File

@@ -3,7 +3,16 @@ package mc.protocol;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import mc.protocol.packets.ClientSidePacket; import mc.protocol.packets.ClientSidePacket;
import mc.protocol.packets.KeepAlivePacket;
import mc.protocol.packets.ServerSidePacket; import mc.protocol.packets.ServerSidePacket;
import mc.protocol.packets.handshaking.client.HandshakePacket;
import mc.protocol.packets.login.client.LoginStartPacket;
import mc.protocol.packets.login.server.DisconnectPacket;
import mc.protocol.packets.login.server.LoginSuccessPacket;
import mc.protocol.packets.play.client.*;
import mc.protocol.packets.play.server.*;
import mc.protocol.packets.status.client.StatusServerRequestPacket;
import mc.protocol.packets.status.server.StatusServerResponse;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.Collections; import java.util.Collections;
@@ -14,30 +23,55 @@ public enum State {
HANDSHAKING(0, HANDSHAKING(0,
// client side // client side
Collections.emptyMap(), Map.of(0x00, HandshakePacket.class),
// server side // server side
Collections.emptyMap() Collections.emptyMap()
), ),
STATUS(1, STATUS(1,
// client side // client side
Collections.emptyMap(), Map.of(
0x00, StatusServerRequestPacket.class,
0x01, KeepAlivePacket.class
),
// server side // server side
Collections.emptyMap() Map.of(
StatusServerResponse.class, 0x00,
KeepAlivePacket.class, 0x01
)
), ),
LOGIN(2, LOGIN(2,
// client side // client side
Collections.emptyMap(), Map.of(0x00, LoginStartPacket.class),
// server side // server side
Collections.emptyMap() Map.of(
DisconnectPacket.class, 0x00,
LoginSuccessPacket.class, 0x02
)
), ),
PLAY(3, PLAY(3,
// client side // client side
Collections.emptyMap(), Map.of(
0x00, TeleportConfirmPacket.class,
0x04, ClientSettingsPacket.class,
0x09, PluginMessagePacket.class,
0x0B, KeepAlivePacket.class,
0x0D, PlayerPositionPacket.class,
0x0E, CPlayerPositionAndLookPacket.class,
0x0F, PlayerLookPacket.class,
0x15, EntityActionPacket.class
),
// server side // server side
Collections.emptyMap() Map.of(
KeepAlivePacket.class, 0x1F,
ChunkDataPacket.class, 0x20,
JoinGamePacket.class, 0x23,
PlayerAbilitiesPacket.class,0x2C,
SPlayerPositionAndLookPacket.class, 0x2F,
SpawnPositionPacket.class, 0x46
)
); );
public static State getById(int id) { public static State getById(int id) {

View File

@@ -6,6 +6,8 @@ import lombok.RequiredArgsConstructor;
import lombok.ToString; import lombok.ToString;
import lombok.experimental.Delegate; import lombok.experimental.Delegate;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import mc.protocol.model.text.Text;
import mc.protocol.model.text.TextSerializer;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.UUID; import java.util.UUID;
@@ -32,13 +34,15 @@ import java.util.UUID;
* | | | | этого числа). | * | | | | этого числа). |
* | 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 байт |
* | Text | | JSON | По файту является String (n), который имеет формат JSON |
* *
* [1] - <a href="https://en.wikipedia.org/wiki/Single-precision_floating-point_format">Single-precision floating-point format</a> * [1] - <a href="https://en.wikipedia.org/wiki/Single-precision_floating-point_format">Single-precision floating-point format</a>
* [2] - <a href="https://en.wikipedia.org/wiki/Double-precision_floating-point_format">Double-precision floating-point format</a> * [2] - <a href="https://en.wikipedia.org/wiki/Double-precision_floating-point_format">Double-precision floating-point format</a>
* [3] - <a href="http://unicode.org/glossary/#unicode_scalar_value">Unicode Scalar Value</a> * [3] - <a href="http://unicode.org/glossary/#unicode_scalar_value">Unicode Scalar Value</a>
* </pre> * </pre>
* *
* @see <a href="https://wiki.vg/index.php?title=Protocol&oldid=7368#Data_types">Data types</a> * @see <a href="https://wiki.vg/index.php?title=Data_types&oldid=14345#Definitions">Data types</a>
* @see <a href="https://wiki.vg/index.php?title=Chat&oldid=14272">Chat</a>
*/ */
@Slf4j @Slf4j
@RequiredArgsConstructor @RequiredArgsConstructor
@@ -53,6 +57,10 @@ public class NetByteBuf extends ByteBuf {
byteBuf.writeByte((byte)(value & 0xFF)); byteBuf.writeByte((byte)(value & 0xFF));
} }
public void writeText(Text text) {
writeString(TextSerializer.toStringPlain(text));
}
//region String //region String
public String readString() { public String readString() {
return readString(Short.MAX_VALUE); return readString(Short.MAX_VALUE);

View File

@@ -1,10 +1,10 @@
package mc.protocol.serializer; package mc.protocol.model;
import com.eclipsesource.json.Json; import com.eclipsesource.json.Json;
import com.eclipsesource.json.JsonArray; import com.eclipsesource.json.JsonArray;
import com.eclipsesource.json.JsonObject; import com.eclipsesource.json.JsonObject;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import mc.protocol.model.ServerInfo; import mc.protocol.model.text.TextSerializer;
import java.util.Spliterator; import java.util.Spliterator;
import java.util.Spliterators; import java.util.Spliterators;
@@ -14,7 +14,11 @@ import java.util.stream.StreamSupport;
@UtilityClass @UtilityClass
public class ServerInfoSerializer { public class ServerInfoSerializer {
public JsonObject toJsonObject(ServerInfo info) { public String toStringPlain(ServerInfo info) {
return toJsonObject(info).toString();
}
private JsonObject toJsonObject(ServerInfo info) {
JsonObject jsonObject = Json.object() JsonObject jsonObject = Json.object()
.add("version", createVersionObj(info)) .add("version", createVersionObj(info))
.add("players", createPlayersObj(info)) .add("players", createPlayersObj(info))

View File

@@ -1,12 +1,9 @@
package mc.protocol.serializer; package mc.protocol.model.text;
import com.eclipsesource.json.Json; import com.eclipsesource.json.Json;
import com.eclipsesource.json.JsonArray; import com.eclipsesource.json.JsonArray;
import com.eclipsesource.json.JsonObject; import com.eclipsesource.json.JsonObject;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import mc.protocol.model.text.Text;
import mc.protocol.model.text.TextColor;
import mc.protocol.model.text.TextStyle;
import java.util.Map; import java.util.Map;
@@ -16,6 +13,10 @@ public class TextSerializer {
private static final Map<Character, TextStyle> legacyStyleCodes; private static final Map<Character, TextStyle> legacyStyleCodes;
private static final Map<Character, TextColor> legacyColorCodes; private static final Map<Character, TextColor> legacyColorCodes;
public String toStringPlain(Text text) {
return toJsonObject(text).toString();
}
public JsonObject toJsonObject(Text text) { public JsonObject toJsonObject(Text text) {
JsonObject jsonObject = Json.object(); JsonObject jsonObject = Json.object();

View File

@@ -8,13 +8,6 @@ import mc.protocol.io.NetByteBuf;
* *
* <p>Эхо-пакет, которым проверяется качество соединения между <b>Клиентом</b> и <b>Сервером</b>.</p> * <p>Эхо-пакет, которым проверяется качество соединения между <b>Клиентом</b> и <b>Сервером</b>.</p>
* *
* <p>По спецификации:</p>
* <oi>
* <li>если <b>Сервер</b> не ответил <b>Клиенту</b> в течении 20 секунд, <b>Клиент</b> отключается
* и выдаёт ошибку <i>"Timed out"</i>.</li>
* <li>если <b>Клиент</b> не отвечает <b>Серверу</b> в течении 30 секунд, <b>Сервер</b> отключает <b>Клиента</b>.</li>
* </oi>
*
* <p>Структура пакета</p> * <p>Структура пакета</p>
* <pre> * <pre>
* | FIELD | TYPE | NOTES | * | FIELD | TYPE | NOTES |
@@ -22,25 +15,32 @@ import mc.protocol.io.NetByteBuf;
* | Payload | Long | Любое уникальное число | * | Payload | Long | Любое уникальное число |
* </pre> * </pre>
* *
* @see <a href="https://wiki.vg/index.php?title=Protocol&oldid=7368#Keep_Alive">Keep Alive</a> * <p>По спецификации:</p>
* <oi>
* <li>если Сервер не ответил Клиенту в течении 20 секунд, Клиент отключается и выдаёт ошибку "Timed out";</li>
* <li>если Клиент не отвечает Серверу в течении 30 секунд, Сервер отключает Клиента.</li>
* </oi>
*
* @see <a href="https://wiki.vg/index.php?title=Protocol&oldid=14204#Keep_Alive_.28clientbound.29">Keep Alive (clientbound)</a>
* @see <a href="https://wiki.vg/index.php?title=Protocol&oldid=14204#Keep_Alive_.28serverbound.29">Keep Alive (serverbound)</a>
*/ */
@Data @Data
public class KeepAlivePacket implements ClientSidePacket, ServerSidePacket { public class KeepAlivePacket implements ClientSidePacket, ServerSidePacket {
private Long payload; private long payload;
@Override @Override
public void readSelf(NetByteBuf netByteBuf) { public void readSelf(NetByteBuf netByteBuf) {
payload = netByteBuf.readLong(); payload = netByteBuf.readLong();
} }
@Override
public void passivate() {
this.payload = null;
}
@Override @Override
public void writeSelf(NetByteBuf netByteBuf) { public void writeSelf(NetByteBuf netByteBuf) {
netByteBuf.writeLong(payload); netByteBuf.writeLong(payload);
} }
@Override
public void passivate() {
this.payload = 0;
}
} }

View File

@@ -1,4 +1,4 @@
package mc.protocol.packets.client; package mc.protocol.packets.handshaking.client;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
@@ -18,14 +18,14 @@ import mc.protocol.packets.ClientSidePacket;
* | FIELD | TYPE | NOTES | * | FIELD | TYPE | NOTES |
* |------------------|----------------|----------------------------------------------| * |------------------|----------------|----------------------------------------------|
* | Protocol version | VarInt | Версия протокола [1] | * | Protocol version | VarInt | Версия протокола [1] |
* | Server address | Stirng | Hostname или IP | * | Server address | Stirng (255) | Hostname или IP |
* | Server port | Unsigned Short | Порт сервера | * | Server port | Unsigned Short | Порт сервера |
* | Next stage | VarInt | ID State на который необходимо переключиться | * | Next state | VarInt | ID State на который необходимо переключиться |
* *
* [1] - <a href="https://wiki.vg/Protocol_version_numbers" target="_top">Protocol version numbers</a> * [1] - <a href="https://wiki.vg/Protocol_version_numbers">Protocol version numbers</a>
* </pre> * </pre>
* *
* @see <a href="https://wiki.vg/index.php?title=Protocol&oldid=7368#Handshake" target="_top">Handshake</a> * @see <a href="https://wiki.vg/index.php?title=Protocol&oldid=14204#Handshake">Handshake</a>
* @see State * @see State
*/ */
@NoArgsConstructor @NoArgsConstructor
@@ -41,10 +41,10 @@ public class HandshakePacket implements ClientSidePacket {
@Override @Override
public void readSelf(NetByteBuf netByteBuf) { public void readSelf(NetByteBuf netByteBuf) {
protocolVersion = netByteBuf.readVarInt(); this.protocolVersion = netByteBuf.readVarInt();
host = netByteBuf.readString(255); this.host = netByteBuf.readString(255);
port = netByteBuf.readUnsignedShort(); this.port = netByteBuf.readUnsignedShort();
nextState = State.getById(netByteBuf.readVarInt()); this.nextState = State.getById(netByteBuf.readVarInt());
} }
@Override @Override
@@ -54,5 +54,4 @@ public class HandshakePacket implements ClientSidePacket {
this.port = 0; this.port = 0;
this.nextState = null; this.nextState = null;
} }
} }

View File

@@ -1,4 +1,4 @@
package mc.protocol.packets.client; package mc.protocol.packets.login.client;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
@@ -19,7 +19,7 @@ import mc.protocol.packets.ClientSidePacket;
* | Name | String | Имя/Логин игрока | * | Name | String | Имя/Логин игрока |
* </pre> * </pre>
* *
* @see <a href="https://wiki.vg/index.php?title=Protocol&oldid=7368#Login_Start" target="_top">Login start</a> * @see <a href="https://wiki.vg/index.php?title=Protocol&oldid=14204#Login_Start">Login start</a>
*/ */
@NoArgsConstructor @NoArgsConstructor
@Getter @Getter

View File

@@ -1,11 +1,10 @@
package mc.protocol.packets.server; package mc.protocol.packets.login.server;
import lombok.Data; import lombok.Data;
import mc.protocol.State; import mc.protocol.State;
import mc.protocol.io.NetByteBuf; import mc.protocol.io.NetByteBuf;
import mc.protocol.model.text.Text; import mc.protocol.model.text.Text;
import mc.protocol.packets.ServerSidePacket; import mc.protocol.packets.ServerSidePacket;
import mc.protocol.serializer.TextSerializer;
/** /**
* Diconnect packet. * Diconnect packet.
@@ -16,7 +15,7 @@ import mc.protocol.serializer.TextSerializer;
* <pre> * <pre>
* | FIELD | TYPE | NOTES | * | FIELD | TYPE | NOTES |
* |-------------|--------|----------------------------------| * |-------------|--------|----------------------------------|
* | JSON Reason | String | Причина отключения. Опционально. | * | JSON Reason | Text | Причина отключения. Опционально. |
* </pre> * </pre>
* *
* <p>Пример JSON Reason</p> * <p>Пример JSON Reason</p>
@@ -26,7 +25,7 @@ import mc.protocol.serializer.TextSerializer;
* } * }
* </pre> * </pre>
* *
* @see <a href="https://wiki.vg/index.php?title=Protocol&oldid=7368#Disconnect_2" target="_top">Disconnect</a> * @see <a href="https://wiki.vg/index.php?title=Protocol&oldid=14204#Disconnect_.28login.29">Disconnect (login)</a>
* @see State * @see State
*/ */
@Data @Data
@@ -39,6 +38,6 @@ public class DisconnectPacket implements ServerSidePacket {
@Override @Override
public void writeSelf(NetByteBuf netByteBuf) { public void writeSelf(NetByteBuf netByteBuf) {
netByteBuf.writeString(TextSerializer.toJsonObject(reason).toString()); netByteBuf.writeText(reason);
} }
} }

View File

@@ -1,4 +1,4 @@
package mc.protocol.packets.server; package mc.protocol.packets.login.server;
import lombok.Data; import lombok.Data;
import mc.protocol.io.NetByteBuf; import mc.protocol.io.NetByteBuf;
@@ -27,7 +27,7 @@ public class LoginSuccessPacket implements ServerSidePacket {
@Override @Override
public void writeSelf(NetByteBuf netByteBuf) { public void writeSelf(NetByteBuf netByteBuf) {
netByteBuf.writeString(uuid.toString()); netByteBuf.writeString(this.uuid.toString());
netByteBuf.writeString(name); netByteBuf.writeString(this.name);
} }
} }

View File

@@ -1,4 +1,4 @@
package mc.protocol.packets.client; package mc.protocol.packets.play.client;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;

View File

@@ -1,4 +1,4 @@
package mc.protocol.packets.client; package mc.protocol.packets.play.client;
import lombok.*; import lombok.*;
import mc.protocol.utils.ChatMode; import mc.protocol.utils.ChatMode;

View File

@@ -1,12 +1,10 @@
package mc.protocol.packets.client; package mc.protocol.packets.play.client;
import lombok.EqualsAndHashCode; import lombok.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
import mc.protocol.io.NetByteBuf; import mc.protocol.io.NetByteBuf;
import mc.protocol.packets.ClientSidePacket; import mc.protocol.packets.ClientSidePacket;
import mc.protocol.utils.EntityActionAction;
import javax.annotation.Nullable;
/** /**
* Entity Action packet. * Entity Action packet.
@@ -31,7 +29,7 @@ import mc.protocol.utils.EntityActionAction;
public class EntityActionPacket implements ClientSidePacket { public class EntityActionPacket implements ClientSidePacket {
private Integer entityId; private Integer entityId;
private EntityActionAction action; private Action action;
private Integer jumpBoost; private Integer jumpBoost;
@Override @Override
@@ -40,7 +38,7 @@ public class EntityActionPacket implements ClientSidePacket {
int actionId = netByteBuf.readVarInt(); int actionId = netByteBuf.readVarInt();
this.jumpBoost = netByteBuf.readVarInt(); this.jumpBoost = netByteBuf.readVarInt();
this.action = EntityActionAction.valueOfCode(actionId); this.action = Action.valueOfCode(actionId);
} }
@Override @Override
@@ -49,4 +47,31 @@ public class EntityActionPacket implements ClientSidePacket {
this.action = null; this.action = null;
this.jumpBoost = null; this.jumpBoost = null;
} }
@RequiredArgsConstructor
public enum Action {
START_SNEAKING(0),
STOP_SNEAKING(1),
LEAVE_BED(2),
START_SPRINTING(3),
STOP_SPRINTING(4),
START_JUMP_WITH_HORSE(5),
STOP_JUMP_WITH_HORSE(6),
OPEN_HORSE_INVENTORY(7),
START_FLYING_WITH_ELYTRA(8);
@Nullable
public static Action valueOfCode(int code) {
for (Action action : Action.values()) {
if (action.code == code) {
return action;
}
}
return null;
}
@Getter
private final int code;
}
} }

View File

@@ -1,4 +1,4 @@
package mc.protocol.packets.client; package mc.protocol.packets.play.client;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;

View File

@@ -1,4 +1,4 @@
package mc.protocol.packets.client; package mc.protocol.packets.play.client;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;

View File

@@ -1,4 +1,4 @@
package mc.protocol.packets.client; package mc.protocol.packets.play.client;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;

View File

@@ -1,4 +1,4 @@
package mc.protocol.packets.client; package mc.protocol.packets.play.client;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
@@ -6,15 +6,15 @@ import lombok.NoArgsConstructor;
import lombok.ToString; import lombok.ToString;
import mc.protocol.io.NetByteBuf; import mc.protocol.io.NetByteBuf;
import mc.protocol.packets.ClientSidePacket; import mc.protocol.packets.ClientSidePacket;
import mc.protocol.packets.server.SPlayerPositionAndLookPacket; import mc.protocol.packets.play.server.SPlayerPositionAndLookPacket;
/** /**
* Teleport сonfirm packet. * Teleport сonfirm packet.
* *
* <p>Структура пакета</p> * <p>Структура пакета</p>
* <pre> * <pre>
* | FIELD | TYPE | NOTES | * | FIELD | TYPE | NOTES |
* |-------------|--------|-----------------------------------------------------------| * |-------------|--------|------------------------------------------------------------|
* | Teleport ID | VarInt | ID, который был выдан пакетом {@link SPlayerPositionAndLookPacket} | * | Teleport ID | VarInt | ID, который был выдан пакетом {@link SPlayerPositionAndLookPacket} |
* </pre> * </pre>
* *

View File

@@ -1,4 +1,4 @@
package mc.protocol.packets.server; package mc.protocol.packets.play.server;
import io.netty.buffer.Unpooled; import io.netty.buffer.Unpooled;
import lombok.Data; import lombok.Data;

View File

@@ -1,4 +1,4 @@
package mc.protocol.packets.server; package mc.protocol.packets.play.server;
import lombok.Data; import lombok.Data;
import mc.protocol.utils.Difficulty; import mc.protocol.utils.Difficulty;

View File

@@ -1,4 +1,4 @@
package mc.protocol.packets.server; package mc.protocol.packets.play.server;
import lombok.Data; import lombok.Data;
import mc.protocol.io.NetByteBuf; import mc.protocol.io.NetByteBuf;

View File

@@ -1,11 +1,11 @@
package mc.protocol.packets.server; package mc.protocol.packets.play.server;
import lombok.Data; import lombok.Data;
import mc.protocol.io.NetByteBuf; import mc.protocol.io.NetByteBuf;
import mc.protocol.model.Location; import mc.protocol.model.Location;
import mc.protocol.model.Look; import mc.protocol.model.Look;
import mc.protocol.packets.ServerSidePacket; import mc.protocol.packets.ServerSidePacket;
import mc.protocol.packets.client.TeleportConfirmPacket; import mc.protocol.packets.play.client.TeleportConfirmPacket;
/** /**
* Установка позиции и угла осмотра Игрока. * Установка позиции и угла осмотра Игрока.

View File

@@ -1,4 +1,4 @@
package mc.protocol.packets.server; package mc.protocol.packets.play.server;
import lombok.Data; import lombok.Data;
import mc.protocol.io.NetByteBuf; import mc.protocol.io.NetByteBuf;

View File

@@ -0,0 +1,34 @@
package mc.protocol.packets.status.client;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import mc.protocol.io.NetByteBuf;
import mc.protocol.packets.ClientSidePacket;
import mc.protocol.packets.ServerSidePacket;
/**
* Status server packet, request.
*
* <p>Клиент запрашивает получение информации о сервере</p>
*/
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
@ToString
public class StatusServerRequestPacket implements ClientSidePacket, ServerSidePacket {
@Override
public void readSelf(NetByteBuf netByteBuf) {
// empty
}
@Override
public void writeSelf(NetByteBuf netByteBuf) {
// empty
}
@Override
public void passivate() {
// pass
}
}

View File

@@ -1,10 +1,8 @@
package mc.protocol.packets.server; package mc.protocol.packets.status.server;
import lombok.Data; import lombok.Data;
import mc.protocol.io.NetByteBuf; import mc.protocol.io.NetByteBuf;
import mc.protocol.model.ServerInfo;
import mc.protocol.packets.ServerSidePacket; import mc.protocol.packets.ServerSidePacket;
import mc.protocol.serializer.ServerInfoSerializer;
/** /**
* Status server packet, response. * Status server packet, response.
@@ -52,10 +50,10 @@ public class StatusServerResponse implements ServerSidePacket {
/** /**
* Информация о серере. * Информация о серере.
*/ */
private ServerInfo info; private String info;
@Override @Override
public void writeSelf(NetByteBuf netByteBuf) { public void writeSelf(NetByteBuf netByteBuf) {
netByteBuf.writeString(ServerInfoSerializer.toJsonObject(info).toString()); netByteBuf.writeString(info);
} }
} }

View File

@@ -11,10 +11,10 @@ public enum ChatMode {
public static ChatMode valueById(int id) { public static ChatMode valueById(int id) {
// а зачем усложнять? // а зачем усложнять?
//@formatter:off //@formatter:off
if (id == 1) return FULL; if (id == 1) return FULL;
else if (id == 2) return COMMANDS_ONLY; else if (id == 2) return COMMANDS_ONLY;
else if (id == 3) return HIDDEN; else if (id == 3) return HIDDEN;
else return null; else return null;
//@formatter:on //@formatter:on
} }
} }

View File

@@ -10,9 +10,9 @@ public enum MainHand {
public static MainHand valueById(int id) { public static MainHand valueById(int id) {
// а зачем усложнять? // а зачем усложнять?
//@formatter:off //@formatter:off
if (id == 0) return LEFT; if (id == 0) return LEFT;
else if (id == 1) return RIGHT; else if (id == 1) return RIGHT;
else return null; else return null;
//@formatter:on //@formatter:on
} }
} }

View File

@@ -1,100 +0,0 @@
package mc.protocol;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import mc.protocol.packets.ClientSidePacket;
import mc.protocol.packets.Packet;
import mc.protocol.packets.KeepAlivePacket;
import mc.protocol.packets.ServerSidePacket;
import mc.protocol.packets.client.*;
import mc.protocol.packets.server.*;
import javax.annotation.Nullable;
import java.util.Collections;
import java.util.Map;
@RequiredArgsConstructor
public enum State {
HANDSHAKING(-1,
// client side
Map.of(0x00, HandshakePacket.class)
),
STATUS(1,
// client side
Map.of(
0x00, StatusServerRequestPacket.class,
0x01, KeepAlivePacket.class
),
// server side
Map.of(
StatusServerResponse.class, 0x00,
KeepAlivePacket.class, 0x01
)
),
LOGIN(2,
// server bound
Map.of(0x00, LoginStartPacket.class),
// client bound
Map.of(
DisconnectPacket.class, 0x00,
LoginSuccessPacket.class, 0x02
)
),
PLAY(3,
// server bound
Map.of(
0x00, TeleportConfirmPacket.class,
0x04, ClientSettingsPacket.class,
0x09, PluginMessagePacket.class,
0x0B, KeepAlivePacket.class,
0x0D, PlayerPositionPacket.class,
0x0E, CPlayerPositionAndLookPacket.class,
0x0F, PlayerLookPacket.class,
0x15, EntityActionPacket.class
),
// client bound
Map.of(
KeepAlivePacket.class, 0x1F,
ChunkDataPacket.class, 0x20,
JoinGamePacket.class, 0x23,
PlayerAbilitiesPacket.class,0x2C,
SPlayerPositionAndLookPacket.class, 0x2F,
SpawnPositionPacket.class, 0x46
)
);
@Nullable
public static State getById(int id) {
for (State state : State.values()) {
if (state.id == id) {
return state;
}
}
return null;
}
@Getter
private final int id;
@Getter
private final Map<Integer, Class<? extends ClientSidePacket>> clientSidePackets;
private final Map<Class<? extends ServerSidePacket>, Integer> serverSidePackets;
State(int id, Map<Integer, Class<? extends ClientSidePacket>> clientSidePackets) {
this.id = id;
this.clientSidePackets = clientSidePackets;
this.serverSidePackets = Collections.emptyMap();
}
@Nullable
public Class<? extends ClientSidePacket> getClientSidePacketById(int id) {
return clientSidePackets == null ? null : clientSidePackets.get(id);
}
@Nullable
public Integer getServerSidePacketId(Class<? extends Packet> clazz) {
return serverSidePackets == null ? null : serverSidePackets.get(clazz);
}
}

View File

@@ -1,21 +0,0 @@
package mc.protocol.packets;
import mc.protocol.io.NetByteBuf;
public abstract class EmptyPacket implements ClientSidePacket, ServerSidePacket {
@Override
public void readSelf(NetByteBuf netByteBuf) {
// empty
}
@Override
public void writeSelf(NetByteBuf netByteBuf) {
// empty
}
@Override
public void passivate() {
// pass
}
}

View File

@@ -1,18 +0,0 @@
package mc.protocol.packets.client;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import mc.protocol.packets.EmptyPacket;
/**
* Status server packet, request.
*
* <p>Клиент запрашивает получение информации о сервере</p>
*/
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
@ToString
public class StatusServerRequestPacket extends EmptyPacket {
}

View File

@@ -1,33 +0,0 @@
package mc.protocol.utils;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import javax.annotation.Nullable;
@RequiredArgsConstructor
public enum EntityActionAction {
START_SNEAKING(0),
STOP_SNEAKING(1),
LEAVE_BED(2),
START_SPRINTING(3),
STOP_SPRINTING(4),
START_JUMP_WITH_HORSE(5),
STOP_JUMP_WITH_HORSE(6),
OPEN_HORSE_INVENTORY(7),
START_FLYING_WITH_ELYTRA(8);
@Nullable
public static EntityActionAction valueOfCode(int code) {
for (EntityActionAction action : EntityActionAction.values()) {
if (action.code == code) {
return action;
}
}
return null;
}
@Getter
private final int code;
}