Packet: LoadMapMessage (#61)

* Add LoadMapMessage packet

* Add LoadMapMessage test
This commit is contained in:
aphedox 2016-08-14 17:37:06 -05:00 committed by pschord
parent 83264de081
commit a37fb3214c
4 changed files with 65 additions and 2 deletions

View file

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

View file

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

View file

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

View file

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