2017-12-05 00:37:24 -05:00
|
|
|
// Copyright (c) 2017 PSForever
|
|
|
|
|
package game.objectcreate
|
|
|
|
|
|
|
|
|
|
import net.psforever.packet.PacketCoding
|
|
|
|
|
import net.psforever.packet.game.{ObjectCreateMessage, PlanetSideGUID}
|
|
|
|
|
import net.psforever.packet.game.objectcreate._
|
|
|
|
|
import net.psforever.types._
|
|
|
|
|
import org.specs2.mutable._
|
|
|
|
|
import scodec.bits._
|
|
|
|
|
|
|
|
|
|
class CharacterDataTest extends Specification {
|
2018-06-03 01:15:47 -04:00
|
|
|
val string = hex"17 73070000 BC8 3E0F 6C2D7 65535 CA16 00 00 09 9741E4F804000000 234530063007200610077006E00790052006F006E006E0069006500 220B7 E67B540404001000000000022B50100 268042006C00610063006B002000420065007200650074002000410072006D006F007500720065006400200043006F00720070007300 1700E0030050040003BC00000234040001A004000 3FFF67A8F A0A5424E0E800000000080952A9C3A03000001081103E040000000A023782F1080C0000016244108200000000808382403A030000014284C3A0C0000000202512F00B80C00000578F80F840000000280838B3C320300000080"
|
|
|
|
|
//string seated was intentionally-produced test data
|
|
|
|
|
val string_seated =
|
2018-06-03 21:35:58 -04:00
|
|
|
hex"170307000069023c83e0f800000011a0530063007200610077006e00790052006f006e006e0069006500220b700000000000000000000000" ++
|
|
|
|
|
hex"06800000268042006c00610063006b002000420065007200650074002000410072006d006f007500720065006400200043006f0072007000" ++
|
|
|
|
|
hex"73001700e0030050040003bc00000234040001a00400020a8fa0a5424e0e800000000080952a9c3a03000001081103e040000000a023782f" ++
|
|
|
|
|
hex"1080c0000016244108200000000808382403a030000014284c3a0c0000000202512f00b80c00000578f80f840000000280838b3c320300000080"
|
2018-06-03 01:15:47 -04:00
|
|
|
val string_backpack = hex"17 9C030000 BC8 340D F20A9 3956C AF0D 00 00 73 480000 87041006E00670065006C006C006F00 4A148 0000000000000000000000005C54200 24404F0072006900670069006E0061006C00200044006900730074007200690063007400 1740180181E8000000C202000042000000D202000000010A3C00"
|
2017-12-05 00:37:24 -05:00
|
|
|
|
|
|
|
|
"CharacterData" should {
|
|
|
|
|
"decode" in {
|
2018-06-03 01:15:47 -04:00
|
|
|
PacketCoding.DecodePacket(string).require match {
|
2017-12-05 00:37:24 -05:00
|
|
|
case ObjectCreateMessage(len, cls, guid, parent, data) =>
|
|
|
|
|
len mustEqual 1907
|
|
|
|
|
cls mustEqual ObjectClass.avatar
|
|
|
|
|
guid mustEqual PlanetSideGUID(3902)
|
|
|
|
|
parent.isDefined mustEqual false
|
2018-05-28 20:39:35 -04:00
|
|
|
data match {
|
|
|
|
|
case Some(PlayerData(Some(pos), basic, char, inv, hand)) =>
|
|
|
|
|
pos.coord mustEqual Vector3(3674.8438f, 2726.789f, 91.15625f)
|
|
|
|
|
pos.orient mustEqual Vector3(0f, 0f, 64.6875f)
|
|
|
|
|
pos.vel.isDefined mustEqual true
|
|
|
|
|
pos.vel.get mustEqual Vector3(1.4375f, -0.4375f, 0f)
|
|
|
|
|
|
2018-10-07 23:34:06 -04:00
|
|
|
basic match {
|
|
|
|
|
case CharacterAppearanceData(a, b, ribbons) =>
|
|
|
|
|
a.app.name mustEqual "ScrawnyRonnie"
|
|
|
|
|
a.app.faction mustEqual PlanetSideEmpire.TR
|
|
|
|
|
a.app.sex mustEqual CharacterGender.Male
|
|
|
|
|
a.app.head mustEqual 5
|
|
|
|
|
a.app.voice mustEqual CharacterVoice.Voice5
|
|
|
|
|
a.black_ops mustEqual false
|
|
|
|
|
a.jammered mustEqual false
|
|
|
|
|
a.exosuit mustEqual ExoSuitType.Reinforced
|
|
|
|
|
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
|
|
|
|
|
a.unk8 mustEqual 4
|
|
|
|
|
a.unk9 mustEqual 0
|
|
|
|
|
a.unkA mustEqual 0
|
|
|
|
|
|
|
|
|
|
b.outfit_name mustEqual "Black Beret Armoured Corps"
|
|
|
|
|
b.outfit_logo mustEqual 23
|
|
|
|
|
b.backpack mustEqual false
|
|
|
|
|
b.facingPitch mustEqual 320.625f
|
|
|
|
|
b.facingYawUpper mustEqual 0
|
|
|
|
|
b.lfs mustEqual false
|
|
|
|
|
b.grenade_state mustEqual GrenadeState.None
|
|
|
|
|
b.is_cloaking mustEqual false
|
|
|
|
|
b.charging_pose mustEqual false
|
|
|
|
|
b.on_zipline mustEqual None
|
|
|
|
|
b.unk0 mustEqual 316554L
|
|
|
|
|
b.unk1 mustEqual false
|
|
|
|
|
b.unk2 mustEqual false
|
|
|
|
|
b.unk3 mustEqual false
|
|
|
|
|
b.unk4 mustEqual false
|
|
|
|
|
b.unk5 mustEqual false
|
|
|
|
|
b.unk6 mustEqual false
|
|
|
|
|
b.unk7 mustEqual false
|
|
|
|
|
|
|
|
|
|
ribbons.upper mustEqual MeritCommendation.MarkovVeteran
|
|
|
|
|
ribbons.middle mustEqual MeritCommendation.HeavyInfantry4
|
|
|
|
|
ribbons.lower mustEqual MeritCommendation.TankBuster7
|
|
|
|
|
ribbons.tos mustEqual MeritCommendation.SixYearTR
|
|
|
|
|
case _ =>
|
|
|
|
|
ko
|
|
|
|
|
}
|
2018-05-28 20:39:35 -04:00
|
|
|
|
|
|
|
|
char.health mustEqual 255
|
|
|
|
|
char.armor mustEqual 253
|
|
|
|
|
char.uniform_upgrade mustEqual UniformStyle.ThirdUpgrade
|
|
|
|
|
char.command_rank mustEqual 5
|
2018-10-04 23:12:07 -04:00
|
|
|
char.implant_effects.length mustEqual 1
|
|
|
|
|
char.implant_effects.head mustEqual ImplantEffects.NoEffects
|
2018-05-28 20:39:35 -04:00
|
|
|
char.cosmetics.isDefined mustEqual true
|
|
|
|
|
char.cosmetics.get.no_helmet mustEqual true
|
|
|
|
|
char.cosmetics.get.beret mustEqual true
|
|
|
|
|
char.cosmetics.get.sunglasses mustEqual true
|
|
|
|
|
char.cosmetics.get.earpiece mustEqual true
|
|
|
|
|
char.cosmetics.get.brimmed_cap mustEqual false
|
2018-10-07 23:34:06 -04:00
|
|
|
char.unk mustEqual 7
|
2018-05-28 20:39:35 -04:00
|
|
|
//short test of inventory items
|
|
|
|
|
inv.isDefined mustEqual true
|
|
|
|
|
val contents = inv.get.contents
|
|
|
|
|
contents.size mustEqual 5
|
|
|
|
|
//0
|
|
|
|
|
contents.head.objectClass mustEqual ObjectClass.plasma_grenade
|
|
|
|
|
contents.head.guid mustEqual PlanetSideGUID(3662)
|
|
|
|
|
contents.head.parentSlot mustEqual 0
|
|
|
|
|
contents.head.obj.asInstanceOf[WeaponData].fire_mode mustEqual 0
|
|
|
|
|
contents.head.obj.asInstanceOf[WeaponData].ammo.head.objectClass mustEqual ObjectClass.plasma_grenade_ammo
|
|
|
|
|
contents.head.obj.asInstanceOf[WeaponData].ammo.head.guid mustEqual PlanetSideGUID(3751)
|
|
|
|
|
//1
|
|
|
|
|
contents(1).objectClass mustEqual ObjectClass.bank
|
|
|
|
|
contents(1).guid mustEqual PlanetSideGUID(3908)
|
|
|
|
|
contents(1).parentSlot mustEqual 1
|
|
|
|
|
contents(1).obj.asInstanceOf[WeaponData].fire_mode mustEqual 1
|
|
|
|
|
contents(1).obj.asInstanceOf[WeaponData].ammo.head.objectClass mustEqual ObjectClass.armor_canister
|
|
|
|
|
contents(1).obj.asInstanceOf[WeaponData].ammo.head.guid mustEqual PlanetSideGUID(4143)
|
|
|
|
|
//2
|
|
|
|
|
contents(2).objectClass mustEqual ObjectClass.mini_chaingun
|
|
|
|
|
contents(2).guid mustEqual PlanetSideGUID(4164)
|
|
|
|
|
contents(2).parentSlot mustEqual 2
|
|
|
|
|
contents(2).obj.asInstanceOf[WeaponData].fire_mode mustEqual 0
|
|
|
|
|
contents(2).obj.asInstanceOf[WeaponData].ammo.head.objectClass mustEqual ObjectClass.bullet_9mm
|
|
|
|
|
contents(2).obj.asInstanceOf[WeaponData].ammo.head.guid mustEqual PlanetSideGUID(3728)
|
|
|
|
|
//3
|
|
|
|
|
contents(3).objectClass mustEqual ObjectClass.phoenix //actually, a decimator
|
|
|
|
|
contents(3).guid mustEqual PlanetSideGUID(3603)
|
|
|
|
|
contents(3).parentSlot mustEqual 3
|
|
|
|
|
contents(3).obj.asInstanceOf[WeaponData].fire_mode mustEqual 0
|
|
|
|
|
contents(3).obj.asInstanceOf[WeaponData].ammo.head.objectClass mustEqual ObjectClass.phoenix_missile
|
|
|
|
|
contents(3).obj.asInstanceOf[WeaponData].ammo.head.guid mustEqual PlanetSideGUID(3056)
|
|
|
|
|
//4
|
|
|
|
|
contents(4).objectClass mustEqual ObjectClass.chainblade
|
|
|
|
|
contents(4).guid mustEqual PlanetSideGUID(4088)
|
|
|
|
|
contents(4).parentSlot mustEqual 4
|
|
|
|
|
contents(4).obj.asInstanceOf[WeaponData].fire_mode mustEqual 1
|
|
|
|
|
contents(4).obj.asInstanceOf[WeaponData].ammo.head.objectClass mustEqual ObjectClass.melee_ammo
|
|
|
|
|
contents(4).obj.asInstanceOf[WeaponData].ammo.head.guid mustEqual PlanetSideGUID(3279)
|
|
|
|
|
|
|
|
|
|
hand mustEqual DrawnSlot.Rifle1
|
|
|
|
|
case _ =>
|
|
|
|
|
ko
|
|
|
|
|
}
|
2017-12-05 00:37:24 -05:00
|
|
|
case _ =>
|
|
|
|
|
ko
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-10-07 23:34:06 -04:00
|
|
|
//
|
2018-06-03 01:15:47 -04:00
|
|
|
"decode (seated)" in {
|
|
|
|
|
PacketCoding.DecodePacket(string_seated).require match {
|
|
|
|
|
case ObjectCreateMessage(len, cls, guid, parent, data) =>
|
2018-06-03 21:35:58 -04:00
|
|
|
len mustEqual 1795
|
2018-06-03 01:15:47 -04:00
|
|
|
cls mustEqual ObjectClass.avatar
|
|
|
|
|
guid mustEqual PlanetSideGUID(3902)
|
|
|
|
|
parent mustEqual Some(ObjectCreateMessageParent(PlanetSideGUID(1234), 0))
|
|
|
|
|
data match {
|
|
|
|
|
case Some(PlayerData(None, basic, char, inv, hand)) =>
|
2018-10-07 23:34:06 -04:00
|
|
|
basic match {
|
|
|
|
|
case CharacterAppearanceData(a, b, ribbons) =>
|
|
|
|
|
a.app.name mustEqual "ScrawnyRonnie"
|
|
|
|
|
a.app.faction mustEqual PlanetSideEmpire.TR
|
|
|
|
|
a.app.sex mustEqual CharacterGender.Male
|
|
|
|
|
a.app.head mustEqual 5
|
|
|
|
|
a.app.voice mustEqual CharacterVoice.Voice5
|
|
|
|
|
a.black_ops mustEqual false
|
|
|
|
|
a.jammered mustEqual false
|
|
|
|
|
a.exosuit mustEqual ExoSuitType.Reinforced
|
|
|
|
|
a.unk1 mustEqual false
|
|
|
|
|
a.unk2 mustEqual None
|
|
|
|
|
a.unk3 mustEqual None
|
|
|
|
|
a.unk4 mustEqual 0
|
|
|
|
|
a.unk5 mustEqual 0
|
|
|
|
|
a.unk6 mustEqual 192L
|
|
|
|
|
a.unk7 mustEqual 0
|
|
|
|
|
a.unk8 mustEqual 0
|
|
|
|
|
a.unk9 mustEqual 0
|
|
|
|
|
a.unkA mustEqual 0
|
|
|
|
|
|
|
|
|
|
b.outfit_name mustEqual "Black Beret Armoured Corps"
|
|
|
|
|
b.outfit_logo mustEqual 23
|
|
|
|
|
b.backpack mustEqual false
|
|
|
|
|
b.facingPitch mustEqual 320.625f
|
|
|
|
|
b.facingYawUpper mustEqual 0
|
|
|
|
|
b.lfs mustEqual false
|
|
|
|
|
b.grenade_state mustEqual GrenadeState.None
|
|
|
|
|
b.is_cloaking mustEqual false
|
|
|
|
|
b.charging_pose mustEqual false
|
|
|
|
|
b.on_zipline mustEqual None
|
|
|
|
|
b.unk0 mustEqual 26L
|
|
|
|
|
b.unk1 mustEqual false
|
|
|
|
|
b.unk2 mustEqual false
|
|
|
|
|
b.unk3 mustEqual false
|
|
|
|
|
b.unk4 mustEqual false
|
|
|
|
|
b.unk5 mustEqual false
|
|
|
|
|
b.unk6 mustEqual false
|
|
|
|
|
b.unk7 mustEqual false
|
|
|
|
|
|
|
|
|
|
ribbons.upper mustEqual MeritCommendation.MarkovVeteran
|
|
|
|
|
ribbons.middle mustEqual MeritCommendation.HeavyInfantry4
|
|
|
|
|
ribbons.lower mustEqual MeritCommendation.TankBuster7
|
|
|
|
|
ribbons.tos mustEqual MeritCommendation.SixYearTR
|
|
|
|
|
//etc..
|
|
|
|
|
case _ =>
|
|
|
|
|
ko
|
|
|
|
|
}
|
2018-06-03 01:15:47 -04:00
|
|
|
case _ =>
|
|
|
|
|
ko
|
|
|
|
|
}
|
|
|
|
|
case _ =>
|
|
|
|
|
ko
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-12-05 00:37:24 -05:00
|
|
|
"decode (backpack)" in {
|
2018-06-03 01:15:47 -04:00
|
|
|
PacketCoding.DecodePacket(string_backpack).require match {
|
2017-12-05 00:37:24 -05:00
|
|
|
case ObjectCreateMessage(len, cls, guid, parent, data) =>
|
|
|
|
|
len mustEqual 924L
|
|
|
|
|
cls mustEqual ObjectClass.avatar
|
|
|
|
|
guid mustEqual PlanetSideGUID(3380)
|
|
|
|
|
parent.isDefined mustEqual false
|
2018-05-28 20:39:35 -04:00
|
|
|
data match {
|
|
|
|
|
case Some(PlayerData(Some(pos), basic, char, None, hand)) =>
|
|
|
|
|
pos.coord mustEqual Vector3(4629.8906f, 6316.4453f, 54.734375f)
|
|
|
|
|
pos.orient mustEqual Vector3(0, 0, 126.5625f)
|
|
|
|
|
pos.vel.isDefined mustEqual false
|
|
|
|
|
|
2018-10-07 23:34:06 -04:00
|
|
|
basic match {
|
|
|
|
|
case CharacterAppearanceData(a, b, ribbons) =>
|
|
|
|
|
a.app.name mustEqual "Angello"
|
|
|
|
|
a.app.faction mustEqual PlanetSideEmpire.VS
|
|
|
|
|
a.app.sex mustEqual CharacterGender.Male
|
|
|
|
|
a.app.head mustEqual 10
|
|
|
|
|
a.app.voice mustEqual CharacterVoice.Voice2
|
|
|
|
|
a.black_ops mustEqual false
|
|
|
|
|
a.jammered mustEqual false
|
|
|
|
|
a.exosuit mustEqual ExoSuitType.MAX
|
|
|
|
|
a.unk1 mustEqual false
|
|
|
|
|
a.unk2 mustEqual None
|
|
|
|
|
a.unk3 mustEqual None
|
|
|
|
|
a.unk4 mustEqual 0
|
|
|
|
|
a.unk5 mustEqual 1
|
|
|
|
|
a.unk6 mustEqual 0L
|
|
|
|
|
a.unk7 mustEqual 0
|
|
|
|
|
a.unk8 mustEqual 0
|
|
|
|
|
a.unk9 mustEqual 0
|
|
|
|
|
a.unkA mustEqual 0
|
|
|
|
|
|
|
|
|
|
b.outfit_name mustEqual "Original District"
|
|
|
|
|
b.outfit_logo mustEqual 23
|
|
|
|
|
b.backpack mustEqual true
|
|
|
|
|
b.facingPitch mustEqual 351.5625f
|
|
|
|
|
b.facingYawUpper mustEqual 0
|
|
|
|
|
b.lfs mustEqual false
|
|
|
|
|
b.grenade_state mustEqual GrenadeState.None
|
|
|
|
|
b.is_cloaking mustEqual false
|
|
|
|
|
b.charging_pose mustEqual false
|
|
|
|
|
b.on_zipline mustEqual None
|
|
|
|
|
b.unk0 mustEqual 529687L
|
|
|
|
|
b.unk1 mustEqual false
|
|
|
|
|
b.unk2 mustEqual false
|
|
|
|
|
b.unk3 mustEqual false
|
|
|
|
|
b.unk4 mustEqual false
|
|
|
|
|
b.unk5 mustEqual false
|
|
|
|
|
b.unk6 mustEqual false
|
|
|
|
|
b.unk7 mustEqual false
|
|
|
|
|
|
|
|
|
|
ribbons.upper mustEqual MeritCommendation.Jacking2
|
|
|
|
|
ribbons.middle mustEqual MeritCommendation.ScavengerVS1
|
|
|
|
|
ribbons.lower mustEqual MeritCommendation.AMSSupport4
|
|
|
|
|
ribbons.tos mustEqual MeritCommendation.SixYearVS
|
|
|
|
|
//etc..
|
|
|
|
|
case _ =>
|
|
|
|
|
ko
|
|
|
|
|
}
|
2018-05-28 20:39:35 -04:00
|
|
|
|
|
|
|
|
char.health mustEqual 0
|
|
|
|
|
char.armor mustEqual 0
|
|
|
|
|
char.uniform_upgrade mustEqual UniformStyle.ThirdUpgrade
|
|
|
|
|
char.command_rank mustEqual 2
|
2018-10-04 23:12:07 -04:00
|
|
|
char.implant_effects.isEmpty mustEqual true
|
2018-05-28 20:39:35 -04:00
|
|
|
char.cosmetics.isDefined mustEqual true
|
|
|
|
|
char.cosmetics.get.no_helmet mustEqual true
|
|
|
|
|
char.cosmetics.get.beret mustEqual true
|
|
|
|
|
char.cosmetics.get.sunglasses mustEqual true
|
|
|
|
|
char.cosmetics.get.earpiece mustEqual true
|
|
|
|
|
char.cosmetics.get.brimmed_cap mustEqual false
|
2018-10-07 23:34:06 -04:00
|
|
|
char.unk mustEqual 1
|
2018-05-28 20:39:35 -04:00
|
|
|
|
|
|
|
|
hand mustEqual DrawnSlot.Pistol1
|
|
|
|
|
case _ =>
|
|
|
|
|
ko
|
|
|
|
|
}
|
2017-12-05 00:37:24 -05:00
|
|
|
case _ =>
|
|
|
|
|
ko
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
"encode" in {
|
2018-05-28 20:39:35 -04:00
|
|
|
val pos : PlacementData = PlacementData(
|
|
|
|
|
Vector3(3674.8438f, 2726.789f, 91.15625f),
|
|
|
|
|
Vector3(0f, 0f, 64.6875f),
|
|
|
|
|
Some(Vector3(1.4375f, -0.4375f, 0f))
|
|
|
|
|
)
|
2018-10-07 23:34:06 -04:00
|
|
|
val a : Int=>CharacterAppearanceA = CharacterAppearanceA(
|
2018-05-28 20:39:35 -04:00
|
|
|
BasicCharacterData(
|
|
|
|
|
"ScrawnyRonnie",
|
|
|
|
|
PlanetSideEmpire.TR,
|
|
|
|
|
CharacterGender.Male,
|
|
|
|
|
5,
|
2018-06-08 21:07:47 -04:00
|
|
|
CharacterVoice.Voice5
|
2017-12-05 00:37:24 -05:00
|
|
|
),
|
2018-05-28 20:39:35 -04:00
|
|
|
false,
|
|
|
|
|
false,
|
2018-10-07 23:34:06 -04:00
|
|
|
false,
|
|
|
|
|
None,
|
|
|
|
|
false,
|
2018-05-28 20:39:35 -04:00
|
|
|
ExoSuitType.Reinforced,
|
2018-10-07 23:34:06 -04:00
|
|
|
None,
|
|
|
|
|
0,
|
|
|
|
|
0,
|
|
|
|
|
30777081L,
|
|
|
|
|
1,
|
|
|
|
|
4,
|
|
|
|
|
0,
|
|
|
|
|
0
|
|
|
|
|
)
|
|
|
|
|
val b : (Boolean,Int)=>CharacterAppearanceB = CharacterAppearanceB(
|
|
|
|
|
316554L,
|
2018-05-28 20:39:35 -04:00
|
|
|
"Black Beret Armoured Corps",
|
|
|
|
|
23,
|
|
|
|
|
false,
|
2018-10-07 23:34:06 -04:00
|
|
|
false,
|
|
|
|
|
false,
|
|
|
|
|
false,
|
|
|
|
|
false,
|
|
|
|
|
320.625f, 0f,
|
2018-05-28 20:39:35 -04:00
|
|
|
false,
|
|
|
|
|
GrenadeState.None,
|
2018-10-07 23:34:06 -04:00
|
|
|
false,
|
|
|
|
|
false,
|
|
|
|
|
false,
|
|
|
|
|
false,
|
|
|
|
|
false,
|
|
|
|
|
None
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
val app : (Int)=>CharacterAppearanceData = CharacterAppearanceData(
|
|
|
|
|
a, b,
|
2018-05-28 20:39:35 -04:00
|
|
|
RibbonBars(
|
|
|
|
|
MeritCommendation.MarkovVeteran,
|
|
|
|
|
MeritCommendation.HeavyInfantry4,
|
|
|
|
|
MeritCommendation.TankBuster7,
|
|
|
|
|
MeritCommendation.SixYearTR
|
|
|
|
|
)
|
|
|
|
|
)
|
2018-06-01 14:17:36 -04:00
|
|
|
val char : (Boolean,Boolean)=>CharacterData = CharacterData(
|
2017-12-05 00:37:24 -05:00
|
|
|
255, 253,
|
|
|
|
|
UniformStyle.ThirdUpgrade,
|
2018-10-07 23:34:06 -04:00
|
|
|
7,
|
2017-12-05 00:37:24 -05:00
|
|
|
5,
|
2018-10-04 23:12:07 -04:00
|
|
|
List(ImplantEffects.NoEffects),
|
2018-05-28 20:39:35 -04:00
|
|
|
Some(Cosmetics(true, true, true, true, false))
|
|
|
|
|
)
|
|
|
|
|
val inv = InventoryData(
|
|
|
|
|
InventoryItemData(ObjectClass.plasma_grenade, PlanetSideGUID(3662), 0, WeaponData(0, 0, ObjectClass.plasma_grenade_ammo, PlanetSideGUID(3751), 0, AmmoBoxData())) ::
|
|
|
|
|
InventoryItemData(ObjectClass.bank, PlanetSideGUID(3908), 1, WeaponData(0, 0, 1, ObjectClass.armor_canister, PlanetSideGUID(4143), 0, AmmoBoxData())) ::
|
|
|
|
|
InventoryItemData(ObjectClass.mini_chaingun, PlanetSideGUID(4164), 2, WeaponData(0, 0, ObjectClass.bullet_9mm, PlanetSideGUID(3728), 0, AmmoBoxData())) ::
|
|
|
|
|
InventoryItemData(ObjectClass.phoenix, PlanetSideGUID(3603), 3, WeaponData(0, 0, ObjectClass.phoenix_missile, PlanetSideGUID(3056), 0, AmmoBoxData())) ::
|
|
|
|
|
InventoryItemData(ObjectClass.chainblade, PlanetSideGUID(4088), 4, WeaponData(0, 0, 1, ObjectClass.melee_ammo, PlanetSideGUID(3279), 0, AmmoBoxData())) ::
|
|
|
|
|
Nil
|
2017-12-05 00:37:24 -05:00
|
|
|
)
|
2018-06-01 14:17:36 -04:00
|
|
|
val obj = PlayerData(pos, app, char, inv, DrawnSlot.Rifle1)
|
2018-05-28 20:39:35 -04:00
|
|
|
|
2017-12-05 00:37:24 -05:00
|
|
|
val msg = ObjectCreateMessage(ObjectClass.avatar, PlanetSideGUID(3902), obj)
|
|
|
|
|
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
2018-10-07 23:34:06 -04:00
|
|
|
pkt mustEqual string
|
2017-12-05 00:37:24 -05:00
|
|
|
}
|
|
|
|
|
|
2018-06-03 01:15:47 -04:00
|
|
|
"encode (seated)" in {
|
2018-10-07 23:34:06 -04:00
|
|
|
val a : Int=>CharacterAppearanceA = CharacterAppearanceA(
|
2018-06-03 01:15:47 -04:00
|
|
|
BasicCharacterData(
|
|
|
|
|
"ScrawnyRonnie",
|
|
|
|
|
PlanetSideEmpire.TR,
|
|
|
|
|
CharacterGender.Male,
|
|
|
|
|
5,
|
2018-06-08 21:07:47 -04:00
|
|
|
CharacterVoice.Voice5
|
2018-06-03 01:15:47 -04:00
|
|
|
),
|
|
|
|
|
false,
|
|
|
|
|
false,
|
2018-10-07 23:34:06 -04:00
|
|
|
false,
|
|
|
|
|
None,
|
|
|
|
|
false,
|
2018-06-03 01:15:47 -04:00
|
|
|
ExoSuitType.Reinforced,
|
2018-10-07 23:34:06 -04:00
|
|
|
None,
|
|
|
|
|
0,
|
|
|
|
|
0,
|
|
|
|
|
192L,
|
|
|
|
|
0,
|
|
|
|
|
0,
|
|
|
|
|
0,
|
|
|
|
|
0
|
|
|
|
|
)
|
|
|
|
|
val b : (Boolean,Int)=>CharacterAppearanceB = CharacterAppearanceB(
|
|
|
|
|
26L,
|
2018-06-03 01:15:47 -04:00
|
|
|
"Black Beret Armoured Corps",
|
|
|
|
|
23,
|
|
|
|
|
false,
|
2018-10-07 23:34:06 -04:00
|
|
|
false,
|
|
|
|
|
false,
|
|
|
|
|
false,
|
|
|
|
|
false,
|
|
|
|
|
320.625f, 0f,
|
2018-06-03 01:15:47 -04:00
|
|
|
false,
|
|
|
|
|
GrenadeState.None,
|
2018-10-07 23:34:06 -04:00
|
|
|
false,
|
|
|
|
|
false,
|
|
|
|
|
false,
|
|
|
|
|
false,
|
|
|
|
|
false,
|
|
|
|
|
None
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
val app : (Int)=>CharacterAppearanceData = CharacterAppearanceData(
|
|
|
|
|
a, b,
|
2018-06-03 01:15:47 -04:00
|
|
|
RibbonBars(
|
|
|
|
|
MeritCommendation.MarkovVeteran,
|
|
|
|
|
MeritCommendation.HeavyInfantry4,
|
|
|
|
|
MeritCommendation.TankBuster7,
|
|
|
|
|
MeritCommendation.SixYearTR
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
val char : (Boolean,Boolean)=>CharacterData = CharacterData(
|
|
|
|
|
255, 253,
|
|
|
|
|
UniformStyle.ThirdUpgrade,
|
|
|
|
|
5,
|
2018-10-04 23:12:07 -04:00
|
|
|
List(ImplantEffects.NoEffects),
|
2018-06-03 01:15:47 -04:00
|
|
|
Some(Cosmetics(true, true, true, true, false))
|
|
|
|
|
)
|
|
|
|
|
val inv = InventoryData(
|
|
|
|
|
InventoryItemData(ObjectClass.plasma_grenade, PlanetSideGUID(3662), 0, WeaponData(0, 0, ObjectClass.plasma_grenade_ammo, PlanetSideGUID(3751), 0, AmmoBoxData())) ::
|
|
|
|
|
InventoryItemData(ObjectClass.bank, PlanetSideGUID(3908), 1, WeaponData(0, 0, 1, ObjectClass.armor_canister, PlanetSideGUID(4143), 0, AmmoBoxData())) ::
|
|
|
|
|
InventoryItemData(ObjectClass.mini_chaingun, PlanetSideGUID(4164), 2, WeaponData(0, 0, ObjectClass.bullet_9mm, PlanetSideGUID(3728), 0, AmmoBoxData())) ::
|
|
|
|
|
InventoryItemData(ObjectClass.phoenix, PlanetSideGUID(3603), 3, WeaponData(0, 0, ObjectClass.phoenix_missile, PlanetSideGUID(3056), 0, AmmoBoxData())) ::
|
|
|
|
|
InventoryItemData(ObjectClass.chainblade, PlanetSideGUID(4088), 4, WeaponData(0, 0, 1, ObjectClass.melee_ammo, PlanetSideGUID(3279), 0, AmmoBoxData())) ::
|
|
|
|
|
Nil
|
|
|
|
|
)
|
2018-06-03 21:35:58 -04:00
|
|
|
val obj = PlayerData(app, char, inv, DrawnSlot.Rifle1)
|
2018-06-03 01:15:47 -04:00
|
|
|
|
|
|
|
|
val msg = ObjectCreateMessage(ObjectClass.avatar, PlanetSideGUID(3902), ObjectCreateMessageParent(PlanetSideGUID(1234), 0), obj)
|
|
|
|
|
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
|
|
|
|
pkt mustEqual string_seated
|
|
|
|
|
}
|
|
|
|
|
|
2017-12-05 00:37:24 -05:00
|
|
|
"encode (backpack)" in {
|
2018-05-28 20:39:35 -04:00
|
|
|
val pos = PlacementData(
|
|
|
|
|
Vector3(4629.8906f, 6316.4453f, 54.734375f),
|
|
|
|
|
Vector3(0, 0, 126.5625f)
|
|
|
|
|
)
|
2018-10-07 23:34:06 -04:00
|
|
|
val a : Int=>CharacterAppearanceA = CharacterAppearanceA(
|
2018-05-28 20:39:35 -04:00
|
|
|
BasicCharacterData(
|
|
|
|
|
"Angello",
|
|
|
|
|
PlanetSideEmpire.VS,
|
|
|
|
|
CharacterGender.Male,
|
|
|
|
|
10,
|
2018-06-08 21:07:47 -04:00
|
|
|
CharacterVoice.Voice2
|
2017-12-05 00:37:24 -05:00
|
|
|
),
|
2018-05-28 20:39:35 -04:00
|
|
|
false,
|
2018-10-07 23:34:06 -04:00
|
|
|
true,
|
|
|
|
|
false,
|
|
|
|
|
None,
|
2018-05-28 20:39:35 -04:00
|
|
|
false,
|
|
|
|
|
ExoSuitType.MAX,
|
2018-10-07 23:34:06 -04:00
|
|
|
None,
|
|
|
|
|
0,
|
|
|
|
|
1,
|
|
|
|
|
0L,
|
|
|
|
|
0,
|
|
|
|
|
0,
|
|
|
|
|
0,
|
|
|
|
|
0
|
|
|
|
|
)
|
|
|
|
|
val b : (Boolean,Int)=>CharacterAppearanceB = CharacterAppearanceB(
|
|
|
|
|
529687L,
|
2018-05-28 20:39:35 -04:00
|
|
|
"Original District",
|
|
|
|
|
23,
|
2018-10-07 23:34:06 -04:00
|
|
|
false, //unk1
|
2018-05-28 20:39:35 -04:00
|
|
|
true, //backpack
|
2018-10-07 23:34:06 -04:00
|
|
|
false, //unk2
|
|
|
|
|
false, //unk3
|
|
|
|
|
false, //unk4
|
|
|
|
|
351.5625f, 0f,
|
|
|
|
|
false, //lfs
|
2018-05-28 20:39:35 -04:00
|
|
|
GrenadeState.None,
|
2018-10-07 23:34:06 -04:00
|
|
|
false, //is_cloaking
|
|
|
|
|
false, //unk5
|
|
|
|
|
false, //unk6
|
|
|
|
|
false, //charging_pose
|
|
|
|
|
false, //unk7
|
|
|
|
|
None
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
val app : (Int)=>CharacterAppearanceData = CharacterAppearanceData(
|
|
|
|
|
a, b,
|
2018-05-28 20:39:35 -04:00
|
|
|
RibbonBars(
|
|
|
|
|
MeritCommendation.Jacking2,
|
|
|
|
|
MeritCommendation.ScavengerVS1,
|
|
|
|
|
MeritCommendation.AMSSupport4,
|
|
|
|
|
MeritCommendation.SixYearVS
|
|
|
|
|
)
|
|
|
|
|
)
|
2018-06-01 14:17:36 -04:00
|
|
|
val char : (Boolean,Boolean)=>CharacterData = CharacterData(
|
2017-12-05 00:37:24 -05:00
|
|
|
0, 0,
|
|
|
|
|
UniformStyle.ThirdUpgrade,
|
2018-10-07 23:34:06 -04:00
|
|
|
1,
|
2018-10-04 23:12:07 -04:00
|
|
|
List(),
|
2018-05-28 20:39:35 -04:00
|
|
|
Some(Cosmetics(true, true, true, true, false))
|
2017-12-05 00:37:24 -05:00
|
|
|
)
|
2018-06-01 14:17:36 -04:00
|
|
|
val obj = PlayerData(pos, app, char, DrawnSlot.Pistol1)
|
2018-05-28 20:39:35 -04:00
|
|
|
|
2017-12-05 00:37:24 -05:00
|
|
|
val msg = ObjectCreateMessage(ObjectClass.avatar, PlanetSideGUID(3380), obj)
|
|
|
|
|
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
2018-10-07 23:34:06 -04:00
|
|
|
//granular test
|
2017-12-05 00:37:24 -05:00
|
|
|
val pkt_bitv = pkt.toBitVector
|
2018-06-03 01:15:47 -04:00
|
|
|
val ori_bitv = string_backpack.toBitVector
|
2018-10-07 23:34:06 -04:00
|
|
|
pkt_bitv.take(916) mustEqual pkt_bitv.take(916) //skip 4
|
|
|
|
|
pkt_bitv.drop(920) mustEqual pkt_bitv.drop(920)
|
2017-12-05 00:37:24 -05:00
|
|
|
//TODO work on CharacterData to make this pass as a single stream
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|