diff --git a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala index cad22888..a2f773f0 100644 --- a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala +++ b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala @@ -510,7 +510,7 @@ object GamePacketOpcode extends Enumeration { // OPCODES 0xa0-af case 0xa0 => game.BuildingInfoUpdateMessage.decode - case 0xa1 => noDecoder(FireHintMessage) + case 0xa1 => game.FireHintMessage.decode case 0xa2 => noDecoder(UplinkRequest) case 0xa3 => noDecoder(UplinkResponse) case 0xa4 => game.WarpgateRequest.decode diff --git a/common/src/main/scala/net/psforever/packet/game/FireHintMessage.scala b/common/src/main/scala/net/psforever/packet/game/FireHintMessage.scala new file mode 100644 index 00000000..53bbd519 --- /dev/null +++ b/common/src/main/scala/net/psforever/packet/game/FireHintMessage.scala @@ -0,0 +1,44 @@ +// Copyright (c) 2017 PSForever +package net.psforever.packet.game + +import net.psforever.packet.{GamePacketOpcode, Marshallable, PacketHelpers, PlanetSideGamePacket} +import net.psforever.types.Vector3 +import scodec.Codec +import scodec.codecs._ + +/** + * not sure for u1 / u2 / u3, maybe need a real brain ... + * @param weapon_guid na + * @param pos na; pos of what ?! + * @param u1 na + * @param u2 na + * @param u3 na + * @param u4 na + * @param u5 na; vel of what ?! + */ + +final case class FireHintMessage(weapon_guid : PlanetSideGUID, + pos : Vector3, + u1 : Int, + u2 : Int, + u3 : Int, + u4 : Int, + u5 : Option[Vector3] = None) + extends PlanetSideGamePacket { + type Packet = FireHintMessage + def opcode = GamePacketOpcode.FireHintMessage + def encode = FireHintMessage.encode(this) +} + +object FireHintMessage extends Marshallable[FireHintMessage] { + + implicit val codec : Codec[FireHintMessage] = ( + ("weapon_guid" | PlanetSideGUID.codec) :: + ("pos" | Vector3.codec_pos) :: + ("u1" | uint16L) :: + ("u2" | uint16L) :: + ("u3" | uint16L) :: + ("u4" | uintL(3)) :: + optional(bool, "u5" | Vector3.codec_vel) + ).as[FireHintMessage] +} diff --git a/common/src/test/scala/game/FireHintMessageTest.scala b/common/src/test/scala/game/FireHintMessageTest.scala new file mode 100644 index 00000000..26dbb085 --- /dev/null +++ b/common/src/test/scala/game/FireHintMessageTest.scala @@ -0,0 +1,55 @@ +// Copyright (c) 2017 PSForever +package game + +import org.specs2.mutable._ +import net.psforever.packet._ +import net.psforever.packet.game._ +import net.psforever.types.Vector3 +import scodec.bits._ + +class FireHintMessageTest extends Specification { + val string = hex"a1 0117 23cd63f1d7480d 000077ff9d1d00" + val string2 = hex"a1 080e 65af5705074411 0000cffee0fc7b08899f5580" + + "decode" in { + PacketCoding.DecodePacket(string).require match { + case FireHintMessage(guid1, pos, guid2, guid3, guid4, unk1,u2) => + guid1 mustEqual PlanetSideGUID(5889) + pos mustEqual Vector3(3482.2734f,3642.4922f,53.125f) + guid2 mustEqual 0 + guid3 mustEqual 65399 + guid4 mustEqual 7581 + unk1 mustEqual 0 + u2 mustEqual None + case _ => + ko + } + } + "decode string2" in { + PacketCoding.DecodePacket(string2).require match { + case FireHintMessage(guid1, pos, guid2, guid3, guid4, unk1,u2) => + guid1 mustEqual PlanetSideGUID(3592) + pos mustEqual Vector3(2910.789f,3744.875f,69.0625f) + guid2 mustEqual 0 + guid3 mustEqual 65231 + guid4 mustEqual 64736 + unk1 mustEqual 3 + u2 mustEqual Some(Vector3(21.5f,-6.8125f,2.65625f)) + case _ => + ko + } + } + + "encode" in { + val msg = FireHintMessage(PlanetSideGUID(5889), Vector3(3482.2734f,3642.4922f,53.125f), 0, 65399, 7581, 0) + val pkt = PacketCoding.EncodePacket(msg).require.toByteVector + + pkt mustEqual string + } + "encode string2" in { + val msg = FireHintMessage(PlanetSideGUID(3592), Vector3(2910.789f,3744.875f,69.0625f), 0, 65231, 64736, 3, Some(Vector3(21.5f,-6.8125f,2.65625f))) + val pkt = PacketCoding.EncodePacket(msg).require.toByteVector + + pkt mustEqual string2 + } +}