From f2c486d6f6ef8dca391cc221eca7c8f5b9bb29ca Mon Sep 17 00:00:00 2001 From: Fate-JH Date: Sat, 2 Mar 2024 23:08:59 -0500 Subject: [PATCH] initial debug draw packet; data for the tests are entirely fabricated as we have no instances of this packet in the wild (#1170) --- .../psforever/packet/GamePacketOpcode.scala | 2 +- .../packet/game/DebugDrawMessage.scala | 32 +++++++++++++++++ .../scala/game/DebugDrawMessageTest.scala | 36 +++++++++++++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 src/main/scala/net/psforever/packet/game/DebugDrawMessage.scala create mode 100644 src/test/scala/game/DebugDrawMessageTest.scala diff --git a/src/main/scala/net/psforever/packet/GamePacketOpcode.scala b/src/main/scala/net/psforever/packet/GamePacketOpcode.scala index a2beebc0..384458bc 100644 --- a/src/main/scala/net/psforever/packet/GamePacketOpcode.scala +++ b/src/main/scala/net/psforever/packet/GamePacketOpcode.scala @@ -487,7 +487,7 @@ object GamePacketOpcode extends Enumeration { case 0x99 => noDecoder(EmpireIncentivesMessage) case 0x9a => game.InvalidTerrainMessage.decode case 0x9b => noDecoder(SyncMessage) - case 0x9c => noDecoder(DebugDrawMessage) + case 0x9c => game.DebugDrawMessage.decode case 0x9d => noDecoder(SoulMarkMessage) case 0x9e => noDecoder(UplinkPositionEvent) case 0x9f => game.HotSpotUpdateMessage.decode diff --git a/src/main/scala/net/psforever/packet/game/DebugDrawMessage.scala b/src/main/scala/net/psforever/packet/game/DebugDrawMessage.scala new file mode 100644 index 00000000..309ec88e --- /dev/null +++ b/src/main/scala/net/psforever/packet/game/DebugDrawMessage.scala @@ -0,0 +1,32 @@ +// Copyright (c) 2024 PSForever +package net.psforever.packet.game + +import net.psforever.packet.GamePacketOpcode.Type +import net.psforever.packet.{GamePacketOpcode, Marshallable, PlanetSideGamePacket} +import net.psforever.types.Vector3 +import scodec.bits.BitVector +import scodec.{Attempt, Codec} +import scodec.codecs._ + +final case class DebugDrawMessage( + unk1: Int, + unk2: Long, + unk3: Long, + unk4: Long, + unk5: List[Vector3] + ) + extends PlanetSideGamePacket { + type Packet = DebugDrawMessage + def opcode: Type = GamePacketOpcode.DebugDrawMessage + def encode: Attempt[BitVector] = DebugDrawMessage.encode(this) +} + +object DebugDrawMessage extends Marshallable[DebugDrawMessage] { + implicit val codec: Codec[DebugDrawMessage] = ( + ("unk1" | uint(bits = 3)) :: + ("unk2" | ulongL(bits = 32)) :: + ("unk3" | ulongL(bits = 32)) :: + ("unk4" | ulongL(bits = 32)) :: + ("unk5" | listOfN(uint2, Vector3.codec_pos)) + ).as[DebugDrawMessage] +} diff --git a/src/test/scala/game/DebugDrawMessageTest.scala b/src/test/scala/game/DebugDrawMessageTest.scala new file mode 100644 index 00000000..c554ef95 --- /dev/null +++ b/src/test/scala/game/DebugDrawMessageTest.scala @@ -0,0 +1,36 @@ +// Copyright (c) 2024 PSForever +package game + +import net.psforever.packet.PacketCoding +import net.psforever.packet.game.DebugDrawMessage +import net.psforever.types.Vector3 +import org.specs2.mutable.Specification +import scodec.bits._ + +class DebugDrawMessageTest extends Specification { + val string = hex"9c2040000000600000008000001c0010000186000800c8000f04008807d00016080578" + + "decode" in { + PacketCoding.decodePacket(string).require match { + case DebugDrawMessage(u1, u2, u3, u4, u5) => + u1 mustEqual 1 + u2 mustEqual 2L + u3 mustEqual 3L + u4 mustEqual 4L + u5 mustEqual List( + Vector3(5,6,7), + Vector3(50,60,70), + Vector3(500,600,700) + ) + case _ => + ko + } + } + + "encode" in { + val msg = DebugDrawMessage(1, 2L, 3L, 4L, List(Vector3(5,6,7), Vector3(50,60,70), Vector3(500,600,700))) + val pkt = PacketCoding.encodePacket(msg).require.toByteVector + + pkt mustEqual string + } +}