refactoring: Packets
This commit is contained in:
@@ -5,6 +5,7 @@ dependencies {
|
||||
|
||||
implementation libs.netty.transport
|
||||
implementation libs.netty.codec
|
||||
implementation libs.json
|
||||
|
||||
testImplementation libs.lang3
|
||||
}
|
||||
|
||||
@@ -3,7 +3,16 @@ package mc.protocol;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import mc.protocol.packets.ClientSidePacket;
|
||||
import mc.protocol.packets.KeepAlivePacket;
|
||||
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 java.util.Collections;
|
||||
@@ -14,30 +23,55 @@ public enum State {
|
||||
|
||||
HANDSHAKING(0,
|
||||
// client side
|
||||
Collections.emptyMap(),
|
||||
Map.of(0x00, HandshakePacket.class),
|
||||
// server side
|
||||
Collections.emptyMap()
|
||||
),
|
||||
|
||||
STATUS(1,
|
||||
// client side
|
||||
Collections.emptyMap(),
|
||||
Map.of(
|
||||
0x00, StatusServerRequestPacket.class,
|
||||
0x01, KeepAlivePacket.class
|
||||
),
|
||||
// server side
|
||||
Collections.emptyMap()
|
||||
Map.of(
|
||||
StatusServerResponse.class, 0x00,
|
||||
KeepAlivePacket.class, 0x01
|
||||
)
|
||||
),
|
||||
|
||||
LOGIN(2,
|
||||
// client side
|
||||
Collections.emptyMap(),
|
||||
Map.of(0x00, LoginStartPacket.class),
|
||||
// server side
|
||||
Collections.emptyMap()
|
||||
Map.of(
|
||||
DisconnectPacket.class, 0x00,
|
||||
LoginSuccessPacket.class, 0x02
|
||||
)
|
||||
),
|
||||
|
||||
PLAY(3,
|
||||
// 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
|
||||
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) {
|
||||
|
||||
@@ -6,6 +6,8 @@ import lombok.RequiredArgsConstructor;
|
||||
import lombok.ToString;
|
||||
import lombok.experimental.Delegate;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import mc.protocol.model.text.Text;
|
||||
import mc.protocol.model.text.TextSerializer;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.UUID;
|
||||
@@ -32,13 +34,15 @@ import java.util.UUID;
|
||||
* | | | | этого числа). |
|
||||
* | VarInt | >= 1 ; <= 5 | Число от -2147483648 и 2147483647 | 32-bit число с плавающей размерностью от 1 до 5 байт |
|
||||
* | 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>
|
||||
* [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>
|
||||
* </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
|
||||
@RequiredArgsConstructor
|
||||
@@ -53,6 +57,10 @@ public class NetByteBuf extends ByteBuf {
|
||||
byteBuf.writeByte((byte)(value & 0xFF));
|
||||
}
|
||||
|
||||
public void writeText(Text text) {
|
||||
writeString(TextSerializer.toStringPlain(text));
|
||||
}
|
||||
|
||||
//region String
|
||||
public String readString() {
|
||||
return readString(Short.MAX_VALUE);
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package mc.protocol.serializer;
|
||||
package mc.protocol.model;
|
||||
|
||||
import com.eclipsesource.json.Json;
|
||||
import com.eclipsesource.json.JsonArray;
|
||||
import com.eclipsesource.json.JsonObject;
|
||||
import lombok.experimental.UtilityClass;
|
||||
import mc.protocol.model.ServerInfo;
|
||||
import mc.protocol.model.text.TextSerializer;
|
||||
|
||||
import java.util.Spliterator;
|
||||
import java.util.Spliterators;
|
||||
@@ -14,7 +14,11 @@ import java.util.stream.StreamSupport;
|
||||
@UtilityClass
|
||||
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()
|
||||
.add("version", createVersionObj(info))
|
||||
.add("players", createPlayersObj(info))
|
||||
@@ -1,12 +1,9 @@
|
||||
package mc.protocol.serializer;
|
||||
package mc.protocol.model.text;
|
||||
|
||||
import com.eclipsesource.json.Json;
|
||||
import com.eclipsesource.json.JsonArray;
|
||||
import com.eclipsesource.json.JsonObject;
|
||||
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;
|
||||
|
||||
@@ -16,6 +13,10 @@ public class TextSerializer {
|
||||
private static final Map<Character, TextStyle> legacyStyleCodes;
|
||||
private static final Map<Character, TextColor> legacyColorCodes;
|
||||
|
||||
public String toStringPlain(Text text) {
|
||||
return toJsonObject(text).toString();
|
||||
}
|
||||
|
||||
public JsonObject toJsonObject(Text text) {
|
||||
JsonObject jsonObject = Json.object();
|
||||
|
||||
@@ -8,13 +8,6 @@ import mc.protocol.io.NetByteBuf;
|
||||
*
|
||||
* <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>
|
||||
* <pre>
|
||||
* | FIELD | TYPE | NOTES |
|
||||
@@ -22,25 +15,32 @@ import mc.protocol.io.NetByteBuf;
|
||||
* | Payload | Long | Любое уникальное число |
|
||||
* </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
|
||||
public class KeepAlivePacket implements ClientSidePacket, ServerSidePacket {
|
||||
|
||||
private Long payload;
|
||||
private long payload;
|
||||
|
||||
@Override
|
||||
public void readSelf(NetByteBuf netByteBuf) {
|
||||
payload = netByteBuf.readLong();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void passivate() {
|
||||
this.payload = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeSelf(NetByteBuf netByteBuf) {
|
||||
netByteBuf.writeLong(payload);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void passivate() {
|
||||
this.payload = 0;
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package mc.protocol.packets.client;
|
||||
package mc.protocol.packets.handshaking.client;
|
||||
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
@@ -18,14 +18,14 @@ import mc.protocol.packets.ClientSidePacket;
|
||||
* | FIELD | TYPE | NOTES |
|
||||
* |------------------|----------------|----------------------------------------------|
|
||||
* | Protocol version | VarInt | Версия протокола [1] |
|
||||
* | Server address | Stirng | Hostname или IP |
|
||||
* | Server address | Stirng (255) | Hostname или IP |
|
||||
* | 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>
|
||||
*
|
||||
* @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
|
||||
*/
|
||||
@NoArgsConstructor
|
||||
@@ -41,10 +41,10 @@ public class HandshakePacket implements ClientSidePacket {
|
||||
|
||||
@Override
|
||||
public void readSelf(NetByteBuf netByteBuf) {
|
||||
protocolVersion = netByteBuf.readVarInt();
|
||||
host = netByteBuf.readString(255);
|
||||
port = netByteBuf.readUnsignedShort();
|
||||
nextState = State.getById(netByteBuf.readVarInt());
|
||||
this.protocolVersion = netByteBuf.readVarInt();
|
||||
this.host = netByteBuf.readString(255);
|
||||
this.port = netByteBuf.readUnsignedShort();
|
||||
this.nextState = State.getById(netByteBuf.readVarInt());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -54,5 +54,4 @@ public class HandshakePacket implements ClientSidePacket {
|
||||
this.port = 0;
|
||||
this.nextState = null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package mc.protocol.packets.client;
|
||||
package mc.protocol.packets.login.client;
|
||||
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
@@ -19,7 +19,7 @@ import mc.protocol.packets.ClientSidePacket;
|
||||
* | Name | String | Имя/Логин игрока |
|
||||
* </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
|
||||
@Getter
|
||||
@@ -1,11 +1,10 @@
|
||||
package mc.protocol.packets.server;
|
||||
package mc.protocol.packets.login.server;
|
||||
|
||||
import lombok.Data;
|
||||
import mc.protocol.State;
|
||||
import mc.protocol.io.NetByteBuf;
|
||||
import mc.protocol.model.text.Text;
|
||||
import mc.protocol.packets.ServerSidePacket;
|
||||
import mc.protocol.serializer.TextSerializer;
|
||||
|
||||
/**
|
||||
* Diconnect packet.
|
||||
@@ -16,7 +15,7 @@ import mc.protocol.serializer.TextSerializer;
|
||||
* <pre>
|
||||
* | FIELD | TYPE | NOTES |
|
||||
* |-------------|--------|----------------------------------|
|
||||
* | JSON Reason | String | Причина отключения. Опционально. |
|
||||
* | JSON Reason | Text | Причина отключения. Опционально. |
|
||||
* </pre>
|
||||
*
|
||||
* <p>Пример JSON Reason</p>
|
||||
@@ -26,7 +25,7 @@ import mc.protocol.serializer.TextSerializer;
|
||||
* }
|
||||
* </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
|
||||
*/
|
||||
@Data
|
||||
@@ -39,6 +38,6 @@ public class DisconnectPacket implements ServerSidePacket {
|
||||
|
||||
@Override
|
||||
public void writeSelf(NetByteBuf netByteBuf) {
|
||||
netByteBuf.writeString(TextSerializer.toJsonObject(reason).toString());
|
||||
netByteBuf.writeText(reason);
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package mc.protocol.packets.server;
|
||||
package mc.protocol.packets.login.server;
|
||||
|
||||
import lombok.Data;
|
||||
import mc.protocol.io.NetByteBuf;
|
||||
@@ -27,7 +27,7 @@ public class LoginSuccessPacket implements ServerSidePacket {
|
||||
|
||||
@Override
|
||||
public void writeSelf(NetByteBuf netByteBuf) {
|
||||
netByteBuf.writeString(uuid.toString());
|
||||
netByteBuf.writeString(name);
|
||||
netByteBuf.writeString(this.uuid.toString());
|
||||
netByteBuf.writeString(this.name);
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package mc.protocol.packets.client;
|
||||
package mc.protocol.packets.play.client;
|
||||
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
@@ -1,4 +1,4 @@
|
||||
package mc.protocol.packets.client;
|
||||
package mc.protocol.packets.play.client;
|
||||
|
||||
import lombok.*;
|
||||
import mc.protocol.utils.ChatMode;
|
||||
@@ -1,12 +1,10 @@
|
||||
package mc.protocol.packets.client;
|
||||
package mc.protocol.packets.play.client;
|
||||
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.ToString;
|
||||
import lombok.*;
|
||||
import mc.protocol.io.NetByteBuf;
|
||||
import mc.protocol.packets.ClientSidePacket;
|
||||
import mc.protocol.utils.EntityActionAction;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
/**
|
||||
* Entity Action packet.
|
||||
@@ -31,7 +29,7 @@ import mc.protocol.utils.EntityActionAction;
|
||||
public class EntityActionPacket implements ClientSidePacket {
|
||||
|
||||
private Integer entityId;
|
||||
private EntityActionAction action;
|
||||
private Action action;
|
||||
private Integer jumpBoost;
|
||||
|
||||
@Override
|
||||
@@ -40,7 +38,7 @@ public class EntityActionPacket implements ClientSidePacket {
|
||||
int actionId = netByteBuf.readVarInt();
|
||||
this.jumpBoost = netByteBuf.readVarInt();
|
||||
|
||||
this.action = EntityActionAction.valueOfCode(actionId);
|
||||
this.action = Action.valueOfCode(actionId);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -49,4 +47,31 @@ public class EntityActionPacket implements ClientSidePacket {
|
||||
this.action = 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;
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package mc.protocol.packets.client;
|
||||
package mc.protocol.packets.play.client;
|
||||
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
@@ -1,4 +1,4 @@
|
||||
package mc.protocol.packets.client;
|
||||
package mc.protocol.packets.play.client;
|
||||
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
@@ -1,4 +1,4 @@
|
||||
package mc.protocol.packets.client;
|
||||
package mc.protocol.packets.play.client;
|
||||
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
@@ -1,4 +1,4 @@
|
||||
package mc.protocol.packets.client;
|
||||
package mc.protocol.packets.play.client;
|
||||
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
@@ -6,15 +6,15 @@ import lombok.NoArgsConstructor;
|
||||
import lombok.ToString;
|
||||
import mc.protocol.io.NetByteBuf;
|
||||
import mc.protocol.packets.ClientSidePacket;
|
||||
import mc.protocol.packets.server.SPlayerPositionAndLookPacket;
|
||||
import mc.protocol.packets.play.server.SPlayerPositionAndLookPacket;
|
||||
|
||||
/**
|
||||
* Teleport сonfirm packet.
|
||||
*
|
||||
* <p>Структура пакета</p>
|
||||
* <pre>
|
||||
* | FIELD | TYPE | NOTES |
|
||||
* |-------------|--------|-----------------------------------------------------------|
|
||||
* | FIELD | TYPE | NOTES |
|
||||
* |-------------|--------|------------------------------------------------------------|
|
||||
* | Teleport ID | VarInt | ID, который был выдан пакетом {@link SPlayerPositionAndLookPacket} |
|
||||
* </pre>
|
||||
*
|
||||
@@ -1,4 +1,4 @@
|
||||
package mc.protocol.packets.server;
|
||||
package mc.protocol.packets.play.server;
|
||||
|
||||
import io.netty.buffer.Unpooled;
|
||||
import lombok.Data;
|
||||
@@ -1,4 +1,4 @@
|
||||
package mc.protocol.packets.server;
|
||||
package mc.protocol.packets.play.server;
|
||||
|
||||
import lombok.Data;
|
||||
import mc.protocol.utils.Difficulty;
|
||||
@@ -1,4 +1,4 @@
|
||||
package mc.protocol.packets.server;
|
||||
package mc.protocol.packets.play.server;
|
||||
|
||||
import lombok.Data;
|
||||
import mc.protocol.io.NetByteBuf;
|
||||
@@ -1,11 +1,11 @@
|
||||
package mc.protocol.packets.server;
|
||||
package mc.protocol.packets.play.server;
|
||||
|
||||
import lombok.Data;
|
||||
import mc.protocol.io.NetByteBuf;
|
||||
import mc.protocol.model.Location;
|
||||
import mc.protocol.model.Look;
|
||||
import mc.protocol.packets.ServerSidePacket;
|
||||
import mc.protocol.packets.client.TeleportConfirmPacket;
|
||||
import mc.protocol.packets.play.client.TeleportConfirmPacket;
|
||||
|
||||
/**
|
||||
* Установка позиции и угла осмотра Игрока.
|
||||
@@ -1,4 +1,4 @@
|
||||
package mc.protocol.packets.server;
|
||||
package mc.protocol.packets.play.server;
|
||||
|
||||
import lombok.Data;
|
||||
import mc.protocol.io.NetByteBuf;
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,8 @@
|
||||
package mc.protocol.packets.server;
|
||||
package mc.protocol.packets.status.server;
|
||||
|
||||
import lombok.Data;
|
||||
import mc.protocol.io.NetByteBuf;
|
||||
import mc.protocol.model.ServerInfo;
|
||||
import mc.protocol.packets.ServerSidePacket;
|
||||
import mc.protocol.serializer.ServerInfoSerializer;
|
||||
|
||||
/**
|
||||
* Status server packet, response.
|
||||
@@ -52,10 +50,10 @@ public class StatusServerResponse implements ServerSidePacket {
|
||||
/**
|
||||
* Информация о серере.
|
||||
*/
|
||||
private ServerInfo info;
|
||||
private String info;
|
||||
|
||||
@Override
|
||||
public void writeSelf(NetByteBuf netByteBuf) {
|
||||
netByteBuf.writeString(ServerInfoSerializer.toJsonObject(info).toString());
|
||||
netByteBuf.writeString(info);
|
||||
}
|
||||
}
|
||||
@@ -11,10 +11,10 @@ public enum ChatMode {
|
||||
public static ChatMode valueById(int id) {
|
||||
// а зачем усложнять?
|
||||
//@formatter:off
|
||||
if (id == 1) return FULL;
|
||||
if (id == 1) return FULL;
|
||||
else if (id == 2) return COMMANDS_ONLY;
|
||||
else if (id == 3) return HIDDEN;
|
||||
else return null;
|
||||
else return null;
|
||||
//@formatter:on
|
||||
}
|
||||
}
|
||||
@@ -10,9 +10,9 @@ public enum MainHand {
|
||||
public static MainHand valueById(int id) {
|
||||
// а зачем усложнять?
|
||||
//@formatter:off
|
||||
if (id == 0) return LEFT;
|
||||
if (id == 0) return LEFT;
|
||||
else if (id == 1) return RIGHT;
|
||||
else return null;
|
||||
else return null;
|
||||
//@formatter:on
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user