From ee87e1c6ec908e2ea005cf97ee15b740cf4e2da1 Mon Sep 17 00:00:00 2001 From: FateJH Date: Wed, 30 Nov 2016 08:38:20 -0500 Subject: [PATCH] variable field at head of weapon data accounted for; encoding and decoding of weapon data should work now --- .../packet/game/ObjectCreateMessage.scala | 46 +++++++++++-------- common/src/test/scala/GamePacketTest.scala | 13 +++++- 2 files changed, 39 insertions(+), 20 deletions(-) diff --git a/common/src/main/scala/net/psforever/packet/game/ObjectCreateMessage.scala b/common/src/main/scala/net/psforever/packet/game/ObjectCreateMessage.scala index c7ecaa1e9..19119ff08 100644 --- a/common/src/main/scala/net/psforever/packet/game/ObjectCreateMessage.scala +++ b/common/src/main/scala/net/psforever/packet/game/ObjectCreateMessage.scala @@ -15,45 +15,48 @@ case class AmmoBoxData(magazine : Int) extends ConstructorData object AmmoBoxData extends Marshallable[AmmoBoxData] { implicit val codec : Codec[AmmoBoxData] = ( - ("code" | uintL(23)) :: + uintL(8) :: + ignore(15) :: ("magazine" | uint16L) ).exmap[AmmoBoxData] ( { - case 0xC8 :: mag :: HNil => + case 0xC8 :: _ :: mag :: HNil => Attempt.successful(AmmoBoxData(mag)) - case x :: _ :: HNil => + case x :: _ :: _ :: HNil => Attempt.failure(Err("code wrong - looking for 200, found "+x)) }, { case AmmoBoxData(mag) => - Attempt.successful(0xC8 :: mag :: HNil) + Attempt.successful(0xC8 :: () :: mag :: HNil) } ).as[AmmoBoxData] } -case class WeaponData(ammo : InternalMold) extends ConstructorData +case class WeaponData(unk : Int, + ammo : InternalMold) extends ConstructorData object WeaponData extends Marshallable[WeaponData] { - type rawPattern = Int :: Unit :: Int :: Unit :: Int :: InternalMold :: HNil + def apply(unk : Int, cls : Int, guid : PlanetSideGUID, parentSlot : Int, ammo : AmmoBoxData) : WeaponData = + new WeaponData(unk, InternalMold(cls, guid, parentSlot, Some(ammo))) + implicit val codec : Codec[WeaponData] = ( - ("code" | uint16L) :: - ignore(12) :: + ("unk" | uint4L) :: + uint4L :: + ignore(20) :: uint4L :: ignore(16) :: - ("tail" | uintL(11)) :: - ("data" | InternalMold.codec) + uintL(11) :: + InternalMold.codec ).exmap[WeaponData] ( { - case 0x48 :: _ :: 2 :: _ :: 0x2C0 :: ammo :: HNil => //TODO: this will work for decoding, but not for encoding - Attempt.successful(WeaponData(ammo)) - case 0x88 :: _ :: 2 :: _ :: 0x2C0 :: ammo :: HNil => - Attempt.successful(WeaponData(ammo)) - case x :: _ :: y :: _ :: z :: _ :: HNil => - Attempt.failure(Err("code wrong - looking for 136-2-704, found %d-%d-%d".format(x,y,z))) + case code :: 8 :: _ :: 2 :: _ :: 0x2C0 :: ammo :: HNil => + Attempt.successful(WeaponData(code, ammo)) + case _ :: x :: _ :: y :: _ :: z :: _ :: HNil => + Attempt.failure(Err("looking for 8-2-704 pattern, found %d-%d-%d".format(x,y,z))) }, { - case WeaponData(ammo) => - Attempt.successful(0x88 :: () :: 2 :: () :: 0x2C0 :: ammo :: HNil) //TODO: this will not work for encoding (see above) + case WeaponData(code, ammo) => + Attempt.successful(code :: 8 :: () :: 2 :: () :: 0x2C0 :: ammo :: HNil) } ).as[WeaponData] } @@ -177,6 +180,13 @@ object WeaponData extends Marshallable[WeaponData] { // ).as[CharacterData] //} +/** + * na + * @param objectClass na + * @param guid na + * @param parentSlot na + * @param obj na + */ case class InternalMold(objectClass : Int, guid : PlanetSideGUID, parentSlot : Int, diff --git a/common/src/test/scala/GamePacketTest.scala b/common/src/test/scala/GamePacketTest.scala index 292367c9d..90e9e8b43 100644 --- a/common/src/test/scala/GamePacketTest.scala +++ b/common/src/test/scala/GamePacketTest.scala @@ -145,8 +145,8 @@ class GamePacketTest extends Specification { } "ObjectCreateMessage" should { - val packet = hex"18 CF 13 00 00 BC 87 00 0A F0 16 C3 43 A1 30 90 00 02 C0 40 00 08 70 43 00 68 00 6F 00 72 00 64 00 54 00 52 00 82 65 1F F5 9E 80 80 00 00 00 00 00 3F FF C0 00 00 00 20 00 00 00 20 27 03 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FC CC 10 00 03 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 90 01 90 00 00 00 00 01 00 7E C8 00 C8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 C0 00 42 C5 46 86 C7 00 00 02 A0 00 00 12 60 78 70 65 5F 77 61 72 70 5F 67 61 74 65 5F 75 73 61 67 65 92 78 70 65 5F 69 6E 73 74 61 6E 74 5F 61 63 74 69 6F 6E 92 78 70 65 5F 73 61 6E 63 74 75 61 72 79 5F 68 65 6C 70 91 78 70 65 5F 62 61 74 74 6C 65 5F 72 61 6E 6B 5F 32 8E 78 70 65 5F 66 6F 72 6D 5F 73 71 75 61 64 8E 78 70 65 5F 74 68 5F 6E 6F 6E 73 61 6E 63 8B 78 70 65 5F 74 68 5F 61 6D 6D 6F 90 78 70 65 5F 74 68 5F 66 69 72 65 6D 6F 64 65 73 8F 75 73 65 64 5F 63 68 61 69 6E 62 6C 61 64 65 9A 76 69 73 69 74 65 64 5F 62 72 6F 61 64 63 61 73 74 5F 77 61 72 70 67 61 74 65 8E 76 69 73 69 74 65 64 5F 6C 6F 63 6B 65 72 8D 75 73 65 64 5F 70 75 6E 69 73 68 65 72 88 75 73 65 64 5F 72 65 6B 8D 75 73 65 64 5F 72 65 70 65 61 74 65 72 9F 76 69 73 69 74 65 64 5F 64 65 63 6F 6E 73 74 72 75 63 74 69 6F 6E 5F 74 65 72 6D 69 6E 61 6C 8F 75 73 65 64 5F 73 75 70 70 72 65 73 73 6F 72 96 76 69 73 69 74 65 64 5F 6F 72 64 65 72 5F 74 65 72 6D 69 6E 61 6C 85 6D 61 70 31 35 85 6D 61 70 31 34 85 6D 61 70 31 32 85 6D 61 70 30 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 0A 36 13 88 04 00 40 00 00 10 00 04 00 00 4D 6E 40 10 41 00 00 00 40 00 18 08 38 1C C0 20 32 00 00 07 80 15 E1 D0 02 10 20 00 00 08 00 03 01 07 13 A8 04 06 40 00 00 10 03 20 BB 00 42 E4 00 00 01 00 0E 07 70 08 6C 80 00 06 40 01 C0 F0 01 13 90 00 00 C8 00 38 1E 40 23 32 00 00 19 00 07 03 D0 05 0E 40 00 03 20 00 E8 7B 00 A4 C8 00 00 64 00 DA 4F 80 14 E1 00 00 00 40 00 18 08 38 1F 40 20 32 00 00 0A 00 08 " - val packet2 = hex"18 F8 00 00 00 BC 8C 10 90 3B 45 C6 FA 94 00 9F F0 00 00 40 00 08 C0 44 00 69 00 66 00 66 00 45" //faked data? + val packet = hex"18 CF 13 00 00 BC 87 00 0A F0 16 C3 43 A1 30 90 00 02 C0 40 00 08 70 43 00 68 00 6F 00 72 00 64 00 54 00 52 00 82 65 1F F5 9E 80 80 00 00 00 00 00 3F FF C0 00 00 00 20 00 00 00 20 27 03 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FC CC 10 00 03 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 90 01 90 00 00 00 00 01 00 7E C8 00 C8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 C0 00 42 C5 46 86 C7 00 00 02 A0 00 00 12 60 78 70 65 5F 77 61 72 70 5F 67 61 74 65 5F 75 73 61 67 65 92 78 70 65 5F 69 6E 73 74 61 6E 74 5F 61 63 74 69 6F 6E 92 78 70 65 5F 73 61 6E 63 74 75 61 72 79 5F 68 65 6C 70 91 78 70 65 5F 62 61 74 74 6C 65 5F 72 61 6E 6B 5F 32 8E 78 70 65 5F 66 6F 72 6D 5F 73 71 75 61 64 8E 78 70 65 5F 74 68 5F 6E 6F 6E 73 61 6E 63 8B 78 70 65 5F 74 68 5F 61 6D 6D 6F 90 78 70 65 5F 74 68 5F 66 69 72 65 6D 6F 64 65 73 8F 75 73 65 64 5F 63 68 61 69 6E 62 6C 61 64 65 9A 76 69 73 69 74 65 64 5F 62 72 6F 61 64 63 61 73 74 5F 77 61 72 70 67 61 74 65 8E 76 69 73 69 74 65 64 5F 6C 6F 63 6B 65 72 8D 75 73 65 64 5F 70 75 6E 69 73 68 65 72 88 75 73 65 64 5F 72 65 6B 8D 75 73 65 64 5F 72 65 70 65 61 74 65 72 9F 76 69 73 69 74 65 64 5F 64 65 63 6F 6E 73 74 72 75 63 74 69 6F 6E 5F 74 65 72 6D 69 6E 61 6C 8F 75 73 65 64 5F 73 75 70 70 72 65 73 73 6F 72 96 76 69 73 69 74 65 64 5F 6F 72 64 65 72 5F 74 65 72 6D 69 6E 61 6C 85 6D 61 70 31 35 85 6D 61 70 31 34 85 6D 61 70 31 32 85 6D 61 70 30 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 0A 36 13 88 04 00 40 00 00 10 00 04 00 00 4D 6E 40 10 41 00 00 00 40 00 18 08 38 1C C0 20 32 00 00 07 80 15 E1 D0 02 10 20 00 00 08 00 03 01 07 13 A8 04 06 40 00 00 10 03 20 BB 00 42 E4 00 00 01 00 0E 07 70 08 6C 80 00 06 40 01 C0 F0 01 13 90 00 00 C8 00 38 1E 40 23 32 00 00 19 00 07 03 D0 05 0E 40 00 03 20 00 E8 7B 00 A4 C8 00 00 64 00 DA 4F 80 14 E1 00 00 00 40 00 18 08 38 1F 40 20 32 00 00 0A 00 08 " //fake data? + val packet2 = hex"18 F8 00 00 00 BC 8C 10 90 3B 45 C6 FA 94 00 9F F0 00 00 40 00 08 C0 44 00 69 00 66 00 66 00 45" //fake data val packet2Rest = packet2.bits.drop(8 + 32 + 1 + 11 + 16) val string_9mm = hex"18 7C000000 2580 0E0 0005 A1 C8000064000" val string_gauss = hex"18 DC000000 2580 2C9 B905 82 480000020000C04 1C00C0B0190000078000" @@ -193,6 +193,7 @@ class GamePacketTest extends Specification { parent.get.slot mustEqual 2 mold.isDefined mustEqual true val obj_wep = mold.get.asInstanceOf[WeaponData] + obj_wep.unk mustEqual 4 val obj_ammo = obj_wep.ammo//.asInstanceOf[InternalMold] obj_ammo.objectClass mustEqual 28 obj_ammo.guid mustEqual PlanetSideGUID(1286) @@ -219,6 +220,14 @@ class GamePacketTest extends Specification { pkt mustEqual string_9mm } + + "encode (gauss)" in { + val obj = Mold(345, WeaponData(4, 28, PlanetSideGUID(1286), 0, AmmoBoxData(30))) + val msg = ObjectCreateMessage(0, 345, PlanetSideGUID(1465), Some(ObjectCreateMessageParent(PlanetSideGUID(75), 2)), obj) + val pkt = PacketCoding.EncodePacket(msg).require.toByteVector + + pkt mustEqual string_gauss + } } "ChatMsg" should {