From 47ccc3252aead0e2a5c335cb068f027110af6391 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 9 May 2021 15:36:19 +0300 Subject: [PATCH] PlayerListHeaderAndFooterPacket --- protocol/src/main/java/mc/protocol/State.java | 3 +- .../PlayerListHeaderAndFooterPacket.java | 50 +++++++++++++++++++ .../packets/server/PlayerListItemPacket.java | 1 + .../main/java/mc/server/PacketHandler.java | 17 ++++++- 4 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 protocol/src/main/java/mc/protocol/packets/server/PlayerListHeaderAndFooterPacket.java diff --git a/protocol/src/main/java/mc/protocol/State.java b/protocol/src/main/java/mc/protocol/State.java index 5bc1735..01ab867 100644 --- a/protocol/src/main/java/mc/protocol/State.java +++ b/protocol/src/main/java/mc/protocol/State.java @@ -61,7 +61,8 @@ public enum State { PlayerAbilitiesPacket.class,0x2C, PlayerListItemPacket.class,0x2E, SPlayerPositionAndLookPacket.class, 0x2F, - SpawnPositionPacket.class, 0x46 + SpawnPositionPacket.class, 0x46, + PlayerListHeaderAndFooterPacket.class,0x4A ) ); diff --git a/protocol/src/main/java/mc/protocol/packets/server/PlayerListHeaderAndFooterPacket.java b/protocol/src/main/java/mc/protocol/packets/server/PlayerListHeaderAndFooterPacket.java new file mode 100644 index 0000000..e97c50c --- /dev/null +++ b/protocol/src/main/java/mc/protocol/packets/server/PlayerListHeaderAndFooterPacket.java @@ -0,0 +1,50 @@ +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; + +/** + * Установка текста для "шапки" и "подвала" Tab-листа. + * + *

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

+ *
+ * | FIELD  | TYPE | NOTES |
+ * |--------|------|-------|
+ * | Header | Text |       |
+ * | Footer | Text |       |
+ * 
+ * + *

Для удаления "шапки" и/или "подвала", нужно отправить следующий {@link Text} компонент:

+ *
+ * {"translate":""}
+ * 
+ * + * @see Player List Header And Footer + * @see PlayerListItemPacket + */ +@Data +public class PlayerListHeaderAndFooterPacket implements ServerSidePacket { + + private static final String REMOVE_COMPONENT = "{\"translate\":\"\"}"; + + private Text header; + private Text foother; + + @Override + public void writeSelf(NetByteBuf netByteBuf) { + if (this.header == null) { + netByteBuf.writeString(REMOVE_COMPONENT); + } else { + netByteBuf.writeString(TextSerializer.toJsonObject(this.header).toString()); + } + + if (this.foother == null) { + netByteBuf.writeString(REMOVE_COMPONENT); + } else { + netByteBuf.writeString(TextSerializer.toJsonObject(this.foother).toString()); + } + } +} diff --git a/protocol/src/main/java/mc/protocol/packets/server/PlayerListItemPacket.java b/protocol/src/main/java/mc/protocol/packets/server/PlayerListItemPacket.java index 7bf2a8f..928bb82 100644 --- a/protocol/src/main/java/mc/protocol/packets/server/PlayerListItemPacket.java +++ b/protocol/src/main/java/mc/protocol/packets/server/PlayerListItemPacket.java @@ -60,6 +60,7 @@ import java.util.function.BiConsumer; * * * @see Player List Item + * @see PlayerListHeaderAndFooterPacket */ @Data public class PlayerListItemPacket implements ServerSidePacket { diff --git a/server/src/main/java/mc/server/PacketHandler.java b/server/src/main/java/mc/server/PacketHandler.java index 05cd6ee..bfdd5dd 100644 --- a/server/src/main/java/mc/server/PacketHandler.java +++ b/server/src/main/java/mc/server/PacketHandler.java @@ -7,6 +7,8 @@ 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.model.text.TextColor; import mc.protocol.packets.PingPacket; import mc.protocol.packets.client.HandshakePacket; import mc.protocol.packets.client.LoginStartPacket; @@ -139,7 +141,20 @@ public class PacketHandler { .hasDisplayName(false) .build()); - context.sendNow(playerListItemPacket); + context.send(playerListItemPacket); + + var playerListHeaderAndFooterPacket = new PlayerListHeaderAndFooterPacket(); + playerListHeaderAndFooterPacket.setHeader(Text.builder() + .append("") //TODO bug component + .append(Text.of(TextColor.GREEN, "===")) + .append(Text.of(TextColor.RED, " MC-PROJECT ")) + .append(Text.of(TextColor.GREEN, "===")) + .build()); + playerListHeaderAndFooterPacket.setFoother(Text.of(TextColor.GRAY, "develop by DmitriyMX")); + + context.send(playerListHeaderAndFooterPacket); + + context.flushSending(); } private static String faviconToBase64(Path iconPath) {