diff --git a/protocol/src/main/java/mc/protocol/State.java b/protocol/src/main/java/mc/protocol/State.java index 67ca2e3..93554f7 100644 --- a/protocol/src/main/java/mc/protocol/State.java +++ b/protocol/src/main/java/mc/protocol/State.java @@ -65,7 +65,8 @@ public enum State { Map.entry(0x13, CPlayerAbilitiesPacket.class), Map.entry(0x14, PlayerDiggingAndMorePacket.class), Map.entry(0x15, EntityActionPacket.class), - Map.entry(0x1D, HandAnimationPacket.class) + Map.entry(0x1D, HandAnimationPacket.class), + Map.entry(0x1F, PlayerBlockPlacementPacket.class) ), // server side Map.of( diff --git a/protocol/src/main/java/mc/protocol/packets/play/client/PlayerBlockPlacementPacket.java b/protocol/src/main/java/mc/protocol/packets/play/client/PlayerBlockPlacementPacket.java new file mode 100644 index 0000000..6ba6b1b --- /dev/null +++ b/protocol/src/main/java/mc/protocol/packets/play/client/PlayerBlockPlacementPacket.java @@ -0,0 +1,78 @@ +package mc.protocol.packets.play.client; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.ToString; +import mc.protocol.buffer.NetByteBuf; +import mc.protocol.model.BlockLocation; +import mc.protocol.packets.ClientSidePacket; +import mc.protocol.utils.Face; +import mc.protocol.utils.Hand; +import mc.protocol.utils.SerializeUtil; +import mc.utils.vector.Vector3f; + +/** + * Игрок размещает блок. + * + *
Структура пакета
+ *+ * | FIELD | TYPE | NOTES | + * |-------------------|----------|---------------------------------------------------------------------------| + * | Location | Position | Позиция блока | + * | Face | VarInt | Сторона блока, к которому ставится новый блок | + * | Hand | VarInt | Используемая рука | + * | | | - 0: основная рука | + * | | | - 1: левая рука | + * | Cursor Position X | Float | Положение перекрестия на блоке, от 0 до 1 с увеличением с West на East. | + * | Cursor Position Y | Float | Положение перекрестия на блоке, от 0 до 1 с увеличением с Bottom на Top. | + * | Cursor Position Z | Float | Положение перекрестия на блоке, от 0 до 1 с увеличением с North на South. | + *+ * + *
Значения Стороны блока
+ *+ * | VALUE | OFFCET | FACE | + * |-------|--------|--------| + * | 0 | -Y | Bottom | + * | 1 | +Y | Top | + * | 2 | -Z | North | + * | 3 | +Z | South | + * | 4 | -X | West | + * | 5 | +X | East | + *+ * + * @see Player Block Placement + */ +@NoArgsConstructor +@Getter +@EqualsAndHashCode +@ToString +public class PlayerBlockPlacementPacket implements ClientSidePacket { + + private BlockLocation location; + private Face face; + private Hand hand; + private Vector3f cursorPosition; + + @Override + public void readSelf(NetByteBuf netByteBuf) { + this.location = SerializeUtil.long2location(netByteBuf.readLong()); + this.face = Face.valueById(netByteBuf.readVarInt()); + this.hand = Hand.valueById(netByteBuf.readVarInt()); + + this.cursorPosition = new Vector3f(); + this.cursorPosition.set( + netByteBuf.readFloat(), + netByteBuf.readFloat(), + netByteBuf.readFloat() + ); + } + + @Override + public void passivate() { + this.location = null; + this.face = null; + this.hand = null; + this.cursorPosition = null; + } +} diff --git a/utils/src/main/java/mc/utils/vector/Vector3f.java b/utils/src/main/java/mc/utils/vector/Vector3f.java new file mode 100644 index 0000000..33c4e3c --- /dev/null +++ b/utils/src/main/java/mc/utils/vector/Vector3f.java @@ -0,0 +1,53 @@ +package mc.utils.vector; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.ToString; + +@Getter +@EqualsAndHashCode +@ToString +public class Vector3f { + + private float x; + private float y; + private float z; + + public Vector3f(float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + } + + public Vector3f(Vector3f vector3f) { + this(vector3f.getX(), vector3f.getY(), vector3f.getZ()); + } + + public Vector3f() { + this(0f, 0f, 0f); + } + + public void set(float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + } + + public void set(Vector3f vector3f) { + this.set(vector3f.getX(), vector3f.getY(), vector3f.getZ()); + } + + public void add(float x, float y, float z) { + this.x += x; + this.y += y; + this.z += z; + } + + public void add(Vector3f vector3f) { + this.add(vector3f.getX(), vector3f.getY(), vector3f.getZ()); + } + + public Vector3f copy() { + return new Vector3f(this); + } +}