diff --git a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala index 1d1f4802..1242feb4 100644 --- a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala +++ b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala @@ -421,7 +421,7 @@ object GamePacketOpcode extends Enumeration { case 0x54 => noDecoder(HackMessage) case 0x55 => noDecoder(DroppodLaunchResponseMessage) case 0x56 => noDecoder(GenericObjectActionMessage) - case 0x57 => noDecoder(AvatarVehicleTimerMessage) + case 0x57 => game.AvatarVehicleTimerMessage.decode // 0x58 case 0x58 => game.AvatarImplantMessage.decode case 0x59 => noDecoder(UnknownMessage89) diff --git a/common/src/main/scala/net/psforever/packet/game/AvatarVehicleTimerMessage.scala b/common/src/main/scala/net/psforever/packet/game/AvatarVehicleTimerMessage.scala new file mode 100644 index 00000000..bf1cb4f4 --- /dev/null +++ b/common/src/main/scala/net/psforever/packet/game/AvatarVehicleTimerMessage.scala @@ -0,0 +1,31 @@ +// Copyright (c) 2017 PSForever +package net.psforever.packet.game + +import net.psforever.packet.{GamePacketOpcode, Marshallable, PacketHelpers, PlanetSideGamePacket} +import scodec.Codec +import scodec.codecs._ + +/** + * @param player_guid player guid ! + * @param text name of the item or vehicle name (ex : medkit, fury ...) + * @param time in seconds + * @param unk1 NA - Seems to be false when it's for medkit, true for vehicles + */ +final case class AvatarVehicleTimerMessage(player_guid : PlanetSideGUID, + text : String, + time : Long, + unk1 : Boolean + ) extends PlanetSideGamePacket { + type Packet = AvatarVehicleTimerMessage + def opcode = GamePacketOpcode.AvatarVehicleTimerMessage + def encode = AvatarVehicleTimerMessage.encode(this) +} + +object AvatarVehicleTimerMessage extends Marshallable[AvatarVehicleTimerMessage] { + implicit val codec : Codec[AvatarVehicleTimerMessage] = ( + ("player_guid" | PlanetSideGUID.codec) :: + ("text" | PacketHelpers.encodedString) :: + ("time" | uint32L) :: + ("unk1" | bool) + ).as[AvatarVehicleTimerMessage] +} \ No newline at end of file diff --git a/common/src/test/scala/game/AvatarVehicleTimerMessageTest.scala b/common/src/test/scala/game/AvatarVehicleTimerMessageTest.scala new file mode 100644 index 00000000..d6795270 --- /dev/null +++ b/common/src/test/scala/game/AvatarVehicleTimerMessageTest.scala @@ -0,0 +1,48 @@ +// Copyright (c) 2017 PSForever +package game + +import org.specs2.mutable._ +import net.psforever.packet._ +import net.psforever.packet.game._ +import scodec.bits._ + +class AvatarVehicleTimerMessageTest extends Specification { + val string = hex"57bd16866d65646b69740500000000" + val string2 = hex"57971b84667572794800000080" + + "decode medkit" in { + PacketCoding.DecodePacket(string).require match { + case AvatarVehicleTimerMessage(player_guid, text, time, u1) => + player_guid mustEqual PlanetSideGUID(5821) + text mustEqual "medkit" + time mustEqual 5 + u1 mustEqual false + case _ => + ko + } + } + "decode fury" in { + PacketCoding.DecodePacket(string2).require match { + case AvatarVehicleTimerMessage(player_guid, text, time, u1) => + player_guid mustEqual PlanetSideGUID(7063) + text mustEqual "fury" + time mustEqual 72 + u1 mustEqual true + case _ => + ko + } + } + + "encode medkit" in { + val msg = AvatarVehicleTimerMessage(PlanetSideGUID(5821),"medkit",5,false) + val pkt = PacketCoding.EncodePacket(msg).require.toByteVector + + pkt mustEqual string + } + "encode fury" in { + val msg = AvatarVehicleTimerMessage(PlanetSideGUID(7063),"fury",72,true) + val pkt = PacketCoding.EncodePacket(msg).require.toByteVector + + pkt mustEqual string2 + } +} \ No newline at end of file