From aebf72de902c86ae2379fe2bef60932a46b1e1a7 Mon Sep 17 00:00:00 2001 From: Tyreece Rozycki <57762380+KrystilizeNevaDies@users.noreply.github.com> Date: Sun, 29 Jan 2023 22:05:28 +1000 Subject: [PATCH] Correctly send the player's main hand setting. (#1724) * Update Player.java * Use setNotifyAboutChanges and add integration test --- .../net/minestom/server/entity/Player.java | 3 ++ .../entity/player/PlayerIntegrationTest.java | 32 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/src/main/java/net/minestom/server/entity/Player.java b/src/main/java/net/minestom/server/entity/Player.java index 930c173ea..e7261e24e 100644 --- a/src/main/java/net/minestom/server/entity/Player.java +++ b/src/main/java/net/minestom/server/entity/Player.java @@ -2204,7 +2204,10 @@ public class Player extends LivingEntity implements CommandSender, Localizable, this.allowServerListings = allowServerListings; // TODO: Use the metadata object here + metadata.setNotifyAboutChanges(false); metadata.setIndex((byte) 17, Metadata.Byte(displayedSkinParts)); + metadata.setIndex((byte) 18, Metadata.Byte((byte) (this.mainHand == MainHand.RIGHT ? 1 : 0))); + metadata.setNotifyAboutChanges(true); } } diff --git a/src/test/java/net/minestom/server/entity/player/PlayerIntegrationTest.java b/src/test/java/net/minestom/server/entity/player/PlayerIntegrationTest.java index 59ddf8a94..c9e3ddbe3 100644 --- a/src/test/java/net/minestom/server/entity/player/PlayerIntegrationTest.java +++ b/src/test/java/net/minestom/server/entity/player/PlayerIntegrationTest.java @@ -1,5 +1,7 @@ package net.minestom.server.entity.player; +import net.minestom.server.message.ChatMessageType; +import net.minestom.server.network.packet.client.play.ClientSettingsPacket; import net.minestom.testing.Collector; import net.minestom.testing.Env; import net.minestom.testing.EnvTest; @@ -45,6 +47,36 @@ public class PlayerIntegrationTest { assertAbilities(player, false, false, false, false); } + @Test + public void handSwapTest(Env env) { + ClientSettingsPacket packet = new ClientSettingsPacket("en_us", (byte) 16, ChatMessageType.FULL, + true, (byte) 127, Player.MainHand.LEFT, true, true); + + var instance = env.createFlatInstance(); + var connection = env.createConnection(); + var player = connection.connect(instance, new Pos(0, 42, 0)).join(); + assertEquals(instance, player.getInstance()); + env.tick(); + env.tick(); + + player.addPacketToQueue(packet); + var collector = connection.trackIncoming(); + env.tick(); + env.tick(); + assertEquals(Player.MainHand.LEFT, player.getSettings().getMainHand()); + + boolean found = false; + for (ServerPacket serverPacket : collector.collect()) { + if (!(serverPacket instanceof EntityMetaDataPacket metaDataPacket)) { + continue; + } + assertEquals((byte) 0, metaDataPacket.entries().get(18).value(), + "EntityMetaDataPacket has the incorrect hand after client settings update."); + found = true; + } + Assertions.assertTrue(found, "EntityMetaDataPacket not sent after client settings update."); + } + private void assertAbilities(Player player, boolean isInvulnerable, boolean isFlying, boolean isAllowFlying, boolean isInstantBreak) { assertEquals(isInvulnerable, player.isInvulnerable());