diff --git a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala index 27e45f83..2e53c000 100644 --- a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala +++ b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala @@ -403,7 +403,7 @@ object GamePacketOpcode extends Enumeration { case ItemTransactionResultMessage => noDecoder(opcode) // OPCODE 70 - case ChangeFireModeMessage => noDecoder(opcode) + case ChangeFireModeMessage => game.ChangeFireModeMessage.decode case ChangeAmmoMessage => noDecoder(opcode) case TimeOfDayMessage => noDecoder(opcode) case UnknownMessage73 => noDecoder(opcode) diff --git a/common/src/main/scala/net/psforever/packet/game/ChangeFireModeMessage.scala b/common/src/main/scala/net/psforever/packet/game/ChangeFireModeMessage.scala new file mode 100644 index 00000000..1ef035e1 --- /dev/null +++ b/common/src/main/scala/net/psforever/packet/game/ChangeFireModeMessage.scala @@ -0,0 +1,21 @@ +// 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._ + +final case class ChangeFireModeMessage(item_guid : PlanetSideGUID, + fire_mode : Int) + extends PlanetSideGamePacket { + type Packet = ChangeFireModeMessage + def opcode = GamePacketOpcode.ChangeFireModeMessage + def encode = ChangeFireModeMessage.encode(this) +} + +object ChangeFireModeMessage extends Marshallable[ChangeFireModeMessage] { + implicit val codec : Codec[ChangeFireModeMessage] = ( + ("item_guid" | PlanetSideGUID.codec) :: + ("fire_mode" | uintL(3)) + ).as[ChangeFireModeMessage] +} diff --git a/common/src/test/scala/GamePacketTest.scala b/common/src/test/scala/GamePacketTest.scala index aed58d02..3a53014d 100644 --- a/common/src/test/scala/GamePacketTest.scala +++ b/common/src/test/scala/GamePacketTest.scala @@ -203,5 +203,26 @@ class GamePacketTest extends Specification { pkt_tell mustEqual string_tell } } + + "ChangeFireModeMessage" should { + val string = hex"46 4C0020" + + "decode" in { + PacketCoding.DecodePacket(string).require match { + case ChangeFireModeMessage(item_guid, fire_mode) => + item_guid mustEqual PlanetSideGUID(76) + fire_mode mustEqual 1 + case default => + ko + } + } + + "encode" in { + val msg = ChangeFireModeMessage(PlanetSideGUID(76), 1) + 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 09b5074e..a666977a 100644 --- a/pslogin/src/main/scala/WorldSessionActor.scala +++ b/pslogin/src/main/scala/WorldSessionActor.scala @@ -153,6 +153,9 @@ class WorldSessionActor extends Actor with MDCContextAware { // TODO: Depending on messagetype, may need to prepend sender's name to contents with proper spacing // TODO: Just replays the packet straight back to sender; actually needs to be routed to recipients! sendResponse(PacketCoding.CreateGamePacket(0, ChatMsg(messagetype, unk1, recipient, contents))) + + case msg @ ChangeFireModeMessage(item_guid, fire_mode) => + log.info("ChangeFireMode: " + msg) case default => log.debug(s"Unhandled GamePacket ${pkt}") }