From 47e6c3e76f65a41cc789cf1c3f180b2479767b38 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 8 May 2021 18:34:52 +0300 Subject: [PATCH] SChatPacket --- protocol/src/main/java/mc/protocol/State.java | 1 + .../protocol/packets/server/SChatPacket.java | 36 +++++++++++++++++++ .../java/mc/protocol/utils/ChatPosition.java | 15 ++++++++ .../main/java/mc/server/PacketHandler.java | 10 ++++++ 4 files changed, 62 insertions(+) create mode 100644 protocol/src/main/java/mc/protocol/packets/server/SChatPacket.java create mode 100644 protocol/src/main/java/mc/protocol/utils/ChatPosition.java diff --git a/protocol/src/main/java/mc/protocol/State.java b/protocol/src/main/java/mc/protocol/State.java index 6159b43..0c4d257 100644 --- a/protocol/src/main/java/mc/protocol/State.java +++ b/protocol/src/main/java/mc/protocol/State.java @@ -54,6 +54,7 @@ public enum State { ), // client bound Map.of( + SChatPacket.class, 0x0F, PingPacket.class, 0x1F, JoinGamePacket.class, 0x23, SpawnPositionPacket.class, 0x46, diff --git a/protocol/src/main/java/mc/protocol/packets/server/SChatPacket.java b/protocol/src/main/java/mc/protocol/packets/server/SChatPacket.java new file mode 100644 index 0000000..3456535 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/packets/server/SChatPacket.java @@ -0,0 +1,36 @@ +package mc.protocol.packets.server; + +import lombok.Data; +import mc.protocol.io.NetByteBuf; +import mc.protocol.model.text.Text; +import mc.protocol.packets.ServerSidePacket; +import mc.protocol.serializer.TextSerializer; +import mc.protocol.utils.ChatPosition; + +/** + * Chat packet. + * + *

Структура пакета

+ *
+ * | FIELD     | TYPE | NOTES                                         |
+ * |-----------|------|-----------------------------------------------|
+ * | JSON Data | Text | Текст                                         |
+ * | Position  | Byte | 0 - сообщение чата                            |
+ * |           |      | 1 - системное сообщение (отображается в чате) |
+ * |           |      | 2 - над панелью быстрого доступа (hotbar)     |
+ * 
+ * + * @see Chat Message (clientbound) + */ +@Data +public class SChatPacket implements ServerSidePacket { + + private Text message; + private ChatPosition position; + + @Override + public void writeSelf(NetByteBuf netByteBuf) { + netByteBuf.writeString(TextSerializer.toJsonObject(this.message).toString()); + netByteBuf.writeByte(this.position.getCode()); + } +} diff --git a/protocol/src/main/java/mc/protocol/utils/ChatPosition.java b/protocol/src/main/java/mc/protocol/utils/ChatPosition.java new file mode 100644 index 0000000..3e47244 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/utils/ChatPosition.java @@ -0,0 +1,15 @@ +package mc.protocol.utils; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public enum ChatPosition { + + CHAT(0), + SYSTEM(1), + HOTBAR(2); + + @Getter + private final int code; +} diff --git a/server/src/main/java/mc/server/PacketHandler.java b/server/src/main/java/mc/server/PacketHandler.java index fad97df..f9fe665 100644 --- a/server/src/main/java/mc/server/PacketHandler.java +++ b/server/src/main/java/mc/server/PacketHandler.java @@ -7,12 +7,14 @@ import mc.protocol.api.ConnectionContext; import mc.protocol.model.Location; import mc.protocol.model.Look; import mc.protocol.model.ServerInfo; +import mc.protocol.model.text.Text; import mc.protocol.packets.PingPacket; import mc.protocol.packets.client.HandshakePacket; import mc.protocol.packets.client.LoginStartPacket; import mc.protocol.packets.client.StatusServerRequestPacket; import mc.protocol.packets.server.*; import mc.protocol.serializer.TextSerializer; +import mc.protocol.utils.ChatPosition; import mc.protocol.utils.Difficulty; import mc.protocol.utils.GameMode; import mc.protocol.utils.LevelType; @@ -122,6 +124,14 @@ public class PacketHandler { context.send(pingPacket); context.flushSending(); + + // -- Эксперименты -- // + + var chatPacket = new SChatPacket(); + chatPacket.setMessage(Text.of("== Hello! ==")); + chatPacket.setPosition(ChatPosition.CHAT); + + context.sendNow(chatPacket); } private static String faviconToBase64(Path iconPath) {