mirror of
https://github.com/psforever/PSF-LoginServer.git
synced 2026-01-19 18:44:45 +00:00
Packet: ConnectToWorldMessage and fix VNL test
This commit is contained in:
parent
43a403174f
commit
034dadc96c
|
|
@ -32,6 +32,8 @@ object GamePacketOpcode extends Enumeration {
|
||||||
= Value
|
= Value
|
||||||
|
|
||||||
def getPacketDecoder(opcode : GamePacketOpcode.Type) : (BitVector) => Attempt[DecodeResult[PlanetSideGamePacket]] = opcode match {
|
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 LoginMessage => game.LoginMessage.decode
|
||||||
case LoginRespMessage => game.LoginRespMessage.decode
|
case LoginRespMessage => game.LoginRespMessage.decode
|
||||||
case VNLWorldStatusMessage => game.VNLWorldStatusMessage.decode
|
case VNLWorldStatusMessage => game.VNLWorldStatusMessage.decode
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
// Copyright (c) 2016 PSForever.net to present
|
// Copyright (c) 2016 PSForever.net to present
|
||||||
package net.psforever.packet.game
|
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.Codec
|
||||||
import scodec.codecs._
|
import scodec.codecs._
|
||||||
|
|
||||||
final case class ConnectToWorldMessage(world : String)
|
final case class ConnectToWorldMessage(server : String, serverIp : String, port : Int)
|
||||||
extends PlanetSideGamePacket {
|
extends PlanetSideGamePacket {
|
||||||
type Packet = ConnectToWorldMessage
|
type Packet = ConnectToWorldMessage
|
||||||
def opcode = GamePacketOpcode.ConnectToWorldMessage
|
def opcode = GamePacketOpcode.ConnectToWorldMessage
|
||||||
|
|
@ -13,5 +13,9 @@ final case class ConnectToWorldMessage(world : String)
|
||||||
}
|
}
|
||||||
|
|
||||||
object ConnectToWorldMessage extends Marshallable[ConnectToWorldMessage] {
|
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]
|
||||||
}
|
}
|
||||||
|
|
@ -9,11 +9,33 @@ import scodec.bits._
|
||||||
class GamePacketTest extends Specification {
|
class GamePacketTest extends Specification {
|
||||||
|
|
||||||
"PlanetSide game packet" in {
|
"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 {
|
"VNLWorldStatusMessage" should {
|
||||||
|
// NOTE: the ServerType is encoded as 0x03 here, but the real planetside server will encode it as 0x04
|
||||||
val string = hex"0597570065006c0063006f006d006500200074006f00200050006c0061006e00650074005300690064006500210020000186" ++
|
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 {
|
"decode" in {
|
||||||
PacketCoding.DecodePacket(string).require match {
|
PacketCoding.DecodePacket(string).require match {
|
||||||
|
|
@ -25,6 +47,7 @@ class GamePacketTest extends Specification {
|
||||||
world.name mustEqual "gemini"
|
world.name mustEqual "gemini"
|
||||||
world.empireNeed mustEqual EmpireNeed.NC
|
world.empireNeed mustEqual EmpireNeed.NC
|
||||||
world.status mustEqual WorldStatus.Up
|
world.status mustEqual WorldStatus.Up
|
||||||
|
world.serverType mustEqual ServerType.Released
|
||||||
|
|
||||||
world.connections.length mustEqual 1
|
world.connections.length mustEqual 1
|
||||||
world.connections{0}.address.getPort mustEqual 30007
|
world.connections{0}.address.getPort mustEqual 30007
|
||||||
|
|
@ -37,7 +60,7 @@ class GamePacketTest extends Specification {
|
||||||
"encode" in {
|
"encode" in {
|
||||||
val msg = VNLWorldStatusMessage("Welcome to PlanetSide! ",
|
val msg = VNLWorldStatusMessage("Welcome to PlanetSide! ",
|
||||||
Vector(
|
Vector(
|
||||||
WorldInformation("gemini", WorldStatus.Up, ServerType.Beta,
|
WorldInformation("gemini", WorldStatus.Up, ServerType.Released,
|
||||||
Vector(
|
Vector(
|
||||||
WorldConnectionInfo(new InetSocketAddress(InetAddress.getByName("64.37.158.69"), 30007))
|
WorldConnectionInfo(new InetSocketAddress(InetAddress.getByName("64.37.158.69"), 30007))
|
||||||
), EmpireNeed.NC
|
), EmpireNeed.NC
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue