From 211eb838aac727e8a2df5c5a826950438166b424 Mon Sep 17 00:00:00 2001 From: FateJH Date: Wed, 18 Oct 2017 20:26:41 -0400 Subject: [PATCH] standardizing VehicleData Codec; clarifying field data for CommonFieldData; added various Vehicles that were not part of the earlier updates, leaving only the BFRs untouched; fixing PacketConverters for Vehicles; cleaning-up ObjectClass --- .../definition/converter/AMSConverter.scala | 44 -- .../definition/converter/ANTConverter.scala | 29 -- .../converter/PacketConverter.scala | 38 -- .../converter/UtilityVehicleConverter.scala | 11 + .../converter/VariantVehicleConverter.scala | 11 + .../converter/VehicleConverter.scala | 28 +- .../packet/game/objectcreate/AMSData.scala | 99 ---- .../packet/game/objectcreate/ANTData.scala | 62 --- .../game/objectcreate/CommonFieldData.scala | 30 +- .../objectcreate/CommonTerminalData.scala | 2 +- .../game/objectcreate/ObjectClass.scala | 479 ++++++++++-------- .../packet/game/objectcreate/Prefab.scala | 419 ++++++++++++--- .../game/objectcreate/Vehicle2Data.scala | 129 ----- .../game/objectcreate/VehicleData.scala | 328 ++++++------ .../scala/game/ObjectCreateMessageTest.scala | 21 +- .../ObjectCreateMessageVehiclesTest.scala | 191 ++++--- .../src/main/scala/WorldSessionActor.scala | 1 - 17 files changed, 982 insertions(+), 940 deletions(-) delete mode 100644 common/src/main/scala/net/psforever/objects/definition/converter/AMSConverter.scala delete mode 100644 common/src/main/scala/net/psforever/objects/definition/converter/ANTConverter.scala create mode 100644 common/src/main/scala/net/psforever/objects/definition/converter/UtilityVehicleConverter.scala create mode 100644 common/src/main/scala/net/psforever/objects/definition/converter/VariantVehicleConverter.scala delete mode 100644 common/src/main/scala/net/psforever/packet/game/objectcreate/AMSData.scala delete mode 100644 common/src/main/scala/net/psforever/packet/game/objectcreate/ANTData.scala delete mode 100644 common/src/main/scala/net/psforever/packet/game/objectcreate/Vehicle2Data.scala diff --git a/common/src/main/scala/net/psforever/objects/definition/converter/AMSConverter.scala b/common/src/main/scala/net/psforever/objects/definition/converter/AMSConverter.scala deleted file mode 100644 index ee4cfc8e..00000000 --- a/common/src/main/scala/net/psforever/objects/definition/converter/AMSConverter.scala +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2017 PSForever -package net.psforever.objects.definition.converter - -import net.psforever.objects.Vehicle -import net.psforever.packet.game.PlanetSideGUID -import net.psforever.packet.game.objectcreate.{AMSData, CommonFieldData, ObjectClass, PlacementData} - -import scala.util.{Success, Try} - -class AMSConverter extends ObjectCreateConverter[Vehicle] { - /* Vehicles do not have a conversion for `0x18` packet data. */ - - override def ConstructorData(obj : Vehicle) : Try[AMSData] = { - Success( - AMSData( - CommonFieldData( - PlacementData(obj.Position, obj.Orientation, obj.Velocity), - obj.Faction, - 0, - if(obj.Owner.isDefined) { obj.Owner.get } else { PlanetSideGUID(0) } //this is the owner field, right? - ), - 0, - obj.Health, - 0, - obj.Configuration, - 0, - ReferenceUtility(obj, ObjectClass.matrix_terminalc), - ReferenceUtility(obj, ObjectClass.ams_respawn_tube), - ReferenceUtility(obj, ObjectClass.order_terminala), - ReferenceUtility(obj, ObjectClass.order_terminalb) - ) - ) - } - - /** - * For an object with a list of utilities, find a specific kind of utility. - * @param obj the game object - * @param objectId the utility being sought - * @return the global unique identifier of the utility - */ - private def ReferenceUtility(obj : Vehicle, objectId : Int) : PlanetSideGUID = { - obj.Utilities.find(util => util.objectId == objectId).head.GUID - } -} diff --git a/common/src/main/scala/net/psforever/objects/definition/converter/ANTConverter.scala b/common/src/main/scala/net/psforever/objects/definition/converter/ANTConverter.scala deleted file mode 100644 index 19c8c729..00000000 --- a/common/src/main/scala/net/psforever/objects/definition/converter/ANTConverter.scala +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2017 PSForever -package net.psforever.objects.definition.converter - -import net.psforever.objects.Vehicle -import net.psforever.packet.game.PlanetSideGUID -import net.psforever.packet.game.objectcreate.{ANTData, CommonFieldData, PlacementData} - -import scala.util.{Success, Try} - -class ANTConverter extends ObjectCreateConverter[Vehicle] { - /* Vehicles do not have a conversion for `0x18` packet data. */ - - override def ConstructorData(obj : Vehicle) : Try[ANTData] = { - Success( - ANTData( - CommonFieldData( - PlacementData(obj.Position, obj.Orientation,obj.Velocity), - obj.Faction, - 0, - if(obj.Owner.isDefined) { obj.Owner.get } else { PlanetSideGUID(0) } //this is the owner field, right? - ), - 0, - obj.Health, - 0, - obj.Configuration - ) - ) - } -} diff --git a/common/src/main/scala/net/psforever/objects/definition/converter/PacketConverter.scala b/common/src/main/scala/net/psforever/objects/definition/converter/PacketConverter.scala index 663b1a2a..0a7fec60 100644 --- a/common/src/main/scala/net/psforever/objects/definition/converter/PacketConverter.scala +++ b/common/src/main/scala/net/psforever/objects/definition/converter/PacketConverter.scala @@ -17,44 +17,6 @@ sealed trait PacketConverter * @tparam A the type of game object */ abstract class ObjectCreateConverter[A <: PlanetSideGameObject] extends PacketConverter { -// def ObjectCreate(obj : A) : Try[ObjectCreateMessage] = { -// Success( -// ObjectCreateMessage(obj.Definition.ObjectId, obj.GUID, -// DroppedItemData( -// PlacementData(obj.Position, obj.Orientation.x.toInt, obj.Orientation.y.toInt, obj.Orientation.z.toInt, Some(obj.Velocity)), -// ConstructorData(obj).get -// ) -// ) -// ) -// } -// -// def ObjectCreate(obj : A, info : PlacementData) : Try[ObjectCreateMessage] = { -// Success(ObjectCreateMessage(obj.Definition.ObjectId, obj.GUID, DroppedItemData(info, ConstructorData(obj).get))) -// } -// -// def ObjectCreate(obj : A, info : ObjectCreateMessageParent) : Try[ObjectCreateMessage] = { -// Success(ObjectCreateMessage(obj.Definition.ObjectId, obj.GUID, info, ConstructorData(obj).get)) -// } -// -// def ObjectCreateDetailed(obj : A) : Try[ObjectCreateDetailedMessage] = { -// Success( -// ObjectCreateDetailedMessage(obj.Definition.ObjectId, obj.GUID, -// DroppedItemData( -// PlacementData(obj.Position, obj.Orientation.x.toInt, obj.Orientation.y.toInt, obj.Orientation.z.toInt, Some(obj.Velocity)), -// DetailedConstructorData(obj).get -// ) -// ) -// ) -// } -// -// def ObjectCreateDetailed(obj : A, info : PlacementData) : Try[ObjectCreateDetailedMessage] = { -// Success(ObjectCreateDetailedMessage(obj.Definition.ObjectId, obj.GUID, DroppedItemData(info, DetailedConstructorData(obj).get))) -// } -// -// def ObjectCreateDetailed(obj : A, info : ObjectCreateMessageParent) : Try[ObjectCreateDetailedMessage] = { -// Success(ObjectCreateDetailedMessage(obj.Definition.ObjectId, obj.GUID, info, DetailedConstructorData(obj).get)) -// } - /** * Take a game object and transform it into its equivalent data for an `0x17` packet. * @param obj the game object diff --git a/common/src/main/scala/net/psforever/objects/definition/converter/UtilityVehicleConverter.scala b/common/src/main/scala/net/psforever/objects/definition/converter/UtilityVehicleConverter.scala new file mode 100644 index 00000000..c39f3965 --- /dev/null +++ b/common/src/main/scala/net/psforever/objects/definition/converter/UtilityVehicleConverter.scala @@ -0,0 +1,11 @@ +// Copyright (c) 2017 PSForever +package net.psforever.objects.definition.converter + +import net.psforever.objects.Vehicle +import net.psforever.packet.game.objectcreate.{UtilityVehicleData, VehicleFormat} + +class UtilityVehicleConverter extends VehicleConverter { + override protected def SpecificFormatModifier : VehicleFormat.Value = VehicleFormat.Utility + + override protected def SpecificFormatData(obj : Vehicle) = Some(UtilityVehicleData(0)) +} diff --git a/common/src/main/scala/net/psforever/objects/definition/converter/VariantVehicleConverter.scala b/common/src/main/scala/net/psforever/objects/definition/converter/VariantVehicleConverter.scala new file mode 100644 index 00000000..12758a05 --- /dev/null +++ b/common/src/main/scala/net/psforever/objects/definition/converter/VariantVehicleConverter.scala @@ -0,0 +1,11 @@ +// Copyright (c) 2017 PSForever +package net.psforever.objects.definition.converter + +import net.psforever.objects.Vehicle +import net.psforever.packet.game.objectcreate.{VariantVehicleData, VehicleFormat} + +class VariantVehicleConverter extends VehicleConverter { + override protected def SpecificFormatModifier : VehicleFormat.Value = VehicleFormat.Variant + + override protected def SpecificFormatData(obj : Vehicle) = Some(VariantVehicleData(0)) +} diff --git a/common/src/main/scala/net/psforever/objects/definition/converter/VehicleConverter.scala b/common/src/main/scala/net/psforever/objects/definition/converter/VehicleConverter.scala index 39ea3403..06409367 100644 --- a/common/src/main/scala/net/psforever/objects/definition/converter/VehicleConverter.scala +++ b/common/src/main/scala/net/psforever/objects/definition/converter/VehicleConverter.scala @@ -4,14 +4,13 @@ package net.psforever.objects.definition.converter import net.psforever.objects.equipment.Equipment import net.psforever.objects.{EquipmentSlot, Vehicle} import net.psforever.packet.game.PlanetSideGUID -import net.psforever.packet.game.objectcreate.MountItem.MountItem -import net.psforever.packet.game.objectcreate.{CommonFieldData, DriveState, MountItem, PlacementData, VehicleData} +import net.psforever.packet.game.objectcreate.{InventoryItemData, _} import scala.annotation.tailrec -import scala.util.{Success, Try} +import scala.util.{Failure, Success, Try} class VehicleConverter extends ObjectCreateConverter[Vehicle]() { - /* Vehicles do not have a conversion for `0x18` packet data. */ + override def DetailedConstructorData(obj : Vehicle) : Try[VehicleData] = Failure(new Exception("VehicleConverter should not be used to generate detailed VehicleData")) override def ConstructorData(obj : Vehicle) : Try[VehicleData] = { Success( @@ -24,14 +23,15 @@ class VehicleConverter extends ObjectCreateConverter[Vehicle]() { ), 0, obj.Health / obj.MaxHealth * 255, //TODO not precise - 0, + false, false, DriveState.Mobile, false, - 0, - Some(MakeMountings(obj).sortBy(_.parentSlot)) - ) + false, + false, + SpecificFormatData(obj), + Some(InventoryData(MakeMountings(obj).sortBy(_.parentSlot))) + )(SpecificFormatModifier) ) - //TODO work utilities into this mess? } /** @@ -39,9 +39,9 @@ class VehicleConverter extends ObjectCreateConverter[Vehicle]() { * @param obj the Vehicle game object * @return the converted data */ - private def MakeMountings(obj : Vehicle) : List[MountItem] = recursiveMakeMountings(obj.Weapons.iterator) + private def MakeMountings(obj : Vehicle) : List[InventoryItemData.InventoryItem] = recursiveMakeMountings(obj.Weapons.iterator) - @tailrec private def recursiveMakeMountings(iter : Iterator[(Int,EquipmentSlot)], list : List[MountItem] = Nil) : List[MountItem] = { + @tailrec private def recursiveMakeMountings(iter : Iterator[(Int,EquipmentSlot)], list : List[InventoryItemData.InventoryItem] = Nil) : List[InventoryItemData.InventoryItem] = { if(!iter.hasNext) { list } @@ -51,7 +51,7 @@ class VehicleConverter extends ObjectCreateConverter[Vehicle]() { val equip : Equipment = slot.Equipment.get recursiveMakeMountings( iter, - list :+ MountItem(equip.Definition.ObjectId, equip.GUID, index, equip.Definition.Packet.ConstructorData(equip).get) + list :+ InventoryItemData(equip.Definition.ObjectId, equip.GUID, index, equip.Definition.Packet.ConstructorData(equip).get) ) } else { @@ -59,4 +59,8 @@ class VehicleConverter extends ObjectCreateConverter[Vehicle]() { } } } + + protected def SpecificFormatModifier : VehicleFormat.Value = VehicleFormat.Normal + + protected def SpecificFormatData(obj : Vehicle) : Option[SpecificVehicleData] = None } diff --git a/common/src/main/scala/net/psforever/packet/game/objectcreate/AMSData.scala b/common/src/main/scala/net/psforever/packet/game/objectcreate/AMSData.scala deleted file mode 100644 index 54a226cc..00000000 --- a/common/src/main/scala/net/psforever/packet/game/objectcreate/AMSData.scala +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (c) 2017 PSForever -package net.psforever.packet.game.objectcreate - -import net.psforever.packet.Marshallable -import net.psforever.packet.game.PlanetSideGUID -import net.psforever.types.PlanetSideEmpire -import scodec.codecs._ -import scodec.{Attempt, Codec, Err} -import shapeless.{::, HNil} - -/** - * A representation of a vehicle called the Advanced Mobile Station (AMS).
- *
- * The AMS has four utilities associated with its `Deployed` mode. - * It has two flanking equipment terminals, a front matrix panel, and a rear deconstruction terminal. - * This is consistent from AMS to AMS, regardless of the faction that spawned the vehicle originally. - * For that reason, the only thing that changes between different AMS's are the GUIDs used for each terminal. - * @param basic data common to objects - * @param unk1 na - * @param health the amount of health the object has, as a percentage of a filled bar - * @param unk2 na - * @param driveState the drivable condition - * @param unk3 na; - * common values are 0 or 63; - * usually in a non-`Mobile` state when non-zero - * @param matrix_guid the GUID for the spawn matrix panel on the front - * @param respawn_guid the GUID for the respawn apparatus on the rear - * @param term_a_guid the GUID for the equipment terminal on the AMS on the left side - * @param term_b_guid the GUID for the equipment on the AMS on the right side - */ -final case class AMSData(basic : CommonFieldData, - unk1 : Int, - health : Int, - unk2 : Int, - driveState : DriveState.Value, - unk3 : Int, - matrix_guid : PlanetSideGUID, - respawn_guid : PlanetSideGUID, - term_a_guid : PlanetSideGUID, - term_b_guid : PlanetSideGUID - ) extends ConstructorData { - override def bitsize : Long = { - val basicSize = basic.bitsize - val vehicleSize : Long = VehicleData.baseVehicleSize - //the four utilities should all be the same size - val utilitySize : Long = 4 * InternalSlot(ObjectClass.matrix_terminalc, matrix_guid, 1, CommonTerminalData(basic.faction)).bitsize - 19L + basicSize + vehicleSize + utilitySize - } -} - -object AMSData extends Marshallable[AMSData] { - /** - * Overloaded constructor that ignores all of the unknown fields. - * @param basic data common to objects - * @param health the amount of health the object has, as a percentage of a filled bar - * @param driveState the drivable condition - * @param matrix_guid the GUID for the spawn matrix panel on the front - * @param respawn_guid the GUID for the respawn apparatus on the rear - * @param term_a_guid the GUID for the equipment terminal on the AMS on the left side - * @param term_b_guid the GUID for the equipment on the AMS on the right side - * @return an `AMSData` object - */ - def apply(basic : CommonFieldData, health : Int, driveState : DriveState.Value, matrix_guid : PlanetSideGUID, respawn_guid : PlanetSideGUID, term_a_guid : PlanetSideGUID, term_b_guid : PlanetSideGUID) : AMSData = - new AMSData(basic, 0, health, 0, driveState, 0, matrix_guid, respawn_guid, term_a_guid, term_b_guid) - - implicit val codec : Codec[AMSData] = ( - VehicleData.basic_vehicle_codec :+ - uintL(6) :+ - bool :+ - uintL(12) :+ - InternalSlot.codec :+ - InternalSlot.codec :+ - InternalSlot.codec :+ - InternalSlot.codec - ).exmap[AMSData] ( - { - case basic :: unk1 :: health :: unk2 :: driveState :: false :: unk3 :: false :: 0x41 :: - InternalSlot(ObjectClass.matrix_terminalc, matrix_guid, 1, CommonTerminalData(_, _)) :: - InternalSlot(ObjectClass.ams_respawn_tube, respawn_guid,2, CommonTerminalData(_, _)) :: - InternalSlot(ObjectClass.order_terminala, terma_guid, 3, CommonTerminalData(_, _)) :: - InternalSlot(ObjectClass.order_terminalb, termb_guid, 4, CommonTerminalData(_, _)) :: HNil => - Attempt.successful(AMSData(basic, unk1, health, unk2, driveState, unk3, matrix_guid, respawn_guid, terma_guid, termb_guid)) - - case _ => - Attempt.failure(Err("invalid AMS data")) - }, - { - case AMSData(basic, unk1, health, unk2, driveState, unk3, matrix_guid, respawn_guid, terma_guid, termb_guid) => - val faction : PlanetSideEmpire.Value = basic.faction - Attempt.successful( - basic :: unk1 :: health :: unk2 :: driveState :: false :: unk3 :: false :: 0x41 :: - InternalSlot(ObjectClass.matrix_terminalc, matrix_guid, 1, CommonTerminalData(faction)) :: - InternalSlot(ObjectClass.ams_respawn_tube, respawn_guid,2, CommonTerminalData(faction)) :: - InternalSlot(ObjectClass.order_terminala, terma_guid, 3, CommonTerminalData(faction)) :: - InternalSlot(ObjectClass.order_terminalb, termb_guid, 4, CommonTerminalData(faction)) :: HNil - ) - } - ) -} diff --git a/common/src/main/scala/net/psforever/packet/game/objectcreate/ANTData.scala b/common/src/main/scala/net/psforever/packet/game/objectcreate/ANTData.scala deleted file mode 100644 index b75a3df7..00000000 --- a/common/src/main/scala/net/psforever/packet/game/objectcreate/ANTData.scala +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (c) 2017 PSForever -package net.psforever.packet.game.objectcreate - -import net.psforever.packet.Marshallable -import scodec.codecs._ -import scodec.{Attempt, Codec, Err} -import shapeless.{::, HNil} - -/** - * A representation of a vehicle called the Advanced Nanite Transport (ANT). - * @param basic data common to objects - * @param unk1 na - * @param health the amount of health the object has, as a percentage of a filled bar - * @param unk2 na - * @param driveState the drivable condition; - * defaults to `Mobile` - * @param unk3 na; - * defaults to 0 - */ -final case class ANTData(basic : CommonFieldData, - unk1 : Int, - health : Int, - unk2 : Int, - driveState : DriveState.Value = DriveState.Mobile, - unk3 : Int = 0 - ) extends ConstructorData { - override def bitsize : Long = { - val basicSize = basic.bitsize - val vehicleBasicSize : Long = VehicleData.baseVehicleSize - 9L + basicSize + vehicleBasicSize - } -} - -object ANTData extends Marshallable[ANTData] { - /** - * Overloaded constructor. - * @param basic data common to objects - * @param health the amount of health the object has, as a percentage of a filled bar - * @param driveState the drivable condition - * @return an `ANTData` object - */ - def apply(basic : CommonFieldData, health : Int, driveState : DriveState.Value) : ANTData = - new ANTData(basic, 0, health, 0, driveState, 0) - - implicit val codec : Codec[ANTData] = ( - VehicleData.basic_vehicle_codec :+ - uint8L :+ - bool //false for vehicle driving control; ditto u4 from above - ).exmap[ANTData] ( - { - case basic :: unk1 :: health :: unk2 :: driveState :: false :: unk3 :: false :: HNil => - Attempt.successful(ANTData(basic, unk1, health, unk2, driveState, unk3)) - - case _ => - Attempt.failure(Err("invalid ant data format")) - }, - { - case ANTData(basic, unk1, health, unk2, driveState, unk3) => - Attempt.successful(basic :: unk1 :: health :: unk2 :: driveState :: false :: unk3 :: false :: HNil) - } - ) -} diff --git a/common/src/main/scala/net/psforever/packet/game/objectcreate/CommonFieldData.scala b/common/src/main/scala/net/psforever/packet/game/objectcreate/CommonFieldData.scala index f598e4fd..37ec4167 100644 --- a/common/src/main/scala/net/psforever/packet/game/objectcreate/CommonFieldData.scala +++ b/common/src/main/scala/net/psforever/packet/game/objectcreate/CommonFieldData.scala @@ -17,7 +17,10 @@ import shapeless.{::, HNil} */ final case class CommonFieldData(pos : PlacementData, faction : PlanetSideEmpire.Value, + bops : Boolean, + destroyed : Boolean, unk : Int, + jammered : Boolean, player_guid : PlanetSideGUID ) extends StreamBitSize { override def bitsize : Long = 23L + pos.bitsize @@ -34,7 +37,16 @@ object CommonFieldData extends Marshallable[CommonFieldData] { * @return a `CommonFieldData` object */ def apply(pos : PlacementData, faction : PlanetSideEmpire.Value, unk : Int) : CommonFieldData = - CommonFieldData(pos, faction, unk, PlanetSideGUID(0)) + CommonFieldData(pos, faction, false, false, unk, false, PlanetSideGUID(0)) + + def apply(pos : PlacementData, faction : PlanetSideEmpire.Value, unk : Int, player_guid : PlanetSideGUID) : CommonFieldData = + CommonFieldData(pos, faction, false, false, unk, false, player_guid) + + def apply(pos : PlacementData, faction : PlanetSideEmpire.Value, destroyed : Boolean, unk : Int) : CommonFieldData = + CommonFieldData(pos, faction, false, destroyed, unk, false, PlanetSideGUID(0)) + + def apply(pos : PlacementData, faction : PlanetSideEmpire.Value, destroyed : Boolean, unk : Int, player_guid : PlanetSideGUID) : CommonFieldData = + CommonFieldData(pos, faction, false, destroyed, unk, false, player_guid) /** * `Codec` for transforming reliable `WeaponData` from the internal structure of the turret when it is defined. @@ -73,19 +85,19 @@ object CommonFieldData extends Marshallable[CommonFieldData] { implicit val codec : Codec[CommonFieldData] = ( ("pos" | PlacementData.codec) :: ("faction" | PlanetSideEmpire.codec) :: - ("unk" | uint(5)) :: + ("bops" | bool) :: + ("destroyed" | bool) :: + ("unk" | uint2L) :: //3 - na, 2 - common, 1 - na, 0 - common? + ("jammered" | bool) :: ("player_guid" | PlanetSideGUID.codec) ).exmap[CommonFieldData] ( { - case pos :: fac :: unk :: player :: HNil => - Attempt.successful(CommonFieldData(pos, fac, unk, player)) - - case _ => - Attempt.failure(Err("invalid deployable data format")) + case pos :: fac :: bops :: wrecked :: unk :: jammered :: player :: HNil => + Attempt.successful(CommonFieldData(pos, fac, bops, wrecked, unk,jammered, player)) }, { - case CommonFieldData(pos, fac, unk, player) => - Attempt.successful(pos :: fac :: unk :: player :: HNil) + case CommonFieldData(pos, fac, bops, wrecked, unk, jammered, player) => + Attempt.successful(pos :: fac :: bops :: wrecked :: unk :: jammered :: player :: HNil) } ) } diff --git a/common/src/main/scala/net/psforever/packet/game/objectcreate/CommonTerminalData.scala b/common/src/main/scala/net/psforever/packet/game/objectcreate/CommonTerminalData.scala index 7a5f6d7f..39dc42a1 100644 --- a/common/src/main/scala/net/psforever/packet/game/objectcreate/CommonTerminalData.scala +++ b/common/src/main/scala/net/psforever/packet/game/objectcreate/CommonTerminalData.scala @@ -41,7 +41,7 @@ object CommonTerminalData extends Marshallable[CommonTerminalData] { { case fac :: 0 :: unk :: 0 :: HNil => Attempt.successful(CommonTerminalData(fac, unk)) - case _ :: _ :: _ :: _ :: HNil => + case _ => Attempt.failure(Err("invalid terminal data format")) }, { diff --git a/common/src/main/scala/net/psforever/packet/game/objectcreate/ObjectClass.scala b/common/src/main/scala/net/psforever/packet/game/objectcreate/ObjectClass.scala index f88a38e7..f396aba1 100644 --- a/common/src/main/scala/net/psforever/packet/game/objectcreate/ObjectClass.scala +++ b/common/src/main/scala/net/psforever/packet/game/objectcreate/ObjectClass.scala @@ -300,6 +300,10 @@ object ObjectClass { final val starfire_projectile = 831 final val striker_missile_targeting_projectile = 841 //vehicles + final val apc_destroyed = 65 + final val apc_tr = 67 //juggernaut + final val apc_nc = 66 //vindicator + final val apc_vs = 68 //leviathan final val ams = 46 final val ams_destroyed = 47 final val ant = 60 @@ -311,24 +315,38 @@ object ObjectClass { final val colossus_flight = 199 final val colossus_gunner = 200 final val droppod = 258 + final val dropship = 259 + final val dropship_destroyed = 260 final val flail = 294 + final val flail_destroyed = 295 final val fury = 335 final val galaxy_gunship = 338 final val liberator = 432 + final val liberator_destroyed = 439 final val lightgunship = 441 + final val lightgunship_destroyed = 442 final val lightning = 446 final val lightning_destroyed = 447 + final val lodestar = 459 + final val lodestar_destroyed = 460 final val magrider = 470 + final val magrider_destroyed = 471 + final val mosquito = 572 + final val mosquito_destroyed = 573 final val mediumtransport = 532 final val mediumtransport_destroyed = 533 final val orbital_shuttle = 608 final val peregrine_flight = 642 final val peregrine_gunner = 643 + final val phantasm = 671 final val prowler = 697 + final val prowler_destroyed = 698 final val quadassault = 707 final val quadassault_destroyed = 708 final val quadstealth = 710 final val quadstealth_destroyed = 711 + final val router = 741 + final val router_destroyed = 742 final val switchblade = 847 final val switchblade_destroyed = 848 final val threemanheavybuggy = 862 //marauder @@ -341,19 +359,26 @@ object ObjectClass { final val twomanhoverbuggy = 900 //thresher final val twomanhoverbuggy_destroyed = 901 final val vanguard = 923 + final val vanguard_destroyed = 924 final val vulture = 986 + final val wasp = 997 //other final val ams_respawn_tube = 49 final val avatar = 121 + final val bfr_rearm_terminal = 142 final val capture_flag = 157 final val implant_terminal_interface = 409 final val locker_container = 456 + final val lodestar_repair_terminal = 461 final val matrix_terminala = 517 final val matrix_terminalb = 518 final val matrix_terminalc = 519 + final val multivehicle_rearm_terminal = 576 final val order_terminal = 612 final val order_terminala = 613 final val order_terminalb = 614 + final val targeting_laser_dispenser = 851 + final val teleportpad_terminal = 853 //TODO refactor the following functions into another object later /** @@ -455,168 +480,169 @@ object ObjectClass { case ObjectClass.winchester_ammo => ConstructorData.genericCodec(DetailedAmmoBoxData.codec, "ammo box") //weapons case ObjectClass.beamer => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.chaingun_12mm => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.chaingun_15mm => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.cannon_20mm => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.cannon_deliverer_20mm => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.cannon_dropship_20mm => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.cannon_dropship_l_20mm => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.cannon_75mm => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.lightning_75mm => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.ace_deployable => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.advanced_missile_launcher_t => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.cannon_dropship_20mm => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.anniversary_gun => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.anniversary_guna => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.anniversary_gunb => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.apc_ballgun_l => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.apc_ballgun_r => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.apc_weapon_systema => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.apc_weapon_systemb => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.apc_weapon_systemc => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.apc_weapon_systemc_nc => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.apc_weapon_systemc_tr => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.apc_weapon_systemc_vs => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.apc_weapon_systemd => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.apc_weapon_systemd_nc => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.apc_weapon_systemd_tr => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.apc_weapon_systemd_vs => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.aphelion_immolation_cannon => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.aphelion_laser => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.aphelion_laser_left => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.aphelion_laser_right => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.aphelion_plasma_rocket_pod => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.aphelion_ppa => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.aphelion_ppa_left => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.aphelion_ppa_right => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.aphelion_starfire => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.aphelion_starfire_left => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.aphelion_starfire_right => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.aurora_weapon_systema => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.aurora_weapon_systemb => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.battlewagon_weapon_systema => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.battlewagon_weapon_systemb => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.battlewagon_weapon_systemc => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.battlewagon_weapon_systemd => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.apc_ballgun_l => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.apc_ballgun_r => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.apc_weapon_systema => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.apc_weapon_systemb => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.apc_weapon_systemc => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.apc_weapon_systemc_nc => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.apc_weapon_systemc_tr => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.apc_weapon_systemc_vs => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.apc_weapon_systemd => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.apc_weapon_systemd_nc => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.apc_weapon_systemd_tr => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.apc_weapon_systemd_vs => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.aphelion_immolation_cannon => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.aphelion_laser => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.aphelion_laser_left => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.aphelion_laser_right => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.aphelion_plasma_rocket_pod => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.aphelion_ppa => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.aphelion_ppa_left => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.aphelion_ppa_right => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.aphelion_starfire => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.aphelion_starfire_left => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.aphelion_starfire_right => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.aurora_weapon_systema => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.aurora_weapon_systemb => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.battlewagon_weapon_systema => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.battlewagon_weapon_systemb => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.battlewagon_weapon_systemc => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.battlewagon_weapon_systemd => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.bolt_driver => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.chainblade => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.chaingun_p => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.colossus_burster => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.colossus_burster_left => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.colossus_burster_right => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.colossus_chaingun => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.colossus_chaingun_left => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.colossus_chaingun_right => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.colossus_cluster_bomb_pod => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.colossus_dual_100mm_cannons => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.colossus_tank_cannon => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.colossus_tank_cannon_left => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.colossus_tank_cannon_right => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.colossus_burster => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.colossus_burster_left => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.colossus_burster_right => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.colossus_chaingun => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.colossus_chaingun_left => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.colossus_chaingun_right => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.colossus_cluster_bomb_pod => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.colossus_dual_100mm_cannons => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.colossus_tank_cannon => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.colossus_tank_cannon_left => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.colossus_tank_cannon_right => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.cycler => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.cycler_v2 => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.cycler_v3 => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.cycler_v4 => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.dropship_rear_turret => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.energy_gun => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.energy_gun_nc => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.energy_gun_tr => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.energy_gun_vs => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.flail_weapon => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.dropship_rear_turret => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.energy_gun => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.energy_gun_nc => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.energy_gun_tr => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.energy_gun_vs => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.flail_weapon => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.flamethrower => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.flechette => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.flux_cannon_thresher => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.fluxpod => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.flux_cannon_thresher => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.fluxpod => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.forceblade => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.fragmentation_grenade => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.fury_weapon_systema => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.galaxy_gunship_cannon => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.galaxy_gunship_gun => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.galaxy_gunship_tailgun => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.fury_weapon_systema => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.galaxy_gunship_cannon => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.galaxy_gunship_gun => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.galaxy_gunship_tailgun => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.gauss => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.gauss_cannon => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.grenade_launcher_marauder => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.heavy_rail_beam_magrider => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.gauss_cannon => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.grenade_launcher_marauder => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.heavy_rail_beam_magrider => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.heavy_sniper => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.hellfire => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.hunterseeker => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.ilc9 => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.isp => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") + case ObjectClass.jammer_grenade => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.katana => ConstructorData.genericCodec(DetailedWeaponData.codec(2), "weapon") case ObjectClass.lancer => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.lasher => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.liberator_25mm_cannon => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.liberator_bomb_bay => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.liberator_weapon_system => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.lightgunship_weapon_system => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.lightning_weapon_system => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.liberator_25mm_cannon => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.liberator_bomb_bay => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.liberator_weapon_system => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.lightgunship_weapon_system => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.lightning_weapon_system => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.maelstrom => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.magcutter => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.mediumtransport_weapon_systemA => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.mediumtransport_weapon_systemB => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.mediumtransport_weapon_systemA => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.mediumtransport_weapon_systemB => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.mini_chaingun => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.oicw => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.nchev_falcon => ConstructorData.genericCodec(DetailedWeaponData.codec(-1), "weapon") case ObjectClass.nchev_scattercannon => ConstructorData.genericCodec(DetailedWeaponData.codec(-1), "weapon") case ObjectClass.nchev_sparrow => ConstructorData.genericCodec(DetailedWeaponData.codec(-1), "weapon") - case ObjectClass.particle_beam_magrider => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.pellet_gun => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.peregrine_dual_machine_gun => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.peregrine_dual_machine_gun_left => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.peregrine_dual_machine_gun_right => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.peregrine_dual_rocket_pods => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.peregrine_mechhammer => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.peregrine_mechhammer_left => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.peregrine_mechhammer_right => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.peregrine_particle_cannon => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.peregrine_sparrow => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.peregrine_sparrow_left => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.peregrine_sparrow_right => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.phalanx_avcombo => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.phalanx_flakcombo => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.phalanx_sgl_hevgatcan => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.phantasm_12mm_machinegun => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.particle_beam_magrider => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.peregrine_dual_machine_gun => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.peregrine_dual_machine_gun_left => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.peregrine_dual_machine_gun_right => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.peregrine_dual_rocket_pods => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.peregrine_mechhammer => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.peregrine_mechhammer_left => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.peregrine_mechhammer_right => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.peregrine_particle_cannon => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.peregrine_sparrow => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.peregrine_sparrow_left => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.peregrine_sparrow_right => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.phalanx_avcombo => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.phalanx_flakcombo => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.phalanx_sgl_hevgatcan => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.phoenix => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.prowler_weapon_systemA => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.prowler_weapon_systemB => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.prowler_weapon_systemA => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.prowler_weapon_systemB => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") + case ObjectClass.plasma_grenade => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.pulsar => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.pulsed_particle_accelerator => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.pulsed_particle_accelerator => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.punisher => ConstructorData.genericCodec(DetailedWeaponData.codec(2), "weapon") - case ObjectClass.quadassault_weapon_system => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.quadassault_weapon_system => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.r_shotgun => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.radiator => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.repeater => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.rocklet => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.rotarychaingun_mosquito => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.router_telepad => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.rotarychaingun_mosquito => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") + case ObjectClass.router_telepad => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") //TODO belongs here? case ObjectClass.scythe => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.six_shooter => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.skyguard_weapon_system => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.skyguard_weapon_system => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.spiker => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.spitfire_aa_weapon => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.spitfire_weapon => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.spitfire_aa_weapon => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.spitfire_weapon => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.striker => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.suppressor => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.thumper => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.thunderer_weapon_systema => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.thunderer_weapon_systemb => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.thunderer_weapon_systema => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.thunderer_weapon_systemb => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.trhev_burster => ConstructorData.genericCodec(DetailedWeaponData.codec(-1), "weapon") case ObjectClass.trhev_dualcycler => ConstructorData.genericCodec(DetailedWeaponData.codec(-1), "weapon") case ObjectClass.trhev_pounder => ConstructorData.genericCodec(DetailedWeaponData.codec(-1), "weapon") - case ObjectClass.vanguard_weapon_system => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.vanu_sentry_turret_weapon => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.vanguard_weapon_system => ConstructorData.genericCodec(DetailedWeaponData.codec(2), "weapon") +// case ObjectClass.vanu_sentry_turret_weapon => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.vshev_comet => ConstructorData.genericCodec(DetailedWeaponData.codec(-1), "weapon") case ObjectClass.vshev_starfire => ConstructorData.genericCodec(DetailedWeaponData.codec(-1), "weapon") case ObjectClass.vshev_quasar => ConstructorData.genericCodec(DetailedWeaponData.codec(-1), "weapon") - case ObjectClass.vulture_bomb_bay => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.vulture_nose_weapon_system => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.vulture_tail_cannon => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.wasp_weapon_system => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.winchester => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.vulture_bomb_bay => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.vulture_nose_weapon_system => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.vulture_tail_cannon => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.wasp_weapon_system => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") + //other weapons + case ObjectClass.ace_deployable => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") + case ObjectClass.advanced_missile_launcher_t => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") + case ObjectClass.cannon_20mm => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") + case ObjectClass.cannon_75mm => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") + case ObjectClass.cannon_deliverer_20mm => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") + case ObjectClass.cannon_dropship_l_20mm => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") + case ObjectClass.chaingun_12mm => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") + case ObjectClass.chaingun_15mm => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") + case ObjectClass.chaingun_p => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") + case ObjectClass.cycler_v2 => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") + case ObjectClass.cycler_v3 => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") + case ObjectClass.cycler_v4 => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.dynomite => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.frag_grenade => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.generic_grenade => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.jammer_grenade => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") + case ObjectClass.lightning_75mm => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") case ObjectClass.mine_sweeper => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") - case ObjectClass.plasma_grenade => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") + case ObjectClass.pellet_gun => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") +// case ObjectClass.phantasm_12mm_machinegun => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") + case ObjectClass.six_shooter => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") + case ObjectClass.winchester => ConstructorData.genericCodec(DetailedWeaponData.codec, "weapon") //medkits case ObjectClass.medkit => ConstructorData.genericCodec(DetailedAmmoBoxData.codec, "ammo box") case ObjectClass.super_armorkit => ConstructorData.genericCodec(DetailedAmmoBoxData.codec, "ammo box") @@ -743,16 +769,6 @@ object ObjectClass { case ObjectClass.winchester_ammo => ConstructorData.genericCodec(AmmoBoxData.codec, "ammo box") //weapons case ObjectClass.beamer => ConstructorData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.chaingun_12mm => ConstructorData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.chaingun_15mm => ConstructorData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.cannon_20mm => ConstructorData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.cannon_deliverer_20mm => ConstructorData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.cannon_dropship_20mm => ConstructorData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.cannon_dropship_l_20mm => ConstructorData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.cannon_75mm => ConstructorData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.lightning_75mm => ConstructorData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.ace_deployable => ConstructorData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.advanced_missile_launcher_t => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.anniversary_gun => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.anniversary_guna => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.anniversary_gunb => ConstructorData.genericCodec(WeaponData.codec, "weapon") @@ -787,7 +803,6 @@ object ObjectClass { case ObjectClass.battlewagon_weapon_systemd => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.bolt_driver => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.chainblade => ConstructorData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.chaingun_p => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.colossus_burster => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.colossus_burster_left => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.colossus_burster_right => ConstructorData.genericCodec(WeaponData.codec, "weapon") @@ -800,11 +815,7 @@ object ObjectClass { case ObjectClass.colossus_tank_cannon_left => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.colossus_tank_cannon_right => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.cycler => ConstructorData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.cycler_v2 => ConstructorData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.cycler_v3 => ConstructorData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.cycler_v4 => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.dropship_rear_turret => ConstructorData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.energy_gun => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.energy_gun_nc => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.energy_gun_tr => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.energy_gun_vs => ConstructorData.genericCodec(WeaponData.codec, "weapon") @@ -828,13 +839,14 @@ object ObjectClass { case ObjectClass.hunterseeker => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.ilc9 => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.isp => ConstructorData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.jammer_grenade => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.katana => ConstructorData.genericCodec(WeaponData.codec(2), "weapon") case ObjectClass.lancer => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.lasher => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.liberator_25mm_cannon => ConstructorData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.liberator_bomb_bay => ConstructorData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.liberator_bomb_bay => ConstructorData.genericCodec(WeaponData.codec(2), "weapon") case ObjectClass.liberator_weapon_system => ConstructorData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.lightgunship_weapon_system => ConstructorData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.lightgunship_weapon_system => ConstructorData.genericCodec(WeaponData.codec(2), "weapon") case ObjectClass.lightning_weapon_system => ConstructorData.genericCodec(WeaponData.codec(2), "weapon") case ObjectClass.maelstrom => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.magcutter => ConstructorData.genericCodec(WeaponData.codec, "weapon") @@ -861,8 +873,8 @@ object ObjectClass { case ObjectClass.phalanx_avcombo => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.phalanx_flakcombo => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.phalanx_sgl_hevgatcan => ConstructorData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.phantasm_12mm_machinegun => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.phoenix => ConstructorData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.plasma_grenade => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.prowler_weapon_systemA => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.prowler_weapon_systemB => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.pulsar => ConstructorData.genericCodec(WeaponData.codec, "weapon") @@ -875,7 +887,6 @@ object ObjectClass { case ObjectClass.rocklet => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.rotarychaingun_mosquito => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.scythe => ConstructorData.genericCodec(WeaponData.codec(2), "weapon") - case ObjectClass.six_shooter => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.skyguard_weapon_system => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.spiker => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.spitfire_aa_weapon => ConstructorData.genericCodec(WeaponData.codec, "weapon") @@ -888,7 +899,7 @@ object ObjectClass { case ObjectClass.trhev_burster => ConstructorData.genericCodec(WeaponData.codec(-1), "weapon") case ObjectClass.trhev_dualcycler => ConstructorData.genericCodec(WeaponData.codec(-1), "weapon") case ObjectClass.trhev_pounder => ConstructorData.genericCodec(WeaponData.codec(-1), "weapon") - case ObjectClass.vanguard_weapon_system => ConstructorData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.vanguard_weapon_system => ConstructorData.genericCodec(WeaponData.codec(2), "weapon") case ObjectClass.vanu_sentry_turret_weapon => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.vshev_comet => ConstructorData.genericCodec(WeaponData.codec(-1), "weapon") case ObjectClass.vshev_quasar => ConstructorData.genericCodec(WeaponData.codec(-1), "weapon") @@ -896,14 +907,30 @@ object ObjectClass { case ObjectClass.vulture_bomb_bay => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.vulture_nose_weapon_system => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.vulture_tail_cannon => ConstructorData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.wasp_weapon_system => ConstructorData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.winchester => ConstructorData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.wasp_weapon_system => ConstructorData.genericCodec(WeaponData.codec(2), "weapon") + //other weapons + case ObjectClass.ace_deployable => ConstructorData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.advanced_missile_launcher_t => ConstructorData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.cannon_20mm => ConstructorData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.cannon_75mm => ConstructorData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.cannon_deliverer_20mm => ConstructorData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.cannon_dropship_l_20mm => ConstructorData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.cannon_dropship_20mm => ConstructorData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.chaingun_12mm => ConstructorData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.chaingun_15mm => ConstructorData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.chaingun_p => ConstructorData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.cycler_v2 => ConstructorData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.cycler_v3 => ConstructorData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.cycler_v4 => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.dynomite => ConstructorData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.energy_gun => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.frag_grenade => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.generic_grenade => ConstructorData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.jammer_grenade => ConstructorData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.lightning_75mm => ConstructorData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.mine_sweeper => ConstructorData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.plasma_grenade => ConstructorData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.phantasm_12mm_machinegun => ConstructorData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.six_shooter => ConstructorData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.winchester => ConstructorData.genericCodec(WeaponData.codec, "weapon") //tools case ObjectClass.applicator => ConstructorData.genericCodec(WeaponData.codec, "tool") case ObjectClass.bank => ConstructorData.genericCodec(WeaponData.codec, "tool") @@ -922,13 +949,18 @@ object ObjectClass { case ObjectClass.orbital_shuttle => ConstructorData.genericCodec(OrbitalShuttleData.codec, "HART") //other case ObjectClass.ams_respawn_tube => ConstructorData.genericCodec(CommonTerminalData.codec, "terminal") + case ObjectClass.bfr_rearm_terminal => ConstructorData.genericCodec(CommonTerminalData.codec, "terminal") case ObjectClass.implant_terminal_interface => ConstructorData.genericCodec(CommonTerminalData.codec, "implant terminal") + case ObjectClass.lodestar_repair_terminal => ConstructorData.genericCodec(CommonTerminalData.codec, "terminal") case ObjectClass.matrix_terminala => ConstructorData.genericCodec(CommonTerminalData.codec, "terminal") case ObjectClass.matrix_terminalb => ConstructorData.genericCodec(CommonTerminalData.codec, "terminal") case ObjectClass.matrix_terminalc => ConstructorData.genericCodec(CommonTerminalData.codec, "terminal") + case ObjectClass.multivehicle_rearm_terminal => ConstructorData.genericCodec(CommonTerminalData.codec, "terminal") case ObjectClass.order_terminal => ConstructorData.genericCodec(CommonTerminalData.codec, "terminal") case ObjectClass.order_terminala => ConstructorData.genericCodec(CommonTerminalData.codec, "terminal") case ObjectClass.order_terminalb => ConstructorData.genericCodec(CommonTerminalData.codec, "terminal") + case ObjectClass.targeting_laser_dispenser => ConstructorData.genericCodec(CommonTerminalData.codec, "terminal") + case ObjectClass.teleportpad_terminal => ConstructorData.genericCodec(CommonTerminalData.codec, "terminal") //failure case case _ => defaultFailureCodec(objClass) } @@ -982,7 +1014,7 @@ object ObjectClass { case ObjectClass.flux_cannon_thresher_battery => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") case ObjectClass.fluxpod_ammo => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") case ObjectClass.frag_cartridge => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") - case ObjectClass.frag_grenade_ammo => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") +// case ObjectClass.frag_grenade_ammo => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") case ObjectClass.gauss_cannon_ammo => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") case ObjectClass.grenade => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") case ObjectClass.health_canister => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") @@ -991,7 +1023,7 @@ object ObjectClass { case ObjectClass.hellfire_ammo => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") case ObjectClass.hunter_seeker_missile => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") case ObjectClass.jammer_cartridge => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") - case ObjectClass.jammer_grenade_ammo => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") +// case ObjectClass.jammer_grenade_ammo => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") case ObjectClass.lancer_cartridge => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") case ObjectClass.liberator_bomb => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") case ObjectClass.maelstrom_ammo => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") @@ -1009,7 +1041,7 @@ object ObjectClass { case ObjectClass.phalanx_ammo => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") case ObjectClass.phoenix_missile => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") case ObjectClass.plasma_cartridge => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") - case ObjectClass.plasma_grenade_ammo => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") +// case ObjectClass.plasma_grenade_ammo => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") case ObjectClass.pounder_ammo => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") case ObjectClass.pulse_battery => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") case ObjectClass.quasar_ammo => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") @@ -1025,63 +1057,56 @@ object ObjectClass { case ObjectClass.spitfire_ammo => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") case ObjectClass.starfire_ammo => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") case ObjectClass.striker_missile_ammo => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") - case ObjectClass.trek_ammo => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") +// case ObjectClass.trek_ammo => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") case ObjectClass.upgrade_canister => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") case ObjectClass.wasp_gun_ammo => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") case ObjectClass.wasp_rocket_ammo => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") case ObjectClass.winchester_ammo => DroppedItemData.genericCodec(AmmoBoxData.codec, "ammo box") //weapons case ObjectClass.beamer => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.chaingun_12mm => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.chaingun_15mm => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.ace_deployable => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.advanced_missile_launcher_t => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.anniversary_gun => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.anniversary_guna => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.anniversary_gunb => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.aphelion_immolation_cannon => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.aphelion_laser => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.aphelion_laser_left => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.aphelion_laser_right => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.aphelion_plasma_rocket_pod => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.aphelion_ppa => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.aphelion_ppa_left => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.aphelion_ppa_right => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.aphelion_starfire => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.aphelion_starfire_left => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.aphelion_starfire_right => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.aphelion_immolation_cannon => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.aphelion_laser => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.aphelion_laser_left => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.aphelion_laser_right => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.aphelion_plasma_rocket_pod => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.aphelion_ppa => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.aphelion_ppa_left => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.aphelion_ppa_right => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.aphelion_starfire => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.aphelion_starfire_left => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.aphelion_starfire_right => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.bolt_driver => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.chainblade => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.chaingun_p => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.colossus_burster => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.colossus_burster_left => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.colossus_burster_right => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.colossus_chaingun => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.colossus_chaingun_left => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.colossus_chaingun_right => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.colossus_cluster_bomb_pod => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.colossus_dual_100mm_cannons => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.colossus_tank_cannon => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.colossus_tank_cannon_left => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.colossus_tank_cannon_right => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.colossus_burster => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.colossus_burster_left => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.colossus_burster_right => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.colossus_chaingun => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.colossus_chaingun_left => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.colossus_chaingun_right => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.colossus_cluster_bomb_pod => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.colossus_dual_100mm_cannons => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.colossus_tank_cannon => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.colossus_tank_cannon_left => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.colossus_tank_cannon_right => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.cycler => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.cycler_v2 => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.cycler_v3 => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.cycler_v4 => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.energy_gun => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.energy_gun_nc => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.energy_gun_tr => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.energy_gun_vs => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.energy_gun => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.energy_gun_nc => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.energy_gun_tr => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.energy_gun_vs => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.flamethrower => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.flechette => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.forceblade => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.fragmentation_grenade => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.gauss => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.heavy_sniper => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.hellfire => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.hellfire => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.hunterseeker => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.ilc9 => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.isp => DroppedItemData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.jammer_grenade => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.katana => DroppedItemData.genericCodec(WeaponData.codec(2), "weapon") case ObjectClass.lancer => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.lasher => DroppedItemData.genericCodec(WeaponData.codec, "weapon") @@ -1089,39 +1114,47 @@ object ObjectClass { case ObjectClass.magcutter => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.mini_chaingun => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.oicw => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.pellet_gun => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.peregrine_dual_machine_gun => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.peregrine_dual_machine_gun_left => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.peregrine_dual_machine_gun_right => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.peregrine_dual_rocket_pods => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.peregrine_mechhammer => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.peregrine_mechhammer_left => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.peregrine_mechhammer_right => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.peregrine_particle_cannon => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.peregrine_sparrow => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.peregrine_sparrow_left => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.peregrine_sparrow_right => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.peregrine_dual_machine_gun => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.peregrine_dual_machine_gun_left => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.peregrine_dual_machine_gun_right => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.peregrine_dual_rocket_pods => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.peregrine_mechhammer => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.peregrine_mechhammer_left => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.peregrine_mechhammer_right => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.peregrine_particle_cannon => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.peregrine_sparrow => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.peregrine_sparrow_left => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.peregrine_sparrow_right => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.phoenix => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.pulsar => DroppedItemData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.plasma_grenade => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.punisher => DroppedItemData.genericCodec(WeaponData.codec(2), "weapon") case ObjectClass.r_shotgun => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.radiator => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.repeater => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.rocklet => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.six_shooter => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.spiker => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.spitfire_aa_weapon => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.spitfire_weapon => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.spitfire_aa_weapon => DroppedItemData.genericCodec(WeaponData.codec, "weapon") +// case ObjectClass.spitfire_weapon => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.striker => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.suppressor => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.thumper => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.winchester => DroppedItemData.genericCodec(WeaponData.codec, "weapon") + //other weapons + case ObjectClass.ace_deployable => DroppedItemData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.advanced_missile_launcher_t => DroppedItemData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.chaingun_12mm => DroppedItemData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.chaingun_15mm => DroppedItemData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.chaingun_p => DroppedItemData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.cycler_v2 => DroppedItemData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.cycler_v3 => DroppedItemData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.cycler_v4 => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.dynomite => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.frag_grenade => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.generic_grenade => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.jammer_grenade => DroppedItemData.genericCodec(WeaponData.codec, "weapon") case ObjectClass.mine_sweeper => DroppedItemData.genericCodec(WeaponData.codec, "weapon") - case ObjectClass.plasma_grenade => DroppedItemData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.pellet_gun => DroppedItemData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.six_shooter => DroppedItemData.genericCodec(WeaponData.codec, "weapon") + case ObjectClass.winchester => DroppedItemData.genericCodec(WeaponData.codec, "weapon") //medkits case ObjectClass.medkit => DroppedItemData.genericCodec(AmmoBoxData.codec, "medkit") case ObjectClass.super_armorkit => DroppedItemData.genericCodec(AmmoBoxData.codec, "repair kit") @@ -1161,34 +1194,72 @@ object ObjectClass { case ObjectClass.starfire_projectile => ConstructorData.genericCodec(TrackedProjectileData.codec, "projectile") case ObjectClass.striker_missile_targeting_projectile => ConstructorData.genericCodec(TrackedProjectileData.codec, "projectile") //vehicles - case ObjectClass.ams => ConstructorData.genericCodec(AMSData.codec, "ams") + case ObjectClass.ams => ConstructorData.genericCodec(VehicleData.codec(VehicleFormat.Utility), "ams") case ObjectClass.ams_destroyed => ConstructorData.genericCodec(DestroyedVehicleData.codec, "wreckage") - case ObjectClass.ant => ConstructorData.genericCodec(ANTData.codec, "ant") + case ObjectClass.ant => ConstructorData.genericCodec(VehicleData.codec(VehicleFormat.Utility), "ant") case ObjectClass.ant_destroyed => ConstructorData.genericCodec(DestroyedVehicleData.codec, "wreckage") - case ObjectClass.aurora => ConstructorData.genericCodec(VehicleData.codec(2)(), "vehicle") - case ObjectClass.battlewagon => ConstructorData.genericCodec(VehicleData.codec(4)(), "vehicle") + case ObjectClass.apc_destroyed => ConstructorData.genericCodec(DestroyedVehicleData.codec, "wreckage") + case ObjectClass.apc_nc => ConstructorData.genericCodec(VehicleData.codec, "vehicle") + case ObjectClass.apc_tr => ConstructorData.genericCodec(VehicleData.codec, "vehicle") + case ObjectClass.apc_vs => ConstructorData.genericCodec(VehicleData.codec, "vehicle") + //case ObjectClass.aphelion_destroyed => normal @ 0 health + case ObjectClass.aphelion_flight => ConstructorData.genericCodec(VehicleData.codec(VehicleFormat.Battleframe), "vehicle") + case ObjectClass.aphelion_gunner => ConstructorData.genericCodec(VehicleData.codec(VehicleFormat.Battleframe), "vehicle") + case ObjectClass.aurora => ConstructorData.genericCodec(VehicleData.codec, "vehicle") + case ObjectClass.battlewagon => ConstructorData.genericCodec(VehicleData.codec, "vehicle") + //case ObjectClass.colossus_destroyed => normal @ 0 health + case ObjectClass.colossus_flight => ConstructorData.genericCodec(VehicleData.codec(VehicleFormat.Battleframe), "vehicle") + case ObjectClass.colossus_gunner => ConstructorData.genericCodec(VehicleData.codec(VehicleFormat.Battleframe), "vehicle") case ObjectClass.droppod => ConstructorData.genericCodec(DroppodData.codec, "droppod") + case ObjectClass.dropship => ConstructorData.genericCodec(VehicleData.codec(VehicleFormat.Variant), "vehicle") + case ObjectClass.dropship_destroyed => ConstructorData.genericCodec(DestroyedVehicleData.codec, "wreckage") + case ObjectClass.flail => ConstructorData.genericCodec(VehicleData.codec(VehicleFormat.Variant), "vehicle") + case ObjectClass.flail_destroyed => ConstructorData.genericCodec(DestroyedVehicleData.codec, "wreckage") case ObjectClass.fury => ConstructorData.genericCodec(VehicleData.codec, "vehicle") + case ObjectClass.galaxy_gunship => ConstructorData.genericCodec(VehicleData.codec(VehicleFormat.Variant), "vehicle") + case ObjectClass.liberator => ConstructorData.genericCodec(VehicleData.codec(VehicleFormat.Variant), "vehicle") + case ObjectClass.liberator_destroyed => ConstructorData.genericCodec(DestroyedVehicleData.codec, "wreckage") + case ObjectClass.lightgunship => ConstructorData.genericCodec(VehicleData.codec(VehicleFormat.Variant), "vehicle") + case ObjectClass.lightgunship_destroyed => ConstructorData.genericCodec(DestroyedVehicleData.codec, "wreckage") case ObjectClass.lightning => ConstructorData.genericCodec(VehicleData.codec, "vehicle") case ObjectClass.lightning_destroyed => ConstructorData.genericCodec(DestroyedVehicleData.codec, "wreckage") - case ObjectClass.mediumtransport => ConstructorData.genericCodec(VehicleData.codec(2)(), "vehicle") + case ObjectClass.lodestar => ConstructorData.genericCodec(VehicleData.codec(VehicleFormat.Variant), "vehicle") + case ObjectClass.lodestar_destroyed => ConstructorData.genericCodec(DestroyedVehicleData.codec, "wreckage") + case ObjectClass.magrider => ConstructorData.genericCodec(VehicleData.codec, "vehicle") + case ObjectClass.magrider_destroyed => ConstructorData.genericCodec(DestroyedVehicleData.codec, "wreckage") + case ObjectClass.mediumtransport => ConstructorData.genericCodec(VehicleData.codec, "vehicle") case ObjectClass.mediumtransport_destroyed => ConstructorData.genericCodec(DestroyedVehicleData.codec, "wreckage") + case ObjectClass.mosquito => ConstructorData.genericCodec(VehicleData.codec(VehicleFormat.Variant), "vehicle") + case ObjectClass.mosquito_destroyed => ConstructorData.genericCodec(DestroyedVehicleData.codec, "wreckage") case ObjectClass.orbital_shuttle => ConstructorData.genericCodec(OrbitalShuttleData.codec_pos, "HART") + //case ObjectClass.peregrine_destroyed => normal @ 0 health + case ObjectClass.peregrine_flight => ConstructorData.genericCodec(VehicleData.codec(VehicleFormat.Battleframe), "vehicle") + case ObjectClass.peregrine_gunner => ConstructorData.genericCodec(VehicleData.codec(VehicleFormat.Battleframe), "vehicle") + case ObjectClass.phantasm => ConstructorData.genericCodec(VehicleData.codec(VehicleFormat.Variant), "vehicle") + //case ObjectClass.phantasm_destroyed => normal @ 0 health + case ObjectClass.prowler => ConstructorData.genericCodec(VehicleData.codec, "vehicle") + case ObjectClass.prowler_destroyed => ConstructorData.genericCodec(DestroyedVehicleData.codec, "wreckage") case ObjectClass.quadassault => ConstructorData.genericCodec(VehicleData.codec, "vehicle") case ObjectClass.quadassault_destroyed => ConstructorData.genericCodec(DestroyedVehicleData.codec, "wreckage") - case ObjectClass.quadstealth => ConstructorData.genericCodec(VehicleData.codec(0)(), "vehicle") + case ObjectClass.quadstealth => ConstructorData.genericCodec(VehicleData.codec, "vehicle") case ObjectClass.quadstealth_destroyed => ConstructorData.genericCodec(DestroyedVehicleData.codec, "wreckage") - case ObjectClass.switchblade => ConstructorData.genericCodec(Vehicle2Data.codec, "vehicle") + case ObjectClass.router => ConstructorData.genericCodec(VehicleData.codec(VehicleFormat.Variant), "vehicle") + case ObjectClass.router_destroyed => ConstructorData.genericCodec(DestroyedVehicleData.codec, "wreckage") + case ObjectClass.switchblade => ConstructorData.genericCodec(VehicleData.codec(VehicleFormat.Variant), "vehicle") case ObjectClass.switchblade_destroyed => ConstructorData.genericCodec(DestroyedVehicleData.codec, "wreckage") - case ObjectClass.threemanheavybuggy => ConstructorData.genericCodec(VehicleData.codec(2)(), "vehicle") + case ObjectClass.threemanheavybuggy => ConstructorData.genericCodec(VehicleData.codec, "vehicle") case ObjectClass.threemanheavybuggy_destroyed => ConstructorData.genericCodec(DestroyedVehicleData.codec, "wreckage") - case ObjectClass.thunderer => ConstructorData.genericCodec(VehicleData.codec(2)(), "vehicle") + case ObjectClass.thunderer => ConstructorData.genericCodec(VehicleData.codec, "vehicle") case ObjectClass.two_man_assault_buggy => ConstructorData.genericCodec(VehicleData.codec, "vehicle") case ObjectClass.two_man_assault_buggy_destroyed => ConstructorData.genericCodec(DestroyedVehicleData.codec, "wreckage") case ObjectClass.twomanheavybuggy => ConstructorData.genericCodec(VehicleData.codec, "vehicle") case ObjectClass.twomanheavybuggy_destroyed => ConstructorData.genericCodec(DestroyedVehicleData.codec, "wreckage") case ObjectClass.twomanhoverbuggy => ConstructorData.genericCodec(VehicleData.codec, "vehicle") case ObjectClass.twomanhoverbuggy_destroyed => ConstructorData.genericCodec(DestroyedVehicleData.codec, "wreckage") + case ObjectClass.vanguard => ConstructorData.genericCodec(VehicleData.codec, "vehicle") + case ObjectClass.vanguard_destroyed => ConstructorData.genericCodec(DestroyedVehicleData.codec, "wreckage") + case ObjectClass.vulture => ConstructorData.genericCodec(VehicleData.codec(VehicleFormat.Variant), "vehicle") + case ObjectClass.wasp => ConstructorData.genericCodec(VehicleData.codec(VehicleFormat.Variant), "vehicle") //other case ObjectClass.ams_respawn_tube => DroppedItemData.genericCodec(CommonTerminalData.codec, "terminal") case ObjectClass.avatar => ConstructorData.genericCodec(CharacterData.codec, "avatar") diff --git a/common/src/main/scala/net/psforever/packet/game/objectcreate/Prefab.scala b/common/src/main/scala/net/psforever/packet/game/objectcreate/Prefab.scala index d0d4c669..8d3a6065 100644 --- a/common/src/main/scala/net/psforever/packet/game/objectcreate/Prefab.scala +++ b/common/src/main/scala/net/psforever/packet/game/objectcreate/Prefab.scala @@ -1,153 +1,422 @@ // Copyright (c) 2017 PSForever package net.psforever.packet.game.objectcreate +import net.psforever.packet.game.PlanetSideGUID +import net.psforever.types.PlanetSideEmpire + /** * A compilation of the common `*Data` objects that would be used for stock game objects. * Each function is named after the `ObjectClass` name (internal name) it creates. * No `Prefab` assumes empire allegiance or initial health. + * This file is more useful for reference, rather than application. */ object Prefab { - import net.psforever.packet.game.PlanetSideGUID - import net.psforever.types.PlanetSideEmpire - object Vehicle { - def ams(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, driveState : DriveState.Value, matrix_guid : PlanetSideGUID, respawn_guid : PlanetSideGUID, term_a_guid : PlanetSideGUID, term_b_guid : PlanetSideGUID) : AMSData = { - AMSData(CommonFieldData(loc, faction, 0), health, driveState, matrix_guid, respawn_guid, term_a_guid, term_b_guid) + def ams(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, driveState : DriveState.Value, matrix_guid : PlanetSideGUID, respawn_guid : PlanetSideGUID, term_a_guid : PlanetSideGUID, term_b_guid : PlanetSideGUID) : VehicleData = { + VehicleData(CommonFieldData(loc, faction, 0), 0, health, false, false, driveState, false, false, false, Some(UtilityVehicleData(0)), + Some(InventoryData(List( + InternalSlot(ObjectClass.matrix_terminalc, matrix_guid, 1, CommonTerminalData(faction)), + InternalSlot(ObjectClass.ams_respawn_tube, respawn_guid, 2, CommonTerminalData(faction)), + InternalSlot(ObjectClass.order_terminala, term_a_guid, 3, CommonTerminalData(faction)), + InternalSlot(ObjectClass.order_terminalb, term_b_guid, 4, CommonTerminalData(faction)) + ))) + )(VehicleFormat.Utility) } - def ant(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, driveState : DriveState.Value) : ANTData = { - ANTData(CommonFieldData(loc, faction, 0), health, driveState) + def ant(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, driveState : DriveState.Value) : VehicleData = { + VehicleData(CommonFieldData(loc, faction, 0), 0, health, false, false, driveState, false, false, false, Some(UtilityVehicleData(0)), None)(VehicleFormat.Utility) } def aurora(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, weapon1_guid : PlanetSideGUID, ammo11_guid : PlanetSideGUID, ammo12_guid : PlanetSideGUID, weapon2_guid : PlanetSideGUID, ammo21_guid : PlanetSideGUID, ammo22_guid : PlanetSideGUID) : VehicleData = { - VehicleData(CommonFieldData(loc, faction, 0), 0, health, 0, DriveState.State7, true, 0, - Some( - MountItem(ObjectClass.aurora_weapon_systema, weapon1_guid, 5, + VehicleData(CommonFieldData(loc, faction, 0), 0, health, false, false, DriveState.State7, true, false, false, None, + Some(InventoryData( + InventoryItemData(ObjectClass.aurora_weapon_systema, weapon1_guid, 5, WeaponData(0x6, 0x8, 0, ObjectClass.fluxpod_ammo, ammo11_guid, 0, AmmoBoxData(0x8), ObjectClass.fluxpod_ammo, ammo12_guid, 1, AmmoBoxData(0x8)) ) :: - MountItem(ObjectClass.aurora_weapon_systemb, weapon2_guid, 6, + InventoryItemData(ObjectClass.aurora_weapon_systemb, weapon2_guid, 6, WeaponData(0x6, 0x8, 0, ObjectClass.fluxpod_ammo, ammo21_guid, 0, AmmoBoxData(0x8), ObjectClass.fluxpod_ammo, ammo22_guid, 1, AmmoBoxData(0x8)) ) :: Nil - ) - )(2) + )) + )(VehicleFormat.Normal) } def battlewagon(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, weapon1_guid : PlanetSideGUID, ammo1_guid : PlanetSideGUID, weapon2_guid : PlanetSideGUID, ammo2_guid : PlanetSideGUID, weapon3_guid : PlanetSideGUID, ammo3_guid : PlanetSideGUID, weapon4_guid : PlanetSideGUID, ammo4_guid : PlanetSideGUID) : VehicleData = { - VehicleData(CommonFieldData(loc, faction, 0), 0, health, 0, DriveState.State7, true, 0, - Some( - MountItem(ObjectClass.battlewagon_weapon_systema, weapon1_guid, 5, + VehicleData(CommonFieldData(loc, faction, 0), 0, health, false, false, DriveState.State7, true, false, false, None, + Some(InventoryData( + InventoryItemData(ObjectClass.battlewagon_weapon_systema, weapon1_guid, 5, WeaponData(0x6, 0x8, 0, ObjectClass.bullet_15mm, ammo1_guid, 0, AmmoBoxData(0x8)) ) :: - MountItem(ObjectClass.battlewagon_weapon_systemb, weapon2_guid, 6, + InventoryItemData(ObjectClass.battlewagon_weapon_systemb, weapon2_guid, 6, WeaponData(0x6, 0x8, 0, ObjectClass.bullet_15mm, ammo2_guid, 0, AmmoBoxData(0x8)) ) :: - MountItem(ObjectClass.battlewagon_weapon_systemc, weapon3_guid, 7, + InventoryItemData(ObjectClass.battlewagon_weapon_systemc, weapon3_guid, 7, WeaponData(0x6, 0x8, 0, ObjectClass.bullet_15mm, ammo3_guid, 0, AmmoBoxData(0x8)) ) :: - MountItem(ObjectClass.battlewagon_weapon_systemd, weapon4_guid, 8, + InventoryItemData(ObjectClass.battlewagon_weapon_systemd, weapon4_guid, 8, WeaponData(0x6, 0x8, 0, ObjectClass.bullet_15mm, ammo4_guid, 0, AmmoBoxData(0x8)) ) :: Nil - ) - )(4) + )) + )(VehicleFormat.Normal) + } + + def dropship(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, weapon1_guid : PlanetSideGUID, ammo1_guid : PlanetSideGUID, weapon2_guid : PlanetSideGUID, ammo2_guid : PlanetSideGUID, weapon3_guid : PlanetSideGUID, ammo3_guid : PlanetSideGUID) : VehicleData = { + VehicleData(CommonFieldData(loc, faction, 2), 0, health, false, false, DriveState.State7, true, false, false, Some(VariantVehicleData(0)), + Some(InventoryData( + InventoryItemData(ObjectClass.cannon_dropship_20mm, weapon1_guid, 12, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_20mm, ammo1_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.cannon_dropship_20mm, weapon2_guid, 13, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_20mm, ammo2_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.dropship_rear_turret, weapon3_guid, 14, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_20mm, ammo3_guid, 0, AmmoBoxData(8)) + ) :: Nil + )) + )(VehicleFormat.Variant) + } + + def flail(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, weapon_guid : PlanetSideGUID, ammo_guid : PlanetSideGUID, terminal_guid : PlanetSideGUID) : VehicleData = { + VehicleData(CommonFieldData(loc, faction, 2), 0, health, false, false, DriveState.Mobile, false, false, false, Some(VariantVehicleData(0)), + Some(InventoryData( + InventoryItemData(ObjectClass.flail_weapon, weapon_guid, 1, + WeaponData(0x6, 0x8, 0, ObjectClass.ancient_ammo_vehicle, ammo_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.targeting_laser_dispenser, terminal_guid, 2, CommonTerminalData(faction, 2)) :: Nil + )) + )(VehicleFormat.Variant) } def fury(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, weapon_guid : PlanetSideGUID, ammo_guid : PlanetSideGUID) : VehicleData = { - VehicleData(CommonFieldData(loc, faction, 0), health, - MountItem(ObjectClass.fury_weapon_systema, weapon_guid, 1, - WeaponData(0x4, 0x8, ObjectClass.hellfire_ammo, ammo_guid, 0, AmmoBoxData(0x8)) - ) - ) + VehicleData(CommonFieldData(loc, faction, 0), 0, health, false, false, DriveState.State7, true, false, false, None, + Some(InventoryData( + InventoryItemData(ObjectClass.fury_weapon_systema, weapon_guid, 1, + WeaponData(0x4, 0x8, ObjectClass.hellfire_ammo, ammo_guid, 0, AmmoBoxData(0x8)) + ) :: Nil + )) + )(VehicleFormat.Normal) + } + + def galaxy_gunship(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, weapon1_guid : PlanetSideGUID, ammo1_guid : PlanetSideGUID, weapon2_guid : PlanetSideGUID, ammo2_guid : PlanetSideGUID, weapon3_guid : PlanetSideGUID, ammo3_guid : PlanetSideGUID, weapon4_guid : PlanetSideGUID, ammo4_guid : PlanetSideGUID, weapon5_guid : PlanetSideGUID, ammo5_guid : PlanetSideGUID) : VehicleData = { + VehicleData(CommonFieldData(loc, faction, 2), 0, health, false, false, DriveState.State7, true, false, false, Some(VariantVehicleData(0)), + Some(InventoryData( + InventoryItemData(ObjectClass.galaxy_gunship_cannon, weapon1_guid, 6, + WeaponData(0x6, 0x8, 0, ObjectClass.heavy_grenade_mortar, ammo1_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.galaxy_gunship_cannon, weapon2_guid, 7, + WeaponData(0x6, 0x8, 0, ObjectClass.heavy_grenade_mortar, ammo2_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.galaxy_gunship_tailgun, weapon3_guid, 8, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_35mm, ammo3_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.galaxy_gunship_gun, weapon4_guid, 9, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_35mm, ammo4_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.galaxy_gunship_gun, weapon5_guid, 10, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_35mm, ammo5_guid, 0, AmmoBoxData(8)) + ) :: Nil + )) + )(VehicleFormat.Variant) + } + + def juggernaut(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, weapon1_guid : PlanetSideGUID, ammo1_guid : PlanetSideGUID, weapon2_guid : PlanetSideGUID, ammo2_guid : PlanetSideGUID, weapon3_guid : PlanetSideGUID, ammo3_guid : PlanetSideGUID, weapon4_guid : PlanetSideGUID, ammo4_guid : PlanetSideGUID, weapon5_guid : PlanetSideGUID, ammo5_guid : PlanetSideGUID, weapon6_guid : PlanetSideGUID, ammo6_guid : PlanetSideGUID) : VehicleData = { + VehicleData(CommonFieldData(loc, faction, 2), 0, health, false, false, DriveState.State7, true, false, false, None, + Some(InventoryData( + InventoryItemData(ObjectClass.apc_weapon_systemc_tr, weapon1_guid, 11, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_15mm, ammo1_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.apc_weapon_systemb, weapon2_guid, 12, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_75mm, ammo2_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.apc_weapon_systema, weapon3_guid, 13, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_75mm, ammo3_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.apc_weapon_systemd_tr, weapon4_guid, 14, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_15mm, ammo4_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.apc_ballgun_r, weapon5_guid, 15, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_12mm, ammo5_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.apc_ballgun_l, weapon6_guid, 16, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_12mm, ammo6_guid, 0, AmmoBoxData(8)) + ) :: Nil + )) + )(VehicleFormat.Normal) + } + + def leviathan(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, weapon1_guid : PlanetSideGUID, ammo1_guid : PlanetSideGUID, weapon2_guid : PlanetSideGUID, ammo2_guid : PlanetSideGUID, weapon3_guid : PlanetSideGUID, ammo3_guid : PlanetSideGUID, weapon4_guid : PlanetSideGUID, ammo4_guid : PlanetSideGUID, weapon5_guid : PlanetSideGUID, ammo5_guid : PlanetSideGUID, weapon6_guid : PlanetSideGUID, ammo6_guid : PlanetSideGUID) : VehicleData = { + VehicleData(CommonFieldData(loc, faction, 2), 0, health, false, false, DriveState.State7, true, false, false, None, + Some(InventoryData( + InventoryItemData(ObjectClass.apc_weapon_systemc_vs, weapon1_guid, 11, + WeaponData(0x6, 0x8, 0, ObjectClass.flux_cannon_thresher_battery, ammo1_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.apc_weapon_systemb, weapon2_guid, 12, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_75mm, ammo2_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.apc_weapon_systema, weapon3_guid, 13, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_75mm, ammo3_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.apc_weapon_systemd_vs, weapon4_guid, 14, + WeaponData(0x6, 0x8, 0, ObjectClass.flux_cannon_thresher_battery, ammo4_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.apc_ballgun_r, weapon5_guid, 15, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_12mm, ammo5_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.apc_ballgun_l, weapon6_guid, 16, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_12mm, ammo6_guid, 0, AmmoBoxData(8)) + ) :: Nil + )) + )(VehicleFormat.Normal) + } + + def liberator(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, weapon1_guid : PlanetSideGUID, ammo1_guid : PlanetSideGUID, weapon2_guid : PlanetSideGUID, ammo2_guid : PlanetSideGUID, ammo3_guid : PlanetSideGUID, weapon3_guid : PlanetSideGUID, ammo4_guid : PlanetSideGUID) : VehicleData = { + VehicleData(CommonFieldData(loc, faction, 2), 0, health, false, false, DriveState.State7, true, false, false, Some(VariantVehicleData(0)), + Some(InventoryData( + InventoryItemData(ObjectClass.liberator_weapon_system, weapon1_guid, 3, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_35mm, ammo1_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.liberator_bomb_bay, weapon2_guid, 4, + WeaponData(0x6, 0x8, 0, ObjectClass.liberator_bomb, ammo2_guid, 0, AmmoBoxData(8), ObjectClass.liberator_bomb, ammo3_guid, 1, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.liberator_25mm_cannon, weapon3_guid, 5, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_25mm, ammo4_guid, 0 ,AmmoBoxData(8)) + ) :: Nil + )) + )(VehicleFormat.Variant) + } + + def lightgunship(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, weapon_guid : PlanetSideGUID, ammo1_guid : PlanetSideGUID, ammo2_guid : PlanetSideGUID) : VehicleData = { + VehicleData(CommonFieldData(loc, faction, 2), 0, health, false, false, DriveState.Mobile, false, false, false, Some(VariantVehicleData(0)), + Some(InventoryData( + InventoryItemData(445, weapon_guid, 1, + WeaponData(0x6, 0x8, 0, 16, ammo1_guid, 0, AmmoBoxData(8), 722, ammo2_guid,1, AmmoBoxData(8)) + ) :: Nil + )) + )(VehicleFormat.Variant) } def lightning(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, weapon_guid : PlanetSideGUID, ammo1_guid : PlanetSideGUID, ammo2_guid : PlanetSideGUID) : VehicleData = { - VehicleData(CommonFieldData(loc, faction, 0), health, - MountItem(ObjectClass.lightning_weapon_system, weapon_guid, 1, - WeaponData(0x4, 0x8, 0, ObjectClass.bullet_75mm, ammo1_guid, 0, AmmoBoxData(0x0), ObjectClass.bullet_25mm, ammo2_guid, 1, AmmoBoxData(0x0)) + VehicleData(CommonFieldData(loc, faction, 0), 0, health, false, false, DriveState.State7, true, false, false, None, + Some(InventoryData( + InventoryItemData(ObjectClass.lightning_weapon_system, weapon_guid, 1, + WeaponData(0x4, 0x8, 0, ObjectClass.bullet_75mm, ammo1_guid, 0, AmmoBoxData(0x0), ObjectClass.bullet_25mm, ammo2_guid, 1, AmmoBoxData(0x0)) + ) :: Nil) ) - ) + )(VehicleFormat.Normal) + } + + def lodestar(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, repair1_guid : PlanetSideGUID, repair2_guid : PlanetSideGUID, veh_rearm1_guid : PlanetSideGUID, veh_rearm2_guid : PlanetSideGUID, bfr_rearm1_guid : PlanetSideGUID, bfr_rearm2_guid : PlanetSideGUID) : VehicleData = { + VehicleData(CommonFieldData(loc, faction, 2), 0, health, false, false, DriveState.State7, true, false, false, Some(VariantVehicleData(0)), + Some(InventoryData(List( + InternalSlot(ObjectClass.lodestar_repair_terminal, repair1_guid, 2, CommonTerminalData(faction, 2)), + InternalSlot(ObjectClass.lodestar_repair_terminal, repair2_guid, 3, CommonTerminalData(faction, 2)), + InternalSlot(ObjectClass.multivehicle_rearm_terminal, veh_rearm1_guid, 4, CommonTerminalData(faction, 2)), + InternalSlot(ObjectClass.multivehicle_rearm_terminal, veh_rearm2_guid, 5, CommonTerminalData(faction, 2)), + InternalSlot(ObjectClass.bfr_rearm_terminal, bfr_rearm1_guid, 6, CommonTerminalData(faction, 2)), + InternalSlot(ObjectClass.bfr_rearm_terminal, bfr_rearm2_guid, 7, CommonTerminalData(faction, 2)) + ))) + )(VehicleFormat.Variant) + } + + def magrider(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, weapon1_guid : PlanetSideGUID, ammo1_guid : PlanetSideGUID, weapon2_guid : PlanetSideGUID, ammo2_guid : PlanetSideGUID) : VehicleData = { + VehicleData(CommonFieldData(loc, faction, 2), 0, health, false, false, DriveState.State7, true, false, false, None, + Some(InventoryData( + InventoryItemData(ObjectClass.particle_beam_magrider, weapon1_guid, 2, + WeaponData(0x6, 0x8, 0, ObjectClass.pulse_battery, ammo1_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.heavy_rail_beam_magrider, weapon2_guid, 3, + WeaponData(0x6, 0x8, 0, ObjectClass.heavy_rail_beam_battery, ammo2_guid, 0, AmmoBoxData(8)) + ) :: Nil + )) + )(VehicleFormat.Normal) } def mediumtransport(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, weapon1_guid : PlanetSideGUID, ammo1_guid : PlanetSideGUID, weapon2_guid : PlanetSideGUID, ammo2_guid : PlanetSideGUID): VehicleData = { - VehicleData(CommonFieldData(loc, faction, 0), 0, health, 0, DriveState.State7, true, 0, - Some( - MountItem(ObjectClass.mediumtransport_weapon_systemA, weapon1_guid, 5, + VehicleData(CommonFieldData(loc, faction, 0), 0, health, false, false, DriveState.State7, true, false, false, None, + Some(InventoryData( + InventoryItemData(ObjectClass.mediumtransport_weapon_systemA, weapon1_guid, 5, WeaponData(0x6, 0x8, ObjectClass.bullet_20mm, ammo1_guid, 0, AmmoBoxData(0x8)) ) :: - MountItem(ObjectClass.mediumtransport_weapon_systemB, weapon2_guid, 6, + InventoryItemData(ObjectClass.mediumtransport_weapon_systemB, weapon2_guid, 6, WeaponData(0x6, 0x8, ObjectClass.bullet_20mm, ammo2_guid, 0, AmmoBoxData(0x8)) ) :: Nil - ) - )(2) + )) + )(VehicleFormat.Normal) + } + + def mosquito(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, weapon_guid : PlanetSideGUID, ammo_guid : PlanetSideGUID) : VehicleData = { + VehicleData(CommonFieldData(loc, faction, 0), 0, health, false, false, DriveState.State7, true, false, false, Some(VariantVehicleData(0)), + Some(InventoryData( + InventoryItemData(ObjectClass.rotarychaingun_mosquito, weapon_guid, 1, + WeaponData(0x6, 0x8, ObjectClass.bullet_12mm, ammo_guid, 0, AmmoBoxData(8)) + ) :: Nil + )) + )(VehicleFormat.Variant) + } + + def phantasm(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int) : VehicleData = { + VehicleData(CommonFieldData(loc, faction, 2), 0, health, false, false, DriveState.State7, true, false, false, Some(VariantVehicleData(0)), None)(VehicleFormat.Variant) + } + + def prowler(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, weapon1_guid : PlanetSideGUID, ammo1_guid : PlanetSideGUID, weapon2_guid : PlanetSideGUID, ammo2_guid : PlanetSideGUID) : VehicleData = { + VehicleData(CommonFieldData(loc, faction, 2), 0, health, false, false, DriveState.State7, true, false, false, None, + Some(InventoryData( + InventoryItemData(ObjectClass.prowler_weapon_systemA, weapon1_guid, 3, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_105mm, ammo1_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.prowler_weapon_systemB, weapon2_guid, 4, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_15mm, ammo2_guid, 0, AmmoBoxData(8)) + ) :: Nil + )) + )(VehicleFormat.Normal) + } + + def router(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, terminal_guid : PlanetSideGUID) : VehicleData = { + VehicleData(CommonFieldData(loc, faction, 2), 0, health, false, false, DriveState.Mobile, false, false, false, Some(VariantVehicleData(0)), + Some(InventoryData( + InventoryItemData(ObjectClass.teleportpad_terminal, terminal_guid, 1, CommonTerminalData(faction, 2)) :: Nil + )) + )(VehicleFormat.Variant) } def quadassault(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, weapon_guid : PlanetSideGUID, ammo_guid : PlanetSideGUID) : VehicleData = { - VehicleData(CommonFieldData(loc, faction, 0), health, - MountItem(ObjectClass.quadassault_weapon_system, weapon_guid, 1, - WeaponData(0x6, 0x8, ObjectClass.bullet_12mm, ammo_guid, 0, AmmoBoxData(0x8)) - ) - ) + VehicleData(CommonFieldData(loc, faction, 0), 0, health, false, false, DriveState.State7, true, false, false, None, + Some(InventoryData( + InventoryItemData(ObjectClass.quadassault_weapon_system, weapon_guid, 1, + WeaponData(0x6, 0x8, ObjectClass.bullet_12mm, ammo_guid, 0, AmmoBoxData(0x8)) + ) :: Nil + )) + )(VehicleFormat.Normal) } def quadstealth(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int) : VehicleData = { - VehicleData(CommonFieldData(loc, faction, 0), 0, health, 0, DriveState.State7, false, 0)(0) + VehicleData(CommonFieldData(loc, faction, 0), 0, health, false, false, DriveState.State7, false, false, false, None, None)(VehicleFormat.Normal) } - def switchblade(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, driveState : DriveState.Value, weapon_guid : PlanetSideGUID, ammo1_guid : PlanetSideGUID, ammo2_guid : PlanetSideGUID) : Vehicle2Data = { - Vehicle2Data(CommonFieldData(loc, faction, 0), health, driveState, - MountItem(ObjectClass.scythe, weapon_guid, 1, - WeaponData(0x6, 0x8, 0, ObjectClass.ancient_ammo_vehicle, ammo1_guid, 0, AmmoBoxData(0x8), ObjectClass.ancient_ammo_vehicle, ammo2_guid, 1, AmmoBoxData(0x8)) - ) - ) + def switchblade(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, driveState : DriveState.Value, weapon_guid : PlanetSideGUID, ammo1_guid : PlanetSideGUID, ammo2_guid : PlanetSideGUID) : VehicleData = { + VehicleData(CommonFieldData(loc, faction, 0), 0, health, false, false, DriveState.State7, true, false, false, Some(VariantVehicleData(0)), + Some(InventoryData( + InventoryItemData(ObjectClass.scythe, weapon_guid, 1, + WeaponData(0x6, 0x8, 0, ObjectClass.ancient_ammo_vehicle, ammo1_guid, 0, AmmoBoxData(0x8), ObjectClass.ancient_ammo_vehicle, ammo2_guid, 1, AmmoBoxData(0x8)) + ) :: Nil + )) + )(VehicleFormat.Variant) } def threemanheavybuggy(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, weapon1_guid : PlanetSideGUID, ammo1_guid : PlanetSideGUID, weapon2_guid : PlanetSideGUID, ammo2_guid : PlanetSideGUID) : VehicleData = { - VehicleData(CommonFieldData(loc, faction, 0), 0, health, 0, DriveState.State7, true, 0, - Some( - MountItem(ObjectClass.chaingun_p, weapon1_guid, 3, + VehicleData(CommonFieldData(loc, faction, 0), 0, health, false, false, DriveState.State7, true, false, false, None, + Some(InventoryData( + InventoryItemData(ObjectClass.chaingun_p, weapon1_guid, 3, WeaponData(0x6, 0x8, 0, ObjectClass.bullet_12mm, ammo1_guid, 0, AmmoBoxData(0x8)) ) :: - MountItem(ObjectClass.grenade_launcher_marauder, weapon2_guid, 4, + InventoryItemData(ObjectClass.grenade_launcher_marauder, weapon2_guid, 4, WeaponData(0x6, 0x8, 0, ObjectClass.heavy_grenade_mortar, ammo2_guid, 0, AmmoBoxData(0x8)) ) :: Nil - ) - )(2) + )) + )(VehicleFormat.Normal) } def thunderer(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, weapon1_guid : PlanetSideGUID, ammo1_guid : PlanetSideGUID, weapon2_guid : PlanetSideGUID, ammo2_guid : PlanetSideGUID) : VehicleData = { - VehicleData(CommonFieldData(loc, faction, 0), 0, health, 0, DriveState.State7, true, 0, - Some( - MountItem(ObjectClass.thunderer_weapon_systema, weapon1_guid, 5, + VehicleData(CommonFieldData(loc, faction, 0), 0, health, false, false, DriveState.State7, true, false, false, None, + Some(InventoryData( + InventoryItemData(ObjectClass.thunderer_weapon_systema, weapon1_guid, 5, WeaponData(0x6, 0x8, 0, ObjectClass.gauss_cannon_ammo, ammo1_guid, 0, AmmoBoxData(0x8)) ) :: - MountItem(ObjectClass.thunderer_weapon_systemb, weapon2_guid, 6, + InventoryItemData(ObjectClass.thunderer_weapon_systemb, weapon2_guid, 6, WeaponData(0x6, 0x8, 0, ObjectClass.gauss_cannon_ammo, ammo2_guid, 0, AmmoBoxData(0x8)) ) :: Nil - ) - )(2) + )) + )(VehicleFormat.Normal) } def two_man_assault_buggy(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, weapon_guid : PlanetSideGUID, ammo_guid : PlanetSideGUID) : VehicleData = { - VehicleData(CommonFieldData(loc, faction, 0), health, - MountItem(ObjectClass.chaingun_p, weapon_guid, 2, - WeaponData(0x6, 0x8, ObjectClass.bullet_12mm, ammo_guid, 0, AmmoBoxData(0x8)) - ) - ) + VehicleData(CommonFieldData(loc, faction, 0), 0, health, false, false, DriveState.State7, true, false, false, None, + Some(InventoryData( + InventoryItemData(ObjectClass.chaingun_p, weapon_guid, 2, + WeaponData(0x6, 0x8, ObjectClass.bullet_12mm, ammo_guid, 0, AmmoBoxData(0x8)) + ) :: Nil + )) + )(VehicleFormat.Normal) } def twomanheavybuggy(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, weapon_guid : PlanetSideGUID, ammo_guid : PlanetSideGUID) : VehicleData = { - VehicleData(CommonFieldData(loc, faction, 0), health, - MountItem(ObjectClass.advanced_missile_launcher_t, weapon_guid, 2, - WeaponData(0x6, 0x8, 0, ObjectClass.firebird_missile, ammo_guid, 0, AmmoBoxData(0x8)) - ) - ) + VehicleData(CommonFieldData(loc, faction, 0), 0, health, false, false, DriveState.State7, true, false, false, None, + Some(InventoryData( + InventoryItemData(ObjectClass.advanced_missile_launcher_t, weapon_guid, 2, + WeaponData(0x6, 0x8, 0, ObjectClass.firebird_missile, ammo_guid, 0, AmmoBoxData(0x8)) + ) :: Nil + )) + )(VehicleFormat.Normal) } def twomanhoverbuggy(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, weapon_guid : PlanetSideGUID, ammo_guid : PlanetSideGUID) : VehicleData = { - VehicleData(CommonFieldData(loc, faction, 0), health, - MountItem(ObjectClass.flux_cannon_thresher, weapon_guid, 2, - WeaponData(0x6, 0x8, 0, ObjectClass.flux_cannon_thresher_battery, ammo_guid, 0, AmmoBoxData(0x8)) - ) - ) + VehicleData(CommonFieldData(loc, faction, 0), 0, health, false, false, DriveState.State7, true, false, false, None, + Some(InventoryData( + InventoryItemData(ObjectClass.flux_cannon_thresher, weapon_guid, 2, + WeaponData(0x6, 0x8, 0, ObjectClass.flux_cannon_thresher_battery, ammo_guid, 0, AmmoBoxData(0x8)) + ) :: Nil + )) + )(VehicleFormat.Normal) + } + + def vanguard(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, weapon_guid : PlanetSideGUID, ammo1_guid : PlanetSideGUID, ammo2_guid : PlanetSideGUID) : VehicleData = { + VehicleData(CommonFieldData(loc, faction, 2), 0, health, false, false, DriveState.State7, true, false, false, None, + Some(InventoryData( + InventoryItemData(ObjectClass.vanguard_weapon_system, weapon_guid, 2, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_150mm, ammo1_guid, 0, AmmoBoxData(8), ObjectClass.bullet_20mm, ammo2_guid, 1, AmmoBoxData(8)) + ) :: Nil + )) + )(VehicleFormat.Normal) + } + + def vindicator(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, weapon1_guid : PlanetSideGUID, ammo1_guid : PlanetSideGUID, weapon2_guid : PlanetSideGUID, ammo2_guid : PlanetSideGUID, weapon3_guid : PlanetSideGUID, ammo3_guid : PlanetSideGUID, weapon4_guid : PlanetSideGUID, ammo4_guid : PlanetSideGUID, weapon5_guid : PlanetSideGUID, ammo5_guid : PlanetSideGUID, weapon6_guid : PlanetSideGUID, ammo6_guid : PlanetSideGUID) : VehicleData = { + VehicleData(CommonFieldData(loc, faction, 2), 0, health, false, false, DriveState.State7, true, false, false, None, + Some(InventoryData( + InventoryItemData(ObjectClass.apc_weapon_systemc_nc, weapon1_guid, 11, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_20mm, ammo1_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.apc_weapon_systemb, weapon2_guid, 12, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_75mm, ammo2_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.apc_weapon_systema, weapon3_guid, 13, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_75mm, ammo3_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.apc_weapon_systemd_nc, weapon4_guid, 14, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_20mm, ammo4_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.apc_ballgun_r, weapon5_guid, 15, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_12mm, ammo5_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.apc_ballgun_l, weapon6_guid, 16, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_12mm, ammo6_guid, 0, AmmoBoxData(8)) + ) :: Nil + )) + )(VehicleFormat.Normal) + } + + def vulture(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, weapon1_guid : PlanetSideGUID, ammo1_guid : PlanetSideGUID, weapon2_guid : PlanetSideGUID, ammo2_guid : PlanetSideGUID, weapon3_guid : PlanetSideGUID, ammo3_guid : PlanetSideGUID) : VehicleData = { + VehicleData(CommonFieldData(loc, faction, 2), 0, health, false, false, DriveState.State7, true, false, false, Some(VariantVehicleData(0)), + Some(InventoryData( + InventoryItemData(ObjectClass.vulture_nose_weapon_system, weapon1_guid, 3, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_35mm, ammo1_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.vulture_bomb_bay, weapon2_guid, 4, + WeaponData(0x6, 0x8, 0, ObjectClass.liberator_bomb, ammo2_guid, 0, AmmoBoxData(8)) + ) :: + InventoryItemData(ObjectClass.vulture_tail_cannon, weapon3_guid, 5, + WeaponData(0x6, 0x8, 0, ObjectClass.bullet_25mm, ammo3_guid, 0, AmmoBoxData(8)) + ) :: Nil + )) + )(VehicleFormat.Variant) + } + + def wasp(loc : PlacementData, faction : PlanetSideEmpire.Value, health : Int, weapon_guid : PlanetSideGUID, ammo1_guid : PlanetSideGUID, ammo2_guid : PlanetSideGUID) : VehicleData = { + VehicleData(CommonFieldData(loc, faction, 0), 0, health, false, false, DriveState.Mobile, false, false, false, Some(VariantVehicleData(0)), + Some(InventoryData( + InventoryItemData(ObjectClass.wasp_weapon_system, weapon_guid, 1, + WeaponData(0x6, 0x8, 0, ObjectClass.wasp_gun_ammo, ammo1_guid, 0, AmmoBoxData(8), ObjectClass.wasp_rocket_ammo, ammo2_guid, 0, AmmoBoxData(8)) + ) :: Nil + )) + )(VehicleFormat.Variant) } } } diff --git a/common/src/main/scala/net/psforever/packet/game/objectcreate/Vehicle2Data.scala b/common/src/main/scala/net/psforever/packet/game/objectcreate/Vehicle2Data.scala deleted file mode 100644 index c338cc02..00000000 --- a/common/src/main/scala/net/psforever/packet/game/objectcreate/Vehicle2Data.scala +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright (c) 2017 PSForever -package net.psforever.packet.game.objectcreate - -import net.psforever.packet.Marshallable -import net.psforever.packet.game.objectcreate.MountItem.MountItem -import scodec.codecs._ -import scodec.{Attempt, Codec, Err} -import shapeless.{::, HNil} - -/** - * A representation of a generic vehicle, with optional mounted weapons. - * This data will help construct vehicular options such as the Switchblade and the Mosquito. - * @param basic data common to objects - * @param unk1 na - * @param health the amount of health the vehicle has, as a percentage of a filled bar - * @param unk2 na - * @param driveState the drivable condition - * @param unk4 na - * @param unk5 na - * @param mountings data regarding the mounted utilities, usually weapons - * @param mount_capacity implicit; - * the total number of mounted utilities allowed on this vehicle; - * defaults to 1; - * -1 or less ignores the imposed checks - * @see `VehicleData` - */ -final case class Vehicle2Data(basic : CommonFieldData, - unk1 : Int, - health : Int, - unk2 : Int, - driveState : DriveState.Value, - unk4 : Boolean, - unk5 : Int, - unk6 : Int, - mountings : Option[List[MountItem]] = None - )(implicit val mount_capacity : Int = 1) extends ConstructorData { - override def bitsize : Long = { - val basicSize = basic.bitsize - val mountSize = if(mountings.isDefined) { - var bSize : Long = 0L - for(item <- mountings.get) { - bSize += item.bitsize - } - 10 + bSize - } - else { - 0L - } - 11L + VehicleData.baseVehicleSize + basicSize + mountSize - } -} - -object Vehicle2Data extends Marshallable[Vehicle2Data] { - /** - * Overloaded constructor that mandates information about a single weapon mount. - * @param basic data common to objects - * @param health the amount of health the object has, as a percentage of a filled bar - * @param mount data regarding the mounted weapon - * @return a `Vehicle2Data` object - */ - def apply(basic : CommonFieldData, health : Int, mount : MountItem) : Vehicle2Data = - Vehicle2Data(basic, 0, health, 0, DriveState.Mobile, false, 0, 0, Some(mount :: Nil)) - - /** - * Overloaded constructor that mandates information about a single weapon mount and deployment state. - * @param basic data common to objects - * @param health the amount of health the object has, as a percentage of a filled bar - * @param driveState the drivable condition - * @param mount data regarding the mounted weapon - * @return a `Vehicle2Data` object - */ - def apply(basic : CommonFieldData, health : Int, driveState : DriveState.Value, mount : MountItem) : Vehicle2Data = - Vehicle2Data(basic, 0, health, 0, driveState, false, 0, 0, Some(mount :: Nil)) - - /** - * A `Codec` for `Vehicle2Data`. - * @param mount_capacity the total number of mounted weapons that are attached to this vehicle; - * defaults to 1 - * @param mountCheck implicit; - * an evaluation of the provided `List` of objects; - * a function that takes an object and returns `true` if the object passed its defined test; - * defaults to `onlyWeapons` - * @return a `VehicleData` object or a `BitVector` - */ - def codec(mount_capacity : Int = 1)(implicit mountCheck : (List[MountItem]) => Boolean = VehicleData.onlyWeapons) : Codec[Vehicle2Data] = ( - VehicleData.basic_vehicle_codec :+ - uint8L :+ - uint2L :+ - optional(bool, "mountings" | VehicleData.mountedUtilitiesCodec(mountCheck)) - ).exmap[Vehicle2Data] ( - { - case basic :: u1 :: health :: u2 :: driveState :: u4 :: u5 :: u6 :: mountings :: HNil => - val onboardMountCount : Int = if(mountings.isDefined) { mountings.get.size } else { 0 } - if(mount_capacity > -1 && mount_capacity != onboardMountCount) { - Attempt.failure(Err(s"vehicle decodes wrong number of mounts - actual $onboardMountCount, expected $mount_capacity")) - } - else { - Attempt.successful(Vehicle2Data(basic, u1, health, u2, driveState, u4, u5, u6, mountings)(onboardMountCount)) - } - - case _ => - Attempt.failure(Err("invalid vehicle data format")) - }, - { - case obj @ Vehicle2Data(basic, u1, health, u2, driveState, u4, u5, u6, mountings) => - val objMountCapacity = obj.mount_capacity - if(objMountCapacity < 0 || mount_capacity < 0) { - Attempt.successful(basic :: u1 :: health :: u2 :: driveState :: u4 :: u5 :: u6 :: mountings :: HNil) - } - else { - val onboardMountCount : Int = if(mountings.isDefined) { mountings.get.size } else { 0 } - if(mount_capacity != objMountCapacity) { - Attempt.failure(Err(s"different encoding expectations for amount of mounts - actual $objMountCapacity, expected $mount_capacity")) - } - else if(mount_capacity != onboardMountCount) { - Attempt.failure(Err(s"vehicle encodes wrong number of mounts - actual $onboardMountCount, expected $mount_capacity")) - } - else { - Attempt.successful(basic :: u1 :: health :: u2 :: driveState :: u4 :: u5 :: u6 :: mountings :: HNil) - } - } - - case _ => - Attempt.failure(Err("invalid vehicle data format")) - } - ) - - implicit val codec : Codec[Vehicle2Data] = codec() -} diff --git a/common/src/main/scala/net/psforever/packet/game/objectcreate/VehicleData.scala b/common/src/main/scala/net/psforever/packet/game/objectcreate/VehicleData.scala index 950e5e6f..8292a5b2 100644 --- a/common/src/main/scala/net/psforever/packet/game/objectcreate/VehicleData.scala +++ b/common/src/main/scala/net/psforever/packet/game/objectcreate/VehicleData.scala @@ -1,15 +1,51 @@ // Copyright (c) 2017 PSForever package net.psforever.packet.game.objectcreate - import net.psforever.packet.Marshallable -import net.psforever.packet.game.objectcreate.MountItem.MountItem -import scodec.codecs._ +import scodec.Attempt.{Failure, Successful} import scodec.{Attempt, Codec, Err} +import scodec.codecs._ import shapeless.{::, HNil} /** - * A representation of a generic vehicle, with optional mounted weapons. - * This data will help construct most of the game's vehicular options such as the Lightning and the Harasser.
+ * An `Enumeration` of the various formats that known structures that the stream of bits for `VehicleData` can assume. + */ +object VehicleFormat extends Enumeration { + type Type = Value + + val + Battleframe, //future expansion? + Normal, + Utility, + Variant = Value +} + +/** + * A basic `Trait` connecting all of the vehicle data formats (excepting `Normal`/`None`). + */ +sealed trait SpecificVehicleData extends StreamBitSize + +/** + * The format of vehicle data for the type of vehicles that are considered "utility." + * The vehicles in this category are two: + * the advanced nanite transport, and + * the advanced mobile station. + * @param unk na + */ +final case class UtilityVehicleData(unk : Int) extends SpecificVehicleData { + override def bitsize : Long = 6L +} + +/** + * A common format variant of vehicle data. + * This category includes all flying vehicles and the ancient cavern vehicles. + * @param unk na + */ +final case class VariantVehicleData(unk : Int) extends SpecificVehicleData { + override def bitsize : Long = 8L +} + +/** + * A representation of a generic vehicle.
*
* Vehicles utilize their own packet to communicate position to the server, known as `VehicleStateMessage`. * This takes the place of `PlayerStateMessageUpstream` when the player avatar is in control; @@ -17,186 +53,174 @@ import shapeless.{::, HNil} * If the vehicle is sufficiently complicated, a `ChildObjectStateMessage` will be used. * This packet will control any turret(s) on the vehicle. * For very complicated vehicles, the packets `FrameVehicleStateMessage` and `VehicleSubStateMessage` will also be employed. - * The tasks that these packets perform are different based on the vehicle that responds or generates them.
- *
- * Vehicles have a variety of features. - * They have their own inventory space, seating space for driver and passengers, Infantry mounting positions for the former two, and weapon mounting positions. - * Specialized vehicles also have terminals attached to them. - * The trunk is little different from player character inventories save for capacity and that it must be manually accessed. - * It is usually on the rear of the vehicle if that vehicle has a trunk at all. - * Weapons and infantry are allocated mounting slots from the same list. - * Weapons are constructed in their given slot with the vehicle itself and Infantry sit aside the weapons. - * Certain slots ("seats") allow control of one of the weapons in another slot ("weapon mounting"). - * ("Seat" and "weapon mounting" do not coincide numerically.) - * For trunk and for Infantry slots, various glyphs are projected onto the ground, called "mounting positions." - * Standing nearly on top of the glyph and facing the vehicle allows access or seat-taking. - * ("Seat" and "mounting positions" will not necessarily coincide numerically either.)
- *
- * Outside of managing mounted weaponry, any vehicle with special "utilities" must be handled as a special case. - * Utilities are plastered onto the chassis and carried around with the vehicle. - * Some vehicles have to go through a sessile physical conversion known as "deploying" to get access to their utilities.
- *
- * An "expected" number of mounting data can be passed into the class for the purposes of validating input. + * The tasks that these packets perform are different based on the vehicle that responds or generates them. * @param basic data common to objects * @param unk1 na - * @param health the amount of health the vehicle has, as a percentage of a filled bar + * @param health the amount of health the vehicle has, as a percentage of a filled bar (255) * @param unk2 na - * @param driveState the drivable condition + * @param no_mount_points do not display entry points for the seats + * @param driveState a representation for the current mobility state; + * various vehicles also use this field to indicate "deployment," e.g., AMS + * @param unk3 na + * @param unk5 na + * @param cloak if a cloakable vehicle is cloaked * @param unk4 na - * @param unk5 na; - * 1 causes the `quadstealth` (Wraith) to cloak - * @param mountings data regarding the mounted utilities, usually weapons - * @param mount_capacity implicit; - * the total number of mounted utilities allowed on this vehicle; - * defaults to 1; - * -1 or less ignores the imposed checks - * @see `Vehicle2Data` + * @param inventory the seats, mounted weapons, and utilities (such as terminals) that are currently included; + * will also include trunk contents + * @param vehicle_type a modifier for parsing the vehicle data format differently; + * defaults to `Normal` */ final case class VehicleData(basic : CommonFieldData, unk1 : Int, health : Int, - unk2 : Int, + unk2 : Boolean, + no_mount_points : Boolean, driveState : DriveState.Value, - unk4 : Boolean, - unk5 : Int, - mountings : Option[List[MountItem]] = None - )(implicit val mount_capacity : Int = 1) extends ConstructorData { + unk3 : Boolean, + unk5 : Boolean, + cloak : Boolean, + unk4 : Option[SpecificVehicleData], + inventory : Option[InventoryData] = None + )(val vehicle_type : VehicleFormat.Value = VehicleFormat.Normal) extends ConstructorData { override def bitsize : Long = { val basicSize = basic.bitsize - val mountSize = if(mountings.isDefined) { - var bSize : Long = 0L - for(item <- mountings.get) { - bSize += item.bitsize - } - 10 + bSize - } - else { - 0L - } - 3L + VehicleData.baseVehicleSize + basicSize + mountSize + val extraBitsSize : Long = if(unk4.isDefined) { unk4.get.bitsize } else { 0L } + val inventorySize = if(inventory.isDefined) { inventory.get.bitsize } else { 0L } + 24L + basicSize + extraBitsSize + inventorySize } } object VehicleData extends Marshallable[VehicleData] { - val baseVehicleSize : Long = 21L //2u + 8u + 2u + 8u + 1u - /** - * Overloaded constructor that mandates information about a single weapon mount. + * Overloaded constructor for specifically handling `Normal` vehicle format. * @param basic data common to objects - * @param health the amount of health the object has, as a percentage of a filled bar - * @param mount data regarding the mounted weapon + * @param unk1 na + * @param health the amount of health the vehicle has, as a percentage of a filled bar (255) + * @param unk2 na + * @param driveState a representation for the current mobility state; + * @param unk3 na + * @param unk4 na + * @param inventory the seats, mounted weapons, and utilities (such as terminals) that are currently included * @return a `VehicleData` object */ - def apply(basic : CommonFieldData, health : Int, mount : MountItem) : VehicleData = - VehicleData(basic, 0, health, 0, DriveState.Mobile, false, 0, Some(mount :: Nil)) + def apply(basic : CommonFieldData, unk1 : Int, health : Int, unk2 : Int, driveState : DriveState.Value, unk3 : Boolean, unk4 : Int, inventory : Option[InventoryData]) : VehicleData = { + new VehicleData(basic, unk1, health, unk2>0, false, driveState, unk3, unk4>0, false, None, inventory)(VehicleFormat.Normal) + } /** - * Overloaded constructor that mandates information about a single weapon mount and deployment state. + * Overloaded constructor for specifically handling `Utility` vehicle format. * @param basic data common to objects - * @param health the amount of health the object has, as a percentage of a filled bar - * @param driveState the drivable condition - * @param mount data regarding the mounted weapon - * @return a `Vehicle2Data` object + * @param unk1 na + * @param health the amount of health the vehicle has, as a percentage of a filled bar (255) + * @param unk2 na + * @param driveState a representation for the current mobility state; + * @param unk3 na + * @param unk4 utility-specific field + * @param unk5 na + * @param inventory the seats, mounted weapons, and utilities (such as terminals) that are currently included + * @return a `VehicleData` object */ - def apply(basic : CommonFieldData, health : Int, driveState : DriveState.Value, mount : MountItem) : VehicleData = - VehicleData(basic, 0, health, 0, driveState, false, 0, Some(mount :: Nil)) + def apply(basic : CommonFieldData, unk1 : Int, health : Int, unk2 : Int, driveState : DriveState.Value, unk3 : Boolean, unk4 : UtilityVehicleData, unk5 : Int, inventory : Option[InventoryData]) : VehicleData = { + new VehicleData(basic, unk1, health, unk2>0, false, driveState, unk3, unk5>0, false, Some(unk4), inventory)(VehicleFormat.Utility) + } /** - * A `Codec` for mounted utilities, generally weapons (as `WeaponData`). - * @param mountCheck a function that takes a `List` of `InternalSlot` objects and returns `true` if those objects passed its test - * @return a `List` of mounted objects or a `BitVector` of the same - * @see `InventoryData` + * Overloaded constructor for specifically handling `Variant` vehicle format. + * @param basic data common to objects + * @param unk1 na + * @param health the amount of health the vehicle has, as a percentage of a filled bar (255) + * @param unk2 na + * @param driveState a representation for the current mobility state; + * @param unk3 na + * @param unk4 variant-specific field + * @param unk5 na + * @param inventory the seats, mounted weapons, and utilities (such as terminals) that are currently included + * @return a `VehicleData` object */ - def mountedUtilitiesCodec(mountCheck : (List[MountItem]) => Boolean) : Codec[List[MountItem]] = - InventoryData.codec(MountItem.codec).exmap[List[MountItem]] ( - { - case InventoryData(list) => - if(!mountCheck(list)) { - Attempt.failure(Err("vehicle mount decoding is disallowed by test failure")) - } - else { - Attempt.successful(list) - } - - case _ => - Attempt.failure(Err("invalid mounting data format")) - }, - { - case list => - if(list.size > 255) { - Attempt.failure(Err("vehicle encodes too many weapon mountings (255+ objects!)")) - } - else if(!mountCheck(list)) { - Attempt.failure(Err("vehicle mount encoding is disallowed by test failure")) - } - else { - Attempt.successful(InventoryData(list)) - } - } - ) + def apply(basic : CommonFieldData, unk1 : Int, health : Int, unk2 : Int, driveState : DriveState.Value, unk3 : Boolean, unk4 : VariantVehicleData, unk5 : Int, inventory : Option[InventoryData]) : VehicleData = { + new VehicleData(basic, unk1, health, unk2>0, false, driveState, unk3, unk5>0, false, Some(unk4), inventory)(VehicleFormat.Variant) + } /** - * These values are parsed by all vehicles. - * Comments about the fields are provided where helpful. + * `Codec` for the "utility" format. */ - val basic_vehicle_codec : Codec[CommonFieldData :: Int :: Int :: Int :: DriveState.Value :: Boolean :: HNil] = ( - CommonFieldData.codec :: //not certain if player_guid is valid - uint2L :: //often paired with the assumed 16u field in previous? - uint8L :: //usually "health" - uint2L :: //usually 0; second bit turns off vehicle seat entry points - DriveState.codec :: //special field (AMS and ANT use for deploy state) - bool //unknown but generally false; can cause stream misalignment if set when unexpected - ).as[CommonFieldData :: Int :: Int :: Int :: DriveState.Value :: Boolean :: HNil] - - /** - * Perform an evaluation of the provided object. - * @param list a List of objects to be compared against some criteria - * @return `true`, if the objects pass this test; false, otherwise - */ - def onlyWeapons(list : List[MountItem]) : Boolean = !list.exists(!_.obj.isInstanceOf[WeaponData]) - - /** - * A `Codec` for `VehicleData`. - * @param mount_capacity the total number of mounted weapons that are attached to this vehicle; - * defaults to 1 - * @param mountCheck implicit; - * an evaluation of the provided `List` of objects; - * a function that takes an object and returns `true` if the object passed its defined test; - * defaults to `onlyWeapons` - * @return a `VehicleData` object or a `BitVector` - */ - def codec(mount_capacity : Int = 1)(implicit mountCheck : (List[MountItem]) => Boolean = onlyWeapons) : Codec[VehicleData] = ( - basic_vehicle_codec :+ - uint2L :+ - optional(bool, "mountings" | mountedUtilitiesCodec(mountCheck)) - ).exmap[VehicleData] ( + private val utility_data_codec : Codec[SpecificVehicleData] = uintL(6).hlist.exmap[SpecificVehicleData] ( { - case basic :: u1 :: health :: u2 :: driveState :: u4 :: u5 :: mountings :: HNil => - val onboardMountCount : Int = if(mountings.isDefined) { mountings.get.size } else { 0 } - if(mount_capacity > -1 && mount_capacity != onboardMountCount) { - Attempt.failure(Err(s"vehicle decodes wrong number of mounts - actual $onboardMountCount, expected $mount_capacity")) - } - else { - Attempt.successful(VehicleData(basic, u1, health, u2, driveState, u4, u5, mountings)(onboardMountCount)) - } + case n :: HNil => + Successful(UtilityVehicleData(n).asInstanceOf[SpecificVehicleData]) }, { - case obj @ VehicleData(basic, u1, health, u2, driveState, u4, u5, mountings) => - val objMountCapacity = obj.mount_capacity - if(objMountCapacity < 0 || mount_capacity < 0) { - Attempt.successful(basic :: u1 :: health :: u2 :: driveState :: u4 :: u5 :: mountings :: HNil) + case UtilityVehicleData(n) => + Successful(n :: HNil) + case _ => + Failure(Err("wrong kind of vehicle data object (wants 'Utility')")) + } + ) + /** + * `Codec` for the "variant" format. + */ + private val variant_data_codec : Codec[SpecificVehicleData] = uint8L.hlist.exmap[SpecificVehicleData] ( + { + case n :: HNil => + Successful(VariantVehicleData(n).asInstanceOf[SpecificVehicleData]) + }, + { + case VariantVehicleData(n) => + Successful(n :: HNil) + case _ => + Failure(Err("wrong kind of vehicle data object (wants 'Variant')")) + } + ) + + /** + * Select an appropriate `Codec` in response to the requested stream format + * @param vehicleFormat the requested format + * @return the appropriate `Codec` for parsing that format + */ + private def selectFormatReader(vehicleFormat : VehicleFormat.Value) : Codec[SpecificVehicleData] = vehicleFormat match { + case VehicleFormat.Utility => + utility_data_codec + case VehicleFormat.Variant => + variant_data_codec + case _ => + Failure(Err(s"$vehicleFormat is not a valid vehicle format for parsing data")).asInstanceOf[Codec[SpecificVehicleData]] + } + + def codec(vehicle_type : VehicleFormat.Value) : Codec[VehicleData] = ( + ("basic" | CommonFieldData.codec) :: + ("unk1" | uint2L) :: + ("health" | uint8L) :: + ("unk2" | bool) :: //usually 0 + ("no_mount_points" | bool) :: + ("driveState" | DriveState.codec) :: //used for deploy state + ("unk3" | bool) :: //unknown but generally false; can cause stream misalignment if set when unexpectedly + ("unk4" | bool) :: + ("cloak" | bool) :: //cloak as wraith, phantasm + conditional(vehicle_type != VehicleFormat.Normal, "unk5" | selectFormatReader(vehicle_type)) :: //padding? + optional(bool, "inventory" | InventoryData.codec) + ).exmap[VehicleData] ( + { + case basic :: u1 :: health :: u2 :: no_mount :: driveState :: u3 :: u4 :: u5 :: cloak :: inv :: HNil => + Attempt.successful(new VehicleData(basic, u1, health, u2, no_mount, driveState, u3, u4, u5, cloak, inv)(vehicle_type)) + + case _ => + Attempt.failure(Err("invalid vehicle data format")) + }, + { + case obj @ VehicleData(basic, u1, health, u2, no_mount, driveState, u3, u4, cloak, Some(u5), inv) => + if(obj.vehicle_type == VehicleFormat.Normal) { + Attempt.failure(Err("invalid vehicle data format; variable bits not expected; will ignore ...")) } else { - val onboardMountCount : Int = if(mountings.isDefined) { mountings.get.size } else { 0 } - if(mount_capacity != objMountCapacity) { - Attempt.failure(Err(s"different encoding expectations for amount of mounts - actual $objMountCapacity, expected $mount_capacity")) - } - else if(mount_capacity != onboardMountCount) { - Attempt.failure(Err(s"vehicle encodes wrong number of mounts - actual $onboardMountCount, expected $mount_capacity")) - } - else { - Attempt.successful(basic :: u1 :: health :: u2 :: driveState :: u4 :: u5 :: mountings :: HNil) - } + Attempt.successful(basic :: u1 :: health :: u2 :: no_mount :: driveState :: u3 :: u4 :: cloak :: Some(u5) :: inv :: HNil) + } + + case obj @ VehicleData(basic, u1, health, u2, no_mount, driveState, u3, u4, cloak, None, inv) => + if(obj.vehicle_type != VehicleFormat.Normal) { + Attempt.failure(Err("invalid vehicle data format; variable bits expected")) + } + else { + Attempt.successful(basic :: u1 :: health :: u2 :: no_mount :: driveState :: u3 :: u4 :: cloak :: None :: inv :: HNil) } case _ => @@ -204,5 +228,5 @@ object VehicleData extends Marshallable[VehicleData] { } ) - implicit val codec : Codec[VehicleData] = codec() + implicit val codec : Codec[VehicleData] = codec(VehicleFormat.Normal) } diff --git a/common/src/test/scala/game/ObjectCreateMessageTest.scala b/common/src/test/scala/game/ObjectCreateMessageTest.scala index 76b8669e..b7795746 100644 --- a/common/src/test/scala/game/ObjectCreateMessageTest.scala +++ b/common/src/test/scala/game/ObjectCreateMessageTest.scala @@ -470,7 +470,8 @@ class ObjectCreateMessageTest extends Specification { turret.deploy.pos.orient.y mustEqual 2.8125f turret.deploy.pos.orient.z mustEqual 264.375f turret.deploy.faction mustEqual PlanetSideEmpire.NC - turret.deploy.unk mustEqual 12 + turret.deploy.destroyed mustEqual true + turret.deploy.unk mustEqual 2 turret.deploy.player_guid mustEqual PlanetSideGUID(3871) turret.health mustEqual 0 turret.internals.isDefined mustEqual false @@ -496,7 +497,7 @@ class ObjectCreateMessageTest extends Specification { turret.deploy.pos.orient.y mustEqual 0f turret.deploy.pos.orient.z mustEqual 154.6875f turret.deploy.faction mustEqual PlanetSideEmpire.VS - turret.deploy.unk mustEqual 4 + turret.deploy.unk mustEqual 2 turret.deploy.player_guid mustEqual PlanetSideGUID(4232) turret.health mustEqual 255 turret.internals.isDefined mustEqual true @@ -537,7 +538,7 @@ class ObjectCreateMessageTest extends Specification { trap.deploy.pos.orient.y mustEqual 0f trap.deploy.pos.orient.z mustEqual 90.0f trap.deploy.faction mustEqual PlanetSideEmpire.VS - trap.deploy.unk mustEqual 4 + trap.deploy.unk mustEqual 2 trap.health mustEqual 255 trap.deploy.player_guid mustEqual PlanetSideGUID(2502) case _ => @@ -562,7 +563,7 @@ class ObjectCreateMessageTest extends Specification { aegis.deploy.pos.orient.y mustEqual 0f aegis.deploy.pos.orient.z mustEqual 90.0f aegis.deploy.faction mustEqual PlanetSideEmpire.VS - aegis.deploy.unk mustEqual 4 + aegis.deploy.unk mustEqual 2 aegis.health mustEqual 255 aegis.deploy.player_guid mustEqual PlanetSideGUID(2366) case _ => @@ -587,7 +588,7 @@ class ObjectCreateMessageTest extends Specification { omft.deploy.pos.orient.y mustEqual 0f omft.deploy.pos.orient.z mustEqual 185.625f omft.deploy.faction mustEqual PlanetSideEmpire.VS - omft.deploy.unk mustEqual 4 + omft.deploy.unk mustEqual 2 omft.deploy.player_guid mustEqual PlanetSideGUID(2502) omft.health mustEqual 255 omft.internals.isDefined mustEqual true @@ -989,7 +990,7 @@ class ObjectCreateMessageTest extends Specification { val obj = SmallTurretData( CommonFieldData( PlacementData(4577.7812f, 5624.828f, 72.046875f, 0f, 2.8125f, 264.375f), - PlanetSideEmpire.NC, 12, PlanetSideGUID(3871) + PlanetSideEmpire.NC, true, 2, PlanetSideGUID(3871) ), 255 //sets to 0 ) @@ -1007,7 +1008,7 @@ class ObjectCreateMessageTest extends Specification { val obj = SmallTurretData( CommonFieldData( PlacementData(4527.633f, 6271.3594f, 70.265625f, 0f, 0f, 154.6875f), - PlanetSideEmpire.VS, 4, PlanetSideGUID(4232) + PlanetSideEmpire.VS, 2, PlanetSideGUID(4232) ), 255, SmallTurretData.spitfire(PlanetSideGUID(3064), 0x6, 0x8, PlanetSideGUID(3694), 8) @@ -1026,7 +1027,7 @@ class ObjectCreateMessageTest extends Specification { val obj = TRAPData( CommonFieldData( PlacementData(3572.4453f, 3277.9766f, 114.0f, 0f, 0f, 90.0f), - PlanetSideEmpire.VS, 4, PlanetSideGUID(2502) + PlanetSideEmpire.VS, 2, PlanetSideGUID(2502) ), 255 ) @@ -1044,7 +1045,7 @@ class ObjectCreateMessageTest extends Specification { val obj = AegisShieldGeneratorData( CommonFieldData( PlacementData(3571.2266f, 3278.0938f, 114.0f, 0f, 0f, 90.0f), - PlanetSideEmpire.VS, 4, PlanetSideGUID(2366) + PlanetSideEmpire.VS, 2, PlanetSideGUID(2366) ), 255 ) @@ -1058,7 +1059,7 @@ class ObjectCreateMessageTest extends Specification { val obj = OneMannedFieldTurretData( CommonFieldData( PlacementData(3567.1406f, 2988.0078f, 71.84375f, 0f, 0f, 185.625f), - PlanetSideEmpire.VS, 4, PlanetSideGUID(2502) + PlanetSideEmpire.VS, 2, PlanetSideGUID(2502) ), 255, OneMannedFieldTurretData.orion(PlanetSideGUID(2615), 0x6, 0x8, PlanetSideGUID(2510), 8) diff --git a/common/src/test/scala/game/ObjectCreateMessageVehiclesTest.scala b/common/src/test/scala/game/ObjectCreateMessageVehiclesTest.scala index cd66e598..11cca6b2 100644 --- a/common/src/test/scala/game/ObjectCreateMessageVehiclesTest.scala +++ b/common/src/test/scala/game/ObjectCreateMessageVehiclesTest.scala @@ -38,13 +38,13 @@ class ObjectCreateMessageVehiclesTest extends Specification { fury.basic.pos.orient.z mustEqual 357.1875f fury.basic.pos.vel.isDefined mustEqual false fury.basic.faction mustEqual PlanetSideEmpire.VS - fury.basic.unk mustEqual 4 + fury.basic.unk mustEqual 2 fury.basic.player_guid mustEqual PlanetSideGUID(0) fury.health mustEqual 255 // - fury.mountings.isDefined mustEqual true - fury.mountings.get.size mustEqual 1 - val mounting = fury.mountings.get.head + fury.inventory.isDefined mustEqual true + fury.inventory.get.contents.size mustEqual 1 + val mounting = fury.inventory.get.contents.head mounting.objectClass mustEqual ObjectClass.fury_weapon_systema mounting.guid mustEqual PlanetSideGUID(400) mounting.parentSlot mustEqual 1 @@ -73,8 +73,8 @@ class ObjectCreateMessageVehiclesTest extends Specification { guid mustEqual PlanetSideGUID(380) parent.isDefined mustEqual false data.isDefined mustEqual true - data.get.isInstanceOf[ANTData] mustEqual true - val ant = data.get.asInstanceOf[ANTData] + data.get.isInstanceOf[VehicleData] mustEqual true + val ant = data.get.asInstanceOf[VehicleData] ant.basic.pos.coord.x mustEqual 3674.8438f ant.basic.pos.coord.y mustEqual 2726.789f ant.basic.pos.coord.z mustEqual 91.15625f @@ -82,7 +82,7 @@ class ObjectCreateMessageVehiclesTest extends Specification { ant.basic.pos.orient.y mustEqual 0f ant.basic.pos.orient.z mustEqual 90.0f ant.basic.faction mustEqual PlanetSideEmpire.VS - ant.basic.unk mustEqual 4 + ant.basic.unk mustEqual 2 ant.basic.player_guid mustEqual PlanetSideGUID(0) ant.health mustEqual 255 ant.driveState mustEqual DriveState.Mobile @@ -108,12 +108,12 @@ class ObjectCreateMessageVehiclesTest extends Specification { lightning.basic.pos.orient.y mustEqual 0f lightning.basic.pos.orient.z mustEqual 90.0f lightning.basic.faction mustEqual PlanetSideEmpire.VS - lightning.basic.unk mustEqual 4 + lightning.basic.unk mustEqual 2 lightning.basic.player_guid mustEqual PlanetSideGUID(0) lightning.health mustEqual 255 - lightning.mountings.isDefined mustEqual true - lightning.mountings.get.size mustEqual 1 - val mounting = lightning.mountings.get.head + lightning.inventory.isDefined mustEqual true + lightning.inventory.get.contents.size mustEqual 1 + val mounting = lightning.inventory.get.contents.head mounting.objectClass mustEqual ObjectClass.lightning_weapon_system mounting.guid mustEqual PlanetSideGUID(91) mounting.parentSlot mustEqual 1 @@ -159,18 +159,19 @@ class ObjectCreateMessageVehiclesTest extends Specification { deliverer.basic.pos.orient.y mustEqual 0f deliverer.basic.pos.orient.z mustEqual 357.1875f deliverer.basic.faction mustEqual PlanetSideEmpire.NC - deliverer.basic.unk mustEqual 4 + deliverer.basic.unk mustEqual 2 deliverer.basic.player_guid mustEqual PlanetSideGUID(0) deliverer.unk1 mustEqual 0 deliverer.health mustEqual 255 - deliverer.unk2 mustEqual 0 + deliverer.unk2 mustEqual false deliverer.driveState mustEqual DriveState.State7 - deliverer.unk4 mustEqual true - deliverer.unk5 mustEqual 0 - deliverer.mountings.isDefined mustEqual true - deliverer.mountings.get.size mustEqual 2 + deliverer.unk3 mustEqual true + deliverer.unk4 mustEqual None + deliverer.unk5 mustEqual false + deliverer.inventory.isDefined mustEqual true + deliverer.inventory.get.contents.size mustEqual 2 //0 - var mounting = deliverer.mountings.get.head + var mounting = deliverer.inventory.get.contents.head mounting.objectClass mustEqual ObjectClass.mediumtransport_weapon_systemA mounting.guid mustEqual PlanetSideGUID(383) mounting.parentSlot mustEqual 5 @@ -187,7 +188,7 @@ class ObjectCreateMessageVehiclesTest extends Specification { ammo.obj.isInstanceOf[AmmoBoxData] mustEqual true ammo.obj.asInstanceOf[AmmoBoxData].unk mustEqual 0x8 //1 - mounting = deliverer.mountings.get(1) + mounting = deliverer.inventory.get.contents(1) mounting.objectClass mustEqual ObjectClass.mediumtransport_weapon_systemB mounting.guid mustEqual PlanetSideGUID(556) mounting.parentSlot mustEqual 6 @@ -216,8 +217,8 @@ class ObjectCreateMessageVehiclesTest extends Specification { guid mustEqual PlanetSideGUID(4157) parent.isDefined mustEqual false data.isDefined mustEqual true - data.get.isInstanceOf[AMSData] mustEqual true - val ams = data.get.asInstanceOf[AMSData] + data.get.isInstanceOf[VehicleData] mustEqual true + val ams = data.get.asInstanceOf[VehicleData] ams.basic.pos.coord.x mustEqual 3674.0f ams.basic.pos.coord.y mustEqual 2726.789f ams.basic.pos.coord.z mustEqual 91.15625f @@ -229,12 +230,27 @@ class ObjectCreateMessageVehiclesTest extends Specification { ams.basic.player_guid mustEqual PlanetSideGUID(34082) ams.unk1 mustEqual 2 ams.health mustEqual 236 - ams.unk2 mustEqual 0 + ams.unk2 mustEqual false ams.driveState mustEqual DriveState.Deployed - ams.matrix_guid mustEqual PlanetSideGUID(3663) - ams.respawn_guid mustEqual PlanetSideGUID(3638) - ams.term_a_guid mustEqual PlanetSideGUID(3827) - ams.term_b_guid mustEqual PlanetSideGUID(3556) + + ams.inventory.isDefined mustEqual true + val inv = ams.inventory.get.contents + inv.head.objectClass mustEqual ObjectClass.matrix_terminalc + inv.head.guid mustEqual PlanetSideGUID(3663) + inv.head.parentSlot mustEqual 1 + inv.head.obj.isInstanceOf[CommonTerminalData] mustEqual true + inv(1).objectClass mustEqual ObjectClass.ams_respawn_tube + inv(1).guid mustEqual PlanetSideGUID(3638) + inv(1).parentSlot mustEqual 2 + inv(1).obj.isInstanceOf[CommonTerminalData] mustEqual true + inv(2).objectClass mustEqual ObjectClass.order_terminala + inv(2).guid mustEqual PlanetSideGUID(3827) + inv(2).parentSlot mustEqual 3 + inv(2).obj.isInstanceOf[CommonTerminalData] mustEqual true + inv(3).objectClass mustEqual ObjectClass.order_terminalb + inv(3).guid mustEqual PlanetSideGUID(3556) + inv(3).parentSlot mustEqual 4 + inv(3).obj.isInstanceOf[CommonTerminalData] mustEqual true case _ => ko } @@ -269,8 +285,8 @@ class ObjectCreateMessageVehiclesTest extends Specification { guid mustEqual PlanetSideGUID(418) parent.isDefined mustEqual false data.isDefined mustEqual true - data.get.isInstanceOf[Vehicle2Data] mustEqual true - val switchblade = data.get.asInstanceOf[Vehicle2Data] + data.get.isInstanceOf[VehicleData] mustEqual true + val switchblade = data.get.asInstanceOf[VehicleData] switchblade.basic.pos.coord.x mustEqual 6531.961f switchblade.basic.pos.coord.y mustEqual 1872.1406f switchblade.basic.pos.coord.z mustEqual 24.734375f @@ -278,13 +294,13 @@ class ObjectCreateMessageVehiclesTest extends Specification { switchblade.basic.pos.orient.y mustEqual 0f switchblade.basic.pos.orient.z mustEqual 357.1875f switchblade.basic.faction mustEqual PlanetSideEmpire.VS - switchblade.basic.unk mustEqual 4 + switchblade.basic.unk mustEqual 2 switchblade.health mustEqual 255 switchblade.driveState mustEqual DriveState.Mobile - switchblade.mountings.isDefined mustEqual true - switchblade.mountings.get.size mustEqual 1 + switchblade.inventory.isDefined mustEqual true + switchblade.inventory.get.contents.size mustEqual 1 //0 - val weapon = switchblade.mountings.get.head + val weapon = switchblade.inventory.get.contents.head weapon.objectClass mustEqual ObjectClass.scythe weapon.guid mustEqual PlanetSideGUID(355) weapon.parentSlot mustEqual 1 @@ -324,7 +340,7 @@ class ObjectCreateMessageVehiclesTest extends Specification { droppod.basic.pos.orient.x mustEqual 0f droppod.basic.pos.orient.y mustEqual 0f droppod.basic.pos.orient.z mustEqual 90.0f - droppod.basic.unk mustEqual 4 + droppod.basic.unk mustEqual 2 droppod.basic.player_guid mustEqual PlanetSideGUID(0) droppod.burn mustEqual false droppod.health mustEqual 255 @@ -378,13 +394,20 @@ class ObjectCreateMessageVehiclesTest extends Specification { val obj = VehicleData( CommonFieldData( PlacementData(6531.961f, 1872.1406f, 24.734375f, 0f, 0f, 357.1875f), - PlanetSideEmpire.VS, 4 + PlanetSideEmpire.VS, 2 ), + 0, 255, - MountItem(ObjectClass.fury_weapon_systema, PlanetSideGUID(400), 1, - WeaponData(0x6, 0x8, 0, ObjectClass.hellfire_ammo, PlanetSideGUID(432), 0, AmmoBoxData(0x8)) - ) - ) + false, false, + DriveState.Mobile, + false, false, false, + None, + Some(InventoryData( + InventoryItemData(ObjectClass.fury_weapon_systema, PlanetSideGUID(400), 1, + WeaponData(0x6, 0x8, 0, ObjectClass.hellfire_ammo, PlanetSideGUID(432), 0, AmmoBoxData(0x8)) + ) :: Nil + )) + )(VehicleFormat.Normal) val msg = ObjectCreateMessage(ObjectClass.fury, PlanetSideGUID(413), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector @@ -392,14 +415,19 @@ class ObjectCreateMessageVehiclesTest extends Specification { } "encode (ant)" in { - val obj = ANTData( + val obj = VehicleData( CommonFieldData( PlacementData(3674.8438f, 2726.789f, 91.15625f, 0f, 0f, 90.0f), - PlanetSideEmpire.VS, 4 + PlanetSideEmpire.VS, 2 ), + 0, 255, - DriveState.Mobile - ) + false, false, + DriveState.Mobile, + false, false, false, + Some(UtilityVehicleData(0)), + None + )(VehicleFormat.Utility) val msg = ObjectCreateMessage(ObjectClass.ant, PlanetSideGUID(380), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector @@ -410,13 +438,20 @@ class ObjectCreateMessageVehiclesTest extends Specification { val obj = VehicleData( CommonFieldData( PlacementData(3674.8438f, 2726.789f, 91.15625f, 0f, 0f, 90.0f), - PlanetSideEmpire.VS, 4 + PlanetSideEmpire.VS, 2 ), + 0, 255, - MountItem(ObjectClass.lightning_weapon_system, PlanetSideGUID(91), 1, - WeaponData(4, 8, 0, ObjectClass.bullet_75mm, PlanetSideGUID(92), 0, AmmoBoxData(), ObjectClass.bullet_25mm, PlanetSideGUID(93), 1, AmmoBoxData()) - ) - ) + false, false, + DriveState.Mobile, + false, false, false, + None, + Some(InventoryData( + InventoryItemData(ObjectClass.lightning_weapon_system, PlanetSideGUID(91), 1, + WeaponData(4, 8, 0, ObjectClass.bullet_75mm, PlanetSideGUID(92), 0, AmmoBoxData(), ObjectClass.bullet_25mm, PlanetSideGUID(93), 1, AmmoBoxData()) + ) :: Nil + )) + )(VehicleFormat.Normal) val msg = ObjectCreateMessage(ObjectClass.lightning, PlanetSideGUID(90), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector @@ -427,26 +462,23 @@ class ObjectCreateMessageVehiclesTest extends Specification { val obj = VehicleData( CommonFieldData( PlacementData(6531.961f, 1872.1406f, 24.734375f, 0f, 0f, 357.1875f), - PlanetSideEmpire.NC, 4 + PlanetSideEmpire.NC, 2 ), 0, 255, - 0, + false, false, DriveState.State7, - true, - 0, - Some( - MountItem( - ObjectClass.mediumtransport_weapon_systemA, PlanetSideGUID(383), 5, + true, false, false, + None, + Some(InventoryData( + InventoryItemData(ObjectClass.mediumtransport_weapon_systemA, PlanetSideGUID(383), 5, WeaponData(6, 8, ObjectClass.bullet_20mm, PlanetSideGUID(420), 0, AmmoBoxData(8)) ) :: - MountItem( - ObjectClass.mediumtransport_weapon_systemB, PlanetSideGUID(556), 6, + InventoryItemData(ObjectClass.mediumtransport_weapon_systemB, PlanetSideGUID(556), 6, WeaponData(6, 8, ObjectClass.bullet_20mm, PlanetSideGUID(575), 0, AmmoBoxData(8)) - ) :: - Nil - ) - )(2) + ) :: Nil + )) + )(VehicleFormat.Normal) val msg = ObjectCreateMessage(ObjectClass.mediumtransport, PlanetSideGUID(387), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector @@ -454,7 +486,7 @@ class ObjectCreateMessageVehiclesTest extends Specification { } "encode (ams)" in { - val obj = AMSData( + val obj = VehicleData( CommonFieldData( PlacementData(3674.0f, 2726.789f, 91.15625f, 0f, 0f, 90.0f), PlanetSideEmpire.VS, 0, @@ -462,14 +494,17 @@ class ObjectCreateMessageVehiclesTest extends Specification { ), 2, 236, - 0, + false, false, DriveState.Deployed, - 63, - PlanetSideGUID(3663), - PlanetSideGUID(3638), - PlanetSideGUID(3827), - PlanetSideGUID(3556) - ) + false, true, true, + Some(UtilityVehicleData(60)), //what does this mean? + Some(InventoryData(List( + InternalSlot(ObjectClass.matrix_terminalc, PlanetSideGUID(3663), 1, CommonTerminalData(PlanetSideEmpire.VS)), + InternalSlot(ObjectClass.ams_respawn_tube, PlanetSideGUID(3638), 2, CommonTerminalData(PlanetSideEmpire.VS)), + InternalSlot(ObjectClass.order_terminala, PlanetSideGUID(3827), 3, CommonTerminalData(PlanetSideEmpire.VS)), + InternalSlot(ObjectClass.order_terminalb, PlanetSideGUID(3556), 4, CommonTerminalData(PlanetSideEmpire.VS)) + ))) + )(VehicleFormat.Utility) val msg = ObjectCreateMessage(ObjectClass.ams, PlanetSideGUID(4157), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector @@ -485,18 +520,24 @@ class ObjectCreateMessageVehiclesTest extends Specification { } "encode (switchblade)" in { - val obj = Vehicle2Data( + val obj = VehicleData( CommonFieldData( PlacementData(6531.961f, 1872.1406f, 24.734375f, 0f, 0f, 357.1875f), PlanetSideEmpire.VS, - 4 + 2 ), + 0, 255, + false, false, DriveState.Mobile, - MountItem(ObjectClass.scythe, PlanetSideGUID(355), 1, - WeaponData(0x6, 0x8, 0, ObjectClass.ancient_ammo_vehicle, PlanetSideGUID(366), 0, AmmoBoxData(0x8), ObjectClass.ancient_ammo_vehicle, PlanetSideGUID(385), 1, AmmoBoxData(0x8)) - ) - ) + false, false, false, + Some(VariantVehicleData(0)), + Some(InventoryData( + InventoryItemData(ObjectClass.scythe, PlanetSideGUID(355), 1, + WeaponData(0x6, 0x8, 0, ObjectClass.ancient_ammo_vehicle, PlanetSideGUID(366), 0, AmmoBoxData(0x8), ObjectClass.ancient_ammo_vehicle, PlanetSideGUID(385), 1, AmmoBoxData(0x8)) + ) :: Nil + )) + )(VehicleFormat.Variant) val msg = ObjectCreateMessage(ObjectClass.switchblade, PlanetSideGUID(418), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector @@ -508,7 +549,7 @@ class ObjectCreateMessageVehiclesTest extends Specification { CommonFieldData( PlacementData(5108.0f, 6164.0f, 1023.9844f, 0f, 0f, 90.0f), PlanetSideEmpire.VS, - 4 + 2 ) ) val msg = ObjectCreateMessage(ObjectClass.droppod, PlanetSideGUID(3595), obj) diff --git a/pslogin/src/main/scala/WorldSessionActor.scala b/pslogin/src/main/scala/WorldSessionActor.scala index 1c9cc53d..2d9dfadb 100644 --- a/pslogin/src/main/scala/WorldSessionActor.scala +++ b/pslogin/src/main/scala/WorldSessionActor.scala @@ -799,7 +799,6 @@ class WorldSessionActor extends Actor with MDCContextAware { ) ) }) - avatarService ! Service.Join(player.Continent) localService ! Service.Join(player.Continent) self ! SetCurrentAvatar(player)