diff --git a/common/src/main/scala/net/psforever/objects/definition/converter/ACEConverter.scala b/common/src/main/scala/net/psforever/objects/definition/converter/ACEConverter.scala index da2884628..5107547da 100644 --- a/common/src/main/scala/net/psforever/objects/definition/converter/ACEConverter.scala +++ b/common/src/main/scala/net/psforever/objects/definition/converter/ACEConverter.scala @@ -21,7 +21,8 @@ class ACEConverter extends ObjectCreateConverter[ConstructionItem]() { None, None, PlanetSideGUID(0) - ) + ), + obj.FireModeIndex ) ) } @@ -39,7 +40,8 @@ class ACEConverter extends ObjectCreateConverter[ConstructionItem]() { None, None, PlanetSideGUID(0) - ) + ), + obj.FireModeIndex ) ) } diff --git a/common/src/main/scala/net/psforever/packet/game/objectcreate/DetailedCharacterData.scala b/common/src/main/scala/net/psforever/packet/game/objectcreate/DetailedCharacterData.scala index 141dd109a..8e8ee8a08 100644 --- a/common/src/main/scala/net/psforever/packet/game/objectcreate/DetailedCharacterData.scala +++ b/common/src/main/scala/net/psforever/packet/game/objectcreate/DetailedCharacterData.scala @@ -30,7 +30,7 @@ final case class ImplantEntry(implant : ImplantType.Value, object ImplantEntry { def apply(implant : ImplantType.Value, initialization : Option[Int]) : ImplantEntry = { - ImplantEntry(implant, initialization, false) + ImplantEntry(implant, initialization, active = false) } } @@ -155,11 +155,10 @@ final case class DetailedCharacterB(unk1 : Option[Long], 0L } //character is at least BR24 - val br24 = DetailedCharacterData.isBR24(bep) - val unk9Size : Long = if(br24) { 0L } else { 13L } + val unk9Size : Long = if(unk9.isEmpty) { 0L } else { 13L } val unkASize : Long = unkA.length * 32L val unkBSize : Long = unkB.foldLeft(0L)(_ + StreamBitSize.stringBitSize(_)) - val cosmeticsSize : Long = if(br24) { cosmetics.get.bitsize } else { 0L } + val cosmeticsSize : Long = if(DetailedCharacterData.isBR24(bep)) { cosmetics.get.bitsize } else { 0L } val paddingSize : Int = DetailedCharacterData.paddingCalculations(pad_length, implants, Nil)(unk2Len) + /* unk2 */ @@ -214,7 +213,7 @@ object DetailedCharacterData extends Marshallable[DetailedCharacterData] { 0L, 0L, healthMax, health, - false, + unk4 = false, armor, 0L, staminaMax, stamina, @@ -240,10 +239,10 @@ object DetailedCharacterData extends Marshallable[DetailedCharacterData] { None, Nil, Nil, - false, + unkC = false, cosmetics ) - (pad_length : Option[Int]) => DetailedCharacterData(a, b(a.bep, pad_length))(pad_length) + pad_length : Option[Int] => DetailedCharacterData(a, b(a.bep, pad_length))(pad_length) } /** @@ -261,7 +260,7 @@ object DetailedCharacterData extends Marshallable[DetailedCharacterData] { ImplantEntry(ImplantType(implant), None, activeBool) //TODO catch potential NoSuchElementException? case implant :: false :: extra :: HNil => //uninitialized (timer), inactive - ImplantEntry(ImplantType(implant), Some(extra), false) //TODO catch potential NoSuchElementException? + ImplantEntry(ImplantType(implant), Some(extra), active = false) //TODO catch potential NoSuchElementException? }, { case ImplantEntry(implant, None, n) => //initialized (no timer), active/inactive? @@ -298,7 +297,7 @@ object DetailedCharacterData extends Marshallable[DetailedCharacterData] { * `Codec` for a `List` of `DCDExtra1` objects. * The first entry contains a padded `String` so it must be processed different from the remainder. */ - private def dcd_list_codec(padFunc : (Long)=>Int) : Codec[List[DCDExtra1]] = ( + private def dcd_list_codec(padFunc : Long=>Int) : Codec[List[DCDExtra1]] = ( uint8 >>:~ { size => conditional(size > 0, dcd_extra1_codec(padFunc(size))) :: PacketHelpers.listOfNSized(size - 1, dcd_extra1_codec(0)) @@ -344,7 +343,7 @@ object DetailedCharacterData extends Marshallable[DetailedCharacterData] { * The first entry contains a padded `String` so it must be processed different from the remainder. * @param padFunc a curried function awaiting the extracted length of the current `List` */ - private def eventsListCodec(padFunc : (Long)=>Int) : Codec[List[String]] = ( + private def eventsListCodec(padFunc : Long=>Int) : Codec[List[String]] = ( uint32L >>:~ { size => conditional(size > 0, PacketHelpers.encodedStringAligned(padFunc(size))) :: PacketHelpers.listOfNSized(size - 1, PacketHelpers.encodedString) @@ -382,7 +381,7 @@ object DetailedCharacterData extends Marshallable[DetailedCharacterData] { * @see `paddingCalculations` * @param padFunc a curried function awaiting the extracted length of the current `List` and will count the padding bits */ - private def unkBCodec(padFunc : (Long)=>Int) : Codec[List[String]] = ( + private def unkBCodec(padFunc : Long=>Int) : Codec[List[String]] = ( uint16L >>:~ { size => conditional(size > 0, PacketHelpers.encodedStringAligned(padFunc(size))) :: PacketHelpers.listOfNSized(size - 1, PacketHelpers.encodedString) @@ -405,7 +404,16 @@ object DetailedCharacterData extends Marshallable[DetailedCharacterData] { ) /** - * Suport function that obtains the "absolute list value" of an `Option` object. + * A `Codec[Boolean]` that parses a `1u` value according to a NOT truth table. + * `0` is `true` and `1` is `false`. + */ + private val isFalse : Codec[Boolean] = bool.xmap[Boolean] ( + value => !value, + value => !value + ) + + /** + * Support function that obtains the "absolute list value" of an `Option` object. * @param opt the `Option` object * @return if defined, returns a `List` of the `Option` object's contents; * if undefined (`None`), returns an empty list @@ -577,19 +585,17 @@ object DetailedCharacterData extends Marshallable[DetailedCharacterData] { ("unk6" | uint32L) :: ("unk7" | uint32L) :: ("unk8" | uint32L) :: - (bool >>:~ { br24 => //BR24+ - conditional(!br24, "unk9" | dcd_extra2_codec) >>:~ { unk9 => - ("unkA" | listOfN(uint16L, uint32L)) :: - ("unkB" | unkBCodec( - paddingCalculations( - displaceByUnk9(pad_length, unk9, 5), - implants, - List(optToList(unk9), tut, fte, unk3, unk2) - ) - )) :: - ("unkC" | bool) :: - conditional(br24, "cosmetics" | Cosmetics.codec) - } + (optional(isFalse, "unk9" | dcd_extra2_codec) >>:~ { unk9 => + ("unkA" | listOfN(uint16L, uint32L)) :: + ("unkB" | unkBCodec( + paddingCalculations( + displaceByUnk9(pad_length, unk9, 5), + implants, + List(optToList(unk9), tut, fte, unk3, unk2) + ) + )) :: + ("unkC" | bool) :: + conditional(isBR24(bep), "cosmetics" | Cosmetics.codec) }) } } @@ -598,7 +604,7 @@ object DetailedCharacterData extends Marshallable[DetailedCharacterData] { }) ).exmap[DetailedCharacterB] ( { - case u1 :: implants :: u2 :: u3 :: fte :: tut :: u4 :: u5 :: u6 :: u7 :: u8 :: _ :: u9 :: uA :: uB :: uC :: cosmetics :: HNil => + case u1 :: implants :: u2 :: u3 :: fte :: tut :: u4 :: u5 :: u6 :: u7 :: u8 :: u9 :: uA :: uB :: uC :: cosmetics :: HNil => Attempt.successful( DetailedCharacterB(u1, implants, u2, u3, fte, tut, u4, u5, u6, u7, u8, u9, uA, uB, uC, cosmetics)(bep, pad_length) ) @@ -612,10 +618,9 @@ object DetailedCharacterData extends Marshallable[DetailedCharacterData] { else { recursiveEnsureImplantSlots(implantCapacity, implants) } - val br24 : Boolean = isBR24(bep) - val cos : Option[Cosmetics] = if(br24) { cosmetics } else { None } + val cos : Option[Cosmetics] = if(isBR24(bep)) { cosmetics } else { None } Attempt.successful( - u1 :: implantList :: u2 :: u3 :: fte :: tut :: u4 :: u5 :: u6 :: u7 :: u8 :: br24 :: u9 :: uA :: uB :: uC :: cos :: HNil + u1 :: implantList :: u2 :: u3 :: fte :: tut :: u4 :: u5 :: u6 :: u7 :: u8 :: u9 :: uA :: uB :: uC :: cos :: HNil ) } ) diff --git a/common/src/main/scala/net/psforever/packet/game/objectcreate/DetailedConstructionToolData.scala b/common/src/main/scala/net/psforever/packet/game/objectcreate/DetailedConstructionToolData.scala index 5fc89bc04..b95b1cee8 100644 --- a/common/src/main/scala/net/psforever/packet/game/objectcreate/DetailedConstructionToolData.scala +++ b/common/src/main/scala/net/psforever/packet/game/objectcreate/DetailedConstructionToolData.scala @@ -11,26 +11,29 @@ import shapeless.{::, HNil} * `DetailedBoomerTriggerData` - `data.faction` can be `NEUTRAL`, `data.unk1` is `true` * `DetailedTelepadData` - `data.faction` can be `NEUTRAL`, `data.jammered` is the router's GUID */ -final case class DetailedConstructionToolData(data : CommonFieldData) extends ConstructorData { +final case class DetailedConstructionToolData(data : CommonFieldData, mode : Int) extends ConstructorData { override def bitsize : Long = 28L + data.bitsize } object DetailedConstructionToolData extends Marshallable[DetailedConstructionToolData] { + def apply(data : CommonFieldData) : DetailedConstructionToolData = DetailedConstructionToolData(data, 0) + implicit val codec : Codec[DetailedConstructionToolData] = ( ("data" | CommonFieldData.codec(false)) :: uint8 :: - uint(18) :: + ("mode" | uint16) :: + uint2 :: uint2 ).exmap[DetailedConstructionToolData] ( { - case data :: 1 :: 1 :: _ :: HNil => - Attempt.successful(DetailedConstructionToolData(data)) + case data :: 1 :: mode :: 1 :: _ :: HNil => + Attempt.successful(DetailedConstructionToolData(data, mode)) case data => Attempt.failure(Err(s"invalid detailed construction tool data format - $data")) }, { - case DetailedConstructionToolData(data) => - Attempt.successful(data :: 1 :: 1 :: 0 :: HNil) + case DetailedConstructionToolData(data, mode) => + Attempt.successful(data :: 1 :: mode :: 1 :: 0 :: HNil) } ) } diff --git a/common/src/main/scala/net/psforever/packet/game/objectcreate/DroppodData.scala b/common/src/main/scala/net/psforever/packet/game/objectcreate/DroppodData.scala index 6d7006a9f..1175ba6b2 100644 --- a/common/src/main/scala/net/psforever/packet/game/objectcreate/DroppodData.scala +++ b/common/src/main/scala/net/psforever/packet/game/objectcreate/DroppodData.scala @@ -26,14 +26,15 @@ import shapeless.{::, HNil} * When `basic.player_guid` is defined, the droppod will not be at the world ceiling anymore and its boosters will be activate. * Does this `basic.player_guid` actually represent the player who is in the pod? * @param basic data common to objects - * @param burn whether the boosters are ignited * @param health the amount of health the object has, as a percentage of a filled bar + * @param burn whether the boosters are ignited * @see `DroppodLaunchRequestMessage` * @see `DroppodLaunchResponseMessage` */ final case class DroppodData(basic : CommonFieldDataWithPlacement, - burn : Boolean = false, - health : Int = 255 + health : Int, + burn : Boolean, + unk : Boolean ) extends ConstructorData { override def bitsize : Long = { val basicSize = basic.bitsize @@ -42,6 +43,8 @@ final case class DroppodData(basic : CommonFieldDataWithPlacement, } object DroppodData extends Marshallable[DroppodData] { + def apply(basic : CommonFieldDataWithPlacement) : DroppodData = DroppodData(basic, 255, burn = false, unk = false) + implicit val codec : Codec[DroppodData] = ( ("basic" | CommonFieldDataWithPlacement.codec) :: bool :: @@ -50,20 +53,20 @@ object DroppodData extends Marshallable[DroppodData] { uint4L :: //0xF uintL(6) :: //0x0 ("boosters" | uint4L) :: //0x9 on standby, 0x0 when burning and occupied (basic.player_guid?) - bool + ("unk" | bool) ).exmap[DroppodData] ( { - case basic :: false :: health :: 0 :: 0xF :: 0 :: boosters :: false :: HNil => + case basic :: false :: health :: 0 :: 0xF :: 0 :: boosters :: unk :: HNil => val burn : Boolean = boosters == 0 - Attempt.successful(DroppodData(basic, burn, health)) + Attempt.successful(DroppodData(basic, health, burn, unk)) case data => Attempt.failure(Err(s"invalid droppod data format - $data")) }, { - case DroppodData(basic, burn, health) => + case DroppodData(basic, health, burn, unk) => val boosters : Int = if(burn) { 0 } else { 9 } - Attempt.successful(basic :: false :: health :: 0 :: 0xF :: 0 :: boosters :: false :: HNil) + Attempt.successful(basic :: false :: health :: 0 :: 0xF :: 0 :: boosters :: unk :: HNil) } ) } diff --git a/common/src/main/scala/net/psforever/packet/game/objectcreate/HandheldData.scala b/common/src/main/scala/net/psforever/packet/game/objectcreate/HandheldData.scala index 9cd6e5e02..293f22129 100644 --- a/common/src/main/scala/net/psforever/packet/game/objectcreate/HandheldData.scala +++ b/common/src/main/scala/net/psforever/packet/game/objectcreate/HandheldData.scala @@ -18,29 +18,34 @@ import shapeless.{::, HNil} * - v4 - not used, i.e., the simple format `CommonFieldData` object is employed * - v5 - for the telepad, this field is expected to be the GUID of the associated Router */ -final case class HandheldData(data : CommonFieldData) extends ConstructorData { +final case class HandheldData(data : CommonFieldData, + mode : Int, + unk : Int) extends ConstructorData { override def bitsize : Long = { 11L + data.bitsize } } object HandheldData extends Marshallable[HandheldData] { + def apply(data : CommonFieldData) : HandheldData = HandheldData(data, 0, 0) + + def apply(data : CommonFieldData, mode : Int) : HandheldData = HandheldData(data, mode, 0) + implicit val codec : Codec[HandheldData] = ( ("data" | CommonFieldData.codec) :: - uint4 :: - uint4 :: - uint(3) + ("mode" | uint8) :: + ("unk" | uint(3)) ).exmap[HandheldData] ( { - case data :: 0 :: 0 :: 0 :: HNil => - Attempt.successful(HandheldData(data)) + case data :: mode :: unk :: HNil => + Attempt.successful(HandheldData(data, mode, unk)) case data => Attempt.failure(Err(s"invalid handheld tool data format - $data")) }, { - case HandheldData(data) => - Attempt.successful(data :: 0 :: 0 :: 0 :: HNil) + case HandheldData(data, mode, unk) => + Attempt.successful(data :: mode :: unk :: HNil) } ) } diff --git a/common/src/main/scala/net/psforever/packet/game/objectcreate/OneMannedFieldTurretData.scala b/common/src/main/scala/net/psforever/packet/game/objectcreate/OneMannedFieldTurretData.scala index 9ef570bdf..7035050dc 100644 --- a/common/src/main/scala/net/psforever/packet/game/objectcreate/OneMannedFieldTurretData.scala +++ b/common/src/main/scala/net/psforever/packet/game/objectcreate/OneMannedFieldTurretData.scala @@ -48,84 +48,6 @@ object OneMannedFieldTurretData extends Marshallable[OneMannedFieldTurretData] { def apply(deploy : CommonFieldDataWithPlacement, health : Int, internals : InventoryData) : OneMannedFieldTurretData = new OneMannedFieldTurretData(deploy, health, Some(internals)) -// /** -// * Prefabricated weapon data for a weaponless field turret mount (`portable_manned_turret`). -// * @param wep_guid the uid to assign to the weapon -// * @param wep_unk1 na; -// * used by `WeaponData` -// * -// * @param wep_unk2 na; -// * used by `WeaponData` -// * @param ammo_guid the uid to assign to the ammo -// * @param ammo_unk na; -// * used by `AmmoBoxData` -// * @return an `InternalSlot` object -// */ -// def generic(wep_guid : PlanetSideGUID, wep_unk1 : Int, wep_unk2 : Int, ammo_guid : PlanetSideGUID, ammo_unk : Int) : InternalSlot = -// InternalSlot(ObjectClass.energy_gun, wep_guid, 1, -// WeaponData(wep_unk1, wep_unk2, ObjectClass.energy_gun_ammo, ammo_guid, 0, -// CommonFieldData(PlanetSideEmpire.NEUTRAL, ammo_unk(false) -// ) -// ) -// -// /** -// * Prefabricated weapon data for the Terran Republic field turret, the Avenger (`portable_manned_turret_tr`). -// * @param wep_guid the uid to assign to the weapon -// * @param wep_unk1 na; -// * used by `WeaponData` -// * -// * @param wep_unk2 na; -// * used by `WeaponData` -// * @param ammo_guid the uid to assign to the ammo -// * @param ammo_unk na; -// * used by `AmmoBoxData` -// * @return an `InternalSlot` object -// */ -// def avenger(wep_guid : PlanetSideGUID, wep_unk1 : Int, wep_unk2 : Int, ammo_guid : PlanetSideGUID, ammo_unk : Int) : InternalSlot = -// InternalSlot(ObjectClass.energy_gun_tr, wep_guid, 1, -// WeaponData(wep_unk1, wep_unk2, ObjectClass.energy_gun_ammo, ammo_guid, 0, -// CommonFieldData(PlanetSideEmpire.NEUTRAL, ammo_unk(false) -// ) -// ) -// -// /** -// * Prefabricated weapon data for the New Conglomerate field turret, the Osprey (`portable_manned_turret_vnc`). -// * @param wep_guid the uid to assign to the weapon -// * @param wep_unk1 na; -// * used by `WeaponData` -// * @param wep_unk2 na; -// * used by `WeaponData` -// * @param ammo_guid the uid to assign to the ammo -// * @param ammo_unk na; -// * used by `AmmoBoxData` -// * @return an `InternalSlot` object -// */ -// def osprey(wep_guid : PlanetSideGUID, wep_unk1 : Int, wep_unk2 : Int, ammo_guid : PlanetSideGUID, ammo_unk : Int) : InternalSlot = -// InternalSlot(ObjectClass.energy_gun_nc, wep_guid, 1, -// WeaponData(wep_unk1, wep_unk2, ObjectClass.energy_gun_ammo, ammo_guid, 0, -// CommonFieldData(PlanetSideEmpire.NEUTRAL, ammo_unk(false) -// ) -// ) -// -// /** -// * Prefabricated weapon data for the Vanu Soveriegnty field turret, the Orion (`portable_manned_turret_vs`). -// * @param wep_guid the uid to assign to the weapon -// * @param wep_unk1 na; -// * used by `WeaponData` -// * @param wep_unk2 na; -// * used by `WeaponData` -// * @param ammo_guid the uid to assign to the ammo -// * @param ammo_unk na; -// * used by `AmmoBoxData` -// * @return an `InternalSlot` object -// */ -// def orion(wep_guid : PlanetSideGUID, wep_unk1 : Int, wep_unk2 : Int, ammo_guid : PlanetSideGUID, ammo_unk : Int) : InternalSlot = -// InternalSlot(ObjectClass.energy_gun_vs, wep_guid, 1, -// WeaponData(wep_unk1, wep_unk2, ObjectClass.energy_gun_ammo, ammo_guid, 0, -// CommonFieldData(PlanetSideEmpire.NEUTRAL, ammo_unk(false) -// ) -// ) - implicit val codec : Codec[OneMannedFieldTurretData] = ( ("deploy" | CommonFieldDataWithPlacement.codec2) :: PlanetSideGUID.codec :: //hoist/extract with the deploy.owner_guid in field above diff --git a/common/src/main/scala/net/psforever/packet/game/objectcreate/REKData.scala b/common/src/main/scala/net/psforever/packet/game/objectcreate/REKData.scala index 13f6a4d9c..390039614 100644 --- a/common/src/main/scala/net/psforever/packet/game/objectcreate/REKData.scala +++ b/common/src/main/scala/net/psforever/packet/game/objectcreate/REKData.scala @@ -9,32 +9,34 @@ import shapeless.{::, HNil} /** * na * @param data na - * @param unk na; + * @param unk1 na; * defaults to 0 * @see `DetailedREKData` */ final case class REKData(data : CommonFieldData, - unk : Int = 0 + unk1 : Int, + unk2 : Int ) extends ConstructorData { override def bitsize : Long = 50L } object REKData extends Marshallable[REKData] { + def apply(data : CommonFieldData) : REKData = REKData(data, 0, 0) + implicit val codec : Codec[REKData] = ( ("data" | CommonFieldData.codec2) :: - uint8 :: - ("unk" | uint8) :: - uint(10) + ("unk1" | uint16) :: + ("unk2" | uint(10)) ).exmap[REKData] ( { - case data :: 0 :: unk :: 0 :: HNil => - Attempt.successful(REKData(data, unk)) + case data :: u1 :: u2 :: HNil => + Attempt.successful(REKData(data, u1, u2)) case data => Attempt.failure(Err(s"invalid rek data format - $data")) }, { - case REKData(data, unk) => - Attempt.successful(data :: 0 :: unk :: 0 :: HNil) + case REKData(data, u1, u2) => + Attempt.successful(data :: u1 :: u2 :: HNil) } ) } diff --git a/common/src/main/scala/net/psforever/packet/game/objectcreate/WeaponData.scala b/common/src/main/scala/net/psforever/packet/game/objectcreate/WeaponData.scala index 88b635964..fad65d960 100644 --- a/common/src/main/scala/net/psforever/packet/game/objectcreate/WeaponData.scala +++ b/common/src/main/scala/net/psforever/packet/game/objectcreate/WeaponData.scala @@ -143,7 +143,9 @@ object WeaponData extends Marshallable[WeaponData] { else { Attempt.successful(WeaponData(data, fmode, ammo, unk)) } - + case data :: fmode :: false :: None :: unk :: HNil => + //rare pass condition, usually found in LockerContainer objects or temporarily existing as a dropped item + Attempt.successful(WeaponData(data, fmode, Nil, unk)) case data => Attempt.failure(Err(s"invalid weapon data format - $data")) }, @@ -159,7 +161,6 @@ object WeaponData extends Marshallable[WeaponData] { else { Attempt.successful(data :: fmode :: false :: Some(InventoryData(ammo)) :: unk :: HNil) } - case _ => Attempt.failure(Err("invalid weapon data format")) } diff --git a/common/src/test/scala/game/objectcreate/HandheldDataTest.scala b/common/src/test/scala/game/objectcreate/HandheldDataTest.scala index 94078f9ae..790efb4b8 100644 --- a/common/src/test/scala/game/objectcreate/HandheldDataTest.scala +++ b/common/src/test/scala/game/objectcreate/HandheldDataTest.scala @@ -23,7 +23,7 @@ class HandheldDataTest extends Specification { parent.get.guid mustEqual PlanetSideGUID(3336) parent.get.slot mustEqual 0 data match { - case HandheldData(CommonFieldData(faction, bops, alternate, v1, v2, v3, v4, v5, fguid)) => + case HandheldData(CommonFieldData(faction, bops, alternate, v1, v2, v3, v4, v5, fguid), mode, unk) => faction mustEqual PlanetSideEmpire.NC bops mustEqual false alternate mustEqual false @@ -50,7 +50,7 @@ class HandheldDataTest extends Specification { parent.isDefined mustEqual false data.isInstanceOf[DroppedItemData[_]] mustEqual true data match { - case DroppedItemData(pos, HandheldData(CommonFieldData(faction, bops, alternate, v1, v2, v3, v4, v5, fguid))) => + case DroppedItemData(pos, HandheldData(CommonFieldData(faction, bops, alternate, v1, v2, v3, v4, v5, fguid), mode, unk)) => pos.coord mustEqual Vector3(4708.461f, 5547.539f, 72.703125f) pos.orient mustEqual Vector3.z(194.0625f) @@ -102,7 +102,7 @@ class HandheldDataTest extends Specification { parent.get.guid mustEqual PlanetSideGUID(430) parent.get.slot mustEqual 0 data match { - case HandheldData(CommonFieldData(faction, bops, alternate, v1, v2, v3, v4, v5, fguid)) => + case HandheldData(CommonFieldData(faction, bops, alternate, v1, v2, v3, v4, v5, fguid), mode, unk) => faction mustEqual PlanetSideEmpire.TR bops mustEqual false alternate mustEqual false @@ -142,7 +142,7 @@ class HandheldDataTest extends Specification { parent.get.guid mustEqual PlanetSideGUID(4272) parent.get.slot mustEqual 0 data match { - case HandheldData(CommonFieldData(faction, bops, alternate, v1, v2, v3, v4, v5, fguid)) => + case HandheldData(CommonFieldData(faction, bops, alternate, v1, v2, v3, v4, v5, fguid), mode, unk) => faction mustEqual PlanetSideEmpire.NEUTRAL bops mustEqual false alternate mustEqual false @@ -182,7 +182,7 @@ class HandheldDataTest extends Specification { parent.get.guid mustEqual PlanetSideGUID(4149) parent.get.slot mustEqual 0 data match { - case HandheldData(CommonFieldData(faction, bops, alternate, v1, v2, v3, v4, v5, fguid)) => + case HandheldData(CommonFieldData(faction, bops, alternate, v1, v2, v3, v4, v5, fguid), mode, unk) => faction mustEqual PlanetSideEmpire.NC bops mustEqual false alternate mustEqual false @@ -208,7 +208,7 @@ class HandheldDataTest extends Specification { guid mustEqual PlanetSideGUID(3682) parent.isDefined mustEqual false data match { - case DroppedItemData(pos, HandheldData(CommonFieldData(faction, bops, alternate, v1, v2, v3, v4, v5, fguid))) => + case DroppedItemData(pos, HandheldData(CommonFieldData(faction, bops, alternate, v1, v2, v3, v4, v5, fguid), mode, unk)) => pos.coord mustEqual Vector3(4777.633f, 5485.4062f, 85.8125f) pos.orient mustEqual Vector3.z(14.0625f) diff --git a/common/src/test/scala/game/objectcreate/REKDataTest.scala b/common/src/test/scala/game/objectcreate/REKDataTest.scala index 328c10dbe..1f6da6b1a 100644 --- a/common/src/test/scala/game/objectcreate/REKDataTest.scala +++ b/common/src/test/scala/game/objectcreate/REKDataTest.scala @@ -23,7 +23,7 @@ class REKDataTest extends Specification { parent.get.guid mustEqual PlanetSideGUID(4174) parent.get.slot mustEqual 0 data match { - case REKData(CommonFieldData(faction, bops, alternate, v1, v2, v3, v4, v5, fguid), unk) => + case REKData(CommonFieldData(faction, bops, alternate, v1, v2, v3, v4, v5, fguid), unk1, unk2) => faction mustEqual PlanetSideEmpire.TR bops mustEqual false alternate mustEqual false @@ -33,7 +33,8 @@ class REKDataTest extends Specification { v4.contains(false) mustEqual true v5.isEmpty mustEqual true fguid mustEqual PlanetSideGUID(0) - unk mustEqual 0 + unk1 mustEqual 0 + unk2 mustEqual 0 case _ => ko } @@ -50,7 +51,7 @@ class REKDataTest extends Specification { guid mustEqual PlanetSideGUID(4355) parent.isDefined mustEqual false data match { - case DroppedItemData(pos, REKData(CommonFieldData(faction, bops, alternate, v1, v2, v3, v4, v5, fguid), unk)) => + case DroppedItemData(pos, REKData(CommonFieldData(faction, bops, alternate, v1, v2, v3, v4, v5, fguid), unk1, unk2)) => pos.coord mustEqual Vector3(4675.039f, 5506.953f, 72.703125f) pos.orient mustEqual Vector3.z(230.625f) @@ -64,7 +65,8 @@ class REKDataTest extends Specification { v5.isEmpty mustEqual true fguid mustEqual PlanetSideGUID(0) - unk mustEqual 3 + unk1 mustEqual 3 + unk2 mustEqual 0 case _ => ko } @@ -83,7 +85,7 @@ class REKDataTest extends Specification { "encode (dropped)" in { val obj = DroppedItemData( PlacementData(4675.039f, 5506.953f, 72.703125f, 0f, 0f, 230.625f), - REKData(CommonFieldData(PlanetSideEmpire.VS, false, false, false, None, false, Some(false), None, PlanetSideGUID(0)), 3) + REKData(CommonFieldData(PlanetSideEmpire.VS, false, false, false, None, false, Some(false), None, PlanetSideGUID(0)), 3, 0) ) val msg = ObjectCreateMessage(ObjectClass.remote_electronics_kit, PlanetSideGUID(4355), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector diff --git a/common/src/test/scala/game/objectcreatedetailed/DetailedCharacterDataTest.scala b/common/src/test/scala/game/objectcreatedetailed/DetailedCharacterDataTest.scala index 84bdd517d..e64dd8fcf 100644 --- a/common/src/test/scala/game/objectcreatedetailed/DetailedCharacterDataTest.scala +++ b/common/src/test/scala/game/objectcreatedetailed/DetailedCharacterDataTest.scala @@ -45,6 +45,7 @@ class DetailedCharacterDataTest extends Specification { hex"000059640000010000" val string_br32 = hex"18 2c e0 00 00 bc 84 B0 00 0b ea 00 6c 7d f1 10 00 00 02 40 00 08 60 4b 00 69 00 43 00 6b 00 4a 00 72 00 02 31 3a cc 82 c0 00 00 00 00 00 00 00 00 3e df 42 00 20 00 0e 00 40 43 40 4c 04 00 02 e8 00 00 03 a8 00 00 01 9c 04 00 00 b8 99 84 00 0e 68 28 00 00 00 00 00 00 00 00 00 00 00 00 01 90 01 90 00 c8 00 00 01 00 7e c8 00 5c 00 00 01 29 c1 cc 80 00 00 00 00 00 00 00 00 00 00 00 00 03 c0 00 40 81 01 c4 45 46 86 c8 88 c9 09 4a 4a 80 50 0c 13 00 00 15 00 80 00 48 00 7870655f6f766572686561645f6d6170 8d7870655f776172705f676174658f7870655f666f726d5f6f75746669748c7870655f626c61636b6f7073927870655f636f6d6d616e645f72616e6b5f35927870655f636f6d6d616e645f72616e6b5f33927870655f73616e6374756172795f68656c70927870655f626174746c655f72616e6b5f3133927870655f626174746c655f72616e6b5f3132927870655f626174746c655f72616e6b5f3130927870655f626174746c655f72616e6b5f3134927870655f626174746c655f72616e6b5f3135937870655f6f72626974616c5f73687574746c658c7870655f64726f705f706f64917870655f62696e645f666163696c697479917870655f626174746c655f72616e6b5f33917870655f626174746c655f72616e6b5f35917870655f626174746c655f72616e6b5f348e7870655f6a6f696e5f73717561648e7870655f666f726d5f7371756164927870655f696e7374616e745f616374696f6e917870655f626174746c655f72616e6b5f32937870655f776172705f676174655f7573616765917870655f626174746c655f72616e6b5f38927870655f626174746c655f72616e6b5f3131917870655f626174746c655f72616e6b5f368e7870655f6d61696c5f616c657274927870655f636f6d6d616e645f72616e6b5f31927870655f626174746c655f72616e6b5f3230927870655f626174746c655f72616e6b5f3138927870655f626174746c655f72616e6b5f3139907870655f6a6f696e5f706c61746f6f6e927870655f626174746c655f72616e6b5f3137927870655f626174746c655f72616e6b5f31368f7870655f6a6f696e5f6f7574666974927870655f626174746c655f72616e6b5f3235927870655f626174746c655f72616e6b5f3234927870655f636f6d6d616e645f72616e6b5f34907870655f666f726d5f706c61746f6f6e8c7870655f62696e645f616d73917870655f626174746c655f72616e6b5f39917870655f626174746c655f72616e6b5f378d7870655f74685f726f757465728c7870655f74685f666c61696c8a7870655f74685f616e748a7870655f74685f616d738f7870655f74685f67726f756e645f708c7870655f74685f6169725f708c7870655f74685f686f7665728d7870655f74685f67726f756e648a7870655f74685f626672927870655f74685f61667465726275726e65728a7870655f74685f6169728c7870655f74685f636c6f616b89757365645f6f69637791757365645f616476616e6365645f61636597766973697465645f73706974666972655f74757272657498766973697465645f73706974666972655f636c6f616b656493766973697465645f73706974666972655f616192766973697465645f74616e6b5f7472617073a1766973697465645f706f727461626c655f6d616e6e65645f7475727265745f6e63a1766973697465645f706f727461626c655f6d616e6e65645f7475727265745f74728e757365645f6d61676375747465728f757365645f636861696e626c6164658f757365645f666f726365626c61646593766973697465645f77616c6c5f74757272657498766973697465645f616e6369656e745f7465726d696e616c8b766973697465645f616d738b766973697465645f616e7490766973697465645f64726f707368697091766973697465645f6c6962657261746f7294766973697465645f6c6967687467756e7368697091766973697465645f6c696768746e696e6790766973697465645f6d616772696465728f766973697465645f70726f776c657293766973697465645f71756164737465616c746890766973697465645f736b7967756172649a766973697465645f74687265656d616e686561767962756767799d766973697465645f74776f5f6d616e5f61737361756c745f627567677998766973697465645f74776f6d616e6865617679627567677998766973697465645f74776f6d616e686f766572627567677990766973697465645f76616e67756172648d766973697465645f666c61696c8e766973697465645f726f7574657293766973697465645f737769746368626c6164658e766973697465645f6175726f726193766973697465645f626174746c657761676f6e8c766973697465645f6675727993766973697465645f7175616461737361756c7496766973697465645f67616c6178795f67756e736869708e766973697465645f6170635f74728e766973697465645f6170635f767390766973697465645f6c6f64657374617290766973697465645f7068616e7461736d91766973697465645f7468756e64657265728e766973697465645f6170635f6e638f766973697465645f76756c747572658c766973697465645f7761737090766973697465645f6d6f73717569746f97766973697465645f617068656c696f6e5f666c6967687497766973697465645f617068656c696f6e5f67756e6e657297766973697465645f636f6c6f737375735f666c6967687497766973697465645f636f6c6f737375735f67756e6e657298766973697465645f706572656772696e655f666c6967687498766973697465645f706572656772696e655f67756e6e657289757365645f62616e6b95766973697465645f7265736f757263655f73696c6f9e766973697465645f63657274696669636174696f6e5f7465726d696e616c94766973697465645f6d65645f7465726d696e616c93757365645f6e616e6f5f64697370656e73657295766973697465645f73656e736f725f736869656c649a766973697465645f62726f6164636173745f77617270676174658c757365645f7068616c616e7894757365645f7068616c616e785f6176636f6d626f96757365645f7068616c616e785f666c616b636f6d626f96766973697465645f77617270676174655f736d616c6c91757365645f666c616d657468726f7765729a757365645f616e6369656e745f7475727265745f776561706f6e92766973697465645f4c4c555f736f636b657492757365645f656e657267795f67756e5f6e6397766973697465645f6d656469756d7472616e73706f72749f757365645f617068656c696f6e5f696d6d6f6c6174696f6e5f63616e6e6f6e93757365645f6772656e6164655f706c61736d6193757365645f6772656e6164655f6a616d6d657298766973697465645f736869656c645f67656e657261746f7295766973697465645f6d6f74696f6e5f73656e736f7296766973697465645f6865616c74685f6372797374616c96766973697465645f7265706169725f6372797374616c97766973697465645f76656869636c655f6372797374616c91757365645f6772656e6164655f6672616788757365645f61636598766973697465645f6164765f6d65645f7465726d696e616c8b757365645f6265616d657290757365645f626f6c745f6472697665728b757365645f6379636c65728a757365645f676175737391757365645f68756e7465727365656b657288757365645f6973708b757365645f6c616e6365728b757365645f6c61736865728e757365645f6d61656c7374726f6d8c757365645f70686f656e69788b757365645f70756c7361728d757365645f70756e69736865728e757365645f725f73686f7467756e8d757365645f7261646961746f7288757365645f72656b8d757365645f72657065617465728c757365645f726f636b6c65748c757365645f737472696b65728f757365645f73757070726573736f728c757365645f7468756d7065729c766973697465645f76616e755f636f6e74726f6c5f636f6e736f6c6598766973697465645f636170747572655f7465726d696e616c92757365645f6d696e695f636861696e67756e91757365645f6c617a655f706f696e7465728c757365645f74656c657061648b757365645f7370696b657291757365645f68656176795f736e6970657293757365645f636f6d6d616e645f75706c696e6b8d757365645f66697265626972648e757365645f666c6563686574746594757365645f68656176795f7261696c5f6265616d89757365645f696c63399a766973697465645f67656e657261746f725f7465726d696e616c8e766973697465645f6c6f636b65729a766973697465645f65787465726e616c5f646f6f725f6c6f636b9c766973697465645f6169725f76656869636c655f7465726d696e616c97766973697465645f67616c6178795f7465726d696e616c98766973697465645f696d706c616e745f7465726d696e616c99766973697465645f7365636f6e646172795f6361707475726590757365645f32356d6d5f63616e6e6f6e99757365645f6c6962657261746f725f626f6d6261726469657293766973697465645f7265706169725f73696c6f93766973697465645f76616e755f6d6f64756c6591757365645f666c61696c5f776561706f6e8b757365645f73637974686598766973697465645f7265737061776e5f7465726d696e616c8c757365645f62616c6c67756e92757365645f656e657267795f67756e5f747295757365645f616e6e69766572736172795f67756e6195757365645f616e6e69766572736172795f67756e6294757365645f616e6e69766572736172795f67756e90757365645f37356d6d5f63616e6e6f6e92757365645f6170635f6e635f776561706f6e92757365645f6170635f74725f776561706f6e92757365645f6170635f76735f776561706f6e90757365645f666c75785f63616e6e6f6e9f757365645f617068656c696f6e5f706c61736d615f726f636b65745f706f6491757365645f617068656c696f6e5f7070618c757365645f666c7578706f6494766973697465645f6266725f7465726d696e616c9e757365645f636f6c6f737375735f636c75737465725f626f6d625f706f64a0757365645f636f6c6f737375735f6475616c5f3130306d6d5f63616e6e6f6e7399757365645f636f6c6f737375735f74616e6b5f63616e6e6f6e96766973697465645f656e657267795f6372797374616c9b757365645f68656176795f6772656e6164655f6c61756e6368657298757365645f33356d6d5f726f74617279636861696e67756e8b757365645f6b6174616e6190757365645f33356d6d5f63616e6e6f6e93757365645f7265617665725f776561706f6e7396757365645f6c696768746e696e675f776561706f6e738c757365645f6d65645f61707090757365645f32306d6d5f63616e6e6f6e98766973697465645f6d6f6e6f6c6974685f616d657269736899766973697465645f6d6f6e6f6c6974685f636572797368656e97766973697465645f6d6f6e6f6c6974685f637973736f7297766973697465645f6d6f6e6f6c6974685f6573616d697299766973697465645f6d6f6e6f6c6974685f666f72736572616c99766973697465645f6d6f6e6f6c6974685f697368756e64617298766973697465645f6d6f6e6f6c6974685f7365617268757397766973697465645f6d6f6e6f6c6974685f736f6c73617292757365645f6e635f6865765f66616c636f6e99757365645f6e635f6865765f7363617474657263616e6e6f6e93757365645f6e635f6865765f73706172726f7791757365645f61726d6f725f736970686f6e9f757365645f706572656772696e655f6475616c5f6d616368696e655f67756e9f757365645f706572656772696e655f6475616c5f726f636b65745f706f647399757365645f706572656772696e655f6d65636868616d6d65729e757365645f706572656772696e655f7061727469636c655f63616e6e6f6e96757365645f706572656772696e655f73706172726f7791757365645f3130356d6d5f63616e6e6f6e92757365645f31356d6d5f636861696e67756ea0757365645f70756c7365645f7061727469636c655f616363656c657261746f7293757365645f726f74617279636861696e67756e9f766973697465645f6465636f6e737472756374696f6e5f7465726d696e616c95757365645f736b7967756172645f776561706f6e7391766973697465645f67656e657261746f7291757365645f67617573735f63616e6e6f6e89757365645f7472656b95757365645f76616e67756172645f776561706f6e73a4766973697465645f616e6369656e745f6169725f76656869636c655f7465726d696e616ca2766973697465645f616e6369656e745f65717569706d656e745f7465726d696e616c96766973697465645f6f726465725f7465726d696e616ca7766973697465645f616e6369656e745f67726f756e645f76656869636c655f7465726d696e616c9f766973697465645f67726f756e645f76656869636c655f7465726d696e616c97757365645f76756c747572655f626f6d6261726469657298757365645f76756c747572655f6e6f73655f63616e6e6f6e98757365645f76756c747572655f7461696c5f63616e6e6f6e97757365645f776173705f776561706f6e5f73797374656d91766973697465645f636861726c6965303191766973697465645f636861726c6965303291766973697465645f636861726c6965303391766973697465645f636861726c6965303491766973697465645f636861726c6965303591766973697465645f636861726c6965303691766973697465645f636861726c6965303791766973697465645f636861726c6965303891766973697465645f636861726c6965303996766973697465645f67696e6765726d616e5f6174617298766973697465645f67696e6765726d616e5f646168616b6196766973697465645f67696e6765726d616e5f6876617296766973697465645f67696e6765726d616e5f697a686199766973697465645f67696e6765726d616e5f6a616d7368696498766973697465645f67696e6765726d616e5f6d697468726198766973697465645f67696e6765726d616e5f726173686e7599766973697465645f67696e6765726d616e5f7372616f73686198766973697465645f67696e6765726d616e5f79617a61746195766973697465645f67696e6765726d616e5f7a616c8e766973697465645f736c656430318e766973697465645f736c656430328e766973697465645f736c656430348e766973697465645f736c656430358e766973697465645f736c656430368e766973697465645f736c656430378e766973697465645f736c6564303897766973697465645f736e6f776d616e5f616d657269736898766973697465645f736e6f776d616e5f636572797368656e96766973697465645f736e6f776d616e5f637973736f7296766973697465645f736e6f776d616e5f6573616d697298766973697465645f736e6f776d616e5f666f72736572616c96766973697465645f736e6f776d616e5f686f7373696e98766973697465645f736e6f776d616e5f697368756e64617297766973697465645f736e6f776d616e5f7365617268757396766973697465645f736e6f776d616e5f736f6c736172857567643036857567643035857567643034857567643033857567643032857567643031856d61703939856d61703938856d61703937856d61703936856d61703135856d61703134856d61703131856d61703038856d61703034856d61703035856d61703033856d61703031856d61703036856d61703032856d61703039856d61703037856d617031300300000091747261696e696e675f73746172745f6e638b747261696e696e675f75698c747261696e696e675f6d61700000000000000000000000000000000000000000800000003d0c04d350840240000010000602429660f80c80000c8004200c1b81480000020000c046f18a47019000019000ca4644304900000040001809e6bb052032000008001a84787211200000080003010714889c06400000100320ff0a42e4000001009e95a7342e03200000080003010408c914064000000001198990c4e4000001000060223b9b2180c800000a00081c20c92c800003600414ec172d900000040001808de1284a0320000320008ef1c336b20000078011d830e6f6400000600569c417e2c80000020000c04102502f019000008c00ce31027d99000000400018099e6146203200004b0015a7d44002f720000008000301040c18dc064000023000b1240800636400000100006020e0e92280c80000c800081650c00cfc800006400ce32a1801a59000000400018099e6fc3e03200004b00058b14680463200000080003010742610c064000043000b16c8880916400000100006020e0d01580c80000c8006714e24012cc80000020000c04cf25c190190000258001032e240307900000c8019c74470061b2000000800030133ced8fc0640000960012d9a8d00f0640000010025b9c1401e4c8000002004b6b23c03d1900000040098f585007b3200000080131a58c00f864000001002536f1c01f4c8000002004a64e2a03f190000004015e1b4580873200000080003010711f8a406400000100110a00c010ee400000100006020e2a51380c8000002002218d21021ec80000020000c041c40249019000000400af18a44043f90000004000180838b44760320000008015e38c80088320000008000301071490cc064000001002bc35890110e400000100006020e2052180c800000200221f90d0222c80000020000c041c5e447019000000400442e62e044790000004000180838af032032000000800886d08c089320000008000301071738740640000010011098898112e400000100006020e2361c80c8000002002212a1b0226c80000020000c041c512170190000004004420a32044f900000040001808389104a0320000008008874c8808a3200000080003010715907c06400000100110c0898114e400000100006020e2771a80c800000200578bd13022ac80000020000c041c424330190000004004423848045790000004000180838bfc32032000000801a86506008b320000008000301071030dc06400000100129f68a0117640000010026353110232c8000002004b69438046d90000004015e2887008eb200000080003010715909406400000100350fb8e011de400000100006020e2881980c8000002005786d0f023cc80000020000c041c4cc3b019000000400af1ba1c047b90000004000180838af872032000000800886344408fb20000008000301071620d406400000100110c10b011fe400000100006020e2870d80c800000200578f30c0240c80000020000c041c5863b019000000400442ee300483900000040001808388605e032000000801a86f03c090b200000080003010712a8fc064000001002bc0d858121e400000100006020e2521c80c800000200578b7230244c80000020000c041c49629019000000400d434026048b90000004000180838afc42032000000801a86d864091b200000080003010711989c064000001003508c8c8123e400000100006020e2a82280c8000002006a14f110248c80000020000c041c4be21019000000400af12640049390000004000180838a54720320000008015e33430092b20000008000301071228cc064000001003546e8d432400000100004f34a631139000004001b0834723120000008000204000c2ed0fa1c800000200a8432234a90000004000180952b248a0320000018004024c569d20000008000250a4d0ebc480000020000c04a24bc43019000000c00e0" val string_ccrider = hex"18 4a c7 00 00 bc 84 B0 0c 0b 95 59 9a 84 40 b0 00 01 32 00 00 08 70 43 00 43 00 52 00 49 00 44 00 45 00 52 00 82 28 c9 3d 04 40 03 c0 01 40 02 80 00 40 35 18 40 00 25 40 42 00 6c 00 61 00 63 00 6b 00 20 00 41 00 72 00 6d 00 6f 00 72 00 65 00 64 00 20 00 52 00 65 00 61 00 70 00 65 00 72 00 73 00 0f 00 00 03 02 0c 00 00 03 88 00 00 00 d4 00 00 01 9c 04 00 00 09 19 90 02 04 3c 28 00 00 00 00 00 00 00 00 00 00 00 00 01 90 01 90 00 64 00 00 01 00 7e c8 00 c8 00 00 01 b9 53 4c 00 00 00 00 00 00 00 00 00 00 00 00 00 03 40 00 40 81 c6 86 c8 48 88 c9 09 49 8a 67 86 e0 00 01 25 e0 32 d8 09 6c 00 00 3c 04 00 02 30 7870655f626c61636b6f7073917870655f626174746c655f72616e6b5f39927870655f626174746c655f72616e6b5f3233927870655f636f6d6d616e645f72616e6b5f318f7870655f666f726d5f6f75746669748e7870655f6d61696c5f616c657274927870655f626174746c655f72616e6b5f3232927870655f636f6d6d616e645f72616e6b5f33907870655f666f726d5f706c61746f6f6e927870655f626174746c655f72616e6b5f3133927870655f626174746c655f72616e6b5f3132927870655f626174746c655f72616e6b5f3130927870655f626174746c655f72616e6b5f3134927870655f626174746c655f72616e6b5f3135917870655f626174746c655f72616e6b5f38927870655f626174746c655f72616e6b5f3131927870655f626174746c655f72616e6b5f3231927870655f626174746c655f72616e6b5f3230927870655f626174746c655f72616e6b5f3138927870655f626174746c655f72616e6b5f3139907870655f6a6f696e5f706c61746f6f6e927870655f626174746c655f72616e6b5f3137927870655f626174746c655f72616e6b5f31368f7870655f6a6f696e5f6f7574666974927870655f626174746c655f72616e6b5f3235927870655f626174746c655f72616e6b5f3234917870655f626174746c655f72616e6b5f37917870655f62696e645f666163696c6974798c7870655f62696e645f616d73927870655f636f6d6d616e645f72616e6b5f35927870655f636f6d6d616e645f72616e6b5f32927870655f696e7374616e745f616374696f6e8e7870655f666f726d5f7371756164917870655f626174746c655f72616e6b5f34937870655f776172705f676174655f7573616765917870655f626174746c655f72616e6b5f32917870655f626174746c655f72616e6b5f33927870655f73616e6374756172795f68656c708c7870655f64726f705f706f64937870655f6f72626974616c5f73687574746c65917870655f626174746c655f72616e6b5f368e7870655f6a6f696e5f7371756164917870655f626174746c655f72616e6b5f35927870655f74685f737769746368626c6164658d7870655f74685f726f757465728c7870655f74685f666c61696c8a7870655f74685f616e748a7870655f74685f616d738a7870655f74685f62667289757365645f6f69637791757365645f616476616e6365645f61636597766973697465645f73706974666972655f74757272657498766973697465645f73706974666972655f636c6f616b656493766973697465645f73706974666972655f616192766973697465645f74616e6b5f7472617073a1766973697465645f706f727461626c655f6d616e6e65645f7475727265745f6e638e757365645f6d616763757474657293766973697465645f77616c6c5f7475727265748b766973697465645f616d738b766973697465645f616e7490766973697465645f64726f707368697091766973697465645f6c6962657261746f7294766973697465645f6c6967687467756e7368697091766973697465645f6c696768746e696e6790766973697465645f6d616772696465728f766973697465645f70726f776c657293766973697465645f71756164737465616c746890766973697465645f736b7967756172649a766973697465645f74687265656d616e686561767962756767799d766973697465645f74776f5f6d616e5f61737361756c745f627567677998766973697465645f74776f6d616e6865617679627567677998766973697465645f74776f6d616e686f766572627567677990766973697465645f76616e67756172648d766973697465645f666c61696c8e766973697465645f726f7574657293766973697465645f737769746368626c6164658e766973697465645f6175726f726193766973697465645f626174746c657761676f6e8c766973697465645f6675727993766973697465645f7175616461737361756c7496766973697465645f67616c6178795f67756e736869708e766973697465645f6170635f74728e766973697465645f6170635f767390766973697465645f6c6f64657374617290766973697465645f7068616e7461736d91766973697465645f7468756e64657265728e766973697465645f6170635f6e638f766973697465645f76756c747572658c766973697465645f7761737090766973697465645f6d6f73717569746f97766973697465645f617068656c696f6e5f666c6967687497766973697465645f617068656c696f6e5f67756e6e657297766973697465645f636f6c6f737375735f666c6967687497766973697465645f636f6c6f737375735f67756e6e657298766973697465645f706572656772696e655f666c6967687498766973697465645f706572656772696e655f67756e6e657289757365645f62616e6b95766973697465645f7265736f757263655f73696c6f9e766973697465645f63657274696669636174696f6e5f7465726d696e616c94766973697465645f6d65645f7465726d696e616c93757365645f6e616e6f5f64697370656e73657295766973697465645f73656e736f725f736869656c649a766973697465645f62726f6164636173745f77617270676174658c757365645f7068616c616e7894757365645f7068616c616e785f6176636f6d626f96757365645f7068616c616e785f666c616b636f6d626f96766973697465645f77617270676174655f736d616c6c91757365645f666c616d657468726f7765729a757365645f616e6369656e745f7475727265745f776561706f6e92766973697465645f4c4c555f736f636b657492757365645f656e657267795f67756e5f6e6397766973697465645f6d656469756d7472616e73706f72749f757365645f617068656c696f6e5f696d6d6f6c6174696f6e5f63616e6e6f6e93757365645f6772656e6164655f706c61736d6193757365645f6772656e6164655f6a616d6d657298766973697465645f736869656c645f67656e657261746f7295766973697465645f6d6f74696f6e5f73656e736f7296766973697465645f6865616c74685f6372797374616c96766973697465645f7265706169725f6372797374616c97766973697465645f76656869636c655f6372797374616c91757365645f6772656e6164655f6672616788757365645f61636598766973697465645f6164765f6d65645f7465726d696e616c8b757365645f6265616d657290757365645f626f6c745f6472697665728b757365645f6379636c65728a757365645f676175737391757365645f68756e7465727365656b657288757365645f6973708b757365645f6c616e6365728b757365645f6c61736865728e757365645f6d61656c7374726f6d8c757365645f70686f656e69788b757365645f70756c7361728d757365645f70756e69736865728e757365645f725f73686f7467756e8d757365645f7261646961746f7288757365645f72656b8d757365645f72657065617465728c757365645f726f636b6c65748c757365645f737472696b65728f757365645f73757070726573736f728c757365645f7468756d7065729c766973697465645f76616e755f636f6e74726f6c5f636f6e736f6c6598766973697465645f636170747572655f7465726d696e616c92757365645f6d696e695f636861696e67756e91757365645f6c617a655f706f696e7465728c757365645f74656c657061648b757365645f7370696b657291757365645f68656176795f736e6970657293757365645f636f6d6d616e645f75706c696e6b8d757365645f66697265626972648e757365645f666c6563686574746594757365645f68656176795f7261696c5f6265616d89757365645f696c63399a766973697465645f67656e657261746f725f7465726d696e616c8e766973697465645f6c6f636b65729a766973697465645f65787465726e616c5f646f6f725f6c6f636b9c766973697465645f6169725f76656869636c655f7465726d696e616c97766973697465645f67616c6178795f7465726d696e616c98766973697465645f696d706c616e745f7465726d696e616c99766973697465645f7365636f6e646172795f6361707475726590757365645f32356d6d5f63616e6e6f6e99757365645f6c6962657261746f725f626f6d6261726469657293766973697465645f7265706169725f73696c6f93766973697465645f76616e755f6d6f64756c6591757365645f666c61696c5f776561706f6e8b757365645f73637974686598766973697465645f7265737061776e5f7465726d696e616c8c757365645f62616c6c67756e95757365645f616e6e69766572736172795f67756e6195757365645f616e6e69766572736172795f67756e6294757365645f616e6e69766572736172795f67756e90757365645f37356d6d5f63616e6e6f6e92757365645f6170635f6e635f776561706f6e92757365645f6170635f74725f776561706f6e92757365645f6170635f76735f776561706f6e90757365645f666c75785f63616e6e6f6e93757365645f617068656c696f6e5f6c617365729f757365645f617068656c696f6e5f706c61736d615f726f636b65745f706f6491757365645f617068656c696f6e5f70706196757365645f617068656c696f6e5f73746172666972658c757365645f666c7578706f6494766973697465645f6266725f7465726d696e616c95757365645f636f6c6f737375735f6275727374657296757365645f636f6c6f737375735f636861696e67756e9e757365645f636f6c6f737375735f636c75737465725f626f6d625f706f64a0757365645f636f6c6f737375735f6475616c5f3130306d6d5f63616e6e6f6e7399757365645f636f6c6f737375735f74616e6b5f63616e6e6f6e96766973697465645f64616d6167655f6372797374616c96766973697465645f656e657267795f6372797374616c9b757365645f68656176795f6772656e6164655f6c61756e6368657298757365645f33356d6d5f726f74617279636861696e67756e8b757365645f6b6174616e6190757365645f33356d6d5f63616e6e6f6e93757365645f7265617665725f776561706f6e7396757365645f6c696768746e696e675f776561706f6e738c757365645f6d65645f61707090757365645f32306d6d5f63616e6e6f6e98766973697465645f6d6f6e6f6c6974685f616d657269736899766973697465645f6d6f6e6f6c6974685f636572797368656e97766973697465645f6d6f6e6f6c6974685f637973736f7297766973697465645f6d6f6e6f6c6974685f6573616d697299766973697465645f6d6f6e6f6c6974685f666f72736572616c97766973697465645f6d6f6e6f6c6974685f686f7373696e99766973697465645f6d6f6e6f6c6974685f697368756e64617298766973697465645f6d6f6e6f6c6974685f7365617268757397766973697465645f6d6f6e6f6c6974685f736f6c73617292757365645f6e635f6865765f66616c636f6e99757365645f6e635f6865765f7363617474657263616e6e6f6e93757365645f6e635f6865765f73706172726f7791757365645f61726d6f725f736970686f6e9f757365645f706572656772696e655f6475616c5f6d616368696e655f67756e9f757365645f706572656772696e655f6475616c5f726f636b65745f706f647399757365645f706572656772696e655f6d65636868616d6d65728f757365645f6e74755f736970686f6e9e757365645f706572656772696e655f7061727469636c655f63616e6e6f6e96757365645f706572656772696e655f73706172726f7791757365645f3130356d6d5f63616e6e6f6e92757365645f31356d6d5f636861696e67756ea0757365645f70756c7365645f7061727469636c655f616363656c657261746f7293757365645f726f74617279636861696e67756e9f766973697465645f6465636f6e737472756374696f6e5f7465726d696e616c95757365645f736b7967756172645f776561706f6e7391766973697465645f67656e657261746f7291757365645f67617573735f63616e6e6f6e89757365645f7472656b95757365645f76616e67756172645f776561706f6e73a4766973697465645f616e6369656e745f6169725f76656869636c655f7465726d696e616ca2766973697465645f616e6369656e745f65717569706d656e745f7465726d696e616c96766973697465645f6f726465725f7465726d696e616ca7766973697465645f616e6369656e745f67726f756e645f76656869636c655f7465726d696e616c9f766973697465645f67726f756e645f76656869636c655f7465726d696e616c97757365645f76756c747572655f626f6d6261726469657298757365645f76756c747572655f6e6f73655f63616e6e6f6e98757365645f76756c747572655f7461696c5f63616e6e6f6e97757365645f776173705f776561706f6e5f73797374656d91766973697465645f636861726c6965303591766973697465645f636861726c6965303691766973697465645f636861726c6965303791766973697465645f636861726c6965303891766973697465645f636861726c696530398e766973697465645f736c656430348e766973697465645f736c656430358e766973697465645f736c656430368e766973697465645f736c656430378e766973697465645f736c65643038857567643036857567643035857567643034857567643033857567643032857567643031856d61703939856d61703938856d61703937856d61703936856d61703135856d61703134856d61703133856d61703132856d61703131856d61703034856d61703035856d61703033856d61703031856d61703036856d61703032856d61703039856d61703037856d617031300800000092747261696e696e675f776561706f6e73303192747261696e696e675f7761727067617465738c747261696e696e675f6d617092747261696e696e675f696e76656e746f727990747261696e696e675f6865616c696e678d747261696e696e675f686172748f747261696e696e675f61726d6f727390747261696e696e675f77656c636f6d650000000000000000000000000000000000000000ab000480000005000000058000000800000008800000090000000f0000000f8000001000000012800000130000001a0000001a8000001c800000228000002e00000031800000320000003580000036000000368000003700000039000000398000003a0000003a8000003b0000003f800000400000004080000041000000418000004e000000518000005580000059000000598000005a0000005a800000610000006180000063000000648000006b8000006c0000006c8000006f0000006f800000700000007080000071000000718000007280000073000000798000007a0000000080800004808000050080000a8080000b0080000d8080000e0080000e8080000f0080001080800011008000140080001c808000270080002a8080002b00800033808000388080003c0080003c8080004000800043808000440080004480800045008000470080004c0080004f808000520080005400800000002f0a26c9313c024000001000060279a272780c80000100026b271682480000020000c041c0464f019000006400d43541d08900000040001808388946a0320000008019041c821700000008046ce915631018000000400018083822c6a030000019001d2338421b00000008000301070438ac060000032003a4630c466000000100006020e06c1e80c000006400748e01c92c00000020000c041c11e4101800000c800e90a02331800000040001808381b06e030000019001989ec436b000000080003010c81d924060000019003310e87f0600000010000602190d31780c000003200662fa22e6c00000020000c04320a82f018000006400e90683bd9800000040001808381205a030000019000205808bcb000001900040e4908058e0000032006629c1d00b4c00000020000c043209c35018000006400cc480320175800000040001808642084a03000000c80198880540303000000080003010c87d86c060000019000b17e9100636000000100006020e01f2080c00000c800081580f010bc000006400414961a022f800000040001808de0004603000003200082818840477000000080003011bc0a11406000006400040a28680b2e000003200569271a017ac00000020000c041037435018000008c00ce2e04003498000000400018099e6c46e03000004b0019c4483406b70000000800030133cc28ec06000009600040ad8e80dfe0000032006710e1201fec00000020000c04cf2a837018000025800ce37432040f8000000400018099e7586a03000004b00058b18480843000000080003010702f11406000006400040f690010ce0000032000e0222786c8000064001c1d82b13900000c800380205233200001900074559050e40000320079afa0fa4c800002000d84b64f4e9000000400010300380" + val string_xrider912 = hex"18cf8c0000bc83e0d97fc6204c5f20800008e00000089078005200690064006500720039003100320082084295c4c000c000c0000000001ed00000248048006f006f006b006500640020004f006e00200049006e00730061006e006900740079000500000302ac0000016c04000114000001a004000220e46c03cb4000000000000000000000000000019001900064000001007ec800c8000001abc44480000000000000000000000000030000408101c686c888c9094a7e8a40000125e012d8196c000344000002487870655f636f6d6d616e645f72616e6b5f32907870655f6a6f696e5f706c61746f6f6e927870655f626174746c655f72616e6b5f3230927870655f626174746c655f72616e6b5f3231927870655f626174746c655f72616e6b5f32328f7870655f666f726d5f6f75746669748c7870655f626c61636b6f7073927870655f626174746c655f72616e6b5f3133927870655f626174746c655f72616e6b5f3132927870655f626174746c655f72616e6b5f3130927870655f626174746c655f72616e6b5f3134927870655f626174746c655f72616e6b5f3135917870655f626174746c655f72616e6b5f358e7870655f6a6f696e5f73717561648e7870655f666f726d5f7371756164927870655f696e7374616e745f616374696f6e917870655f626174746c655f72616e6b5f38927870655f626174746c655f72616e6b5f3131917870655f626174746c655f72616e6b5f36927870655f626174746c655f72616e6b5f3138927870655f626174746c655f72616e6b5f3139927870655f626174746c655f72616e6b5f3137927870655f626174746c655f72616e6b5f31368f7870655f6a6f696e5f6f7574666974917870655f626174746c655f72616e6b5f39917870655f626174746c655f72616e6b5f37927870655f636f6d6d616e645f72616e6b5f31937870655f6f72626974616c5f73687574746c658c7870655f64726f705f706f64927870655f73616e6374756172795f68656c70917870655f62696e645f666163696c697479917870655f626174746c655f72616e6b5f33917870655f626174746c655f72616e6b5f32937870655f776172705f676174655f75736167658c7870655f62696e645f616d73917870655f626174746c655f72616e6b5f348e7870655f74685f6e6f6e73616e638d7870655f74685f726f757465728c7870655f74685f666c61696c8a7870655f74685f616e748a7870655f74685f616d738f7870655f74685f67726f756e645f708c7870655f74685f6169725f708c7870655f74685f686f7665728d7870655f74685f67726f756e648a7870655f74685f626672927870655f74685f61667465726275726e65728a7870655f74685f6169728b7870655f74685f616d6d6f907870655f74685f666972656d6f6465738c7870655f74685f636c6f616b8a7870655f74685f6d617889757365645f6f69637791757365645f616476616e6365645f61636597766973697465645f73706974666972655f74757272657498766973697465645f73706974666972655f636c6f616b656493766973697465645f73706974666972655f616192766973697465645f74616e6b5f7472617073a1766973697465645f706f727461626c655f6d616e6e65645f7475727265745f74728f757365645f636861696e626c61646593766973697465645f77616c6c5f7475727265748b766973697465645f616d738b766973697465645f616e7490766973697465645f64726f707368697091766973697465645f6c6962657261746f7294766973697465645f6c6967687467756e7368697091766973697465645f6c696768746e696e678f766973697465645f70726f776c657293766973697465645f71756164737465616c746890766973697465645f736b7967756172649a766973697465645f74687265656d616e686561767962756767799d766973697465645f74776f5f6d616e5f61737361756c745f627567677998766973697465645f74776f6d616e6865617679627567677998766973697465645f74776f6d616e686f766572627567677990766973697465645f76616e67756172648d766973697465645f666c61696c8e766973697465645f726f7574657293766973697465645f626174746c657761676f6e8c766973697465645f6675727993766973697465645f7175616461737361756c7496766973697465645f67616c6178795f67756e736869708e766973697465645f6170635f747290766973697465645f6c6f64657374617290766973697465645f7068616e7461736d8e766973697465645f6170635f6e638f766973697465645f76756c747572658c766973697465645f7761737090766973697465645f6d6f73717569746f97766973697465645f636f6c6f737375735f666c6967687489757365645f62616e6b95766973697465645f7265736f757263655f73696c6f9e766973697465645f63657274696669636174696f6e5f7465726d696e616c94766973697465645f6d65645f7465726d696e616c93757365645f6e616e6f5f64697370656e73657295766973697465645f73656e736f725f736869656c649a766973697465645f62726f6164636173745f77617270676174658c757365645f7068616c616e7896757365645f7068616c616e785f666c616b636f6d626f96766973697465645f77617270676174655f736d616c6c91757365645f666c616d657468726f7765729a757365645f616e6369656e745f7475727265745f776561706f6e92766973697465645f4c4c555f736f636b657497766973697465645f6d656469756d7472616e73706f727493757365645f6772656e6164655f706c61736d6193757365645f6772656e6164655f6a616d6d657298766973697465645f736869656c645f67656e657261746f7295766973697465645f6d6f74696f6e5f73656e736f7297766973697465645f76656869636c655f6372797374616c91757365645f6772656e6164655f6672616788757365645f61636598766973697465645f6164765f6d65645f7465726d696e616c90757365645f626f6c745f6472697665728b757365645f6379636c65728a757365645f676175737391757365645f68756e7465727365656b657288757365645f6973708b757365645f6c616e6365728b757365645f6c61736865728e757365645f6d61656c7374726f6d8c757365645f70686f656e69788b757365645f70756c7361728d757365645f70756e69736865728e757365645f725f73686f7467756e8d757365645f7261646961746f7288757365645f72656b8d757365645f72657065617465728c757365645f726f636b6c65748c757365645f737472696b65728f757365645f73757070726573736f728c757365645f7468756d70657292757365645f74726865765f6275727374657295757365645f74726865765f6475616c6379636c657292757365645f74726865765f706f756e6465729c766973697465645f76616e755f636f6e74726f6c5f636f6e736f6c6598766973697465645f636170747572655f7465726d696e616c92757365645f6d696e695f636861696e67756e91757365645f6c617a655f706f696e7465728c757365645f74656c657061648b757365645f7370696b657291757365645f68656176795f736e697065728d757365645f66697265626972648e757365645f666c6563686574746594757365645f68656176795f7261696c5f6265616d9a766973697465645f67656e657261746f725f7465726d696e616c8e766973697465645f6c6f636b65729a766973697465645f65787465726e616c5f646f6f725f6c6f636b9c766973697465645f6169725f76656869636c655f7465726d696e616c97766973697465645f67616c6178795f7465726d696e616c98766973697465645f696d706c616e745f7465726d696e616c99766973697465645f7365636f6e646172795f6361707475726590757365645f32356d6d5f63616e6e6f6e99757365645f6c6962657261746f725f626f6d6261726469657293766973697465645f7265706169725f73696c6f93766973697465645f76616e755f6d6f64756c6591757365645f666c61696c5f776561706f6e98766973697465645f7265737061776e5f7465726d696e616c92757365645f656e657267795f67756e5f747295757365645f616e6e69766572736172795f67756e6195757365645f616e6e69766572736172795f67756e6292757365645f6170635f74725f776561706f6e90757365645f666c75785f63616e6e6f6e94766973697465645f6266725f7465726d696e616ca0757365645f636f6c6f737375735f6475616c5f3130306d6d5f63616e6e6f6e7399757365645f636f6c6f737375735f74616e6b5f63616e6e6f6e9b757365645f68656176795f6772656e6164655f6c61756e6368657298757365645f33356d6d5f726f74617279636861696e67756e8b757365645f6b6174616e6190757365645f33356d6d5f63616e6e6f6e93757365645f7265617665725f776561706f6e7396757365645f6c696768746e696e675f776561706f6e738c757365645f6d65645f61707090757365645f32306d6d5f63616e6e6f6e99766973697465645f6d6f6e6f6c6974685f666f72736572616c91757365645f3130356d6d5f63616e6e6f6e92757365645f31356d6d5f636861696e67756e93757365645f726f74617279636861696e67756e9f766973697465645f6465636f6e737472756374696f6e5f7465726d696e616c95757365645f736b7967756172645f776561706f6e7391766973697465645f67656e657261746f7289757365645f7472656b95757365645f76616e67756172645f776561706f6e73a4766973697465645f616e6369656e745f6169725f76656869636c655f7465726d696e616ca2766973697465645f616e6369656e745f65717569706d656e745f7465726d696e616c96766973697465645f6f726465725f7465726d696e616c9f766973697465645f67726f756e645f76656869636c655f7465726d696e616c97757365645f76756c747572655f626f6d6261726469657298757365645f76756c747572655f6e6f73655f63616e6e6f6e98757365645f76756c747572655f7461696c5f63616e6e6f6e97757365645f776173705f776561706f6e5f73797374656d857567643035857567643034857567643033857567643032857567643031856d61703939856d61703938856d61703937856d61703135856d61703134856d61703132856d61703034856d61703035856d61703033856d61703031856d61703036856d61703032856d61703039856d61703037856d617031300000000000000000000000000000000000000000000000008b00048000000800000008800000228000003580000036000000390000003980000043000000558000005900000062000000638000006f000000728000000d808000148080002d8080003400800043808000478080005280800000002146d2890d80080000020000c041c1141d0190000050004d6822704100000040001808382004a03200000c8015e0103610200000080003010716107406400000100320db0a42e000000100889949102a03000000080003013cd5d8b4060000010003294084c4e0000001000060279a2b0e80c0000020006524c0f92c00000020000c04f35fa17018000004000443142b3b800000040001808389304e0300000008019c5b42b6b0000000800030133cf284406000009600338fa8a71e00000010000602679e41580c000012c00652fc16ecc00000020000c04f350a2d018000004000ce2222801698000000400018099e7202e03000004b0019c5ec4402f70000000800030133cc688406000009600338808780636000000100006026796d1580c000012c00671eb0f010ec00000020000c04cf2c623018000025800ce21824022f8000000400018099e4d42603000004b0019499c300483000000080003013cd798a406000001000329078a80b8e0000001000060279af10a80c0000020006522011017ac00000020000c04f34001d018000004000415ec100397800000040001808de1385603000002700194bdc4c0747000000080003013cd6609c06000000f000701108c364000032000e0dc0d89c8000064001c00e2119900000c800380ec52872000019000744a875264000032006c27b12a708000002000081001c" "DetailedCharacterData" should { "decode" in { @@ -1290,6 +1291,152 @@ class DetailedCharacterDataTest extends Specification { } } + "decode (xRider912)" in { + PacketCoding.DecodePacket(string_xrider912).require match { + case ObjectCreateDetailedMessage(len, cls, guid, parentInfo, data) => + len mustEqual 36047 + cls mustEqual ObjectClass.avatar + guid mustEqual PlanetSideGUID(3390) + parentInfo.isEmpty mustEqual true + + data match { + case DetailedPlayerData(Some(pos), basic , char, Some(inv), hand) => + pos mustEqual PlacementData(3577.1797f, 2712.25f, 35.78125f, 0, 0, 50.625f) + + basic match { + case CharacterAppearanceData(a, b, ribbons) => + a.app mustEqual BasicCharacterData("xRider912", PlanetSideEmpire.TR, CharacterGender.Male, 4, CharacterVoice.Voice1) + a.data.bops mustEqual false + a.data.alternate 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.Standard + a.unk5 mustEqual 0 + a.unk6 mustEqual 1267466L + a.unk7 mustEqual 3 + a.unk8 mustEqual 3 + a.unk9 mustEqual 0 + a.unkA mustEqual 0 + + b.unk0 mustEqual 16507L + b.outfit_name mustEqual "Hooked On Insanity" + b.outfit_logo mustEqual 5 + b.unk1 mustEqual false + b.backpack mustEqual false + b.unk2 mustEqual false + b.unk3 mustEqual false + b.unk4 mustEqual false + b.facingPitch mustEqual 0 + b.facingYawUpper mustEqual 0 + b.lfs mustEqual false + b.grenade_state mustEqual GrenadeState.None + b.is_cloaking mustEqual false + b.unk5 mustEqual false + b.unk6 mustEqual false + b.charging_pose mustEqual false + b.unk7 mustEqual false + b.on_zipline.isEmpty mustEqual true + + ribbons.upper mustEqual MeritCommendation.EmeraldVeteran + ribbons.middle mustEqual MeritCommendation.ScavengerTR1 + ribbons.lower mustEqual MeritCommendation.BlackOpsParticipant + ribbons.tos mustEqual MeritCommendation.SixYearTR + case _ => + ko + } + + DetailedCharacterData.isBR24(char.a.bep) mustEqual false + char match { + case DetailedCharacterData(a, b) => + a.bep mustEqual 1784200L + a.cep mustEqual 53490L + a.unk1 mustEqual 0L + a.unk2 mustEqual 0L + a.unk3 mustEqual 0L + a.healthMax mustEqual 100 + a.health mustEqual 100 + a.unk4 mustEqual false + a.armor mustEqual 50 + a.unk5 mustEqual 32831L + a.staminaMax mustEqual 100 + a.stamina mustEqual 100 + a.max_field.isEmpty mustEqual true + a.unk6 mustEqual 0 + a.unk7 mustEqual 6 + a.unk8 mustEqual 1184175L + a.unk9 mustEqual List(0, 0, 0, 0, 0, 0) + a.certs mustEqual List( + CertificationType.StandardAssault, + CertificationType.MediumAssault, + CertificationType.HeavyAssault, + CertificationType.AntiVehicular, + CertificationType.AirCavalryScout, + CertificationType.StandardExoSuit, + CertificationType.AgileExoSuit, + CertificationType.Medical, + CertificationType.AdvancedMedical, + CertificationType.Hacking, + CertificationType.AdvancedHacking, + CertificationType.Engineering + ) + + b.unk1.contains(21236) mustEqual true + b.implants mustEqual List( + ImplantEntry(ImplantType.Surge, Some(94), false), + ImplantEntry(ImplantType.Targeting, Some(91), false), + ImplantEntry(ImplantType.DarklightVision, Some(91), false) + ) + b.unk2 mustEqual List() + b.unk3 mustEqual List() + b.firstTimeEvents.size mustEqual 209 //too many to bother listing; see encoding test + b.tutorials mustEqual List() + b.unk4 mustEqual 0L + b.unk5 mustEqual 0L + b.unk6 mustEqual 0L + b.unk7 mustEqual 0L + b.unk8 mustEqual 0L + b.unk9.isEmpty mustEqual true + b.unkA mustEqual List( + 9, 16, 17, 69, 107, 108, + 114, 115, 134, 171, 178, + 196, 199, 222, 229, 283, + 297, 347, 360, 391, 399, 421 + ) + b.unkB mustEqual List() + b.unkC mustEqual false + b.cosmetics.isEmpty mustEqual true + case _ => + ko + } + + inv.contents.length mustEqual 10 + //check first and last entries of inventory for accuracy + inv.contents.head mustEqual InternalSlot( + 730, PlanetSideGUID(3465), 0, + DetailedWeaponData(CommonFieldData(PlanetSideEmpire.TR, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List( + InternalSlot(28, PlanetSideGUID(3722), 0, + DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 20) + ) + ), false) + ) + //... + inv.contents(9) mustEqual InternalSlot( + 728, PlanetSideGUID(4731), 39, + DetailedREKData(CommonFieldData(PlanetSideEmpire.TR, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)), 16) + ) + + hand mustEqual DrawnSlot.None + case _ => + ko + } + case _ => + ko + } + } + "encode" in { val pos : PlacementData = PlacementData( 3674.8438f, 2726.789f, 91.15625f, @@ -2876,5 +3023,376 @@ class DetailedCharacterDataTest extends Specification { val pkt = PacketCoding.EncodePacket(msg).require.toByteVector pkt mustEqual string_ccrider } + + "encode (xRider912)" in { + val pos : PlacementData = PlacementData( + Vector3(3577.1797f, 2712.25f, 35.78125f), + Vector3.z(50.625f), + None + ) + val aa : Int=>CharacterAppearanceA = CharacterAppearanceA( + BasicCharacterData( + "xRider912", + PlanetSideEmpire.TR, + CharacterGender.Male, + 4, + CharacterVoice.Voice1 + ), + CommonFieldData( + PlanetSideEmpire.TR, + false, + false, + false, + None, + false, + None, + None, + PlanetSideGUID(0) + ), + ExoSuitType.Standard, + 0, + 1267466L, + 3, + 3, + 0, + 0 + ) + + val ab : (Boolean, Int)=>CharacterAppearanceB = CharacterAppearanceB( + 16507L, + "Hooked On Insanity", + 5, + false, + false, + false, + false, + false, + 0, 0, + false, + GrenadeState.None, + false, + false, + false, + false, + false, + None + ) + + val app : Int=>CharacterAppearanceData = CharacterAppearanceData( + aa, ab, + RibbonBars( + MeritCommendation.EmeraldVeteran, + MeritCommendation.ScavengerTR1, + MeritCommendation.BlackOpsParticipant, + MeritCommendation.SixYearTR + ) + ) + + val ba : DetailedCharacterA = DetailedCharacterA( + 1784200L, + 53490L, + 0L, 0L, 0L, + 100, 100, + false, + 50, + 32831, + 100, 100, + None, + 0, + 6, + 1184175, + List(0, 0, 0, 0, 0, 0), + List( + CertificationType.StandardAssault, + CertificationType.MediumAssault, + CertificationType.HeavyAssault, + CertificationType.AntiVehicular, + CertificationType.AirCavalryScout, + CertificationType.StandardExoSuit, + CertificationType.AgileExoSuit, + CertificationType.Medical, + CertificationType.AdvancedMedical, + CertificationType.Hacking, + CertificationType.AdvancedHacking, + CertificationType.Engineering + ) + ) + val bb : (Long, Option[Int])=>DetailedCharacterB = DetailedCharacterB( + Some(21236), + List( + ImplantEntry(ImplantType.Surge, Some(94), false), + ImplantEntry(ImplantType.Targeting, Some(91), false), + ImplantEntry(ImplantType.DarklightVision, Some(91), false) + ), + List(), List(), + List( + "xpe_command_rank_2", + "xpe_join_platoon", + "xpe_battle_rank_20", + "xpe_battle_rank_21", + "xpe_battle_rank_22", + "xpe_form_outfit", + "xpe_blackops", + "xpe_battle_rank_13", + "xpe_battle_rank_12", + "xpe_battle_rank_10", + "xpe_battle_rank_14", + "xpe_battle_rank_15", + "xpe_battle_rank_5", + "xpe_join_squad", + "xpe_form_squad", + "xpe_instant_action", + "xpe_battle_rank_8", + "xpe_battle_rank_11", + "xpe_battle_rank_6", + "xpe_battle_rank_18", + "xpe_battle_rank_19", + "xpe_battle_rank_17", + "xpe_battle_rank_16", + "xpe_join_outfit", + "xpe_battle_rank_9", + "xpe_battle_rank_7", + "xpe_command_rank_1", + "xpe_orbital_shuttle", + "xpe_drop_pod", + "xpe_sanctuary_help", + "xpe_bind_facility", + "xpe_battle_rank_3", + "xpe_battle_rank_2", + "xpe_warp_gate_usage", + "xpe_bind_ams", + "xpe_battle_rank_4", + "xpe_th_nonsanc", + "xpe_th_router", + "xpe_th_flail", + "xpe_th_ant", + "xpe_th_ams", + "xpe_th_ground_p", + "xpe_th_air_p", + "xpe_th_hover", + "xpe_th_ground", + "xpe_th_bfr", + "xpe_th_afterburner", + "xpe_th_air", + "xpe_th_ammo", + "xpe_th_firemodes", + "xpe_th_cloak", + "xpe_th_max", + "used_oicw", + "used_advanced_ace", + "visited_spitfire_turret", + "visited_spitfire_cloaked", + "visited_spitfire_aa", + "visited_tank_traps", + "visited_portable_manned_turret_tr", + "used_chainblade", + "visited_wall_turret", + "visited_ams", + "visited_ant", + "visited_dropship", + "visited_liberator", + "visited_lightgunship", + "visited_lightning", + "visited_prowler", + "visited_quadstealth", + "visited_skyguard", + "visited_threemanheavybuggy", + "visited_two_man_assault_buggy", + "visited_twomanheavybuggy", + "visited_twomanhoverbuggy", + "visited_vanguard", + "visited_flail", + "visited_router", + "visited_battlewagon", + "visited_fury", + "visited_quadassault", + "visited_galaxy_gunship", + "visited_apc_tr", + "visited_lodestar", + "visited_phantasm", + "visited_apc_nc", + "visited_vulture", + "visited_wasp", + "visited_mosquito", + "visited_colossus_flight", + "used_bank", + "visited_resource_silo", + "visited_certification_terminal", + "visited_med_terminal", + "used_nano_dispenser", + "visited_sensor_shield", + "visited_broadcast_warpgate", + "used_phalanx", + "used_phalanx_flakcombo", + "visited_warpgate_small", + "used_flamethrower", + "used_ancient_turret_weapon", + "visited_LLU_socket", + "visited_mediumtransport", + "used_grenade_plasma", + "used_grenade_jammer", + "visited_shield_generator", + "visited_motion_sensor", + "visited_vehicle_crystal", + "used_grenade_frag", + "used_ace", + "visited_adv_med_terminal", + "used_bolt_driver", + "used_cycler", + "used_gauss", + "used_hunterseeker", + "used_isp", + "used_lancer", + "used_lasher", + "used_maelstrom", + "used_phoenix", + "used_pulsar", + "used_punisher", + "used_r_shotgun", + "used_radiator", + "used_rek", + "used_repeater", + "used_rocklet", + "used_striker", + "used_suppressor", + "used_thumper", + "used_trhev_burster", + "used_trhev_dualcycler", + "used_trhev_pounder", + "visited_vanu_control_console", + "visited_capture_terminal", + "used_mini_chaingun", + "used_laze_pointer", + "used_telepad", + "used_spiker", + "used_heavy_sniper", + "used_firebird", + "used_flechette", + "used_heavy_rail_beam", + "visited_generator_terminal", + "visited_locker", + "visited_external_door_lock", + "visited_air_vehicle_terminal", + "visited_galaxy_terminal", + "visited_implant_terminal", + "visited_secondary_capture", + "used_25mm_cannon", + "used_liberator_bombardier", + "visited_repair_silo", + "visited_vanu_module", + "used_flail_weapon", + "visited_respawn_terminal", + "used_energy_gun_tr", + "used_anniversary_guna", + "used_anniversary_gunb", + "used_apc_tr_weapon", + "used_flux_cannon", + "visited_bfr_terminal", + "used_colossus_dual_100mm_cannons", + "used_colossus_tank_cannon", + "used_heavy_grenade_launcher", + "used_35mm_rotarychaingun", + "used_katana", + "used_35mm_cannon", + "used_reaver_weapons", + "used_lightning_weapons", + "used_med_app", + "used_20mm_cannon", + "visited_monolith_forseral", + "used_105mm_cannon", + "used_15mm_chaingun", + "used_rotarychaingun", + "visited_deconstruction_terminal", + "used_skyguard_weapons", + "visited_generator", + "used_trek", + "used_vanguard_weapons", + "visited_ancient_air_vehicle_terminal", + "visited_ancient_equipment_terminal", + "visited_order_terminal", + "visited_ground_vehicle_terminal", + "used_vulture_bombardier", + "used_vulture_nose_cannon", + "used_vulture_tail_cannon", + "used_wasp_weapon_system", + "ugd05", + "ugd04", + "ugd03", + "ugd02", + "ugd01", + "map99", + "map98", + "map97", + "map15", + "map14", + "map12", + "map04", + "map05", + "map03", + "map01", + "map06", + "map02", + "map09", + "map07", + "map10" + ), + List(), + 0, + 0, + 0, + 0, + 0, + None, + List( + 9, 16, 17, 69, 107, 108, 114, 115, 134, 171, 178, 196, + 199, 222, 229, 283, 297, 347, 360, 391, 399, 421 + ), + List(), + false, + None + ) + val char : Option[Int]=>DetailedCharacterData = + (pad_length : Option[Int]) => DetailedCharacterData(ba, bb(ba.bep, pad_length))(pad_length) + + val inv : InventoryData = InventoryData(List( + InternalSlot(730,PlanetSideGUID(3465),0,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.TR,false,false,true,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(28,PlanetSideGUID(3722),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,true,None,false,None,None,PlanetSideGUID(0)),20))),false)), + InternalSlot(845,PlanetSideGUID(4929),2,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.TR,false,false,true,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(28,PlanetSideGUID(4736),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,true,None,false,None,None,PlanetSideGUID(0)),25))),false)), + InternalSlot(175,PlanetSideGUID(3332),4,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.TR,false,false,true,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(540,PlanetSideGUID(3778),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,true,None,false,None,None,PlanetSideGUID(0)),1))),false)), + InternalSlot(456,PlanetSideGUID(5302),5,DetailedLockerContainerData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),Some(InventoryData(List( + InternalSlot(714,PlanetSideGUID(2628),0,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(755,PlanetSideGUID(5819),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),16))),false)), + InternalSlot(714,PlanetSideGUID(2433),9,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(755,PlanetSideGUID(3627),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),16))),false)), + InternalSlot(714,PlanetSideGUID(3916),18,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(755,PlanetSideGUID(3069),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),16))),false)), + InternalSlot(324,PlanetSideGUID(5514),29,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(540,PlanetSideGUID(4940),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),1))),false)), + InternalSlot(462,PlanetSideGUID(2669),90,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(463,PlanetSideGUID(2277),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),150))),false)), + InternalSlot(462,PlanetSideGUID(5365),99,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(463,PlanetSideGUID(5604),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),150))),false)), + InternalSlot(714,PlanetSideGUID(5884),108,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(755,PlanetSideGUID(5765),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),16))),false)), + InternalSlot(462,PlanetSideGUID(5137),180,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(463,PlanetSideGUID(3016),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),150))),false)), + InternalSlot(462,PlanetSideGUID(4475),189,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(463,PlanetSideGUID(4237),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),150))),false)), + InternalSlot(462,PlanetSideGUID(3841),198,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(463,PlanetSideGUID(5485),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),150))),false)), + InternalSlot(462,PlanetSideGUID(4075),270,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(463,PlanetSideGUID(4451),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),150))),false)), + InternalSlot(462,PlanetSideGUID(4620),279,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(463,PlanetSideGUID(2357),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),150))),false)), + InternalSlot(714,PlanetSideGUID(3175),288,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(755,PlanetSideGUID(5363),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),16))),false)), + InternalSlot(714,PlanetSideGUID(5391),369,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(755,PlanetSideGUID(2801),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),16))),false)), + InternalSlot(714,PlanetSideGUID(4384),378,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(755,PlanetSideGUID(3584),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),16))),false)), + InternalSlot(577,PlanetSideGUID(2294),459,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(111,PlanetSideGUID(5454),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),78))),false)), + InternalSlot(714,PlanetSideGUID(5111),465,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(755,PlanetSideGUID(5068),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),15))),false)) + ))))), + InternalSlot(28,PlanetSideGUID(4386),6,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,true,None,false,None,None,PlanetSideGUID(0)),50)), + InternalSlot(28,PlanetSideGUID(3548),9,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,true,None,false,None,None,PlanetSideGUID(0)),50)), + InternalSlot(28,PlanetSideGUID(4103),12,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,true,None,false,None,None,PlanetSideGUID(0)),50)), + InternalSlot(28,PlanetSideGUID(5179),33,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,true,None,false,None,None,PlanetSideGUID(0)),50)), + InternalSlot(29,PlanetSideGUID(3733),36,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,true,None,false,None,None,PlanetSideGUID(0)),50)), + InternalSlot(728,PlanetSideGUID(4731),39,DetailedREKData(CommonFieldData(PlanetSideEmpire.TR,false,false,true,None,false,Some(false),None,PlanetSideGUID(0)),16)) + )) + val obj = DetailedPlayerData.apply(pos, app, char, inv, DrawnSlot.None) + + val msg = ObjectCreateDetailedMessage(0x79, PlanetSideGUID(3390), obj) + val pkt = PacketCoding.EncodePacket(msg).require.toByteVector + val pkt_bitv = pkt.toBitVector + val ori_bitv = string_xrider912.toBitVector + pkt_bitv.take(140) mustEqual ori_bitv.take(140) //skip 1; this is the highest bit of PlacementData::Orientation::z + pkt_bitv.drop(141) mustEqual ori_bitv.drop(141) + //TODO work on DetailedCharacterData to make this pass as a single stream + } } } diff --git a/common/src/test/scala/game/objectcreatedetailed/DetailedConstructionToolDataTest.scala b/common/src/test/scala/game/objectcreatedetailed/DetailedConstructionToolDataTest.scala index 13ebb06f0..a363b7993 100644 --- a/common/src/test/scala/game/objectcreatedetailed/DetailedConstructionToolDataTest.scala +++ b/common/src/test/scala/game/objectcreatedetailed/DetailedConstructionToolDataTest.scala @@ -25,7 +25,7 @@ class DetailedConstructionToolDataTest extends Specification { parent.get.guid mustEqual PlanetSideGUID(3104) parent.get.slot mustEqual 0 data match { - case DetailedConstructionToolData(cdata) => + case DetailedConstructionToolData(cdata, mode) => cdata.faction mustEqual PlanetSideEmpire.VS cdata.bops mustEqual false cdata.alternate mustEqual false @@ -65,7 +65,7 @@ class DetailedConstructionToolDataTest extends Specification { parent.get.guid mustEqual PlanetSideGUID(2502) parent.get.slot mustEqual 0 data match { - case DetailedConstructionToolData(cdata) => + case DetailedConstructionToolData(cdata, mode) => cdata.faction mustEqual PlanetSideEmpire.NEUTRAL cdata.bops mustEqual false cdata.alternate mustEqual false @@ -105,7 +105,7 @@ class DetailedConstructionToolDataTest extends Specification { parent.get.guid mustEqual PlanetSideGUID(414) parent.get.slot mustEqual 0 data match { - case DetailedConstructionToolData(cdata) => + case DetailedConstructionToolData(cdata, mode) => cdata.faction mustEqual PlanetSideEmpire.NC cdata.bops mustEqual false cdata.alternate mustEqual false @@ -133,7 +133,7 @@ class DetailedConstructionToolDataTest extends Specification { parent.get.guid mustEqual PlanetSideGUID(340) parent.get.slot mustEqual 9 data match { - case DetailedConstructionToolData(cdata) => + case DetailedConstructionToolData(cdata, mode) => cdata.faction mustEqual PlanetSideEmpire.VS cdata.bops mustEqual false cdata.alternate mustEqual false diff --git a/common/src/test/scala/game/objectcreatevehicle/NonstandardVehiclesTest.scala b/common/src/test/scala/game/objectcreatevehicle/NonstandardVehiclesTest.scala index 3f31ebf0a..849e0d3d6 100644 --- a/common/src/test/scala/game/objectcreatevehicle/NonstandardVehiclesTest.scala +++ b/common/src/test/scala/game/objectcreatevehicle/NonstandardVehiclesTest.scala @@ -22,7 +22,7 @@ class NonstandardVehiclesTest extends Specification { guid mustEqual PlanetSideGUID(3595) parent.isDefined mustEqual false data match { - case DroppodData(basic, burn, health) => + case DroppodData(basic, health, burn, unk) => basic.pos.coord mustEqual Vector3(5108.0f, 6164.0f, 1023.9844f) basic.pos.orient mustEqual Vector3.z(90.0f)