diff --git a/protocol/src/main/java/mc/protocol/State.java b/protocol/src/main/java/mc/protocol/State.java index 038de6c..2a56a63 100644 --- a/protocol/src/main/java/mc/protocol/State.java +++ b/protocol/src/main/java/mc/protocol/State.java @@ -51,7 +51,8 @@ public enum State { 0x0D, PlayerPositionPacket.class, 0x0E, CPlayerPositionAndLookPacket.class, 0x0F, PlayerLookPacket.class, - 0x15, EntityActionPacket.class + 0x15, EntityActionPacket.class, + 0x1C, UpdateSignPacket.class ), // client bound Map.of( diff --git a/protocol/src/main/java/mc/protocol/packets/client/UpdateSignPacket.java b/protocol/src/main/java/mc/protocol/packets/client/UpdateSignPacket.java new file mode 100644 index 0000000..3297772 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/packets/client/UpdateSignPacket.java @@ -0,0 +1,57 @@ +package mc.protocol.packets.client; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.ToString; +import mc.protocol.io.NetByteBuf; +import mc.protocol.model.Location; +import mc.protocol.packets.ClientSidePacket; +import mc.protocol.packets.server.OpenSignEditorPacket; +import mc.protocol.serializer.LocationSerializer; + +/** + * Update Sign packet. + * + *
Отправляется клиентом, когда нажата кнопка "Done" в окне редактирования таблички.
+ * + *Структура пакета
+ *+ * | FIELD | TYPE | NOTES | + * |----------|--------------|--------------------------------| + * | Location | Location | Позиция редактируемой табилчки | + * | Line 1 | String (384) | Строка таблички | + * | Line 2 | String (384) | Строка таблички | + * | Line 3 | String (384) | Строка таблички | + * | Line 4 | String (384) | Строка таблички | + *+ * + * @see Update Sign + * @see OpenSignEditorPacket + */ +@NoArgsConstructor +@Getter +@EqualsAndHashCode +@ToString +public class UpdateSignPacket implements ClientSidePacket { + + private Location location; + @SuppressWarnings("MismatchedReadAndWriteOfArray") + private String[] lines; + + @Override + public void readSelf(NetByteBuf netByteBuf) { + this.location = LocationSerializer.fromLongValue(netByteBuf.readLong()); + this.lines = new String[4]; + this.lines[0] = netByteBuf.readString(384); + this.lines[1] = netByteBuf.readString(384); + this.lines[2] = netByteBuf.readString(384); + this.lines[3] = netByteBuf.readString(384); + } + + @Override + public void passivate() { + this.location = null; + this.lines = null; + } +} diff --git a/protocol/src/main/java/mc/protocol/packets/server/OpenSignEditorPacket.java b/protocol/src/main/java/mc/protocol/packets/server/OpenSignEditorPacket.java index 7c06dbc..64fbcf4 100644 --- a/protocol/src/main/java/mc/protocol/packets/server/OpenSignEditorPacket.java +++ b/protocol/src/main/java/mc/protocol/packets/server/OpenSignEditorPacket.java @@ -4,6 +4,7 @@ import lombok.Data; import mc.protocol.io.NetByteBuf; import mc.protocol.model.Location; import mc.protocol.packets.ServerSidePacket; +import mc.protocol.packets.client.UpdateSignPacket; import mc.protocol.serializer.LocationSerializer; /** @@ -17,6 +18,7 @@ import mc.protocol.serializer.LocationSerializer; * * * @see Open Sign Editor + * @see UpdateSignPacket */ @Data public class OpenSignEditorPacket implements ServerSidePacket { diff --git a/protocol/src/main/java/mc/protocol/serializer/LocationSerializer.java b/protocol/src/main/java/mc/protocol/serializer/LocationSerializer.java index bae859a..9fff646 100644 --- a/protocol/src/main/java/mc/protocol/serializer/LocationSerializer.java +++ b/protocol/src/main/java/mc/protocol/serializer/LocationSerializer.java @@ -12,6 +12,13 @@ public class LocationSerializer { | (floorDouble(location.getZ()) & 0x3FFFFFF); } + public Location fromLongValue(long value) { + return new Location( + value >> 38, + (value >> 26) & 0xFFF, + value << 38 >> 38); + } + private static int floorDouble(double value) { int i = (int) value; return value < (double) i ? i - 1 : i;