From cc3cd06bfb23eda77ebf28c65005ef371d714907 Mon Sep 17 00:00:00 2001 From: Aphedox Date: Thu, 11 Aug 2016 23:09:11 -0500 Subject: [PATCH 1/6] SetEmpireMessage --- .../psforever/packet/GamePacketOpcode.scala | 2 +- .../packet/game/SetEmpireMessage.scala | 21 +++++++++++++++++++ .../src/main/scala/WorldSessionActor.scala | 1 + 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 common/src/main/scala/net/psforever/packet/game/SetEmpireMessage.scala diff --git a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala index 4da688b3..fdd69be5 100644 --- a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala +++ b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala @@ -361,7 +361,7 @@ object GamePacketOpcode extends Enumeration { case ActionProgressMessage => noDecoder(opcode) case ActionCancelMessage => noDecoder(opcode) case ActionCancelAcknowledgeMessage => noDecoder(opcode) - case SetEmpireMessage => noDecoder(opcode) + case SetEmpireMessage => game.SetEmpireMessage.decode case EmoteMsg => game.EmoteMsg.decode case UnuseItemMessage => noDecoder(opcode) case ObjectDetachMessage => noDecoder(opcode) diff --git a/common/src/main/scala/net/psforever/packet/game/SetEmpireMessage.scala b/common/src/main/scala/net/psforever/packet/game/SetEmpireMessage.scala new file mode 100644 index 00000000..dc960220 --- /dev/null +++ b/common/src/main/scala/net/psforever/packet/game/SetEmpireMessage.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 SetEmpireMessage(continent_guid : PlanetSideGUID, + empire : PlanetSideEmpire.Value) + extends PlanetSideGamePacket { + type Packet = SetEmpireMessage + def opcode = GamePacketOpcode.SetEmpireMessage + def encode = SetEmpireMessage.encode(this) +} + +object SetEmpireMessage extends Marshallable[SetEmpireMessage] { + implicit val codec : Codec[SetEmpireMessage] = ( + ("continent_guid" | PlanetSideGUID.codec) :: + ("empire" | PlanetSideEmpire.codec) + ).as[SetEmpireMessage] +} diff --git a/pslogin/src/main/scala/WorldSessionActor.scala b/pslogin/src/main/scala/WorldSessionActor.scala index a3a531cd..1e1a49ed 100644 --- a/pslogin/src/main/scala/WorldSessionActor.scala +++ b/pslogin/src/main/scala/WorldSessionActor.scala @@ -140,6 +140,7 @@ class WorldSessionActor extends Actor with MDCContextAware { 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 ") sendRawResponse(objectHex) + sendResponse(PacketCoding.CreateGamePacket(0, SetEmpireMessage(PlanetSideGUID(7), PlanetSideEmpire.VS))) sendResponse(PacketCoding.CreateGamePacket(0, ContinentalLockUpdateMessage(PlanetSideGUID(13), PlanetSideEmpire.VS))) // "The VS have captured the VS Sanctuary." sendResponse(PacketCoding.CreateGamePacket(0, BroadcastWarpgateUpdateMessage(PlanetSideGUID(13), PlanetSideGUID(1), 32))) // VS Sanctuary: Inactive Warpgate -> Broadcast Warpgate From f145fd49f26845b64e1e999137d792f1a4763812 Mon Sep 17 00:00:00 2001 From: Aphedox Date: Sat, 13 Aug 2016 18:14:20 -0500 Subject: [PATCH 2/6] misc --- .../scala/net/psforever/packet/game/SetEmpireMessage.scala | 6 +++++- pslogin/src/main/scala/WorldSessionActor.scala | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/common/src/main/scala/net/psforever/packet/game/SetEmpireMessage.scala b/common/src/main/scala/net/psforever/packet/game/SetEmpireMessage.scala index dc960220..dbadac2a 100644 --- a/common/src/main/scala/net/psforever/packet/game/SetEmpireMessage.scala +++ b/common/src/main/scala/net/psforever/packet/game/SetEmpireMessage.scala @@ -5,6 +5,10 @@ import net.psforever.packet.{GamePacketOpcode, Marshallable, PacketHelpers, Plan import scodec.Codec import scodec.codecs._ +/** + * The object_guid space for SetEmpireMessage is continent specific. + * SetEmpireMessage is usually followed by HackMessage (indicating the hack disposition of the same object_guid) + */ final case class SetEmpireMessage(continent_guid : PlanetSideGUID, empire : PlanetSideEmpire.Value) extends PlanetSideGamePacket { @@ -15,7 +19,7 @@ final case class SetEmpireMessage(continent_guid : PlanetSideGUID, object SetEmpireMessage extends Marshallable[SetEmpireMessage] { implicit val codec : Codec[SetEmpireMessage] = ( - ("continent_guid" | PlanetSideGUID.codec) :: + ("object_guid" | PlanetSideGUID.codec) :: ("empire" | PlanetSideEmpire.codec) ).as[SetEmpireMessage] } diff --git a/pslogin/src/main/scala/WorldSessionActor.scala b/pslogin/src/main/scala/WorldSessionActor.scala index 1e1a49ed..846f4c11 100644 --- a/pslogin/src/main/scala/WorldSessionActor.scala +++ b/pslogin/src/main/scala/WorldSessionActor.scala @@ -140,7 +140,10 @@ class WorldSessionActor extends Actor with MDCContextAware { 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 ") sendRawResponse(objectHex) - sendResponse(PacketCoding.CreateGamePacket(0, SetEmpireMessage(PlanetSideGUID(7), PlanetSideEmpire.VS))) + // VS Sanc specific object_guids + sendResponse(PacketCoding.CreateGamePacket(0, SetEmpireMessage(PlanetSideGUID(2), PlanetSideEmpire.VS))) //HART building C + sendResponse(PacketCoding.CreateGamePacket(0, SetEmpireMessage(PlanetSideGUID(29), PlanetSideEmpire.NC))) //South Villa Gun Tower + sendResponse(PacketCoding.CreateGamePacket(0, ContinentalLockUpdateMessage(PlanetSideGUID(13), PlanetSideEmpire.VS))) // "The VS have captured the VS Sanctuary." sendResponse(PacketCoding.CreateGamePacket(0, BroadcastWarpgateUpdateMessage(PlanetSideGUID(13), PlanetSideGUID(1), 32))) // VS Sanctuary: Inactive Warpgate -> Broadcast Warpgate From e326f454e55f35f67fad06651a2f32e6ca9f2f49 Mon Sep 17 00:00:00 2001 From: Aphedox Date: Sat, 13 Aug 2016 19:12:21 -0500 Subject: [PATCH 3/6] misc --- .../packet/game/SetEmpireMessage.scala | 6 +++--- common/src/test/scala/GamePacketTest.scala | 21 +++++++++++++++++++ .../src/main/scala/WorldSessionActor.scala | 2 +- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/common/src/main/scala/net/psforever/packet/game/SetEmpireMessage.scala b/common/src/main/scala/net/psforever/packet/game/SetEmpireMessage.scala index dbadac2a..a0a42020 100644 --- a/common/src/main/scala/net/psforever/packet/game/SetEmpireMessage.scala +++ b/common/src/main/scala/net/psforever/packet/game/SetEmpireMessage.scala @@ -7,9 +7,9 @@ import scodec.codecs._ /** * The object_guid space for SetEmpireMessage is continent specific. - * SetEmpireMessage is usually followed by HackMessage (indicating the hack disposition of the same object_guid) + * SetEmpireMessage is usually followed by HackMessage (indicating the hack disposition of the same building_guid) */ -final case class SetEmpireMessage(continent_guid : PlanetSideGUID, +final case class SetEmpireMessage(building_guid : PlanetSideGUID, empire : PlanetSideEmpire.Value) extends PlanetSideGamePacket { type Packet = SetEmpireMessage @@ -19,7 +19,7 @@ final case class SetEmpireMessage(continent_guid : PlanetSideGUID, object SetEmpireMessage extends Marshallable[SetEmpireMessage] { implicit val codec : Codec[SetEmpireMessage] = ( - ("object_guid" | PlanetSideGUID.codec) :: + ("building_guid" | PlanetSideGUID.codec) :: ("empire" | PlanetSideEmpire.codec) ).as[SetEmpireMessage] } diff --git a/common/src/test/scala/GamePacketTest.scala b/common/src/test/scala/GamePacketTest.scala index 167b8a7a..847bc7e3 100644 --- a/common/src/test/scala/GamePacketTest.scala +++ b/common/src/test/scala/GamePacketTest.scala @@ -796,6 +796,27 @@ class GamePacketTest extends Specification { } } + "SetEmpireMessage" should { + val string = hex"24 02 00 80" + + "decode" in { + PacketCoding.DecodePacket(string).require match { + case SetEmpireMessage(building_guid, empire) => + building_guid mustEqual PlanetSideGUID(2) + empire mustEqual PlanetSideEmpire.VS + case default => + ko + } + } + + "encode" in { + val msg = SetEmpireMessage(PlanetSideGUID(2), PlanetSideEmpire.VS) + val pkt = PacketCoding.EncodePacket(msg).require.toByteVector + + pkt mustEqual string + } + } + "PingMsg" should { val packet = hex"1a 00000000 b0360000" diff --git a/pslogin/src/main/scala/WorldSessionActor.scala b/pslogin/src/main/scala/WorldSessionActor.scala index 846f4c11..e0e5f03a 100644 --- a/pslogin/src/main/scala/WorldSessionActor.scala +++ b/pslogin/src/main/scala/WorldSessionActor.scala @@ -140,7 +140,7 @@ class WorldSessionActor extends Actor with MDCContextAware { 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 ") sendRawResponse(objectHex) - // VS Sanc specific object_guids + // These building_guids are specfic to VS Sanc sendResponse(PacketCoding.CreateGamePacket(0, SetEmpireMessage(PlanetSideGUID(2), PlanetSideEmpire.VS))) //HART building C sendResponse(PacketCoding.CreateGamePacket(0, SetEmpireMessage(PlanetSideGUID(29), PlanetSideEmpire.NC))) //South Villa Gun Tower From fce876480e7f83f1ae50a7c47c0130562a4d2da9 Mon Sep 17 00:00:00 2001 From: Aphedox Date: Sat, 13 Aug 2016 19:51:20 -0500 Subject: [PATCH 4/6] rename building_guid to object_guid --- .../scala/net/psforever/packet/game/SetEmpireMessage.scala | 6 +++--- common/src/test/scala/GamePacketTest.scala | 4 ++-- pslogin/src/main/scala/WorldSessionActor.scala | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/common/src/main/scala/net/psforever/packet/game/SetEmpireMessage.scala b/common/src/main/scala/net/psforever/packet/game/SetEmpireMessage.scala index a0a42020..0dcc7428 100644 --- a/common/src/main/scala/net/psforever/packet/game/SetEmpireMessage.scala +++ b/common/src/main/scala/net/psforever/packet/game/SetEmpireMessage.scala @@ -7,9 +7,9 @@ import scodec.codecs._ /** * The object_guid space for SetEmpireMessage is continent specific. - * SetEmpireMessage is usually followed by HackMessage (indicating the hack disposition of the same building_guid) + * SetEmpireMessage is usually followed by HackMessage (indicating the hack disposition of the same object_guid) */ -final case class SetEmpireMessage(building_guid : PlanetSideGUID, +final case class SetEmpireMessage(object_guid : PlanetSideGUID, empire : PlanetSideEmpire.Value) extends PlanetSideGamePacket { type Packet = SetEmpireMessage @@ -19,7 +19,7 @@ final case class SetEmpireMessage(building_guid : PlanetSideGUID, object SetEmpireMessage extends Marshallable[SetEmpireMessage] { implicit val codec : Codec[SetEmpireMessage] = ( - ("building_guid" | PlanetSideGUID.codec) :: + ("object_guid" | PlanetSideGUID.codec) :: ("empire" | PlanetSideEmpire.codec) ).as[SetEmpireMessage] } diff --git a/common/src/test/scala/GamePacketTest.scala b/common/src/test/scala/GamePacketTest.scala index 847bc7e3..51aa7713 100644 --- a/common/src/test/scala/GamePacketTest.scala +++ b/common/src/test/scala/GamePacketTest.scala @@ -801,8 +801,8 @@ class GamePacketTest extends Specification { "decode" in { PacketCoding.DecodePacket(string).require match { - case SetEmpireMessage(building_guid, empire) => - building_guid mustEqual PlanetSideGUID(2) + case SetEmpireMessage(object_guid, empire) => + object_guid mustEqual PlanetSideGUID(2) empire mustEqual PlanetSideEmpire.VS case default => ko diff --git a/pslogin/src/main/scala/WorldSessionActor.scala b/pslogin/src/main/scala/WorldSessionActor.scala index e0e5f03a..48da8b0a 100644 --- a/pslogin/src/main/scala/WorldSessionActor.scala +++ b/pslogin/src/main/scala/WorldSessionActor.scala @@ -140,7 +140,7 @@ class WorldSessionActor extends Actor with MDCContextAware { 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 ") sendRawResponse(objectHex) - // These building_guids are specfic to VS Sanc + // These object_guids are specfic to VS Sanc sendResponse(PacketCoding.CreateGamePacket(0, SetEmpireMessage(PlanetSideGUID(2), PlanetSideEmpire.VS))) //HART building C sendResponse(PacketCoding.CreateGamePacket(0, SetEmpireMessage(PlanetSideGUID(29), PlanetSideEmpire.NC))) //South Villa Gun Tower From d6e5adaf767e4f37fb0997c8533084bf6cdf44f7 Mon Sep 17 00:00:00 2001 From: tfarley Date: Sat, 13 Aug 2016 19:45:55 -0700 Subject: [PATCH 5/6] Add WeaponJammedMessage packet --- .../psforever/packet/GamePacketOpcode.scala | 2 +- .../packet/game/WeaponJammedMessage.scala | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 common/src/main/scala/net/psforever/packet/game/WeaponJammedMessage.scala diff --git a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala index fdd69be5..02a83d1e 100644 --- a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala +++ b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala @@ -441,7 +441,7 @@ object GamePacketOpcode extends Enumeration { // OPCODE 100 case AvatarSearchCriteriaMessage => noDecoder(opcode) case AvatarSearchResponse => noDecoder(opcode) - case WeaponJammedMessage => noDecoder(opcode) + case WeaponJammedMessage => game.WeaponJammedMessage.decode case LinkDeadAwarenessMsg => noDecoder(opcode) case DroppodFreefallingMessage => noDecoder(opcode) case AvatarFirstTimeEventMessage => game.AvatarFirstTimeEventMessage.decode diff --git a/common/src/main/scala/net/psforever/packet/game/WeaponJammedMessage.scala b/common/src/main/scala/net/psforever/packet/game/WeaponJammedMessage.scala new file mode 100644 index 00000000..de772346 --- /dev/null +++ b/common/src/main/scala/net/psforever/packet/game/WeaponJammedMessage.scala @@ -0,0 +1,27 @@ +// 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._ + +/** + * Instructs client to play the weapon jammed sound when sent server to client. + * + * Appears to have the same functionality and sound regardless of guid, as long as the client has that item in inventory. + * See also [[WeaponDryFireMessage]] + * + * @param weapon_guid the weapon that is jammed + */ +final case class WeaponJammedMessage(weapon_guid : PlanetSideGUID) + extends PlanetSideGamePacket { + type Packet = WeaponJammedMessage + def opcode = GamePacketOpcode.WeaponJammedMessage + def encode = WeaponJammedMessage.encode(this) +} + +object WeaponJammedMessage extends Marshallable[WeaponJammedMessage] { + implicit val codec : Codec[WeaponJammedMessage] = ( + ("weapon_guid" | PlanetSideGUID.codec) + ).as[WeaponJammedMessage] +} From 939b1f7dc0ce03eb0f399cf58635656cac36f357 Mon Sep 17 00:00:00 2001 From: tfarley Date: Sat, 13 Aug 2016 19:48:30 -0700 Subject: [PATCH 6/6] Add WeaponJammedMessage test --- common/src/test/scala/GamePacketTest.scala | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/common/src/test/scala/GamePacketTest.scala b/common/src/test/scala/GamePacketTest.scala index 51aa7713..3b26d310 100644 --- a/common/src/test/scala/GamePacketTest.scala +++ b/common/src/test/scala/GamePacketTest.scala @@ -817,6 +817,26 @@ class GamePacketTest extends Specification { } } + "WeaponJammedMessage" should { + val string = hex"66 4C00" + + "decode" in { + PacketCoding.DecodePacket(string).require match { + case WeaponJammedMessage(weapon_guid) => + weapon_guid mustEqual PlanetSideGUID(76) + case default => + ko + } + } + + "encode" in { + val msg = WeaponJammedMessage(PlanetSideGUID(76)) + val pkt = PacketCoding.EncodePacket(msg).require.toByteVector + + pkt mustEqual string + } + } + "PingMsg" should { val packet = hex"1a 00000000 b0360000"