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) {