From 3789bc2ae553a63621e205684c7312b4f4952861 Mon Sep 17 00:00:00 2001 From: FateJH Date: Wed, 14 Sep 2016 00:18:08 -0400 Subject: [PATCH] added FavoritesMessage packet and tests --- .../psforever/packet/GamePacketOpcode.scala | 2 +- .../packet/game/FavoritesMessage.scala | 38 ++++++++++++++ common/src/test/scala/GamePacketTest.scala | 49 +++++++++++++++++++ 3 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 common/src/main/scala/net/psforever/packet/game/FavoritesMessage.scala diff --git a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala index 6e9984e5..c9b7d65e 100644 --- a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala +++ b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala @@ -433,7 +433,7 @@ object GamePacketOpcode extends Enumeration { case 0x5f => noDecoder(FavoritesResponse) // OPCODES 0x60-6f - case 0x60 => noDecoder(FavoritesMessage) + case 0x60 => game.FavoritesMessage.decode case 0x61 => noDecoder(ObjectDetectedMessage) case 0x62 => noDecoder(SplashHitMessage) case 0x63 => noDecoder(SetChatFilterMessage) diff --git a/common/src/main/scala/net/psforever/packet/game/FavoritesMessage.scala b/common/src/main/scala/net/psforever/packet/game/FavoritesMessage.scala new file mode 100644 index 00000000..e9884672 --- /dev/null +++ b/common/src/main/scala/net/psforever/packet/game/FavoritesMessage.scala @@ -0,0 +1,38 @@ +// 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._ + +/** + * na + * @param list na + * @param player_guid the player + * @param line na + * @param subject na + * @param armor the type of exo-suit + * @param subtype the exo-suit subtype, if any + */ +final case class FavoritesMessage(list : Int, + player_guid : PlanetSideGUID, + line : Int, + subject : String, + armor : Option[Int] = None, + subtype : Option[Int] = None) + extends PlanetSideGamePacket { + type Packet = FavoritesMessage + def opcode = GamePacketOpcode.FavoritesMessage + def encode = FavoritesMessage.encode(this) +} + +object FavoritesMessage extends Marshallable[FavoritesMessage] { + implicit val codec : Codec[FavoritesMessage] = ( + ("list" | uintL(2)) >>:~ { value => + ("player_guid" | PlanetSideGUID.codec) :: + ("line" | uintL(4)) :: + ("subject" | PacketHelpers.encodedWideStringAligned(2)) :: + conditional(value == 0, "armor" | uintL(3)) :: + conditional(value == 0, "subtype" | uintL(3)) + }).as[FavoritesMessage] +} diff --git a/common/src/test/scala/GamePacketTest.scala b/common/src/test/scala/GamePacketTest.scala index 2f7e8a11..58760ff4 100644 --- a/common/src/test/scala/GamePacketTest.scala +++ b/common/src/test/scala/GamePacketTest.scala @@ -850,6 +850,55 @@ class GamePacketTest extends Specification { } } + "FavoritesMessage" should { + val stringVehicles = hex"60 5C 84 02 20 5300 6B00 7900 6700 7500 6100 7200 6400" + val stringInfantry = hex"60 2C 03 82 34 4100 6700 6900 6C00 6500 2000 2800 6200 6100 7300 6900 6300 2900 20" + + "decode (for infantry)" in { + PacketCoding.DecodePacket(stringInfantry).require match { + case FavoritesMessage(list, player_guid, line, subject, armor, subtype) => + list mustEqual 0 + player_guid mustEqual PlanetSideGUID(3760) + line mustEqual 0 + subject mustEqual "Agile (basic)" + armor.isDefined mustEqual true + armor.get mustEqual 1 + subtype.isDefined mustEqual true + subtype.get mustEqual 0 + case default => + ko + } + } + + "encode (for infantry)" in { + val msg = FavoritesMessage(0, PlanetSideGUID(3760), 0, "Agile (basic)", Option(1), Option(0)) + val pkt = PacketCoding.EncodePacket(msg).require.toByteVector + + pkt mustEqual stringInfantry + } + + "decode (for vehicles)" in { + PacketCoding.DecodePacket(stringVehicles).require match { + case FavoritesMessage(list, player_guid, line, subject, armor, subtype) => + list mustEqual 1 + player_guid mustEqual PlanetSideGUID(4210) + line mustEqual 0 + subject mustEqual "Skyguard" + armor.isDefined mustEqual false + subtype.isDefined mustEqual false + case default => + ko + } + } + + "encode (for vehicles)" in { + val msg = FavoritesMessage(1, PlanetSideGUID(4210), 0, "Skyguard") + val pkt = PacketCoding.EncodePacket(msg).require.toByteVector + + pkt mustEqual stringVehicles + } + } + "WeaponJammedMessage" should { val string = hex"66 4C00"