From 1e7c0123a4da48c3b0e974cbb247997356486625 Mon Sep 17 00:00:00 2001 From: Resaec Date: Sun, 28 Apr 2024 20:15:49 +0200 Subject: [PATCH] Improve Outfit packets --- .../packet/game/OutfitMemberEvent.scala | 36 +++++----- .../packet/game/OutfitMemberUpdate.scala | 4 +- .../scala/game/OutfitMemberEventTest.scala | 68 ++++++++++++------- 3 files changed, 63 insertions(+), 45 deletions(-) diff --git a/src/main/scala/net/psforever/packet/game/OutfitMemberEvent.scala b/src/main/scala/net/psforever/packet/game/OutfitMemberEvent.scala index d3c33c4bd..09e9bb9ca 100644 --- a/src/main/scala/net/psforever/packet/game/OutfitMemberEvent.scala +++ b/src/main/scala/net/psforever/packet/game/OutfitMemberEvent.scala @@ -13,15 +13,15 @@ final case class OutfitMemberEvent( unk1: Int, unk2: Int, unk3: Int, + unk4: Int, + unk5: Int, + unk6: Int, member_name: String, unk7: Int, unk8: Int, unk9: Int, unk10: Int, - unk12: Int, - unk13: Int, - unk14: Int, - unk15: Int, + unk11: Int, ) extends PlanetSideGamePacket { type Packet = OutfitMemberEvent def opcode = GamePacketOpcode.OutfitMemberEvent @@ -32,26 +32,26 @@ object OutfitMemberEvent extends Marshallable[OutfitMemberEvent] { implicit val codec: Codec[OutfitMemberEvent] = ( ("unk00" | uintL(2)) :: ("outfit_id" | PlanetSideGUID.codec) :: - ("unk1" | uint16L) :: - ("unk2" | uint16L) :: - ("unk3" | uint16L) :: + ("unk1" | uint8L) :: + ("unk2" | uint8L) :: + ("unk3" | uint8L) :: + ("unk4" | uint8L) :: + ("unk5" | uint8L) :: + ("unk6" | uint8L) :: ("member_name" | PacketHelpers.encodedWideStringAligned(6)) :: - ("unk7" | uint8L) :: - ("unk8" | uint8L) :: + ("unk7" | uint16L) :: + ("unk8" | uint16L) :: ("unk9" | uint16L) :: - ("unk10" | uint8L) :: - ("unk12" | uint8L) :: - ("unk13" | uint8L) :: - ("unk14" | uint8L) :: - ("unk15" | uint8L) + ("unk10" | uint16L) :: + ("unk11" | uint8L) ).xmap[OutfitMemberEvent]( { - case unk00 :: outfit_id :: u1 :: u2 :: u3 :: member_name :: u7 :: u8 :: u9 :: u10 :: u12 :: u13 :: u14 :: u15 :: HNil => - OutfitMemberEvent(unk00, outfit_id, u1, u2, u3, member_name, u7, u8, u9, u10, u12, u13, u14, u15) + case unk00 :: outfit_id :: u1 :: u2 :: u3 :: u4 :: u5 :: u6 :: member_name :: u7 :: u8 :: u9 :: u10 :: u11 :: HNil => + OutfitMemberEvent(unk00, outfit_id, u1, u2, u3, u4, u5, u6, member_name, u7, u8, u9, u10, u11) }, { - case OutfitMemberEvent(unk00, outfit_id, u1, u2, u3, member_name, u7, u8, u9, u10, u12, u13, u14, u15) => - unk00 :: outfit_id :: u1 :: u2 :: u3 :: member_name :: u7 :: u8 :: u9 :: u10 :: u12 :: u13 :: u14 :: u15 :: HNil + case OutfitMemberEvent(unk00, outfit_id, u1, u2, u3, u4, u5, u6, member_name, u7, u8, u9, u10, u11) => + unk00 :: outfit_id :: u1 :: u2 :: u3 :: u4 :: u5 :: u6 :: member_name :: u7 :: u8 :: u9 :: u10 :: u11 :: HNil } ) } diff --git a/src/main/scala/net/psforever/packet/game/OutfitMemberUpdate.scala b/src/main/scala/net/psforever/packet/game/OutfitMemberUpdate.scala index 8b28406ad..10f33d0f5 100644 --- a/src/main/scala/net/psforever/packet/game/OutfitMemberUpdate.scala +++ b/src/main/scala/net/psforever/packet/game/OutfitMemberUpdate.scala @@ -10,7 +10,7 @@ import shapeless.{::, HNil} final case class OutfitMemberUpdate( outfit_guid: PlanetSideGUID, unk1: Int, - unk2: Int, + avatar_guid: PlanetSideGUID, unk3: Int, ) extends PlanetSideGamePacket { type Packet = OutfitMemberUpdate @@ -22,7 +22,7 @@ object OutfitMemberUpdate extends Marshallable[OutfitMemberUpdate] { implicit val codec: Codec[OutfitMemberUpdate] = ( ("outfit_guid" | PlanetSideGUID.codec) :: ("unk1" | uint16L) :: - ("unk2" | uint16L) :: + ("avatar_guid" | PlanetSideGUID.codec) :: ("unk3" | uint8L) ).xmap[OutfitMemberUpdate]( { diff --git a/src/test/scala/game/OutfitMemberEventTest.scala b/src/test/scala/game/OutfitMemberEventTest.scala index a4a27c8e7..78e747d30 100644 --- a/src/test/scala/game/OutfitMemberEventTest.scala +++ b/src/test/scala/game/OutfitMemberEventTest.scala @@ -10,25 +10,43 @@ import scodec.bits._ class OutfitMemberEventTest extends Specification { - //val unk0_ABC: ByteVector = hex"90 3518 4000 1a4e 4100 2 180 450078007000650072007400 8483 07e0 119d bfe0 70" // 0x90048640001030c28022404c0061007a00650072003100390038003200f43a45e00b4c604010 -val unk0_ABC: ByteVector = hex"90 048640001030c28022404c0061007a00650072003100390038003200f43a45e00b4c604010" + //val unk0_ABC: ByteVector = hex"90 3518 4000 1a4e 4100 2 180 450078007000650072007400 8483 07e0 119d bfe0 70" // 0x90048640001030c28022404c0061007a00650072003100390038003200f43a45e00b4c604010 +val unk0_ABC_Lazer: ByteVector = hex"90 048640001030c28022404c0061007a00650072003100390038003200f43a45e00b4c604010" + + val OpolE = hex"90 0 4864 0003 aad6 280a 14 0 4f0070006f006c004500 c9a1 80e0 0d03 2040 10" + val Billy = hex"90 0 4864 0003 a41a 280a 20 0 620069006c006c007900320035003600 935f 6000 186a b040 50" + val Lazer = hex"90 0 4864 0001 030c 2802 24 0 4c0061007a00650072003100390038003200 e6dc 25a0 153e 6040 10" + val Virus = hex"90 0 4864 0002 1b64 4c02 28 0 5600690072007500730047006900760065007200 2f89 0080 0000 0000 10" + val PvtPa = hex"90 0 4864 0000 1e69 e80a 2c 0 500076007400500061006e00630061006b0065007300 705e a080 0a85 e060 10" + val Night = hex"90 0 4864 0002 4cf0 3802 28 0 4e006900670068007400770069006e0067003100 b8fb 9a40 0da6 ec80 50" + + /* + OutfitMemberEvent(0, ValidPlanetSideGUID(6418), 0, 0, 64, 195, 10, 0, Lazer1982, 230, 220, 37, 160, 21, 62, 96, 64, 16, BitVector(empty)) + OutfitMemberEvent(0, ValidPlanetSideGUID(6418), 0, 0, 7, 154, 122, 2, PvtPancakes, 112, 94, 160, 128, 10, 133, 224, 96, 16, BitVector(empty)) + OutfitMemberEvent(0, ValidPlanetSideGUID(6418), 0, 0, 134, 217, 19, 0, VirusGiver, 47, 137, 0, 128, 0, 0, 0, 0, 16, BitVector(empty)) + OutfitMemberEvent(0, ValidPlanetSideGUID(6418), 0, 0, 234, 181, 138, 2, OpolE, 201, 161, 128, 224, 13, 3, 32, 64, 16, BitVector(empty)) + OutfitMemberEvent(0, ValidPlanetSideGUID(6418), 0, 0, 233, 6, 138, 2, billy256, 147, 95, 96, 0, 24, 106, 176, 64, 80, BitVector(empty)) + + + */ + "decode Unk0 ABC" in { - PacketCoding.decodePacket(unk0_ABC).require match { - case OutfitMemberEvent(unk00, outfit_guid, unk1, unk2, unk3, member_name, unk7, unk8, unk9, unk10, unk12, unk13, unk14, unk15) => + PacketCoding.decodePacket(unk0_ABC_Lazer).require match { + case OutfitMemberEvent(unk00, outfit_guid, unk1, unk2, unk3, unk4, unk5, unk6, member_name, unk7, unk8, unk9, unk10, unk11) => unk00 mustEqual 0 outfit_guid mustEqual PlanetSideGUID(6418) unk1 mustEqual 0 - unk2 mustEqual 49984 - unk3 mustEqual 10 + unk2 mustEqual 0 + unk3 mustEqual 64 + unk4 mustEqual 195 + unk5 mustEqual 10 + unk6 mustEqual 0 member_name mustEqual "Lazer1982" - unk7 mustEqual 244 - unk8 mustEqual 58 - unk9 mustEqual 57413 - unk10 mustEqual 11 - unk12 mustEqual 76 - unk13 mustEqual 96 - unk14 mustEqual 64 - unk15 mustEqual 16 + unk7 mustEqual 15092 + unk8 mustEqual 57413 + unk9 mustEqual 19467 + unk10 mustEqual 16480 + unk11 mustEqual 16 case _ => ko } @@ -39,20 +57,20 @@ val unk0_ABC: ByteVector = hex"90 048640001030c28022404c0061007a0065007200310039 unk00 = 0, outfit_id = PlanetSideGUID(6418), unk1 = 0, - unk2 = 49984, - unk3 = 10, + unk2 = 0, + unk3 = 64, + unk4 = 195, + unk5 = 10, + unk6 = 0, member_name = "Lazer1982", - unk7 = 244, - unk8 = 58, - unk9 = 57413, - unk10 = 11, - unk12 = 76, - unk13 = 96, - unk14 = 64, - unk15 = 16, + unk7 = 15092, + unk8 = 57413, + unk9 = 19467, + unk10 = 16480, + unk11 = 16, ) val pkt = PacketCoding.encodePacket(msg).require.toByteVector - pkt mustEqual unk0_ABC + pkt mustEqual unk0_ABC_Lazer } }