diff --git a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala index 76c7a0b8c..21d4ba9b1 100644 --- a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala +++ b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala @@ -335,7 +335,7 @@ object GamePacketOpcode extends Enumeration { case 0x0c => noDecoder(DestroyMessage) case 0x0d => game.ReloadMessage.decode case 0x0e => game.MountVehicleMsg.decode - case 0x0f => noDecoder(DismountVehicleMsg) + case 0x0f => game.DismountVehicleMsg.decode // OPCODES 0x10-1f case 0x10 => game.UseItemMessage.decode diff --git a/common/src/main/scala/net/psforever/packet/game/DismountVehicleMsg.scala b/common/src/main/scala/net/psforever/packet/game/DismountVehicleMsg.scala new file mode 100644 index 000000000..991ef0283 --- /dev/null +++ b/common/src/main/scala/net/psforever/packet/game/DismountVehicleMsg.scala @@ -0,0 +1,29 @@ +// Copyright (c) 2017 PSForever +package net.psforever.packet.game + +import net.psforever.packet.{GamePacketOpcode, Marshallable, PlanetSideGamePacket} +import scodec.Codec +import scodec.codecs._ + +/** + * Dispatched by the client when the player wishes to get out of a vehicle. + * @param player_guid the player + * @param unk1 na + * @param unk2 na + */ +final case class DismountVehicleMsg(player_guid : PlanetSideGUID, + unk1 : Int, //maybe, seat number? + unk2 : Boolean) //maybe, bailing? + extends PlanetSideGamePacket { + type Packet = DismountVehicleMsg + def opcode = GamePacketOpcode.DismountVehicleMsg + def encode = DismountVehicleMsg.encode(this) +} + +object DismountVehicleMsg extends Marshallable[DismountVehicleMsg] { + implicit val codec : Codec[DismountVehicleMsg] = ( + ("player_guid" | PlanetSideGUID.codec) :: + ("unk1" | uint4L) :: + ("unk2" | bool) + ).as[DismountVehicleMsg] +} diff --git a/common/src/test/scala/game/DismountVehicleMsgTest.scala b/common/src/test/scala/game/DismountVehicleMsgTest.scala new file mode 100644 index 000000000..9af501036 --- /dev/null +++ b/common/src/test/scala/game/DismountVehicleMsgTest.scala @@ -0,0 +1,29 @@ +// Copyright (c) 2017 PSForever +package game + +import org.specs2.mutable._ +import net.psforever.packet._ +import net.psforever.packet.game._ +import scodec.bits._ + +class DismountVehicleMsgTest extends Specification { + val string = hex"0F C609 00" + + "decode" in { + PacketCoding.DecodePacket(string).require match { + case DismountVehicleMsg(player_guid, unk1, unk2) => + player_guid mustEqual PlanetSideGUID(2502) + unk1 mustEqual 0 + unk2 mustEqual false + case _ => + ko + } + } + + "encode" in { + val msg = DismountVehicleMsg(PlanetSideGUID(2502), 0, false) + val pkt = PacketCoding.EncodePacket(msg).require.toByteVector + + pkt mustEqual string + } +} diff --git a/pslogin/src/main/scala/WorldSessionActor.scala b/pslogin/src/main/scala/WorldSessionActor.scala index 044739d73..3e10636f1 100644 --- a/pslogin/src/main/scala/WorldSessionActor.scala +++ b/pslogin/src/main/scala/WorldSessionActor.scala @@ -365,9 +365,13 @@ class WorldSessionActor extends Actor with MDCContextAware { log.info("WarpgateRequest: " + msg) case msg @ MountVehicleMsg(player_guid, vehicle_guid, unk) => - //sendResponse(PacketCoding.CreateGamePacket(0, ObjectAttachMessage(vehicle_guid,player_guid,0))) + sendResponse(PacketCoding.CreateGamePacket(0, ObjectAttachMessage(vehicle_guid,player_guid,0))) log.info("MounVehicleMsg: "+msg) + case msg @ DismountVehicleMsg(player_guid, unk1, unk2) => + sendResponse(PacketCoding.CreateGamePacket(0, msg)) //should be safe; replace with ObjectDetachMessage later + log.info("DismountVehicleMsg: " + msg) + case msg @ AvatarGrenadeStateMessage(player_guid, state) => log.info("AvatarGrenadeStateMessage: " + msg)