From 83264de081fd7ad6a50fa23c67344137d33b40e1 Mon Sep 17 00:00:00 2001 From: Chord Date: Sun, 14 Aug 2016 16:40:50 -0400 Subject: [PATCH] Packet: QuantityDeltaUpdateMessage (#57) --- .../psforever/packet/GamePacketOpcode.scala | 2 +- .../game/QuantityDeltaUpdateMessage.scala | 29 +++++++++++++++++++ common/src/test/scala/GamePacketTest.scala | 21 ++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 common/src/main/scala/net/psforever/packet/game/QuantityDeltaUpdateMessage.scala diff --git a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala index 461d42a0..a5bb0e2a 100644 --- a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala +++ b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala @@ -553,7 +553,7 @@ object GamePacketOpcode extends Enumeration { case VanuModuleUpdateMessage => noDecoder(opcode) case FacilityBenefitShieldChargeRequestMessage => noDecoder(opcode) case ProximityTerminalUseMessage => noDecoder(opcode) - case QuantityDeltaUpdateMessage => noDecoder(opcode) + case QuantityDeltaUpdateMessage => game.QuantityDeltaUpdateMessage.decode case ChainLashMessage => noDecoder(opcode) case ZoneInfoMessage => noDecoder(opcode) case LongRangeProjectileInfoMessage => noDecoder(opcode) diff --git a/common/src/main/scala/net/psforever/packet/game/QuantityDeltaUpdateMessage.scala b/common/src/main/scala/net/psforever/packet/game/QuantityDeltaUpdateMessage.scala new file mode 100644 index 00000000..02572924 --- /dev/null +++ b/common/src/main/scala/net/psforever/packet/game/QuantityDeltaUpdateMessage.scala @@ -0,0 +1,29 @@ +// Copyright (c) 2016 PSForever.net to present +package net.psforever.packet.game + +import net.psforever.packet.{GamePacketOpcode, Marshallable, PacketHelpers, PlanetSideGamePacket} +import scodec.Codec +import scodec.codecs._ + +/** + * Instructs client to update the quantity of an item based on a delta when sent server to client. + * + * See also [[QuantityUpdateMessage]] + * + * @param item_guid the item to update + * @param quantity_delta the change in quantity of the item + */ +final case class QuantityDeltaUpdateMessage(item_guid : PlanetSideGUID, + quantity_delta : Int) + extends PlanetSideGamePacket { + type Packet = QuantityDeltaUpdateMessage + def opcode = GamePacketOpcode.QuantityDeltaUpdateMessage + def encode = QuantityDeltaUpdateMessage.encode(this) +} + +object QuantityDeltaUpdateMessage extends Marshallable[QuantityDeltaUpdateMessage] { + implicit val codec : Codec[QuantityDeltaUpdateMessage] = ( + ("item_guid" | PlanetSideGUID.codec) :: + ("quantity_delta" | int32L) + ).as[QuantityDeltaUpdateMessage] +} diff --git a/common/src/test/scala/GamePacketTest.scala b/common/src/test/scala/GamePacketTest.scala index f813c789..1613637f 100644 --- a/common/src/test/scala/GamePacketTest.scala +++ b/common/src/test/scala/GamePacketTest.scala @@ -858,6 +858,27 @@ class GamePacketTest extends Specification { } } + "QuantityDeltaUpdateMessage" should { + val string = hex"C4 5300 FBFFFFFF" + + "decode" in { + PacketCoding.DecodePacket(string).require match { + case QuantityDeltaUpdateMessage(item_guid, quantity) => + item_guid mustEqual PlanetSideGUID(83) + quantity mustEqual -5 + case default => + ko + } + } + + "encode" in { + val msg = QuantityDeltaUpdateMessage(PlanetSideGUID(83), -5) + val pkt = PacketCoding.EncodePacket(msg).require.toByteVector + + pkt mustEqual string + } + } + "PingMsg" should { val packet = hex"1a 00000000 b0360000"