diff --git a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala index 84f03437b..0bd04d7a1 100644 --- a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala +++ b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala @@ -348,7 +348,7 @@ object GamePacketOpcode extends Enumeration { case BindPlayerMessage => noDecoder(opcode) case ObjectCreateMessage_Duplicate => noDecoder(opcode) case ObjectCreateMessage => game.ObjectCreateMessage.decode - case ObjectDeleteMessage => noDecoder(opcode) + case ObjectDeleteMessage => game.ObjectDeleteMessage.decode case PingMsg => noDecoder(opcode) case VehicleStateMessage => noDecoder(opcode) case FrameVehicleStateMessage => noDecoder(opcode) diff --git a/common/src/main/scala/net/psforever/packet/game/ObjectDeleteMessage.scala b/common/src/main/scala/net/psforever/packet/game/ObjectDeleteMessage.scala new file mode 100644 index 000000000..d1d648e0a --- /dev/null +++ b/common/src/main/scala/net/psforever/packet/game/ObjectDeleteMessage.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 ObjectDeleteMessage(object_guid : PlanetSideGUID, + unk1 : Int) + extends PlanetSideGamePacket { + type Packet = ObjectDeleteMessage + def opcode = GamePacketOpcode.ObjectDeleteMessage + def encode = ObjectDeleteMessage.encode(this) +} + +object ObjectDeleteMessage extends Marshallable[ObjectDeleteMessage] { + implicit val codec : Codec[ObjectDeleteMessage] = ( + ("object_guid" | PlanetSideGUID.codec) :: + ("unk1" | uintL(3)) + ).as[ObjectDeleteMessage] +} diff --git a/common/src/test/scala/GamePacketTest.scala b/common/src/test/scala/GamePacketTest.scala index ddb3cbecc..47e94f419 100644 --- a/common/src/test/scala/GamePacketTest.scala +++ b/common/src/test/scala/GamePacketTest.scala @@ -369,5 +369,26 @@ class GamePacketTest extends Specification { pkt mustEqual string } } + + "ObjectDeleteMessage" should { + val string = hex"19 4C00 00" + + "decode" in { + PacketCoding.DecodePacket(string).require match { + case ObjectDeleteMessage(object_guid, unk1) => + object_guid mustEqual PlanetSideGUID(76) + unk1 mustEqual 0 + case default => + ko + } + } + + "encode" in { + val msg = ObjectDeleteMessage(PlanetSideGUID(76), 0) + 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 ff586196c..79f3cc457 100644 --- a/pslogin/src/main/scala/WorldSessionActor.scala +++ b/pslogin/src/main/scala/WorldSessionActor.scala @@ -179,6 +179,11 @@ class WorldSessionActor extends Actor with MDCContextAware { case msg @ RequestDestroyMessage(object_guid) => log.info("RequestDestroy: " + msg) + // TODO: Make sure this is the correct response in all cases + sendResponse(PacketCoding.CreateGamePacket(0, ObjectDeleteMessage(object_guid, 0))) + + case msg @ ObjectDeleteMessage(object_guid, unk1) => + log.info("ObjectDelete: " + msg) case default => log.debug(s"Unhandled GamePacket ${pkt}") }