diff --git a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala index a78c6b9e..02a83d1e 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..0dcc7428 --- /dev/null +++ b/common/src/main/scala/net/psforever/packet/game/SetEmpireMessage.scala @@ -0,0 +1,25 @@ +// 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._ + +/** + * 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(object_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] = ( + ("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 5b5cce63..b7292d00 100644 --- a/common/src/test/scala/GamePacketTest.scala +++ b/common/src/test/scala/GamePacketTest.scala @@ -816,6 +816,27 @@ class GamePacketTest extends Specification { } } + "SetEmpireMessage" should { + val string = hex"24 02 00 80" + + "decode" in { + PacketCoding.DecodePacket(string).require match { + case SetEmpireMessage(object_guid, empire) => + object_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 a3a531cd..48da8b0a 100644 --- a/pslogin/src/main/scala/WorldSessionActor.scala +++ b/pslogin/src/main/scala/WorldSessionActor.scala @@ -140,6 +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) + // 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 + 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