From 99dd89fe083ffaecbec9d99ed31181a4f714bf7b Mon Sep 17 00:00:00 2001 From: AlexProgrammerDE <40795980+AlexProgrammerDE@users.noreply.github.com> Date: Wed, 28 Oct 2026 09:14:28 +0100 Subject: [PATCH 1/2] fix(protocol): include the hand in explicit attack swings Protocol 2225 adds a trailing hand byte to Animate. The ordinary punch writer already supplies it, but the explicit attack helper still emits the old layout and BDS rejects that packet. Match the main-hand field used by the updated punch path. --- .../viabedrock/api/model/entity/ClientPlayerEntity.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/raphimc/viabedrock/api/model/entity/ClientPlayerEntity.java b/src/main/java/net/raphimc/viabedrock/api/model/entity/ClientPlayerEntity.java index 57e75bd5f..1a8a010e5 100644 --- a/src/main/java/net/raphimc/viabedrock/api/model/entity/ClientPlayerEntity.java +++ b/src/main/java/net/raphimc/viabedrock/api/model/entity/ClientPlayerEntity.java @@ -154,7 +154,8 @@ public void sendSwingPacketToServer() { animate.write(Types.UNSIGNED_BYTE, (short) AnimatePacketPayload_Action.Swing.getValue()); // action animate.write(BedrockTypes.UNSIGNED_VAR_LONG, this.runtimeId); // entity runtime id animate.write(BedrockTypes.FLOAT_LE, 0F); // data - animate.write(BedrockTypes.OPTIONAL_STRING, ActorSwingSource.Attack.name().toLowerCase(Locale.ROOT)); // swing source // TODO: 1.21.130 + animate.write(BedrockTypes.OPTIONAL_STRING, ActorSwingSource.Attack.name().toLowerCase(Locale.ROOT)); // swing source + animate.write(Types.BYTE, (byte) HandSlot.Mainhand.getValue()); // hand slot animate.sendToServer(BedrockProtocol.class); } From 3b8640ae6f8b699adfb7faf9b18dfe8c02c0196b Mon Sep 17 00:00:00 2001 From: AlexProgrammerDE <40795980+AlexProgrammerDE@users.noreply.github.com> Date: Wed, 28 Oct 2026 09:14:28 +0100 Subject: [PATCH 2/2] fix(protocol): satisfy checks for the 26.60 packet readers The new readers introduce nine checkstyle errors: unused decoded fields, non-final locals, and a misindented record closing parenthesis. Consume intentionally unused fields without assigning locals and retain the existing packet behavior. --- .../model/inventory/InventoryTransactionData.java | 2 +- .../viabedrock/protocol/packet/EntityPackets.java | 2 +- .../raphimc/viabedrock/protocol/packet/HudPackets.java | 2 +- .../viabedrock/protocol/packet/WorldPackets.java | 2 +- .../types/entitydata/PassengerOfBlocksType.java | 10 +++++----- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/raphimc/viabedrock/protocol/model/inventory/InventoryTransactionData.java b/src/main/java/net/raphimc/viabedrock/protocol/model/inventory/InventoryTransactionData.java index 11107aa46..5d2fb1ad1 100644 --- a/src/main/java/net/raphimc/viabedrock/protocol/model/inventory/InventoryTransactionData.java +++ b/src/main/java/net/raphimc/viabedrock/protocol/model/inventory/InventoryTransactionData.java @@ -69,7 +69,7 @@ record ReleaseItemTransactionData( BedrockItem itemInHand, Position3f headPosition, HandSlot handSlot - ) implements InventoryTransactionData { + ) implements InventoryTransactionData { } } diff --git a/src/main/java/net/raphimc/viabedrock/protocol/packet/EntityPackets.java b/src/main/java/net/raphimc/viabedrock/protocol/packet/EntityPackets.java index ba99f01a6..39c8bf5fa 100644 --- a/src/main/java/net/raphimc/viabedrock/protocol/packet/EntityPackets.java +++ b/src/main/java/net/raphimc/viabedrock/protocol/packet/EntityPackets.java @@ -606,7 +606,7 @@ public static void register(final BedrockProtocol protocol) { final long entityRuntimeId = wrapper.read(BedrockTypes.UNSIGNED_VAR_LONG); // entity runtime id wrapper.read(BedrockTypes.FLOAT_LE); // data wrapper.read(BedrockTypes.OPTIONAL_STRING); // swing source - HandSlot hand = HandSlot.getByValue(wrapper.read(Types.BYTE), HandSlot.Mainhand); // hand + final HandSlot hand = HandSlot.getByValue(wrapper.read(Types.BYTE), HandSlot.Mainhand); // hand final Entity entity = wrapper.user().get(EntityTracker.class).getEntityByRid(entityRuntimeId); if (entity == null) { diff --git a/src/main/java/net/raphimc/viabedrock/protocol/packet/HudPackets.java b/src/main/java/net/raphimc/viabedrock/protocol/packet/HudPackets.java index a330f25b7..74b333318 100644 --- a/src/main/java/net/raphimc/viabedrock/protocol/packet/HudPackets.java +++ b/src/main/java/net/raphimc/viabedrock/protocol/packet/HudPackets.java @@ -79,7 +79,7 @@ public static void register(final BedrockProtocol protocol) { final long entityUniqueId = wrapper.read(BedrockTypes.VAR_LONG); // actorUniqueId final String name = wrapper.read(BedrockTypes.STRING); // name final String xuid = wrapper.read(BedrockTypes.STRING); // xuid - final String skinPlayFabId = wrapper.read(BedrockTypes.STRING); // skin playfab id + wrapper.read(BedrockTypes.STRING); // skin playfab id final String platformOnlineId = wrapper.read(BedrockTypes.STRING); // platform online id final int deviceOs = wrapper.read(BedrockTypes.INT_LE); // device os final SkinData skin = wrapper.read(BedrockTypes.SKIN); // skin diff --git a/src/main/java/net/raphimc/viabedrock/protocol/packet/WorldPackets.java b/src/main/java/net/raphimc/viabedrock/protocol/packet/WorldPackets.java index b509e8ba9..97c493221 100644 --- a/src/main/java/net/raphimc/viabedrock/protocol/packet/WorldPackets.java +++ b/src/main/java/net/raphimc/viabedrock/protocol/packet/WorldPackets.java @@ -288,7 +288,7 @@ public static void register(final BedrockProtocol protocol) { final boolean cachingEnabled = wrapper.read(Types.BOOLEAN); // caching enabled final Long[] blobs = wrapper.read(BedrockTypes.LONG_ARRAY); // blob ids (always present in 1.26.40) final byte[] data = wrapper.read(BedrockTypes.BYTE_ARRAY); // data - final boolean biomeUpdate = wrapper.read(Types.BOOLEAN); // biome update + wrapper.read(Types.BOOLEAN); // biome update if (cachingEnabled) { final int expectedLength = requestSubChunks ? 1 : sectionCount + 1; if (blobs.length != expectedLength) { diff --git a/src/main/java/net/raphimc/viabedrock/protocol/types/entitydata/PassengerOfBlocksType.java b/src/main/java/net/raphimc/viabedrock/protocol/types/entitydata/PassengerOfBlocksType.java index 08fc79dc3..9a13a1a89 100644 --- a/src/main/java/net/raphimc/viabedrock/protocol/types/entitydata/PassengerOfBlocksType.java +++ b/src/main/java/net/raphimc/viabedrock/protocol/types/entitydata/PassengerOfBlocksType.java @@ -34,11 +34,11 @@ public PassengerOfBlocksType() { @Override public PassengerOfBlocks read(final ByteBuf buffer) { - BlockPosition position = BedrockTypes.BLOCK_POSITION.read(buffer); - Position3f offset = BedrockTypes.POSITION_3F.read(buffer); - float rotation = BedrockTypes.FLOAT_LE.read(buffer); - float rotationLimit = BedrockTypes.FLOAT_LE.read(buffer); - PassengerOfBlockArguments_EmoteType emote = PassengerOfBlockArguments_EmoteType.getByValue(buffer.readByte()); + final BlockPosition position = BedrockTypes.BLOCK_POSITION.read(buffer); + final Position3f offset = BedrockTypes.POSITION_3F.read(buffer); + final float rotation = BedrockTypes.FLOAT_LE.read(buffer); + final float rotationLimit = BedrockTypes.FLOAT_LE.read(buffer); + final PassengerOfBlockArguments_EmoteType emote = PassengerOfBlockArguments_EmoteType.getByValue(buffer.readByte()); return new PassengerOfBlocks(position, offset, rotation, rotationLimit, emote); }