From cb0320a471bf3dd8c482ba3a8fe41b55a13266dd Mon Sep 17 00:00:00 2001 From: yuzumika Date: Wed, 3 Jan 2024 16:10:23 -0800 Subject: [PATCH 1/3] NPCMoreTalkHandler: don't underflow selection --- .../java/net/server/channel/handlers/NPCMoreTalkHandler.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/net/server/channel/handlers/NPCMoreTalkHandler.java b/src/main/java/net/server/channel/handlers/NPCMoreTalkHandler.java index 0dc04cd8a0..fa7c0a09e7 100644 --- a/src/main/java/net/server/channel/handlers/NPCMoreTalkHandler.java +++ b/src/main/java/net/server/channel/handlers/NPCMoreTalkHandler.java @@ -60,6 +60,11 @@ public final class NPCMoreTalkHandler extends AbstractPacketHandler { selection = p.readInt(); } else if (p.available() > 0) { selection = p.readByte(); + // If there are more than 127 choices, don't underflow to -128. + // This is useful if you want to have more than 127 hairs/faces at a stylist NPC. + if (selection < 0) { + selection += 256; + } } if (c.getQM() != null) { if (c.getQM().isStart()) { From 5a4200cc8e45181250e39ff6dc7f0f762c1efa68 Mon Sep 17 00:00:00 2001 From: yuzumika Date: Thu, 4 Jan 2024 10:55:07 -0800 Subject: [PATCH 2/3] implement ByteBufInPacket.readUnsignedByte --- src/main/java/net/packet/ByteBufInPacket.java | 2 ++ src/main/java/net/packet/InPacket.java | 1 + .../net/server/channel/handlers/NPCMoreTalkHandler.java | 7 +------ 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/packet/ByteBufInPacket.java b/src/main/java/net/packet/ByteBufInPacket.java index 19dfdfffc0..e79326f7c6 100644 --- a/src/main/java/net/packet/ByteBufInPacket.java +++ b/src/main/java/net/packet/ByteBufInPacket.java @@ -22,6 +22,8 @@ public class ByteBufInPacket implements InPacket { public byte readByte() { return byteBuf.readByte(); } + @Override + public short readUnsignedByte() { return byteBuf.readUnsignedByte(); } @Override public short readShort() { diff --git a/src/main/java/net/packet/InPacket.java b/src/main/java/net/packet/InPacket.java index 37e5280899..e21e15a44a 100644 --- a/src/main/java/net/packet/InPacket.java +++ b/src/main/java/net/packet/InPacket.java @@ -4,6 +4,7 @@ import java.awt.*; public interface InPacket extends Packet { byte readByte(); + short readUnsignedByte(); short readShort(); int readInt(); long readLong(); diff --git a/src/main/java/net/server/channel/handlers/NPCMoreTalkHandler.java b/src/main/java/net/server/channel/handlers/NPCMoreTalkHandler.java index fa7c0a09e7..e39b1676e4 100644 --- a/src/main/java/net/server/channel/handlers/NPCMoreTalkHandler.java +++ b/src/main/java/net/server/channel/handlers/NPCMoreTalkHandler.java @@ -59,12 +59,7 @@ public final class NPCMoreTalkHandler extends AbstractPacketHandler { if (p.available() >= 4) { selection = p.readInt(); } else if (p.available() > 0) { - selection = p.readByte(); - // If there are more than 127 choices, don't underflow to -128. - // This is useful if you want to have more than 127 hairs/faces at a stylist NPC. - if (selection < 0) { - selection += 256; - } + selection = p.readUnsignedByte(); } if (c.getQM() != null) { if (c.getQM().isStart()) { From 738e1b24e620c6be326414ed2a10a6679c1970a4 Mon Sep 17 00:00:00 2001 From: yuzumika Date: Thu, 4 Jan 2024 13:42:20 -0800 Subject: [PATCH 3/3] add unit tests for ByteBufInPacketTest.readUnsignedByte --- .../java/net/packet/ByteBufInPacketTest.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/test/java/net/packet/ByteBufInPacketTest.java b/src/test/java/net/packet/ByteBufInPacketTest.java index 3a27dd795a..6837ecfe1c 100644 --- a/src/test/java/net/packet/ByteBufInPacketTest.java +++ b/src/test/java/net/packet/ByteBufInPacketTest.java @@ -38,6 +38,36 @@ class ByteBufInPacketTest { assertEquals(writtenByte, readByte); } + @Test + void readUnsignedByte() { + final byte writtenByte = Byte.MAX_VALUE; + byteBuf.writeByte(writtenByte); + + short readUnsignedByte = inPacket.readUnsignedByte(); + + assertEquals(writtenByte, readUnsignedByte); + } + + @Test + void readUnsignedByte_shouldBeNonnegative() { + final byte writtenByte = Byte.MIN_VALUE; + byteBuf.writeByte(writtenByte); + + short readUnsignedByte = inPacket.readUnsignedByte(); + + assertEquals((short)writtenByte + 256, readUnsignedByte); + } + + @Test + void readUnsignedByte_shouldBeNonnegative2() { + final byte writtenByte = -1; + byteBuf.writeByte(writtenByte); + + short readUnsignedByte = inPacket.readUnsignedByte(); + + assertEquals((short)writtenByte + 256, readUnsignedByte); + } + @Test void readShort() { final short writtenShort = 12_345;