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(); }