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)