diff --git a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala index c294890f..caacfe15 100644 --- a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala +++ b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala @@ -32,6 +32,8 @@ object GamePacketOpcode extends Enumeration { = Value def getPacketDecoder(opcode : GamePacketOpcode.Type) : (BitVector) => Attempt[DecodeResult[PlanetSideGamePacket]] = opcode match { + //case ConnectToWorldRequestMessage => game.ConnectToWorldRequestMessage.decode + case ConnectToWorldMessage => game.ConnectToWorldMessage.decode case LoginMessage => game.LoginMessage.decode case LoginRespMessage => game.LoginRespMessage.decode case VNLWorldStatusMessage => game.VNLWorldStatusMessage.decode diff --git a/common/src/main/scala/net/psforever/packet/game/ConnectToWorldMessage.scala b/common/src/main/scala/net/psforever/packet/game/ConnectToWorldMessage.scala index 14675920..84105cea 100644 --- a/common/src/main/scala/net/psforever/packet/game/ConnectToWorldMessage.scala +++ b/common/src/main/scala/net/psforever/packet/game/ConnectToWorldMessage.scala @@ -1,11 +1,11 @@ // Copyright (c) 2016 PSForever.net to present package net.psforever.packet.game -import net.psforever.packet.{GamePacketOpcode, Marshallable, PlanetSideGamePacket} +import net.psforever.packet.{GamePacketOpcode, Marshallable, PacketHelpers, PlanetSideGamePacket} import scodec.Codec import scodec.codecs._ -final case class ConnectToWorldMessage(world : String) +final case class ConnectToWorldMessage(server : String, serverIp : String, port : Int) extends PlanetSideGamePacket { type Packet = ConnectToWorldMessage def opcode = GamePacketOpcode.ConnectToWorldMessage @@ -13,5 +13,9 @@ final case class ConnectToWorldMessage(world : String) } object ConnectToWorldMessage extends Marshallable[ConnectToWorldMessage] { - implicit val codec : Codec[ConnectToWorldMessage] = ascii.as[ConnectToWorldMessage] + implicit val codec : Codec[ConnectToWorldMessage] = ( + ("server_name" | PacketHelpers.encodedString) :: + ("server_ip" | PacketHelpers.encodedString) :: + ("server_port" | uint16L) + ).as[ConnectToWorldMessage] } \ No newline at end of file diff --git a/common/src/test/scala/GamePacketTest.scala b/common/src/test/scala/GamePacketTest.scala index aa619e04..ed3d0f0c 100644 --- a/common/src/test/scala/GamePacketTest.scala +++ b/common/src/test/scala/GamePacketTest.scala @@ -9,11 +9,33 @@ import scodec.bits._ class GamePacketTest extends Specification { "PlanetSide game packet" in { - val cNonce = 656287232 + + "ConnectToWorldMessage" should { + val string = hex"04 8667656D696E69 8C36342E33372E3135382E36393C75" + + "decode" in { + PacketCoding.DecodePacket(string).require match { + case ConnectToWorldMessage(serverName, serverIp, serverPort) => + serverName mustEqual "gemini" + serverIp mustEqual "64.37.158.69" + serverPort mustEqual 30012 + case default => + true mustEqual false + } + } + + "encode" in { + val msg = ConnectToWorldMessage("gemini", "64.37.158.69", 30012) + val pkt = PacketCoding.EncodePacket(msg).require.toByteVector + + pkt mustEqual string + } + } "VNLWorldStatusMessage" should { + // NOTE: the ServerType is encoded as 0x03 here, but the real planetside server will encode it as 0x04 val string = hex"0597570065006c0063006f006d006500200074006f00200050006c0061006e00650074005300690064006500210020000186" ++ - hex"67656d696e69" ++ hex"0100 01 00 01459e2540 3775" ++ bin"01".toByteVector + hex"67656d696e69" ++ hex"0100 03 00 01459e2540 3775" ++ bin"01".toByteVector "decode" in { PacketCoding.DecodePacket(string).require match { @@ -25,6 +47,7 @@ class GamePacketTest extends Specification { world.name mustEqual "gemini" world.empireNeed mustEqual EmpireNeed.NC world.status mustEqual WorldStatus.Up + world.serverType mustEqual ServerType.Released world.connections.length mustEqual 1 world.connections{0}.address.getPort mustEqual 30007 @@ -37,7 +60,7 @@ class GamePacketTest extends Specification { "encode" in { val msg = VNLWorldStatusMessage("Welcome to PlanetSide! ", Vector( - WorldInformation("gemini", WorldStatus.Up, ServerType.Beta, + WorldInformation("gemini", WorldStatus.Up, ServerType.Released, Vector( WorldConnectionInfo(new InetSocketAddress(InetAddress.getByName("64.37.158.69"), 30007)) ), EmpireNeed.NC