From b210df904aabf0c3aa18cf33b6dacf8fb94f5f22 Mon Sep 17 00:00:00 2001 From: Chord Date: Sat, 14 May 2016 15:38:34 -0400 Subject: [PATCH] Packet: ConnectToWorldRequestMessage --- .../psforever/packet/GamePacketOpcode.scala | 2 +- .../game/ConnectToWorldRequestMessage.scala | 31 +++++++++++++++++++ common/src/test/scala/GamePacketTest.scala | 25 +++++++++++++++ 3 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 common/src/main/scala/net/psforever/packet/game/ConnectToWorldRequestMessage.scala diff --git a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala index caacfe15..bf911d36 100644 --- a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala +++ b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala @@ -32,7 +32,7 @@ object GamePacketOpcode extends Enumeration { = Value def getPacketDecoder(opcode : GamePacketOpcode.Type) : (BitVector) => Attempt[DecodeResult[PlanetSideGamePacket]] = opcode match { - //case ConnectToWorldRequestMessage => game.ConnectToWorldRequestMessage.decode + case ConnectToWorldRequestMessage => game.ConnectToWorldRequestMessage.decode case ConnectToWorldMessage => game.ConnectToWorldMessage.decode case LoginMessage => game.LoginMessage.decode case LoginRespMessage => game.LoginRespMessage.decode diff --git a/common/src/main/scala/net/psforever/packet/game/ConnectToWorldRequestMessage.scala b/common/src/main/scala/net/psforever/packet/game/ConnectToWorldRequestMessage.scala new file mode 100644 index 00000000..802ec020 --- /dev/null +++ b/common/src/main/scala/net/psforever/packet/game/ConnectToWorldRequestMessage.scala @@ -0,0 +1,31 @@ +// Copyright (c) 2016 PSForever.net to present +package net.psforever.packet.game + +import net.psforever.packet.{GamePacketOpcode, Marshallable, PacketHelpers, PlanetSideGamePacket} +import scodec.Codec +import scodec.codecs._ + +// NOTE: this packet has a ton of bytes left over at the end and is usually all zeros +// except for the server name and a 0x80 near the end +final case class ConnectToWorldRequestMessage(server : String, + majorVersion : Long, + minorVersion : Long, + revision : Long, + buildDate : String, + unknown : Int) extends PlanetSideGamePacket { + type Packet = ConnectToWorldRequestMessage + def opcode = GamePacketOpcode.ConnectToWorldRequestMessage + def encode = ConnectToWorldRequestMessage.encode(this) +} + +object ConnectToWorldRequestMessage extends Marshallable[ConnectToWorldRequestMessage] { + implicit val codec : Codec[ConnectToWorldRequestMessage] = ( + ("server_name" | PacketHelpers.encodedString) :: + ("unknown" | ignore(32*8)) :: + ("major_version" | uint32L) :: + ("minor_version" | uint32L) :: + ("revision" | uint32L) :: + ("build_date" | PacketHelpers.encodedString) :: + ("unknown_short" | uint16L) + ).as[ConnectToWorldRequestMessage] +} \ No newline at end of file diff --git a/common/src/test/scala/GamePacketTest.scala b/common/src/test/scala/GamePacketTest.scala index ed3d0f0c..c6af18a3 100644 --- a/common/src/test/scala/GamePacketTest.scala +++ b/common/src/test/scala/GamePacketTest.scala @@ -10,6 +10,31 @@ class GamePacketTest extends Specification { "PlanetSide game packet" in { + "ConnectToWorldRequestMessage" should { + val string = hex"03 8667656D696E69 0000000000000000 00000000 00000000 00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 " + + "decode" in { + PacketCoding.DecodePacket(string).require match { + case ConnectToWorldRequestMessage(serverName, majorVersion, minorVersion, revision, buildDate, unk) => + serverName mustEqual "gemini" + majorVersion mustEqual 0 + minorVersion mustEqual 0 + revision mustEqual 0 + buildDate mustEqual "" + unk mustEqual 0 + case default => + true mustEqual false + } + } + + "encode" in { + val msg = ConnectToWorldRequestMessage("gemini", 0, 0, 0, "", 0) + val pkt = PacketCoding.EncodePacket(msg).require.toByteVector + + pkt mustEqual string + } + } + "ConnectToWorldMessage" should { val string = hex"04 8667656D696E69 8C36342E33372E3135382E36393C75"