From f6d84791e6e22edef3214417147f16ffd67a21fd Mon Sep 17 00:00:00 2001 From: Chord Date: Sat, 4 Jun 2016 03:33:11 -0400 Subject: [PATCH] Packet: CharacterCreateRequestMessage --- .../psforever/packet/GamePacketOpcode.scala | 4 +- .../game/CharacterCreateRequestMessage.scala | 38 +++++++++++++++++++ .../packet/game/VNLWorldStatusMessage.scala | 6 +-- common/src/test/scala/GamePacketTest.scala | 8 ++-- 4 files changed, 47 insertions(+), 9 deletions(-) create mode 100644 common/src/main/scala/net/psforever/packet/game/CharacterCreateRequestMessage.scala diff --git a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala index 081180dee..02691593d 100644 --- a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala +++ b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala @@ -66,7 +66,7 @@ object GamePacketOpcode extends Enumeration { PlanetsideAttributeMessage, UnknownMessage45, UnknownMessage46, - UnknownMessage47, + CharacterCreateRequestMessage, CharacterRequestMessage, LoadMapMessage, @@ -379,7 +379,7 @@ object GamePacketOpcode extends Enumeration { case PlanetsideAttributeMessage => noDecoder(opcode) case UnknownMessage45 => noDecoder(opcode) case UnknownMessage46 => noDecoder(opcode) - case UnknownMessage47 => noDecoder(opcode) + case CharacterCreateRequestMessage => game.CharacterCreateRequestMessage.decode case CharacterRequestMessage => game.CharacterRequestMessage.decode case LoadMapMessage => noDecoder(opcode) diff --git a/common/src/main/scala/net/psforever/packet/game/CharacterCreateRequestMessage.scala b/common/src/main/scala/net/psforever/packet/game/CharacterCreateRequestMessage.scala new file mode 100644 index 000000000..b616493d5 --- /dev/null +++ b/common/src/main/scala/net/psforever/packet/game/CharacterCreateRequestMessage.scala @@ -0,0 +1,38 @@ +// 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._ + +object CharacterGender extends Enumeration(1) { + type Type = Value + + val Male, Female = Value + + implicit val codec = PacketHelpers.createEnumerationCodec(this, uint2L) +} + +/** + * Is sent by the PlanetSide client on character selection completion. + */ +final case class CharacterCreateRequestMessage(name : String, + headId : Int, + voiceId : Int, + gender : CharacterGender.Value, + empire : PlanetSideEmpire.Value) + extends PlanetSideGamePacket { + type Packet = CharacterCreateRequestMessage + def opcode = GamePacketOpcode.CharacterCreateRequestMessage + def encode = CharacterCreateRequestMessage.encode(this) +} + +object CharacterCreateRequestMessage extends Marshallable[CharacterCreateRequestMessage] { + implicit val codec : Codec[CharacterCreateRequestMessage] = ( + ("name" | PacketHelpers.encodedWideString) :: + ("headId" | uint8L) :: + ("voiceId" | uint8L) :: + ("gender" | CharacterGender.codec) :: + ("empire" | PlanetSideEmpire.codec) + ).as[CharacterCreateRequestMessage] +} \ No newline at end of file diff --git a/common/src/main/scala/net/psforever/packet/game/VNLWorldStatusMessage.scala b/common/src/main/scala/net/psforever/packet/game/VNLWorldStatusMessage.scala index 4038eb100..5719492ce 100644 --- a/common/src/main/scala/net/psforever/packet/game/VNLWorldStatusMessage.scala +++ b/common/src/main/scala/net/psforever/packet/game/VNLWorldStatusMessage.scala @@ -22,7 +22,7 @@ object ServerType extends Enumeration(1) { implicit val codec = PacketHelpers.createEnumerationCodec(this, uint8L) } -object EmpireNeed extends Enumeration { +object PlanetSideEmpire extends Enumeration { type Type = Value val TR, NC, VS = Value @@ -34,7 +34,7 @@ final case class WorldConnectionInfo(address : InetSocketAddress) final case class WorldInformation(name : String, status : WorldStatus.Value, serverType : ServerType.Value, connections : Vector[WorldConnectionInfo], - empireNeed : EmpireNeed.Value) + empireNeed : PlanetSideEmpire.Value) final case class VNLWorldStatusMessage(welcomeMessage : String, worlds : Vector[WorldInformation]) extends PlanetSideGamePacket { @@ -114,7 +114,7 @@ object VNLWorldStatusMessage extends Marshallable[VNLWorldStatusMessage] { ("status_and_type" | statusCodec) :+ // TODO: limit the size of this vector to 11 as the client will fail on any more ("connections" | vectorOfN(uint8L, connectionCodec)) :+ - ("empire_need" | EmpireNeed.codec) + ("empire_need" | PlanetSideEmpire.codec) ) ).as[WorldInformation] ))).as[VNLWorldStatusMessage] diff --git a/common/src/test/scala/GamePacketTest.scala b/common/src/test/scala/GamePacketTest.scala index 946894643..c33b04c40 100644 --- a/common/src/test/scala/GamePacketTest.scala +++ b/common/src/test/scala/GamePacketTest.scala @@ -71,7 +71,7 @@ class GamePacketTest extends Specification { val world = worlds{0} world.name mustEqual "gemini" - world.empireNeed mustEqual EmpireNeed.NC + world.empireNeed mustEqual PlanetSideEmpire.NC world.status mustEqual WorldStatus.Up world.serverType mustEqual ServerType.Released @@ -89,7 +89,7 @@ class GamePacketTest extends Specification { WorldInformation("gemini", WorldStatus.Up, ServerType.Released, Vector( WorldConnectionInfo(new InetSocketAddress(InetAddress.getByName("64.37.158.69"), 30007)) - ), EmpireNeed.NC + ), PlanetSideEmpire.NC ) ) ) @@ -103,8 +103,8 @@ class GamePacketTest extends Specification { "encode and decode multiple worlds" in { val msg = VNLWorldStatusMessage("Welcome to PlanetSide! ", Vector( - WorldInformation("PSForever1", WorldStatus.Up, ServerType.Released, Vector(), EmpireNeed.NC), - WorldInformation("PSForever2", WorldStatus.Down, ServerType.Beta, Vector(), EmpireNeed.TR) + WorldInformation("PSForever1", WorldStatus.Up, ServerType.Released, Vector(), PlanetSideEmpire.NC), + WorldInformation("PSForever2", WorldStatus.Down, ServerType.Beta, Vector(), PlanetSideEmpire.TR) )) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector