diff --git a/protocol/src/main/java/mc/protocol/State.java b/protocol/src/main/java/mc/protocol/State.java index f2bcbb3..323e7a1 100644 --- a/protocol/src/main/java/mc/protocol/State.java +++ b/protocol/src/main/java/mc/protocol/State.java @@ -57,6 +57,7 @@ public enum State { PingPacket.class, 0x1F, JoinGamePacket.class, 0x23, ScoreboardDisplayPacket.class, 0x3B, + ScoreboardObjectivePacket.class, 0x42, TeamsPacket.class, 0x44, SpawnPositionPacket.class, 0x46, ChunkDataPacket.class, 0x20, diff --git a/protocol/src/main/java/mc/protocol/packets/server/ScoreboardObjectivePacket.java b/protocol/src/main/java/mc/protocol/packets/server/ScoreboardObjectivePacket.java new file mode 100644 index 0000000..dcd9ac2 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/packets/server/ScoreboardObjectivePacket.java @@ -0,0 +1,44 @@ +package mc.protocol.packets.server; + +import lombok.Data; +import mc.protocol.io.NetByteBuf; +import mc.protocol.packets.ServerSidePacket; +import mc.protocol.utils.ScoreboardObjectiveMode; +import mc.protocol.utils.ScoreboardObjectiveType; + +/** + * Scoreboard objective packet. + * + *

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

+ *
+ * | FIELD           | TYPE        | NOTES                                             |
+ * |-----------------|-------------|---------------------------------------------------|
+ * | Objective Name  | String (16) | Уникальное наименование цели (objective)          |
+ * | Mode            | Byte        | 0 - создание Scoreboard                           |
+ * |                 |             | 1 - удаление Scoreboard                           |
+ * |                 |             | 2 - обновление Scoreboard                         |
+ * | Objective Value | String (32) | Если "Mode" равен 0 или 2. Отображаемый текст     |
+ * | Type            | String (16) | Если "Mode" равен 0 или 2. "integer" или "hearts" |
+ * 
+ * + * @see Scoreboard Objective + */ +@Data +public class ScoreboardObjectivePacket implements ServerSidePacket { + + private String name; + private ScoreboardObjectiveMode mode; + private String value; + private ScoreboardObjectiveType type; + + @Override + public void writeSelf(NetByteBuf netByteBuf) { + netByteBuf.writeString(this.name); + netByteBuf.writeByte(this.mode.getCode()); + + if (ScoreboardObjectiveMode.CREATE.equals(this.mode) || ScoreboardObjectiveMode.UPDATE.equals(this.mode)) { + netByteBuf.writeString(this.value); + netByteBuf.writeString(this.type.name().toLowerCase()); + } + } +} diff --git a/protocol/src/main/java/mc/protocol/utils/ScoreboardObjectiveMode.java b/protocol/src/main/java/mc/protocol/utils/ScoreboardObjectiveMode.java new file mode 100644 index 0000000..cd9546c --- /dev/null +++ b/protocol/src/main/java/mc/protocol/utils/ScoreboardObjectiveMode.java @@ -0,0 +1,14 @@ +package mc.protocol.utils; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public enum ScoreboardObjectiveMode { + CREATE(0), + REMOVE(1), + UPDATE(2); + + @Getter + private final int code; +} diff --git a/protocol/src/main/java/mc/protocol/utils/ScoreboardObjectiveType.java b/protocol/src/main/java/mc/protocol/utils/ScoreboardObjectiveType.java new file mode 100644 index 0000000..20fc790 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/utils/ScoreboardObjectiveType.java @@ -0,0 +1,6 @@ +package mc.protocol.utils; + +public enum ScoreboardObjectiveType { + INTEGER, + HEARTS +} diff --git a/server/src/main/java/mc/server/PacketHandler.java b/server/src/main/java/mc/server/PacketHandler.java index 466418d..da08408 100644 --- a/server/src/main/java/mc/server/PacketHandler.java +++ b/server/src/main/java/mc/server/PacketHandler.java @@ -127,23 +127,41 @@ public class PacketHandler { // --- Эксперименты --- // - TeamsPacket teamsPacket = new TeamsPacket(); - teamsPacket.setName("Score::List"); - teamsPacket.setMode(TeamsMode.CREATE); - teamsPacket.setDisplayName(teamsPacket.getName()); - teamsPacket.setNameTagVisibility(TeamsNameTagVisibility.NEVER); - teamsPacket.setCollisionRule(TeamsCollisionRule.NEVER); - teamsPacket.setColor(-1/*no color*/); - teamsPacket.getMembers().add(playerName); + var scoreboardObjectivePacket = new ScoreboardObjectivePacket(); + scoreboardObjectivePacket.setName(playerName); + scoreboardObjectivePacket.setMode(ScoreboardObjectiveMode.CREATE); + scoreboardObjectivePacket.setValue("Score::List"); + scoreboardObjectivePacket.setType(ScoreboardObjectiveType.INTEGER); - context.send(teamsPacket); + context.send(scoreboardObjectivePacket); - ScoreboardDisplayPacket scoreboardDisplayPacket = new ScoreboardDisplayPacket(); + var scoreboardDisplayPacket = new ScoreboardDisplayPacket(); scoreboardDisplayPacket.setPosition(ScoreboardPosition.LIST); - scoreboardDisplayPacket.setName(teamsPacket.getName()); + scoreboardDisplayPacket.setName(playerName); context.send(scoreboardDisplayPacket); + @SuppressWarnings("java:S117") + var teamsPacket_Create = new TeamsPacket(); + teamsPacket_Create.setMode(TeamsMode.CREATE); + teamsPacket_Create.setName("__fakeScore0"); + teamsPacket_Create.setDisplayName(teamsPacket_Create.getName()); + teamsPacket_Create.setPrefix(""); + teamsPacket_Create.setSuffix(""); + teamsPacket_Create.setNameTagVisibility(TeamsNameTagVisibility.ALWAYS); + teamsPacket_Create.setCollisionRule(TeamsCollisionRule.ALWAYS); + teamsPacket_Create.setColor(-1/*no color*/); + + context.send(teamsPacket_Create); + + @SuppressWarnings("java:S117") + var teamsPacket_Add = new TeamsPacket(); + teamsPacket_Add.setMode(TeamsMode.ADD_MEMBER); + teamsPacket_Add.setName(teamsPacket_Create.getName()); + teamsPacket_Add.getMembers().add(playerName); + + context.send(teamsPacket_Add); + context.flushSending(); }