ObjectCreateMessage Alterations, Class Object Adjustments (#243)

* power outage failure resulting in the destruction of the original ocm-fixes branch; the git branch refs were corrupted during commit, but the up-to-date changed files remained intact

* eliminating the need for CommonFieldData2 and CommonFieldData2WithPlacement

* in the middle of integrating CommonFieldData into DetailedLockerContainerData (but not standard LockerContainerData); added field for final boolean in WeaponData

* adding faction affinity to Equipment (to match functionality; not becuase I know what ends ...)

* in the middle of integrating CommonFieldData into DetailedCommandDetonaterData

* applying faction affinity to objects at time of terminal production (but to what ends?); required BoomerTrigger and AmmoBox to always report as NEUTRAL internally

* completed the transition from using the old class-based order terminal system to the page-based order terminal system; unused terminal classes have been eliminated

* more closely aligned TelepadDeployableData and InternalTelepadDeployableData

* modifying TelepadDeployableData make it generic and eliminate the need for InternalTelepadDeployableData after fixing a packet converter to utilize DroppedItemData

* modified Terminal operation to branch further outwards from Terminal.Request to the TerminalDefinition's Request method; modified tests to reflect update

* loosening up matrix terminal definition limitations

* modified ProximityTerminal to support a custom defintition class

* rendered the message passing system for Terminals general (Any) in the full scale so it can be specific in instance cases

* refactored and moved both EquipmentSlot and ExoSuitDefinition

* (re)load Favorites each time player (re)spawns
This commit is contained in:
Fate-JH 2019-03-03 08:23:30 -05:00 committed by GitHub
parent 5fc9e191fe
commit 337cfbe5d2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
174 changed files with 6281 additions and 5477 deletions

View file

@ -2,8 +2,8 @@
package game.objectcreatevehicle
import net.psforever.packet._
import net.psforever.packet.game.{ObjectCreateMessage, PlanetSideGUID}
import net.psforever.packet.game.objectcreate._
import net.psforever.packet.game.{ObjectCreateMessage, PlanetSideGUID}
import org.specs2.mutable._
import scodec.bits._
@ -18,9 +18,8 @@ class DestroyedVehiclesTest extends Specification {
cls mustEqual ObjectClass.ams_destroyed
guid mustEqual PlanetSideGUID(4157)
parent.isDefined mustEqual false
data.isDefined mustEqual true
data.get.isInstanceOf[DestroyedVehicleData] mustEqual true
val dams = data.get.asInstanceOf[DestroyedVehicleData]
data.isInstanceOf[DestroyedVehicleData] mustEqual true
val dams = data.asInstanceOf[DestroyedVehicleData]
dams.pos.coord.x mustEqual 3674.0f
dams.pos.coord.y mustEqual 2726.789f
dams.pos.coord.z mustEqual 91.15625f

View file

@ -2,8 +2,8 @@
package game.objectcreatevehicle
import net.psforever.packet._
import net.psforever.packet.game.{ObjectCreateMessage, PlanetSideGUID}
import net.psforever.packet.game.objectcreate._
import net.psforever.packet.game.{ObjectCreateMessage, PlanetSideGUID}
import net.psforever.types._
import org.specs2.mutable._
import scodec.bits._
@ -22,28 +22,28 @@ class MountedVehiclesTest extends Specification {
len mustEqual 1991
cls mustEqual ObjectClass.mosquito
guid mustEqual PlanetSideGUID(4308)
parent mustEqual None
parent.isEmpty mustEqual true
data match {
case Some(vdata : VehicleData) =>
case vdata : VehicleData =>
vdata.pos.coord mustEqual Vector3(4571.6875f, 5602.1875f, 93)
vdata.pos.orient mustEqual Vector3(11.25f, 2.8125f, 92.8125f)
vdata.pos.vel mustEqual Some(Vector3(31.71875f, 8.875f, -0.03125f))
vdata.faction mustEqual PlanetSideEmpire.TR
vdata.bops mustEqual false
vdata.destroyed mustEqual false
vdata.jammered mustEqual false
vdata.owner_guid mustEqual PlanetSideGUID(3776)
vdata.pos.vel.contains(Vector3(31.71875f, 8.875f, -0.03125f)) mustEqual true
vdata.data.faction mustEqual PlanetSideEmpire.TR
vdata.data.bops mustEqual false
vdata.data.alternate mustEqual false
vdata.data.v1 mustEqual false
vdata.data.v3 mustEqual false
vdata.data.v5.isEmpty mustEqual true
vdata.data.guid mustEqual PlanetSideGUID(3776)
vdata.health mustEqual 255
vdata.no_mount_points mustEqual false
vdata.driveState mustEqual DriveState.Mobile
vdata.cloak mustEqual false
vdata.unk1 mustEqual 0
vdata.unk2 mustEqual false
vdata.unk3 mustEqual false
vdata.unk4 mustEqual false
vdata.unk5 mustEqual false
vdata.unk6 mustEqual false
vdata.vehicle_format_data mustEqual Some(VariantVehicleData(7))
vdata.vehicle_format_data.contains(VariantVehicleData(7)) mustEqual true
vdata.inventory match {
case Some(InventoryData(list)) =>
list.head.objectClass mustEqual ObjectClass.avatar
@ -54,13 +54,13 @@ class MountedVehiclesTest extends Specification {
app match {
case CharacterAppearanceData(a, b, ribbons) =>
a.app mustEqual BasicCharacterData("ScrawnyRonnie", PlanetSideEmpire.TR, CharacterGender.Male, 5, CharacterVoice.Voice5)
a.black_ops mustEqual false
a.jammered mustEqual false
a.data.bops mustEqual false
a.data.v1 mustEqual false
a.data.v2.isEmpty mustEqual true
a.data.v3 mustEqual false
a.data.v4.isEmpty mustEqual true
a.data.v5.isEmpty mustEqual true
a.exosuit mustEqual ExoSuitType.Agile
a.unk1 mustEqual false
a.unk2 mustEqual None
a.unk3 mustEqual None
a.unk4 mustEqual 0
a.unk5 mustEqual 0
a.unk6 mustEqual 30777081L
a.unk7 mustEqual 1
@ -77,7 +77,7 @@ class MountedVehiclesTest extends Specification {
b.grenade_state mustEqual GrenadeState.None
b.is_cloaking mustEqual false
b.charging_pose mustEqual false
b.on_zipline mustEqual None
b.on_zipline.isEmpty mustEqual true
b.unk0 mustEqual 316554L
b.unk1 mustEqual false
b.unk2 mustEqual false
@ -99,7 +99,7 @@ class MountedVehiclesTest extends Specification {
unk mustEqual 7
cr mustEqual 5
implants mustEqual Nil
cosmetics mustEqual Some(Cosmetics(true, true, true, true, false))
cosmetics.contains(Cosmetics(true, true, true, true, false)) mustEqual true
case _ =>
ko
}
@ -139,14 +139,18 @@ class MountedVehiclesTest extends Specification {
5,
CharacterVoice.Voice5
),
false,
false,
false,
None,
false,
CommonFieldData(
PlanetSideEmpire.TR,
false,
false,
false,
None,
false,
None,
None,
PlanetSideGUID(0)
),
ExoSuitType.Agile,
None,
0,
0,
30777081L,
1,
@ -174,7 +178,7 @@ class MountedVehiclesTest extends Specification {
None
)
val app : (Int)=>CharacterAppearanceData = CharacterAppearanceData(
val app : Int=>CharacterAppearanceData = CharacterAppearanceData(
a, b,
RibbonBars(
MeritCommendation.MarkovVeteran,
@ -194,16 +198,16 @@ class MountedVehiclesTest extends Specification {
val inv : InventoryData = InventoryData(
List(
InternalSlot(ObjectClass.medicalapplicator, PlanetSideGUID(4201), 0,
WeaponData(0, 0, 0, List(InternalSlot(ObjectClass.health_canister, PlanetSideGUID(3472), 0, AmmoBoxData(0))))
WeaponData(CommonFieldData(PlanetSideEmpire.TR), 0, List(InternalSlot(ObjectClass.health_canister, PlanetSideGUID(3472), 0, CommonFieldData()(false))))
),
InternalSlot(ObjectClass.bank, PlanetSideGUID(2952), 1,
WeaponData(0, 0, 0, List(InternalSlot(ObjectClass.armor_canister, PlanetSideGUID(3758), 0, AmmoBoxData(0))))
WeaponData(CommonFieldData(PlanetSideEmpire.TR), 0, List(InternalSlot(ObjectClass.armor_canister, PlanetSideGUID(3758), 0, CommonFieldData()(false))))
),
InternalSlot(ObjectClass.mini_chaingun, PlanetSideGUID(2929), 2,
WeaponData(0, 0, 0, List(InternalSlot(ObjectClass.bullet_9mm, PlanetSideGUID(3292), 0, AmmoBoxData(0))))
WeaponData(CommonFieldData(PlanetSideEmpire.TR), 0, List(InternalSlot(ObjectClass.bullet_9mm, PlanetSideGUID(3292), 0, CommonFieldData()(false))))
),
InternalSlot(ObjectClass.chainblade, PlanetSideGUID(3222), 4,
WeaponData(0, 0, 0, List(InternalSlot(ObjectClass.melee_ammo, PlanetSideGUID(3100), 0, AmmoBoxData(0))))
WeaponData(CommonFieldData(PlanetSideEmpire.TR), 0, List(InternalSlot(ObjectClass.melee_ammo, PlanetSideGUID(3100), 0, CommonFieldData()(false))))
)
)
)
@ -214,11 +218,7 @@ class MountedVehiclesTest extends Specification {
Vector3(11.25f, 2.8125f, 92.8125f),
Some(Vector3(31.71875f, 8.875f, -0.03125f))
),
PlanetSideEmpire.TR,
false, false,
0,
false, false,
PlanetSideGUID(3776),
CommonFieldData(PlanetSideEmpire.TR, false, false, false, None, false, Some(false), None, PlanetSideGUID(3776)),
false,
255,
false, false,
@ -230,7 +230,7 @@ class MountedVehiclesTest extends Specification {
List(
InternalSlot(ObjectClass.avatar, PlanetSideGUID(3776), 0, player),
InternalSlot(ObjectClass.rotarychaingun_mosquito, PlanetSideGUID(3602), 1,
WeaponData(6, 0, 0, List(InternalSlot(ObjectClass.bullet_12mm, PlanetSideGUID(3538), 0, AmmoBoxData(0))))
WeaponData(CommonFieldData(), 0, List(InternalSlot(ObjectClass.bullet_12mm, PlanetSideGUID(3538), 0, CommonFieldData()(false))))
)
)
)

View file

@ -2,8 +2,8 @@
package game.objectcreatevehicle
import net.psforever.packet._
import net.psforever.packet.game.{ObjectCreateMessage, PlanetSideGUID}
import net.psforever.packet.game.objectcreate._
import net.psforever.packet.game.{ObjectCreateMessage, PlanetSideGUID}
import net.psforever.types._
import org.specs2.mutable._
import scodec.bits._
@ -21,19 +21,25 @@ class NonstandardVehiclesTest extends Specification {
cls mustEqual ObjectClass.droppod
guid mustEqual PlanetSideGUID(3595)
parent.isDefined mustEqual false
data.isDefined mustEqual true
data.get.isInstanceOf[DroppodData] mustEqual true
val droppod = data.get.asInstanceOf[DroppodData]
droppod.basic.pos.coord.x mustEqual 5108.0f
droppod.basic.pos.coord.y mustEqual 6164.0f
droppod.basic.pos.coord.z mustEqual 1023.9844f
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 2
droppod.basic.player_guid mustEqual PlanetSideGUID(0)
droppod.burn mustEqual false
droppod.health mustEqual 255
data match {
case DroppodData(basic, burn, health) =>
basic.pos.coord mustEqual Vector3(5108.0f, 6164.0f, 1023.9844f)
basic.pos.orient mustEqual Vector3.z(90.0f)
basic.data.faction mustEqual PlanetSideEmpire.VS
basic.data.bops mustEqual false
basic.data.alternate mustEqual false
basic.data.v1 mustEqual true
basic.data.v2.isDefined mustEqual false
basic.data.v3 mustEqual false
basic.data.v5.isDefined mustEqual false
basic.data.guid mustEqual PlanetSideGUID(0)
burn mustEqual false
health mustEqual 255
case _ =>
ko
}
case _ =>
ko
}
@ -48,10 +54,9 @@ class NonstandardVehiclesTest extends Specification {
parent.isDefined mustEqual true
parent.get.guid mustEqual PlanetSideGUID(786)
parent.get.slot mustEqual 3
data.isDefined mustEqual true
data.get.isInstanceOf[OrbitalShuttleData] mustEqual true
data.get.asInstanceOf[OrbitalShuttleData].faction mustEqual PlanetSideEmpire.VS
data.get.asInstanceOf[OrbitalShuttleData].pos.isDefined mustEqual false
data.isInstanceOf[OrbitalShuttleData] mustEqual true
data.asInstanceOf[OrbitalShuttleData].faction mustEqual PlanetSideEmpire.VS
data.asInstanceOf[OrbitalShuttleData].pos.isDefined mustEqual false
case _ =>
ko
}
@ -64,9 +69,8 @@ class NonstandardVehiclesTest extends Specification {
cls mustEqual ObjectClass.orbital_shuttle
guid mustEqual PlanetSideGUID(1127)
parent.isDefined mustEqual false
data.isDefined mustEqual true
data.get.isInstanceOf[OrbitalShuttleData] mustEqual true
val shuttle = data.get.asInstanceOf[OrbitalShuttleData]
data.isInstanceOf[OrbitalShuttleData] mustEqual true
val shuttle = data.asInstanceOf[OrbitalShuttleData]
shuttle.faction mustEqual PlanetSideEmpire.VS
shuttle.pos.isDefined mustEqual true
shuttle.pos.get.coord.x mustEqual 5610.0156f
@ -82,10 +86,9 @@ class NonstandardVehiclesTest extends Specification {
"encode (droppod)" in {
val obj = DroppodData(
CommonFieldData(
CommonFieldDataWithPlacement(
PlacementData(5108.0f, 6164.0f, 1023.9844f, 0f, 0f, 90.0f),
PlanetSideEmpire.VS,
2
CommonFieldData(PlanetSideEmpire.VS, 2)
)
)
val msg = ObjectCreateMessage(ObjectClass.droppod, PlanetSideGUID(3595), obj)

View file

@ -2,8 +2,8 @@
package game.objectcreatevehicle
import net.psforever.packet._
import net.psforever.packet.game.{ObjectCreateMessage, PlanetSideGUID}
import net.psforever.packet.game.objectcreate._
import net.psforever.packet.game.{ObjectCreateMessage, PlanetSideGUID}
import net.psforever.types._
import org.specs2.mutable._
import scodec.bits._
@ -21,15 +21,14 @@ class NormalVehiclesTest extends Specification {
cls mustEqual ObjectClass.fury
guid mustEqual PlanetSideGUID(413)
parent.isDefined mustEqual false
data.isDefined mustEqual true
data.get.isInstanceOf[VehicleData] mustEqual true
val fury = data.get.asInstanceOf[VehicleData]
data.isInstanceOf[VehicleData] mustEqual true
val fury = data.asInstanceOf[VehicleData]
fury.pos.coord mustEqual Vector3(6531.961f, 1872.1406f,24.734375f)
fury.pos.orient mustEqual Vector3(0, 0, 357.1875f)
fury.pos.vel mustEqual None
fury.faction mustEqual PlanetSideEmpire.VS
fury.unk1 mustEqual 2
fury.owner_guid mustEqual PlanetSideGUID(0)
fury.pos.vel.isEmpty mustEqual true
fury.data.faction mustEqual PlanetSideEmpire.VS
fury.data.v1 mustEqual true
fury.data.guid mustEqual PlanetSideGUID(0)
fury.health mustEqual 255
//
fury.inventory.isDefined mustEqual true
@ -39,17 +38,40 @@ class NormalVehiclesTest extends Specification {
mounting.guid mustEqual PlanetSideGUID(400)
mounting.parentSlot mustEqual 1
mounting.obj.isInstanceOf[WeaponData] mustEqual true
val weapon = mounting.obj.asInstanceOf[WeaponData]
weapon.unk1 mustEqual 0x6
weapon.unk2 mustEqual 0x8
weapon.fire_mode mustEqual 0
weapon.ammo.size mustEqual 1
val ammo = weapon.ammo.head
ammo.objectClass mustEqual ObjectClass.hellfire_ammo
ammo.guid mustEqual PlanetSideGUID(432)
ammo.parentSlot mustEqual 0
ammo.obj.isInstanceOf[AmmoBoxData] mustEqual true
ammo.obj.asInstanceOf[AmmoBoxData].unk mustEqual 0x8
mounting.obj match {
case WeaponData(CommonFieldData(wfaction, wbops, walternate, wv1, wv2, wv3, wv4, wv5, wfguid), fmode, ammo, _) =>
wfaction mustEqual PlanetSideEmpire.NEUTRAL
wbops mustEqual false
walternate mustEqual false
wv1 mustEqual true
wv2.isEmpty mustEqual true
wv3 mustEqual false
wv4.isEmpty mustEqual true
wv5.isEmpty mustEqual true
wfguid mustEqual PlanetSideGUID(0)
fmode mustEqual 0
ammo.head.objectClass mustEqual ObjectClass.hellfire_ammo
ammo.head.guid mustEqual PlanetSideGUID(432)
ammo.head.parentSlot mustEqual 0
ammo.head.obj match {
case CommonFieldData(faction, bops, alternate, v1, v2, v3, v4, v5, fguid) =>
faction mustEqual PlanetSideEmpire.NEUTRAL
bops mustEqual false
alternate mustEqual false
v1 mustEqual true
v2.isEmpty mustEqual true
v3 mustEqual false
v4.contains(false) mustEqual true
v5.isEmpty mustEqual true
fguid mustEqual PlanetSideGUID(0)
case _ =>
ko
}
case _ =>
ko
}
case _ =>
ko
}
@ -62,15 +84,14 @@ class NormalVehiclesTest extends Specification {
cls mustEqual ObjectClass.lightning
guid mustEqual PlanetSideGUID(90)
parent.isDefined mustEqual false
data.isDefined mustEqual true
data.get.isInstanceOf[VehicleData] mustEqual true
val lightning = data.get.asInstanceOf[VehicleData]
data.isInstanceOf[VehicleData] mustEqual true
val lightning = data.asInstanceOf[VehicleData]
lightning.pos.coord mustEqual Vector3(3674.8438f, 2726.789f, 91.15625f)
lightning.pos.orient mustEqual Vector3(0, 0, 90)
lightning.pos.vel mustEqual None
lightning.faction mustEqual PlanetSideEmpire.VS
lightning.unk1 mustEqual 2
lightning.owner_guid mustEqual PlanetSideGUID(0)
lightning.pos.vel.isEmpty mustEqual true
lightning.data.faction mustEqual PlanetSideEmpire.VS
lightning.data.v1 mustEqual true
lightning.data.guid mustEqual PlanetSideGUID(0)
lightning.health mustEqual 255
lightning.inventory.isDefined mustEqual true
@ -79,26 +100,59 @@ class NormalVehiclesTest extends Specification {
mounting.objectClass mustEqual ObjectClass.lightning_weapon_system
mounting.guid mustEqual PlanetSideGUID(91)
mounting.parentSlot mustEqual 1
mounting.obj.isInstanceOf[WeaponData] mustEqual true
val weapon = mounting.obj.asInstanceOf[WeaponData]
weapon.unk1 mustEqual 0x4
weapon.unk2 mustEqual 0x8
weapon.fire_mode mustEqual 0
weapon.ammo.size mustEqual 2
//0
var ammo = weapon.ammo.head
ammo.objectClass mustEqual ObjectClass.bullet_75mm
ammo.guid mustEqual PlanetSideGUID(92)
ammo.parentSlot mustEqual 0
ammo.obj.isInstanceOf[AmmoBoxData] mustEqual true
ammo.obj.asInstanceOf[AmmoBoxData].unk mustEqual 0x0
//1
ammo = weapon.ammo(1)
ammo.objectClass mustEqual ObjectClass.bullet_25mm
ammo.guid mustEqual PlanetSideGUID(93)
ammo.parentSlot mustEqual 1
ammo.obj.isInstanceOf[AmmoBoxData] mustEqual true
ammo.obj.asInstanceOf[AmmoBoxData].unk mustEqual 0x0
mounting.obj match {
case WeaponData(CommonFieldData(wfaction, wbops, walternate, wv1, wv2, wv3, wv4, wv5, wfguid), fmode, ammo, _) =>
wfaction mustEqual PlanetSideEmpire.VS
wbops mustEqual false
walternate mustEqual false
wv1 mustEqual true
wv2.isEmpty mustEqual true
wv3 mustEqual false
wv4.isEmpty mustEqual true
wv5.isEmpty mustEqual true
wfguid mustEqual PlanetSideGUID(0)
fmode mustEqual 0
//0
ammo.head.objectClass mustEqual ObjectClass.bullet_75mm
ammo.head.guid mustEqual PlanetSideGUID(92)
ammo.head.parentSlot mustEqual 0
ammo.head.obj match {
case CommonFieldData(faction, bops, alternate, v1, v2, v3, v4, v5, fguid) =>
faction mustEqual PlanetSideEmpire.NEUTRAL
bops mustEqual false
alternate mustEqual false
v1 mustEqual false
v2.isEmpty mustEqual true
v3 mustEqual false
v4.contains(false) mustEqual true
v5.isEmpty mustEqual true
fguid mustEqual PlanetSideGUID(0)
case _ =>
ko
}
//1
ammo(1).objectClass mustEqual ObjectClass.bullet_25mm
ammo(1).guid mustEqual PlanetSideGUID(93)
ammo(1).parentSlot mustEqual 1
ammo(1).obj match {
case CommonFieldData(faction, bops, alternate, v1, v2, v3, v4, v5, fguid) =>
faction mustEqual PlanetSideEmpire.NEUTRAL
bops mustEqual false
alternate mustEqual false
v1 mustEqual false
v2.isEmpty mustEqual true
v3 mustEqual false
v4.contains(false) mustEqual true
v5.isEmpty mustEqual true
fguid mustEqual PlanetSideGUID(0)
case _ =>
ko
}
case _ =>
ko
}
case _ =>
ko
}
@ -111,62 +165,104 @@ class NormalVehiclesTest extends Specification {
cls mustEqual ObjectClass.mediumtransport
guid mustEqual PlanetSideGUID(387)
parent.isDefined mustEqual false
data.isDefined mustEqual true
data.get.isInstanceOf[VehicleData] mustEqual true
val deliverer = data.get.asInstanceOf[VehicleData]
deliverer.pos.coord mustEqual Vector3(6531.961f, 1872.1406f, 24.734375f)
deliverer.pos.orient mustEqual Vector3(0, 0, 357.1875f)
deliverer.pos.vel mustEqual None
deliverer.faction mustEqual PlanetSideEmpire.NC
deliverer.owner_guid mustEqual PlanetSideGUID(0)
deliverer.health mustEqual 255
deliverer.driveState mustEqual DriveState.State7
deliverer.jammered mustEqual false
deliverer.destroyed mustEqual false
deliverer.cloak mustEqual false
deliverer.unk1 mustEqual 2
deliverer.unk2 mustEqual false
deliverer.unk3 mustEqual false
deliverer.unk4 mustEqual false
deliverer.unk5 mustEqual true
deliverer.unk6 mustEqual false
deliverer.vehicle_format_data mustEqual None
deliverer.inventory.isDefined mustEqual true
deliverer.inventory.get.contents.size mustEqual 2
//0
var mounting = deliverer.inventory.get.contents.head
mounting.objectClass mustEqual ObjectClass.mediumtransport_weapon_systemA
mounting.guid mustEqual PlanetSideGUID(383)
mounting.parentSlot mustEqual 5
mounting.obj.isInstanceOf[WeaponData] mustEqual true
var weapon = mounting.obj.asInstanceOf[WeaponData]
weapon.unk1 mustEqual 0x6
weapon.unk2 mustEqual 0x8
weapon.fire_mode mustEqual 0
weapon.ammo.size mustEqual 1
var ammo = weapon.ammo.head
ammo.objectClass mustEqual ObjectClass.bullet_20mm
ammo.guid mustEqual PlanetSideGUID(420)
ammo.parentSlot mustEqual 0
ammo.obj.isInstanceOf[AmmoBoxData] mustEqual true
ammo.obj.asInstanceOf[AmmoBoxData].unk mustEqual 0x8
//1
mounting = deliverer.inventory.get.contents(1)
mounting.objectClass mustEqual ObjectClass.mediumtransport_weapon_systemB
mounting.guid mustEqual PlanetSideGUID(556)
mounting.parentSlot mustEqual 6
mounting.obj.isInstanceOf[WeaponData] mustEqual true
weapon = mounting.obj.asInstanceOf[WeaponData]
weapon.unk1 mustEqual 0x6
weapon.unk2 mustEqual 0x8
weapon.fire_mode mustEqual 0
weapon.ammo.size mustEqual 1
ammo = weapon.ammo.head
ammo.objectClass mustEqual ObjectClass.bullet_20mm
ammo.guid mustEqual PlanetSideGUID(575)
ammo.parentSlot mustEqual 0
ammo.obj.isInstanceOf[AmmoBoxData] mustEqual true
ammo.obj.asInstanceOf[AmmoBoxData].unk mustEqual 0x8
data match {
case VehicleData(pos, vdata, unk3, health, unk4, _, driveState, unk5, unk6, _, format, Some(InventoryData(inv))) =>
pos.coord mustEqual Vector3(6531.961f, 1872.1406f, 24.734375f)
pos.orient mustEqual Vector3.z(357.1875f)
vdata.faction mustEqual PlanetSideEmpire.NC
vdata.alternate mustEqual false
vdata.v1 mustEqual true
vdata.v3 mustEqual false
vdata.v5.isEmpty mustEqual true
vdata.guid mustEqual PlanetSideGUID(0)
health mustEqual 255
driveState mustEqual DriveState.State7
unk3 mustEqual false
unk4 mustEqual false
unk5 mustEqual true
unk6 mustEqual false
format.isEmpty mustEqual true
//0
inv.head.objectClass mustEqual ObjectClass.mediumtransport_weapon_systemA
inv.head.guid mustEqual PlanetSideGUID(383)
inv.head.parentSlot mustEqual 5
inv.head.obj match {
case WeaponData(CommonFieldData(wfaction, wbops, walternate, wv1, wv2, wv3, wv4, wv5, wfguid), fmode, List(ammo), _) =>
wfaction mustEqual PlanetSideEmpire.NEUTRAL
wbops mustEqual false
walternate mustEqual false
wv1 mustEqual true
wv2.isEmpty mustEqual true
wv3 mustEqual false
wv4.isEmpty mustEqual true
wv5.isEmpty mustEqual true
wfguid mustEqual PlanetSideGUID(0)
fmode mustEqual 0
ammo.objectClass mustEqual ObjectClass.bullet_20mm
ammo.guid mustEqual PlanetSideGUID(420)
ammo.parentSlot mustEqual 0
ammo.obj match {
case CommonFieldData(faction, bops, alternate, v1, v2, v3, v4, v5, fguid) =>
faction mustEqual PlanetSideEmpire.NEUTRAL
bops mustEqual false
alternate mustEqual false
v1 mustEqual true
v2.isEmpty mustEqual true
v3 mustEqual false
v4.contains(false) mustEqual true
v5.isEmpty mustEqual true
fguid mustEqual PlanetSideGUID(0)
case _ =>
ko
}
case _ =>
ko
}
//1
inv(1).objectClass mustEqual ObjectClass.mediumtransport_weapon_systemB
inv(1).guid mustEqual PlanetSideGUID(556)
inv(1).parentSlot mustEqual 6
inv(1).obj match {
case WeaponData(CommonFieldData(wfaction, wbops, walternate, wv1, wv2, wv3, wv4, wv5, wfguid), fmode, List(ammo), _) =>
wfaction mustEqual PlanetSideEmpire.NEUTRAL
wbops mustEqual false
walternate mustEqual false
wv1 mustEqual true
wv2.isEmpty mustEqual true
wv3 mustEqual false
wv4.isEmpty mustEqual true
wv5.isEmpty mustEqual true
wfguid mustEqual PlanetSideGUID(0)
fmode mustEqual 0
ammo.objectClass mustEqual ObjectClass.bullet_20mm
ammo.guid mustEqual PlanetSideGUID(575)
ammo.parentSlot mustEqual 0
ammo.obj match {
case CommonFieldData(faction, bops, alternate, v1, v2, v3, v4, v5, fguid) =>
faction mustEqual PlanetSideEmpire.NEUTRAL
bops mustEqual false
alternate mustEqual false
v1 mustEqual true
v2.isEmpty mustEqual true
v3 mustEqual false
v4.contains(false) mustEqual true
v5.isEmpty mustEqual true
fguid mustEqual PlanetSideGUID(0)
case _ =>
ko
}
case _ =>
ko
}
case _ =>
ko
}
case _ =>
ko
}
@ -175,22 +271,26 @@ class NormalVehiclesTest extends Specification {
"encode (fury)" in {
val obj = VehicleData(
PlacementData(6531.961f, 1872.1406f, 24.734375f, 0f, 0f, 357.1875f),
PlanetSideEmpire.VS,
false, false,
2,
false, false,
PlanetSideGUID(0),
CommonFieldData(PlanetSideEmpire.VS, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)),
false,
255,
false, false,
DriveState.Mobile,
false, false, false,
None,
Some(InventoryData(
Some(InventoryData(List(
InventoryItemData(ObjectClass.fury_weapon_systema, PlanetSideGUID(400), 1,
WeaponData(0x6, 0x8, 0, ObjectClass.hellfire_ammo, PlanetSideGUID(432), 0, AmmoBoxData(0x8))
) :: Nil
))
WeaponData(
CommonFieldData(PlanetSideEmpire.NEUTRAL, 2),
0,
List(
InternalSlot(ObjectClass.hellfire_ammo, PlanetSideGUID(432), 0,
CommonFieldData(PlanetSideEmpire.NEUTRAL, 2)(false)
)
)
)
)
)))
)(VehicleFormat.Normal)
val msg = ObjectCreateMessage(ObjectClass.fury, PlanetSideGUID(413), obj)
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
@ -201,22 +301,25 @@ class NormalVehiclesTest extends Specification {
"encode (lightning)" in {
val obj = VehicleData(
PlacementData(3674.8438f, 2726.789f, 91.15625f, 0f, 0f, 90.0f),
PlanetSideEmpire.VS,
false, false,
2,
false, false,
PlanetSideGUID(0),
CommonFieldData(PlanetSideEmpire.VS, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)),
false,
255,
false, false,
DriveState.Mobile,
false, false, false,
None,
Some(InventoryData(
Some(InventoryData(List(
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
))
WeaponData(
CommonFieldData(PlanetSideEmpire.VS, 2),
0,
List(
InternalSlot(ObjectClass.bullet_75mm, PlanetSideGUID(92), 0, CommonFieldData()(false)),
InternalSlot(ObjectClass.bullet_25mm, PlanetSideGUID(93), 1, CommonFieldData()(false))
)
)
)
)))
)(VehicleFormat.Normal)
val msg = ObjectCreateMessage(ObjectClass.lightning, PlanetSideGUID(90), obj)
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
@ -227,25 +330,37 @@ class NormalVehiclesTest extends Specification {
"encode (medium transport)" in {
val obj = VehicleData(
PlacementData(6531.961f, 1872.1406f, 24.734375f, 0f, 0f, 357.1875f),
PlanetSideEmpire.NC,
false, false,
2,
false, false,
PlanetSideGUID(0),
CommonFieldData(PlanetSideEmpire.NC, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)),
false,
255,
false, false,
DriveState.State7,
true, false, false,
None,
Some(InventoryData(
Some(InventoryData(List(
InventoryItemData(ObjectClass.mediumtransport_weapon_systemA, PlanetSideGUID(383), 5,
WeaponData(6, 8, ObjectClass.bullet_20mm, PlanetSideGUID(420), 0, AmmoBoxData(8))
) ::
InventoryItemData(ObjectClass.mediumtransport_weapon_systemB, PlanetSideGUID(556), 6,
WeaponData(6, 8, ObjectClass.bullet_20mm, PlanetSideGUID(575), 0, AmmoBoxData(8))
) :: Nil
))
WeaponData(
CommonFieldData(PlanetSideEmpire.NEUTRAL, 2),
0,
List(
InternalSlot(ObjectClass.bullet_20mm, PlanetSideGUID(420), 0,
CommonFieldData(PlanetSideEmpire.NEUTRAL, 2)(false)
)
)
)
),
InventoryItemData(ObjectClass.mediumtransport_weapon_systemB, PlanetSideGUID(556), 6,
WeaponData(
CommonFieldData(PlanetSideEmpire.NEUTRAL, 2),
0,
List(
InternalSlot(ObjectClass.bullet_20mm, PlanetSideGUID(575), 0,
CommonFieldData(PlanetSideEmpire.NEUTRAL, 2)(false)
)
)
)
)
)))
)(VehicleFormat.Normal)
val msg = ObjectCreateMessage(ObjectClass.mediumtransport, PlanetSideGUID(387), obj)
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector

View file

@ -2,8 +2,8 @@
package game.objectcreatevehicle
import net.psforever.packet._
import net.psforever.packet.game.{ObjectCreateMessage, PlanetSideGUID}
import net.psforever.packet.game.objectcreate._
import net.psforever.packet.game.{ObjectCreateMessage, PlanetSideGUID}
import net.psforever.types._
import org.specs2.mutable._
import scodec.bits._
@ -22,20 +22,19 @@ class UtilityVehiclesTest extends Specification {
cls mustEqual ObjectClass.ant
guid mustEqual PlanetSideGUID(380)
parent.isDefined mustEqual false
data.isDefined mustEqual true
data.get.isInstanceOf[VehicleData] mustEqual true
val ant = data.get.asInstanceOf[VehicleData]
data.isInstanceOf[VehicleData] mustEqual true
val ant = data.asInstanceOf[VehicleData]
ant.pos.coord mustEqual Vector3(3674.8438f, 2726.789f, 91.15625f)
ant.pos.orient mustEqual Vector3(0, 0, 90)
ant.faction mustEqual PlanetSideEmpire.VS
ant.owner_guid mustEqual PlanetSideGUID(0)
ant.data.faction mustEqual PlanetSideEmpire.VS
ant.data.alternate mustEqual false
ant.data.v1 mustEqual true
ant.data.v3 mustEqual false
ant.data.v5.isEmpty mustEqual true
ant.data.guid mustEqual PlanetSideGUID(0)
ant.driveState mustEqual DriveState.Mobile
ant.health mustEqual 255
ant.jammered mustEqual false
ant.destroyed mustEqual false
ant.cloak mustEqual false
ant.unk1 mustEqual 2
ant.unk2 mustEqual false
ant.unk3 mustEqual false
ant.unk4 mustEqual false
ant.unk5 mustEqual false
@ -52,22 +51,21 @@ class UtilityVehiclesTest extends Specification {
cls mustEqual ObjectClass.ams
guid mustEqual PlanetSideGUID(4157)
parent.isDefined mustEqual false
data.isDefined mustEqual true
data.get.isInstanceOf[VehicleData] mustEqual true
val ams = data.get.asInstanceOf[VehicleData]
data.isInstanceOf[VehicleData] mustEqual true
val ams = data.asInstanceOf[VehicleData]
ams.pos.coord mustEqual Vector3(3674, 2726.789f, 91.15625f)
ams.pos.orient mustEqual Vector3(0, 0, 90)
ams.pos.vel mustEqual None
ams.faction mustEqual PlanetSideEmpire.VS
ams.owner_guid mustEqual PlanetSideGUID(2885)
ams.data.faction mustEqual PlanetSideEmpire.VS
ams.data.alternate mustEqual false
ams.data.v1 mustEqual false
ams.data.v3 mustEqual false
ams.data.v5.isEmpty mustEqual true
ams.data.guid mustEqual PlanetSideGUID(2885)
ams.driveState mustEqual DriveState.Deployed
ams.vehicle_format_data mustEqual Some(UtilityVehicleData(60))
ams.health mustEqual 236
ams.jammered mustEqual false
ams.destroyed mustEqual false
ams.cloak mustEqual true
ams.unk1 mustEqual 0
ams.unk2 mustEqual false
ams.unk3 mustEqual false
ams.unk4 mustEqual false
ams.unk5 mustEqual false
@ -78,19 +76,19 @@ class UtilityVehiclesTest extends Specification {
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.head.obj.isInstanceOf[CommonFieldData] 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(1).obj.isInstanceOf[CommonFieldData] 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(2).obj.isInstanceOf[CommonFieldData] 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
inv(3).obj.isInstanceOf[CommonFieldData] mustEqual true
case _ =>
ko
}
@ -99,11 +97,7 @@ class UtilityVehiclesTest extends Specification {
"encode (ant)" in {
val obj = VehicleData(
PlacementData(3674.8438f, 2726.789f, 91.15625f, 0f, 0f, 90.0f),
PlanetSideEmpire.VS,
false, false,
2,
false, false,
PlanetSideGUID(0),
CommonFieldData(PlanetSideEmpire.VS, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)),
false,
255,
false, false,
@ -121,11 +115,7 @@ class UtilityVehiclesTest extends Specification {
"encode (ams)" in {
val obj = VehicleData(
PlacementData(3674.0f, 2726.789f, 91.15625f, 0f, 0f, 90.0f),
PlanetSideEmpire.VS,
false, false,
0,
false, false,
PlanetSideGUID(2885),
CommonFieldData(PlanetSideEmpire.VS, false, false, false, None, false, Some(false), None, PlanetSideGUID(2885)),
false,
236,
false, false,
@ -133,10 +123,10 @@ class UtilityVehiclesTest extends Specification {
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))
InternalSlot(ObjectClass.matrix_terminalc, PlanetSideGUID(3663), 1, CommonFieldData(PlanetSideEmpire.VS)(false)),
InternalSlot(ObjectClass.ams_respawn_tube, PlanetSideGUID(3638), 2, CommonFieldData(PlanetSideEmpire.VS)(false)),
InternalSlot(ObjectClass.order_terminala, PlanetSideGUID(3827), 3, CommonFieldData(PlanetSideEmpire.VS)(false)),
InternalSlot(ObjectClass.order_terminalb, PlanetSideGUID(3556), 4, CommonFieldData(PlanetSideEmpire.VS)(false))
)))
)(VehicleFormat.Utility)
val msg = ObjectCreateMessage(ObjectClass.ams, PlanetSideGUID(4157), obj)

View file

@ -19,17 +19,16 @@ class VariantVehiclesTest extends Specification {
cls mustEqual ObjectClass.switchblade
guid mustEqual PlanetSideGUID(418)
parent.isDefined mustEqual false
data.isDefined mustEqual true
data.get.isInstanceOf[VehicleData] mustEqual true
val switchblade = data.get.asInstanceOf[VehicleData]
data.isInstanceOf[VehicleData] mustEqual true
val switchblade = data.asInstanceOf[VehicleData]
switchblade.pos.coord.x mustEqual 6531.961f
switchblade.pos.coord.y mustEqual 1872.1406f
switchblade.pos.coord.z mustEqual 24.734375f
switchblade.pos.orient.x mustEqual 0f
switchblade.pos.orient.y mustEqual 0f
switchblade.pos.orient.z mustEqual 357.1875f
switchblade.faction mustEqual PlanetSideEmpire.VS
switchblade.unk1 mustEqual 2
switchblade.data.faction mustEqual PlanetSideEmpire.VS
switchblade.data.v1 mustEqual true
switchblade.health mustEqual 255
switchblade.driveState mustEqual DriveState.Mobile
switchblade.inventory.isDefined mustEqual true
@ -39,21 +38,59 @@ class VariantVehiclesTest extends Specification {
weapon.objectClass mustEqual ObjectClass.scythe
weapon.guid mustEqual PlanetSideGUID(355)
weapon.parentSlot mustEqual 1
weapon.obj.asInstanceOf[WeaponData].unk1 mustEqual 0x6
weapon.obj.asInstanceOf[WeaponData].unk2 mustEqual 0x8
weapon.obj.asInstanceOf[WeaponData].ammo.size mustEqual 2
//ammo-0
var ammo = weapon.obj.asInstanceOf[WeaponData].ammo.head
ammo.objectClass mustEqual ObjectClass.ancient_ammo_vehicle
ammo.guid mustEqual PlanetSideGUID(366)
ammo.parentSlot mustEqual 0
ammo.obj.asInstanceOf[AmmoBoxData].unk mustEqual 0x8
//ammo-1
ammo = weapon.obj.asInstanceOf[WeaponData].ammo(1)
ammo.objectClass mustEqual ObjectClass.ancient_ammo_vehicle
ammo.guid mustEqual PlanetSideGUID(385)
ammo.parentSlot mustEqual 1
ammo.obj.asInstanceOf[AmmoBoxData].unk mustEqual 0x8
weapon.obj match {
case WeaponData(CommonFieldData(wfaction, wbops, walternate, wv1, wv2, wv3, wv4, wv5, wfguid), fmode, ammo, _) =>
wfaction mustEqual PlanetSideEmpire.NEUTRAL
wbops mustEqual false
walternate mustEqual false
wv1 mustEqual true
wv2.isEmpty mustEqual true
wv3 mustEqual false
wv4.isEmpty mustEqual true
wv5.isEmpty mustEqual true
wfguid mustEqual PlanetSideGUID(0)
fmode mustEqual 0
//ammo-0
ammo.head.objectClass mustEqual ObjectClass.ancient_ammo_vehicle
ammo.head.guid mustEqual PlanetSideGUID(366)
ammo.head.parentSlot mustEqual 0
ammo.head.obj match {
case CommonFieldData(faction, bops, alternate, v1, v2, v3, v4, v5, fguid) =>
faction mustEqual PlanetSideEmpire.NEUTRAL
bops mustEqual false
alternate mustEqual false
v1 mustEqual true
v2.isEmpty mustEqual true
v3 mustEqual false
v4.contains(false) mustEqual true
v5.isEmpty mustEqual true
fguid mustEqual PlanetSideGUID(0)
case _ =>
ko
}
//ammo-1
ammo(1).objectClass mustEqual ObjectClass.ancient_ammo_vehicle
ammo(1).guid mustEqual PlanetSideGUID(385)
ammo(1).parentSlot mustEqual 1
ammo(1).obj match {
case CommonFieldData(faction, bops, alternate, v1, v2, v3, v4, v5, fguid) =>
faction mustEqual PlanetSideEmpire.NEUTRAL
bops mustEqual false
alternate mustEqual false
v1 mustEqual true
v2.isEmpty mustEqual true
v3 mustEqual false
v4.contains(false) mustEqual true
v5.isEmpty mustEqual true
fguid mustEqual PlanetSideGUID(0)
case _ =>
ko
}
case _ =>
ko
}
case _ =>
ko
}
@ -62,22 +99,25 @@ class VariantVehiclesTest extends Specification {
"encode (switchblade)" in {
val obj = VehicleData(
PlacementData(6531.961f, 1872.1406f, 24.734375f, 0f, 0f, 357.1875f),
PlanetSideEmpire.VS,
false, false,
2,
false, false,
PlanetSideGUID(0),
CommonFieldData(PlanetSideEmpire.VS, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)),
false,
255,
false, false,
DriveState.Mobile,
false, false, false,
Some(VariantVehicleData(0)),
Some(InventoryData(
Some(InventoryData(List(
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
))
WeaponData(
CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)),
0,
List(
InternalSlot(ObjectClass.ancient_ammo_vehicle, PlanetSideGUID(366), 0, CommonFieldData(PlanetSideEmpire.NEUTRAL, 2)(false)),
InternalSlot(ObjectClass.ancient_ammo_vehicle, PlanetSideGUID(385), 1, CommonFieldData(PlanetSideEmpire.NEUTRAL, 2)(false))
)
)
)
)))
)(VehicleFormat.Variant)
val msg = ObjectCreateMessage(ObjectClass.switchblade, PlanetSideGUID(418), obj)
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector