Packet: ConnectToWorldRequestMessage

This commit is contained in:
Chord 2016-05-14 15:38:34 -04:00
parent 034dadc96c
commit b210df904a
3 changed files with 57 additions and 1 deletions

View file

@ -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

View file

@ -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]
}

View file

@ -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"