From 30f679238ba5d3439aa0f708b1dbffd4f76f9a5d Mon Sep 17 00:00:00 2001 From: Fate-JH Date: Sun, 5 Mar 2017 14:39:04 -0500 Subject: [PATCH] Packet: AvatarImplantMessage (#108) * added initial AvatarImplantMessage packet * rebased AvatarImplantMessage and working test * converting implant types * changing format of Enum from axx_bxx to AxxBxx --- .../psforever/packet/GamePacketOpcode.scala | 2 +- .../packet/game/AvatarImplantMessage.scala | 69 +++++++++++++++++++ .../scala/game/AvatarImplantMessageTest.scala | 30 ++++++++ 3 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 common/src/main/scala/net/psforever/packet/game/AvatarImplantMessage.scala create mode 100644 common/src/test/scala/game/AvatarImplantMessageTest.scala diff --git a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala index 42f24ac6b..916ea8d39 100644 --- a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala +++ b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala @@ -423,7 +423,7 @@ object GamePacketOpcode extends Enumeration { case 0x56 => noDecoder(GenericObjectActionMessage) case 0x57 => noDecoder(AvatarVehicleTimerMessage) // 0x58 - case 0x58 => noDecoder(AvatarImplantMessage) + case 0x58 => game.AvatarImplantMessage.decode case 0x59 => noDecoder(UnknownMessage89) case 0x5a => noDecoder(DelayedPathMountMsg) case 0x5b => noDecoder(OrbitalShuttleTimeMsg) diff --git a/common/src/main/scala/net/psforever/packet/game/AvatarImplantMessage.scala b/common/src/main/scala/net/psforever/packet/game/AvatarImplantMessage.scala new file mode 100644 index 000000000..75cd5a6c1 --- /dev/null +++ b/common/src/main/scala/net/psforever/packet/game/AvatarImplantMessage.scala @@ -0,0 +1,69 @@ +// 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._ + +/** + * An `Enumeration` of the available implants. + */ +object ImplantType extends Enumeration { + type Type = Value + val AdvancedRegen, + Targeting, + AudioAmplifier, + DarklightVision, + MeleeBooster, + PersonalShield, + RangeMagnifier, + Unknown7, + SilentRun, + Surge = Value + + implicit val codec = PacketHelpers.createEnumerationCodec(this, uint4L) +} + +/** + * Change the state of the implant.
+ * Write better comments. + *
+ * Implant:
+ * ` + * 00 - Regeneration (advanced_regen)
+ * 01 - Enhanced Targeting (targeting)
+ * 02 - Audio Amplifier (audio_amplifier)
+ * 03 - Darklight Vision (darklight_vision)
+ * 04 - Melee Booster (melee_booster)
+ * 05 - Personal Shield (personal_shield)
+ * 06 - Range Magnifier (range_magnifier)
+ * 07 - `None`
+ * 08 - Sensor Shield (silent_run)
+ * 09 - Surge (surge)
+ * ` + *
+ * Exploration
+ * Where is Second Wind (second_wind)? + * @param player_guid the player + * @param unk1 na + * @param unk2 na + * @param implant the implant + */ +final case class AvatarImplantMessage(player_guid : PlanetSideGUID, + unk1 : Int, + unk2 : Int, + implant : ImplantType.Value) + extends PlanetSideGamePacket { + type Packet = AvatarImplantMessage + def opcode = GamePacketOpcode.AvatarImplantMessage + def encode = AvatarImplantMessage.encode(this) +} + +object AvatarImplantMessage extends Marshallable[AvatarImplantMessage] { + implicit val codec : Codec[AvatarImplantMessage] = ( + ("player_guid" | PlanetSideGUID.codec) :: + ("unk1" | uintL(3)) :: + ("unk2" | uint2L) :: + ("implant" | ImplantType.codec) + ).as[AvatarImplantMessage] +} diff --git a/common/src/test/scala/game/AvatarImplantMessageTest.scala b/common/src/test/scala/game/AvatarImplantMessageTest.scala new file mode 100644 index 000000000..e7cc35397 --- /dev/null +++ b/common/src/test/scala/game/AvatarImplantMessageTest.scala @@ -0,0 +1,30 @@ +// Copyright (c) 2016 PSForever.net to present +package game + +import org.specs2.mutable._ +import net.psforever.packet._ +import net.psforever.packet.game._ +import scodec.bits._ + +class AvatarImplantMessageTest extends Specification { + val string = hex"58 630C 68 80" + + "decode" in { + PacketCoding.DecodePacket(string).require match { + case AvatarImplantMessage(player_guid, unk1, unk2, implant) => + player_guid mustEqual PlanetSideGUID(3171) + unk1 mustEqual 3 + unk2 mustEqual 1 + implant mustEqual ImplantType.Targeting + case _ => + ko + } + } + + "encode" in { + val msg = AvatarImplantMessage(PlanetSideGUID(3171), 3, 1, ImplantType.Targeting) + val pkt = PacketCoding.EncodePacket(msg).require.toByteVector + + pkt mustEqual string + } +}