diff --git a/protocol/src/main/java/mc/protocol/State.java b/protocol/src/main/java/mc/protocol/State.java index 1d20194..39d1dca 100644 --- a/protocol/src/main/java/mc/protocol/State.java +++ b/protocol/src/main/java/mc/protocol/State.java @@ -46,14 +46,15 @@ public enum State { Map.of( 0x00, TeleportConfirmPacket.class, 0x04, ClientSettingsPacket.class, - 0x09, PluginMessagePacket.class + 0x09, PluginMessagePacket.class, + 0x0E, CPlayerPositionAndLookPacket.class ), // client bound Map.of( JoinGamePacket.class, 0x23, SpawnPositionPacket.class, 0x46, PlayerAbilitiesPacket.class,0x2C, - PlayerPositionAndLookPacket.class, 0x2F + SPlayerPositionAndLookPacket.class, 0x2F ) ); diff --git a/protocol/src/main/java/mc/protocol/packets/client/CPlayerPositionAndLookPacket.java b/protocol/src/main/java/mc/protocol/packets/client/CPlayerPositionAndLookPacket.java new file mode 100644 index 0000000..d0f5036 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/packets/client/CPlayerPositionAndLookPacket.java @@ -0,0 +1,58 @@ +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.model.Look; +import mc.protocol.packets.ClientSidePacket; + +/** + * Клиент сообщает о движении Игрока. + * + *
Структура пакета
+ *+ * | FIELD | TYPE | NOTES | + * |-----------|---------|------------------------------------------------------------| + * | X | Double | Абсолютная позиция по X | + * | Y | Double | Абсолютная позиция по Y. | + * | | | Имеется ввиду позиция ног. Голова находиться выше на 1.62f | + * | Z | Double | Абсолютная позиция по Z | + * | Yaw | Float | Абсолютный поворот головы по OX, в градусах | + * | Pitch | Float | Абсолютный поворот головы по OY, в градусах | + * | On Ground | Boolean | true, если Игрок находится на земле | + *+ * + * @see Player Position And Look (serverbound) + */ +@NoArgsConstructor +@Getter +@EqualsAndHashCode +@ToString +public class CPlayerPositionAndLookPacket implements ClientSidePacket { + + private Location position; + private Look look; + @SuppressWarnings("java:S116") + private boolean onGround; + + @Override + public void readSelf(NetByteBuf netByteBuf) { + double x = netByteBuf.readDouble(); + double y = netByteBuf.readDouble(); + double z = netByteBuf.readDouble(); + this.position = new Location(x, y, z); + + float yaw = netByteBuf.readFloat(); + float pitch = netByteBuf.readFloat(); + this.look = new Look(yaw, pitch); + + this.onGround = netByteBuf.readBoolean(); + } + + public double getYPositionHead() { + return this.position.getY() + 1.62f; + } +} diff --git a/protocol/src/main/java/mc/protocol/packets/client/TeleportConfirmPacket.java b/protocol/src/main/java/mc/protocol/packets/client/TeleportConfirmPacket.java index 1b0c849..eee3df4 100644 --- a/protocol/src/main/java/mc/protocol/packets/client/TeleportConfirmPacket.java +++ b/protocol/src/main/java/mc/protocol/packets/client/TeleportConfirmPacket.java @@ -6,7 +6,7 @@ import lombok.NoArgsConstructor; import lombok.ToString; import mc.protocol.io.NetByteBuf; import mc.protocol.packets.ClientSidePacket; -import mc.protocol.packets.server.PlayerPositionAndLookPacket; +import mc.protocol.packets.server.SPlayerPositionAndLookPacket; /** * Teleport сonfirm packet. @@ -15,11 +15,11 @@ import mc.protocol.packets.server.PlayerPositionAndLookPacket; *
* | FIELD | TYPE | NOTES |
* |-------------|--------|-----------------------------------------------------------|
- * | Teleport ID | VarInt | ID, который был выдан пакетом {@link PlayerPositionAndLookPacket} |
+ * | Teleport ID | VarInt | ID, который был выдан пакетом {@link SPlayerPositionAndLookPacket} |
*
*
* @see Login start
- * @see PlayerPositionAndLookPacket
+ * @see SPlayerPositionAndLookPacket
*/
@NoArgsConstructor
@Getter
diff --git a/protocol/src/main/java/mc/protocol/packets/server/PlayerPositionAndLookPacket.java b/protocol/src/main/java/mc/protocol/packets/server/SPlayerPositionAndLookPacket.java
similarity index 97%
rename from protocol/src/main/java/mc/protocol/packets/server/PlayerPositionAndLookPacket.java
rename to protocol/src/main/java/mc/protocol/packets/server/SPlayerPositionAndLookPacket.java
index ba503f8..d9ceac4 100644
--- a/protocol/src/main/java/mc/protocol/packets/server/PlayerPositionAndLookPacket.java
+++ b/protocol/src/main/java/mc/protocol/packets/server/SPlayerPositionAndLookPacket.java
@@ -37,11 +37,11 @@ import mc.protocol.packets.client.TeleportConfirmPacket;
* Примечание от Dinnerbone про "Flags":
* "It's a bitfield, X/Y/Z/Y_ROT/X_ROT. If X is set, the x value is relative and not absolute." * - * @see Player Position And Look + * @see Player Position And Look (clientbound) * @see TeleportConfirmPacket */ @Data -public class PlayerPositionAndLookPacket implements ServerSidePacket { +public class SPlayerPositionAndLookPacket implements ServerSidePacket { private Location position; private Look look; diff --git a/server/src/main/java/mc/server/PacketHandler.java b/server/src/main/java/mc/server/PacketHandler.java index 7135487..bc2f85c 100644 --- a/server/src/main/java/mc/server/PacketHandler.java +++ b/server/src/main/java/mc/server/PacketHandler.java @@ -99,7 +99,7 @@ public class PacketHandler { channel.getCtx().flush(); - var playerPositionAndLookPacket = new PlayerPositionAndLookPacket(); + var playerPositionAndLookPacket = new SPlayerPositionAndLookPacket(); playerPositionAndLookPacket.setPosition(spawnLocation); playerPositionAndLookPacket.setLook(new Look(0f, 0f)); playerPositionAndLookPacket.setTeleportId(random.nextInt());