Archived
0

ScoreboardObjectivePacket

This commit is contained in:
2021-05-08 15:36:10 +03:00
parent 9ccb9a6221
commit 050130be60
5 changed files with 94 additions and 11 deletions

View File

@@ -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,

View File

@@ -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.
*
* <p>Структура пакета</p>
* <pre>
* | 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" |
* </pre>
*
* @see <a href="https://wiki.vg/index.php?title=Protocol&oldid=14204#Scoreboard_Objective" target="_top">Scoreboard Objective</a>
*/
@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());
}
}
}

View File

@@ -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;
}

View File

@@ -0,0 +1,6 @@
package mc.protocol.utils;
public enum ScoreboardObjectiveType {
INTEGER,
HEARTS
}

View File

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