diff --git a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala index caacfe15f..bf911d36a 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 000000000..802ec0203 --- /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 ed3d0f0c0..c6af18a3a 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"