Correctly send the player's main hand setting. (#1724)

* Update Player.java

* Use setNotifyAboutChanges and add integration test
This commit is contained in:
Tyreece Rozycki 2023-01-29 22:05:28 +10:00 committed by GitHub
parent 51ef4779c9
commit aebf72de90
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 35 additions and 0 deletions

View File

@ -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);
}
}

View File

@ -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());