diff --git a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala index a5bb0e2a..2ac15cec 100644 --- a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala +++ b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala @@ -376,7 +376,7 @@ object GamePacketOpcode extends Enumeration { case UnknownMessage46 => noDecoder(opcode) case CharacterCreateRequestMessage => game.CharacterCreateRequestMessage.decode case CharacterRequestMessage => game.CharacterRequestMessage.decode - case LoadMapMessage => noDecoder(opcode) + case LoadMapMessage => game.LoadMapMessage.decode // OPCODE 50 case SetCurrentAvatarMessage => game.SetCurrentAvatarMessage.decode diff --git a/common/src/main/scala/net/psforever/packet/game/LoadMapMessage.scala b/common/src/main/scala/net/psforever/packet/game/LoadMapMessage.scala new file mode 100644 index 00000000..35888066 --- /dev/null +++ b/common/src/main/scala/net/psforever/packet/game/LoadMapMessage.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._ + + +/** + * map_name and nav_map_name should match (unless you want to be lost :)) + * + * ex: + * map13 & home3 = vs sanc + * map10 & z10 = amerish + * map07 & z7 = esamir + */ +final case class LoadMapMessage(map_name : String, + nav_map_name : String, // Also determines loading screen + unk1 : Int, + unk2 : Long, + weapons_unlocked : Boolean, + checksum : Long) //? + extends PlanetSideGamePacket { + type Packet = LoadMapMessage + def opcode = GamePacketOpcode.LoadMapMessage + def encode = LoadMapMessage.encode(this) +} + +object LoadMapMessage extends Marshallable[LoadMapMessage] { + implicit val codec : Codec[LoadMapMessage] = ( + ("map_name" | PacketHelpers.encodedString) :: // TODO: Implement encodedStringWithLimit + ("nav_map_name" | PacketHelpers.encodedString) :: //TODO: Implement encodedStringWithLimit + ("unk1" | uint16L) :: + ("unk2" | uint32L) :: + ("weapons_unlocked" | bool) :: + ("checksum" | uint32L) + ).as[LoadMapMessage] +} diff --git a/common/src/test/scala/GamePacketTest.scala b/common/src/test/scala/GamePacketTest.scala index 1613637f..e1b47823 100644 --- a/common/src/test/scala/GamePacketTest.scala +++ b/common/src/test/scala/GamePacketTest.scala @@ -837,6 +837,31 @@ class GamePacketTest extends Specification { } } + "LoadMapMessage" should { + val string = hex"31 85 6D61703130 83 7A3130 0FA0 19000000 F6 F1 60 86 80" + + "decode" in { + PacketCoding.DecodePacket(string).require match { + case LoadMapMessage(map_name, nav_map_name, unk1, unk2, weapons_unlocked, unk3) => + map_name mustEqual "map10" + nav_map_name mustEqual "z10" + unk1 mustEqual 40975 + unk2 mustEqual 25 + weapons_unlocked mustEqual true + unk3 mustEqual 230810349 + case default => + ko + } + } + + "encode" in { + val msg = LoadMapMessage("map10","z10",40975,25,true,230810349) + val pkt = PacketCoding.EncodePacket(msg).require.toByteVector + pkt mustEqual string + } + } + + "QuantityUpdateMessage" should { val string = hex"3D 5300 7B000000" diff --git a/pslogin/src/main/scala/WorldSessionActor.scala b/pslogin/src/main/scala/WorldSessionActor.scala index 48da8b0a..1a9a21f3 100644 --- a/pslogin/src/main/scala/WorldSessionActor.scala +++ b/pslogin/src/main/scala/WorldSessionActor.scala @@ -137,7 +137,7 @@ class WorldSessionActor extends Actor with MDCContextAware { log.debug("Object: " + obj) // LoadMapMessage 13714 in mossy .gcap // XXX: hardcoded shit - sendRawResponse(hex"31 85 6D 61 70 31 33 85 68 6F 6D 65 33 A4 9C 19 00 00 00 AE 30 5E 70 00 ") + sendResponse(PacketCoding.CreateGamePacket(0, LoadMapMessage("map13","home3",40100,25,true,3770441820L))) //VS Sanctuary sendRawResponse(objectHex) // These object_guids are specfic to VS Sanc