diff --git a/protocol/src/main/java/mc/protocol/State.java b/protocol/src/main/java/mc/protocol/State.java index f642227..ef93765 100644 --- a/protocol/src/main/java/mc/protocol/State.java +++ b/protocol/src/main/java/mc/protocol/State.java @@ -61,6 +61,7 @@ public enum State { 0x0D, PlayerPositionPacket.class, 0x0E, CPlayerPositionAndLookPacket.class, 0x0F, PlayerLookPacket.class, + 0x13, CPlayerAbilitiesPacket.class, 0x15, EntityActionPacket.class ), // server side @@ -68,7 +69,7 @@ public enum State { KeepAlivePacket.class, 0x1F, ChunkDataPacket.class, 0x20, JoinGamePacket.class, 0x23, - PlayerAbilitiesPacket.class,0x2C, + SPlayerAbilitiesPacket.class,0x2C, SPlayerPositionAndLookPacket.class, 0x2F, SpawnPositionPacket.class, 0x46 ) diff --git a/protocol/src/main/java/mc/protocol/packets/play/client/CPlayerAbilitiesPacket.java b/protocol/src/main/java/mc/protocol/packets/play/client/CPlayerAbilitiesPacket.java new file mode 100644 index 0000000..1429024 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/packets/play/client/CPlayerAbilitiesPacket.java @@ -0,0 +1,68 @@ +package mc.protocol.packets.play.client; + +import lombok.Data; +import mc.protocol.buffer.NetByteBuf; +import mc.protocol.packets.ClientSidePacket; +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 CPlayerAbilitiesPacket implements ClientSidePacket { + + @SuppressWarnings("java:S116") + private byte $flags = 0; + private float flyingSpeed; + private float fieldOfView; + + @Override + public void readSelf(NetByteBuf netByteBuf) { + this.$flags = netByteBuf.readByte(); + this.flyingSpeed = netByteBuf.readFloat(); + this.fieldOfView = netByteBuf.readFloat(); + } + + //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); + } + + @Override + public void passivate() { + $flags = 0; + flyingSpeed = 0; + fieldOfView = 0; + } +} diff --git a/protocol/src/main/java/mc/protocol/packets/play/server/PlayerAbilitiesPacket.java b/protocol/src/main/java/mc/protocol/packets/play/server/SPlayerAbilitiesPacket.java similarity index 96% rename from protocol/src/main/java/mc/protocol/packets/play/server/PlayerAbilitiesPacket.java rename to protocol/src/main/java/mc/protocol/packets/play/server/SPlayerAbilitiesPacket.java index afa898e..4724291 100644 --- a/protocol/src/main/java/mc/protocol/packets/play/server/PlayerAbilitiesPacket.java +++ b/protocol/src/main/java/mc/protocol/packets/play/server/SPlayerAbilitiesPacket.java @@ -27,7 +27,7 @@ import mc.protocol.packets.ServerSidePacket; * @see Player Abilities */ @Data -public class PlayerAbilitiesPacket implements ServerSidePacket { +public class SPlayerAbilitiesPacket implements ServerSidePacket { @SuppressWarnings("java:S116") private byte $flags = 0; diff --git a/server/src/main/java/mc/server/scenario/ScenarioLogin.java b/server/src/main/java/mc/server/scenario/ScenarioLogin.java index bdd9438..dbb335d 100644 --- a/server/src/main/java/mc/server/scenario/ScenarioLogin.java +++ b/server/src/main/java/mc/server/scenario/ScenarioLogin.java @@ -83,7 +83,7 @@ public class ScenarioLogin implements PacketScenario { } private void sendPlayerAbilities(Player player) { - var playerAbilitiesPacket = new PlayerAbilitiesPacket(); + var playerAbilitiesPacket = new SPlayerAbilitiesPacket(); playerAbilitiesPacket.setCatFly(true); playerAbilitiesPacket.setFlying(true); playerAbilitiesPacket.setCreativeMode(true);