diff --git a/protocol/src/main/java/mc/protocol/State.java b/protocol/src/main/java/mc/protocol/State.java index a2a7d35..9f6cf71 100644 --- a/protocol/src/main/java/mc/protocol/State.java +++ b/protocol/src/main/java/mc/protocol/State.java @@ -50,7 +50,8 @@ public enum State { // client bound Map.of( JoinGamePacket.class, 0x23, - SpawnPositionPacket.class, 0x46 + SpawnPositionPacket.class, 0x46, + PlayerAbilitiesPacket.class,0x2C ) ); diff --git a/protocol/src/main/java/mc/protocol/packets/server/PlayerAbilitiesPacket.java b/protocol/src/main/java/mc/protocol/packets/server/PlayerAbilitiesPacket.java new file mode 100644 index 0000000..e2c084a --- /dev/null +++ b/protocol/src/main/java/mc/protocol/packets/server/PlayerAbilitiesPacket.java @@ -0,0 +1,60 @@ +package mc.protocol.packets.server; + +import lombok.Data; +import mc.protocol.io.NetByteBuf; +import mc.protocol.packets.ServerSidePacket; + +/** + * Характеристики игрока. + * + *

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

+ *
+ * | FIELD                        | TYPE     | NOTES                                   |
+ * |------------------------------|----------|-----------------------------------------|
+ * | Flags                        | Byte     | Битовая маска флагов. См. ниже значения |
+ * | Flying Speed                 | Float    | Скорость полёта                         |
+ * | Field of View (FOV) Modifier | Float    | Поле зрения                             |
+ * 
+ * + *

Флаги "Flags"

+ *
+ * Bit 0x01 - Неуязвимость (Invulnerable)
+ * Bit 0x02 - В полёте (Flying)
+ * Bit 0x04 - Может летать (Allow Flying)
+ * Bit 0x08 - Creative Mode (Instant Break)
+ * 
+ * + * @see Player Abilities + */ +@Data +public class PlayerAbilitiesPacket implements ServerSidePacket { + + @SuppressWarnings("java:S116") + private byte $flags = 0; + private float flyingSpeed; + private float fieldOfView; + + @Override + public void writeSelf(NetByteBuf netByteBuf) { + netByteBuf.writeByte(this.$flags); + netByteBuf.writeFloat(this.flyingSpeed); + netByteBuf.writeFloat(this.fieldOfView); + } + + //FIXME использование value значений + public void setInvulnerable(boolean value) { + this.$flags = (byte) (this.$flags | 0x01); + } + + public void setFlying(boolean value) { + this.$flags = (byte) (this.$flags | 0x02); + } + + public void setCatFly(boolean value) { + this.$flags = (byte) (this.$flags | 0x04); + } + + public void setCreativeMode(boolean value) { + this.$flags = (byte) (this.$flags | 0x08); + } +} diff --git a/server/src/main/java/mc/server/PacketHandler.java b/server/src/main/java/mc/server/PacketHandler.java index 611a686..bbffca9 100644 --- a/server/src/main/java/mc/server/PacketHandler.java +++ b/server/src/main/java/mc/server/PacketHandler.java @@ -9,10 +9,7 @@ import mc.protocol.packets.PingPacket; import mc.protocol.packets.client.HandshakePacket; import mc.protocol.packets.client.LoginStartPacket; import mc.protocol.packets.client.StatusServerRequestPacket; -import mc.protocol.packets.server.JoinGamePacket; -import mc.protocol.packets.server.LoginSuccessPacket; -import mc.protocol.packets.server.SpawnPositionPacket; -import mc.protocol.packets.server.StatusServerResponse; +import mc.protocol.packets.server.*; import mc.protocol.serializer.TextSerializer; import mc.server.config.Config; import org.apache.commons.io.IOUtils; @@ -86,6 +83,17 @@ public class PacketHandler { log.info("{}", spawnPositionPacket); channel.getCtx().write(spawnPositionPacket); + PlayerAbilitiesPacket playerAbilitiesPacket = new PlayerAbilitiesPacket(); + playerAbilitiesPacket.setCatFly(true); + playerAbilitiesPacket.setFlying(true); + playerAbilitiesPacket.setCreativeMode(false); + playerAbilitiesPacket.setInvulnerable(true); + playerAbilitiesPacket.setFieldOfView(0.0f); + playerAbilitiesPacket.setFlyingSpeed(0.05f); + + log.info("{}", playerAbilitiesPacket); + channel.getCtx().write(playerAbilitiesPacket); + channel.getCtx().flush(); }