diff --git a/protocol/src/main/java/mc/protocol/State.java b/protocol/src/main/java/mc/protocol/State.java index 323e7a1..d8d0651 100644 --- a/protocol/src/main/java/mc/protocol/State.java +++ b/protocol/src/main/java/mc/protocol/State.java @@ -59,6 +59,7 @@ public enum State { ScoreboardDisplayPacket.class, 0x3B, ScoreboardObjectivePacket.class, 0x42, TeamsPacket.class, 0x44, + ScoreboardUpdateScorePacket.class, 0x45, SpawnPositionPacket.class, 0x46, ChunkDataPacket.class, 0x20, PlayerAbilitiesPacket.class,0x2C, diff --git a/protocol/src/main/java/mc/protocol/packets/server/ScoreboardUpdateScorePacket.java b/protocol/src/main/java/mc/protocol/packets/server/ScoreboardUpdateScorePacket.java new file mode 100644 index 0000000..7bf14fc --- /dev/null +++ b/protocol/src/main/java/mc/protocol/packets/server/ScoreboardUpdateScorePacket.java @@ -0,0 +1,43 @@ +package mc.protocol.packets.server; + +import lombok.Data; +import mc.protocol.io.NetByteBuf; +import mc.protocol.packets.ServerSidePacket; +import mc.protocol.utils.ScoreboardUpdateScoreAction; + +/** + * Update score packet. + * + *

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

+ *
+ * | FIELD           | TYPE        | NOTES                                              |
+ * |-----------------|-------------|--------------------------------------------------- |
+ * | Entity Name     | String (40) | Сущность, которой принадлежит счет (score).        |
+ * |                 |             | Для Игроков - это ник                              |
+ * |                 |             | Для других сущностей - это UUID                    |
+ * | Action          | Byte        | 0 - создать или обновить счет (score); 1 - удалить |
+ * | Objective Name  | String (16) | Имя сущности, которой принадлежит счет (score)     |
+ * | Value           | VarInt      | Если "Action" = 0. Значение счета (score)          |
+ * 
+ * + * @see Update Score + */ +@Data +public class ScoreboardUpdateScorePacket implements ServerSidePacket { + + private String entityName; + private ScoreboardUpdateScoreAction action; + private String entityDisplayName; + private int value; + + @Override + public void writeSelf(NetByteBuf netByteBuf) { + netByteBuf.writeString(this.entityName); + netByteBuf.writeByte(this.action.getCode()); + netByteBuf.writeString(this.entityDisplayName); + + if (ScoreboardUpdateScoreAction.CREATE_OR_UPDATE.equals(this.action)) { + netByteBuf.writeVarInt(this.value); + } + } +} diff --git a/protocol/src/main/java/mc/protocol/utils/ScoreboardUpdateScoreAction.java b/protocol/src/main/java/mc/protocol/utils/ScoreboardUpdateScoreAction.java new file mode 100644 index 0000000..91bc870 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/utils/ScoreboardUpdateScoreAction.java @@ -0,0 +1,13 @@ +package mc.protocol.utils; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public enum ScoreboardUpdateScoreAction { + CREATE_OR_UPDATE(0), + REMOVE(1); + + @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 da08408..4507596 100644 --- a/server/src/main/java/mc/server/PacketHandler.java +++ b/server/src/main/java/mc/server/PacketHandler.java @@ -162,6 +162,13 @@ public class PacketHandler { context.send(teamsPacket_Add); + var scoreboardUpdateScorePacket = new ScoreboardUpdateScorePacket(); + scoreboardUpdateScorePacket.setEntityName(teamsPacket_Create.getPrefix() + playerName + teamsPacket_Create.getSuffix()); + scoreboardUpdateScorePacket.setEntityDisplayName(playerName); + scoreboardUpdateScorePacket.setAction(ScoreboardUpdateScoreAction.CREATE_OR_UPDATE); + + context.send(scoreboardUpdateScorePacket); + context.flushSending(); }