// Copyright (c) 2017 PSForever package game import net.psforever.packet._ import net.psforever.packet.game.{ObjectCreateMessage, _} import net.psforever.packet.game.objectcreate._ import net.psforever.types._ import org.specs2.mutable._ import scodec.bits._ class ObjectCreateMessageTest extends Specification { val string_striker_projectile = hex"17 C5000000 A4B 009D 4C129 0CB0A 9814 00 F5 E3 040000666686400" val string_implant_interface = hex"17 6C000000 01014C93304818000000" val string_order_terminala = hex"17 A5000000 B2AF30EACF1889F7A3D1200007D2000000" val string_ace_held = hex"17 76000000 0406900650C80480000000" val string_boomertrigger = hex"17 76000000 58084A8100E80C00000000" //reconstructed from an inventory entry val string_detonater_held = hex"17 76000000 1A886A8421080400000000" val string_lasher_held = hex"17 BB000000 1688569D90B83 880000008082077036032000000" val string_punisher_held = hex"17 F6000000 0A06612331083 88000000810381383E03200003793287C0E400000" val string_rek_held = hex"17 86000000 27086C2350F800800000000000" val string_captureflag = hex"17 E5000000 CE8EA10 04A47 B818A FE0E 00 00 0F 24000015000400160B09000" //LLU for Qumu on Amerish val string_ace_dropped = hex"17 AF000000 90024113B329C5D5A2D1200005B440000000" val string_detonater_dropped = hex"17 AF000000 EA8620ED1549B4B6A741500001B000000000" val string_shotgunshell_dropped = hex"17 A5000000 F9A7D0D 5E269 BED5A F114 0000596000000" val string_lasher_dropped = hex"17 F4000000 D69020C 99299 85D0A 5F10 00 00 20 400000004041038819018000000" val string_punisher_dropped = hex"17 2F010000 E12A20B 915A9 28C9A 1412 00 00 33 200000004081C1901B01800001BCB5C2E07000000" val string_rek_dropped = hex"17 BF000000 EC20311 85219 7AC1A 2D12 00 00 4E 4000000001800" val string_boomer = hex"17 A5000000 CA0000F1630938D5A8F1400003F0031100" val string_spitfire_short = hex"17 BB000000 9D37010 E4F08 6AFCA 0312 00 7F 42 2C1F0F0000F00" val string_spitfire = hex"17 4F010000 9D3A910 D1D78 AE3FC 9111 00 00 69 4488107F80F2021DBF80B80C80000008086EDB83A03200000" val string_trap = hex"17 BB000000 A8B630A 39FA6 FD666 801C 00 00 00 44C6097F80F00" val string_aegis = hex"17 10010000 F80FC09 9DF96 0C676 801C 00 00 00 443E09FF0000000000000000000000000" val string_orion = hex"17 5E010000 D82640B 92F76 01D65 F611 00 00 5E 4400006304BFC1E4041826E1503900000010104CE704C06400000" val string_locker_container = hex"17 AF010000 E414C0C00000000000000000000600000818829DC2E030000000202378620D80C00000378FA0FADC000006F1FC199D800000" val string_character = hex"17 73070000 BC8 3E0F 6C2D7 65535 CA16 00 00 09 9741E4F804000000 234530063007200610077006E00790052006F006E006E0069006500 220B7 E67B540404001000000000022B50100 268042006C00610063006B002000420065007200650074002000410072006D006F007500720065006400200043006F00720070007300 1700E0030050040003BC00000234040001A004000 3FFF67A8F A0A5424E0E800000000080952A9C3A03000001081103E040000000A023782F1080C0000016244108200000000808382403A030000014284C3A0C0000000202512F00B80C00000578F80F840000000280838B3C320300000080" val string_character_backpack = hex"17 9C030000 BC8 340D F20A9 3956C AF0D 00 00 73 480000 87041006E00670065006C006C006F00 4A148 0000000000000000000000005C54200 24404F0072006900670069006E0061006C00200044006900730074007200690063007400 1740180181E8000000C202000042000000D202000000010A3C00" "decode (striker projectile)" in { PacketCoding.DecodePacket(string_striker_projectile).require match { case ObjectCreateMessage(len, cls, guid, parent, data) => len mustEqual 197 cls mustEqual ObjectClass.striker_missile_targeting_projectile guid mustEqual PlanetSideGUID(40192) parent.isDefined mustEqual false data.isDefined mustEqual true data.get.isInstanceOf[TrackedProjectileData] mustEqual true val projectile = data.get.asInstanceOf[TrackedProjectileData] projectile.pos.coord.x mustEqual 4644.5938f projectile.pos.coord.y mustEqual 5472.0938f projectile.pos.coord.z mustEqual 82.375f projectile.pos.orient.x mustEqual 0f projectile.pos.orient.y mustEqual 30.9375f projectile.pos.orient.z mustEqual 171.5625f projectile.unk1 mustEqual 0 projectile.unk2 mustEqual TrackedProjectileData.striker_missile_targetting_projectile_data case _ => ko } } "decode (implant interface)" in { PacketCoding.DecodePacket(string_implant_interface).require match { case ObjectCreateMessage(len, cls, guid, parent, data) => len mustEqual 108 cls mustEqual 0x199 guid mustEqual PlanetSideGUID(1075) parent.isDefined mustEqual true parent.get.guid mustEqual PlanetSideGUID(514) parent.get.slot mustEqual 1 data.isDefined mustEqual true data.get.isInstanceOf[CommonTerminalData] mustEqual true data.get.asInstanceOf[CommonTerminalData].faction mustEqual PlanetSideEmpire.VS case _ => ko } } "decode (order terminal a)" in { PacketCoding.DecodePacket(string_order_terminala).require match { case ObjectCreateMessage(len, cls, guid, parent, data) => len mustEqual 165 cls mustEqual ObjectClass.order_terminala guid mustEqual PlanetSideGUID(3827) parent.isDefined mustEqual false data.isDefined mustEqual true data.get.isInstanceOf[DroppedItemData[_]] mustEqual true val drop = data.get.asInstanceOf[DroppedItemData[_]] drop.pos.coord.x mustEqual 4579.3438f drop.pos.coord.y mustEqual 5615.0703f drop.pos.coord.z mustEqual 72.953125f drop.pos.orient.x mustEqual 0f drop.pos.orient.y mustEqual 0f drop.pos.orient.z mustEqual 98.4375f drop.obj.isInstanceOf[CommonTerminalData] mustEqual true val term = drop.obj.asInstanceOf[CommonTerminalData] term.faction mustEqual PlanetSideEmpire.NC term.unk mustEqual 0 case _ => ko } } "decode (ace, held)" in { PacketCoding.DecodePacket(string_ace_held).require match { case ObjectCreateMessage(len, cls, guid, parent, data) => len mustEqual 118 cls mustEqual ObjectClass.ace guid mustEqual PlanetSideGUID(3173) parent.isDefined mustEqual true parent.get.guid mustEqual PlanetSideGUID(3336) parent.get.slot mustEqual 0 data.isDefined mustEqual true data.get.isInstanceOf[ACEData] mustEqual true val ace = data.get.asInstanceOf[ACEData] ace.unk1 mustEqual 4 ace.unk2 mustEqual 8 ace.unk3 mustEqual 0 case _ => ko } } "decode (boomer trigger, held)" in { PacketCoding.DecodePacket(string_boomertrigger).require match { case ObjectCreateMessage(len, cls, guid, parent, data) => len mustEqual 118 cls mustEqual ObjectClass.boomer_trigger guid mustEqual PlanetSideGUID(3600) parent.isDefined mustEqual true parent.get.guid mustEqual PlanetSideGUID(4272) parent.get.slot mustEqual 0 data.isDefined mustEqual true data.get.isInstanceOf[BoomerTriggerData] mustEqual true data.get.asInstanceOf[BoomerTriggerData].unk mustEqual 0 case _ => ko } } "decode (detonator, held)" in { PacketCoding.DecodePacket(string_detonater_held).require match { case ObjectCreateMessage(len, cls, guid, parent, data) => len mustEqual 118 cls mustEqual ObjectClass.command_detonater guid mustEqual PlanetSideGUID(4162) parent.isDefined mustEqual true parent.get.guid mustEqual PlanetSideGUID(4149) parent.get.slot mustEqual 0 data.isDefined mustEqual true data.get.isInstanceOf[CommandDetonaterData] mustEqual true val cud = data.get.asInstanceOf[CommandDetonaterData] cud.unk1 mustEqual 4 cud.unk2 mustEqual 0 case _ => ko } } "decode (lasher, held)" in { PacketCoding.DecodePacket(string_lasher_held).require match { case ObjectCreateMessage(len, cls, guid, parent, data) => len mustEqual 187 cls mustEqual ObjectClass.lasher guid mustEqual PlanetSideGUID(3033) parent.isDefined mustEqual true parent.get.guid mustEqual PlanetSideGUID(4141) parent.get.slot mustEqual 3 data.isDefined mustEqual true data.get.isInstanceOf[WeaponData] mustEqual true val wep = data.get.asInstanceOf[WeaponData] wep.unk1 mustEqual 4 wep.unk2 mustEqual 8 wep.fire_mode mustEqual 0 wep.ammo.head.objectClass mustEqual ObjectClass.energy_cell wep.ammo.head.guid mustEqual PlanetSideGUID(3548) wep.ammo.head.parentSlot mustEqual 0 wep.ammo.head.obj.isInstanceOf[AmmoBoxData] mustEqual true val ammo = wep.ammo.head.obj.asInstanceOf[AmmoBoxData] ammo.unk mustEqual 8 case _ => ko } } "decode (punisher, held)" in { PacketCoding.DecodePacket(string_punisher_held).require match { case ObjectCreateMessage(len, cls, guid, parent, data) => len mustEqual 246 cls mustEqual ObjectClass.punisher guid mustEqual PlanetSideGUID(4147) parent.isDefined mustEqual true parent.get.guid mustEqual PlanetSideGUID(3092) parent.get.slot mustEqual 3 data.isDefined mustEqual true data.get.isInstanceOf[WeaponData] mustEqual true val wep = data.get.asInstanceOf[WeaponData] wep.unk1 mustEqual 4 wep.unk2 mustEqual 8 wep.fire_mode mustEqual 0 val ammo = wep.ammo ammo.size mustEqual 2 //0 ammo.head.objectClass mustEqual ObjectClass.bullet_9mm ammo.head.guid mustEqual PlanetSideGUID(3918) ammo.head.parentSlot mustEqual 0 ammo.head.obj.isInstanceOf[AmmoBoxData] mustEqual true ammo.head.obj.asInstanceOf[AmmoBoxData].unk mustEqual 8 //1 ammo(1).objectClass mustEqual ObjectClass.rocket ammo(1).guid mustEqual PlanetSideGUID(3941) ammo(1).parentSlot mustEqual 1 ammo(1).obj.isInstanceOf[AmmoBoxData] mustEqual true ammo(1).obj.asInstanceOf[AmmoBoxData].unk mustEqual 8 case _ => ko } } "decode (REK, held)" in { PacketCoding.DecodePacket(string_rek_held).require match { case ObjectCreateMessage(len, cls, guid, parent, data) => len mustEqual 134 cls mustEqual ObjectClass.remote_electronics_kit guid mustEqual PlanetSideGUID(3893) parent.isDefined mustEqual true parent.get.guid mustEqual PlanetSideGUID(4174) parent.get.slot mustEqual 0 data.isDefined mustEqual true data.get.isInstanceOf[REKData] mustEqual true val rek = data.get.asInstanceOf[REKData] rek.unk1 mustEqual 0 rek.unk2 mustEqual 8 rek.unk3 mustEqual 0 case _ => ko } } "decode (capture flag)" in { PacketCoding.DecodePacket(string_captureflag).require match { case ObjectCreateMessage(len, cls, guid, parent, data) => len mustEqual 229 cls mustEqual ObjectClass.capture_flag guid mustEqual PlanetSideGUID(4330) parent.isDefined mustEqual false data.isDefined mustEqual true data.get.isInstanceOf[CaptureFlagData] mustEqual true val flag = data.get.asInstanceOf[CaptureFlagData] flag.pos.coord.x mustEqual 3912.0312f flag.pos.coord.y mustEqual 5169.4375f flag.pos.coord.z mustEqual 59.96875f flag.pos.orient.x mustEqual 0f flag.pos.orient.y mustEqual 0f flag.pos.orient.z mustEqual 47.8125f flag.faction mustEqual PlanetSideEmpire.NC flag.unk1 mustEqual 21 flag.unk2 mustEqual 4 flag.unk3 mustEqual 2838 flag.unk4 mustEqual 9 case _ => ko } } "decode (ace, dropped)" in { PacketCoding.DecodePacket(string_ace_dropped).require match { case ObjectCreateMessage(len, cls, guid, parent, data) => len mustEqual 175 cls mustEqual ObjectClass.ace guid mustEqual PlanetSideGUID(4388) parent.isDefined mustEqual false data.isDefined mustEqual true data.get.isInstanceOf[DroppedItemData[_]] mustEqual true val drop = data.get.asInstanceOf[DroppedItemData[_]] drop.pos.coord.x mustEqual 4708.461f drop.pos.coord.y mustEqual 5547.539f drop.pos.coord.z mustEqual 72.703125f drop.pos.orient.x mustEqual 0f drop.pos.orient.y mustEqual 0f drop.pos.orient.z mustEqual 194.0625f drop.obj.isInstanceOf[ACEData] mustEqual true val ace = drop.obj.asInstanceOf[ACEData] ace.unk1 mustEqual 8 ace.unk2 mustEqual 8 case _ => ko } } "decode (detonator, dropped)" in { PacketCoding.DecodePacket(string_detonater_dropped).require match { case ObjectCreateMessage(len, cls, guid, parent, data) => len mustEqual 175 cls mustEqual ObjectClass.command_detonater guid mustEqual PlanetSideGUID(3682) parent.isDefined mustEqual false data.isDefined mustEqual true data.get.isInstanceOf[DroppedItemData[_]] mustEqual true val drop = data.get.asInstanceOf[DroppedItemData[_]] drop.pos.coord.x mustEqual 4777.633f drop.pos.coord.y mustEqual 5485.4062f drop.pos.coord.z mustEqual 85.8125f drop.pos.orient.x mustEqual 0f drop.pos.orient.y mustEqual 0f drop.pos.orient.z mustEqual 14.0625f drop.obj.isInstanceOf[CommandDetonaterData] mustEqual true case _ => ko } } "decode (shotgun shells, dropped)" in { PacketCoding.DecodePacket(string_shotgunshell_dropped).require match { case ObjectCreateMessage(len, cls, guid, parent, data) => len mustEqual 165 cls mustEqual ObjectClass.shotgun_shell guid mustEqual PlanetSideGUID(3453) parent.isDefined mustEqual false data.isDefined mustEqual true data.get.isInstanceOf[DroppedItemData[_]] mustEqual true val drop = data.get.asInstanceOf[DroppedItemData[_]] drop.pos.coord.x mustEqual 4684.7344f drop.pos.coord.y mustEqual 5547.4844f drop.pos.coord.z mustEqual 83.765625f drop.pos.orient.x mustEqual 0f drop.pos.orient.y mustEqual 0f drop.pos.orient.z mustEqual 199.6875f drop.obj.isInstanceOf[AmmoBoxData] mustEqual true val box = drop.obj.asInstanceOf[AmmoBoxData] box.unk mustEqual 0 case _ => ko } } "decode (lasher, dropped)" in { PacketCoding.DecodePacket(string_lasher_dropped).require match { case ObjectCreateMessage(len, cls, guid, parent, data) => len mustEqual 244 cls mustEqual ObjectClass.lasher guid mustEqual PlanetSideGUID(3074) parent.isDefined mustEqual false data.isDefined mustEqual true data.get.isInstanceOf[DroppedItemData[_]] mustEqual true val drop = data.get.asInstanceOf[DroppedItemData[_]] drop.pos.coord.x mustEqual 4691.1953f drop.pos.coord.y mustEqual 5537.039f drop.pos.coord.z mustEqual 65.484375f drop.pos.orient.x mustEqual 0f drop.pos.orient.y mustEqual 0f drop.pos.orient.z mustEqual 0f drop.obj.isInstanceOf[WeaponData] mustEqual true val wep = drop.obj.asInstanceOf[WeaponData] wep.unk1 mustEqual 4 wep.unk2 mustEqual 0 wep.fire_mode mustEqual 0 wep.ammo.head.objectClass mustEqual ObjectClass.energy_cell wep.ammo.head.guid mustEqual PlanetSideGUID(3268) wep.ammo.head.parentSlot mustEqual 0 wep.ammo.head.obj.isInstanceOf[AmmoBoxData] mustEqual true val ammo = wep.ammo.head.obj.asInstanceOf[AmmoBoxData] ammo.unk mustEqual 0 case _ => ko } } "decode (punisher, dropped)" in { PacketCoding.DecodePacket(string_punisher_dropped).require match { case ObjectCreateMessage(len, cls, guid, parent, data) => len mustEqual 303 cls mustEqual ObjectClass.punisher guid mustEqual PlanetSideGUID(2978) parent.isDefined mustEqual false data.isDefined mustEqual true data.get.isInstanceOf[DroppedItemData[_]] mustEqual true val drop = data.get.asInstanceOf[DroppedItemData[_]] drop.pos.coord.x mustEqual 4789.133f drop.pos.coord.y mustEqual 5522.3125f drop.pos.coord.z mustEqual 72.3125f drop.pos.orient.x mustEqual 0f drop.pos.orient.y mustEqual 0f drop.pos.orient.z mustEqual 306.5625f drop.obj.isInstanceOf[WeaponData] mustEqual true val wep = drop.obj.asInstanceOf[WeaponData] wep.unk1 mustEqual 2 wep.unk2 mustEqual 0 wep.fire_mode mustEqual 0 val ammo = wep.ammo ammo.size mustEqual 2 //0 ammo.head.objectClass mustEqual ObjectClass.bullet_9mm ammo.head.guid mustEqual PlanetSideGUID(3528) ammo.head.parentSlot mustEqual 0 ammo.head.obj.isInstanceOf[AmmoBoxData] mustEqual true ammo.head.obj.asInstanceOf[AmmoBoxData].unk mustEqual 0 //1 ammo(1).objectClass mustEqual ObjectClass.rocket ammo(1).guid mustEqual PlanetSideGUID(3031) ammo(1).parentSlot mustEqual 1 ammo(1).obj.isInstanceOf[AmmoBoxData] mustEqual true ammo(1).obj.asInstanceOf[AmmoBoxData].unk mustEqual 0 case _ => ko } } "decode (REK, dropped)" in { PacketCoding.DecodePacket(string_rek_dropped).require match { case ObjectCreateMessage(len, cls, guid, parent, data) => len mustEqual 191 cls mustEqual ObjectClass.remote_electronics_kit guid mustEqual PlanetSideGUID(4355) parent.isDefined mustEqual false data.isDefined mustEqual true data.get.isInstanceOf[DroppedItemData[_]] mustEqual true val dropped = data.get.asInstanceOf[DroppedItemData[_]] dropped.pos.coord.x mustEqual 4675.039f dropped.pos.coord.y mustEqual 5506.953f dropped.pos.coord.z mustEqual 72.703125f dropped.pos.orient.x mustEqual 0f dropped.pos.orient.y mustEqual 0f dropped.pos.orient.z mustEqual 230.625f dropped.obj.isInstanceOf[REKData] mustEqual true val rek = dropped.obj.asInstanceOf[REKData] rek.unk1 mustEqual 8 rek.unk2 mustEqual 0 rek.unk3 mustEqual 3 case _ => ko } } "decode (boomer)" in { PacketCoding.DecodePacket(string_boomer).require match { case ObjectCreateMessage(len, cls, guid, parent, data) => len mustEqual 165 cls mustEqual ObjectClass.boomer guid mustEqual PlanetSideGUID(3840) parent.isDefined mustEqual false data.isDefined mustEqual true data.get.isInstanceOf[SmallDeployableData] mustEqual true val boomer = data.get.asInstanceOf[SmallDeployableData] boomer.deploy.pos.coord.x mustEqual 4704.172f boomer.deploy.pos.coord.y mustEqual 5546.4375f boomer.deploy.pos.coord.z mustEqual 82.234375f boomer.deploy.pos.orient.x mustEqual 0f boomer.deploy.pos.orient.y mustEqual 0f boomer.deploy.pos.orient.z mustEqual 272.8125f boomer.deploy.unk mustEqual 0 boomer.deploy.player_guid mustEqual PlanetSideGUID(4145) case _ => ko } } "decode (spitfire, short)" in { PacketCoding.DecodePacket(string_spitfire_short).require match { case ObjectCreateMessage(len, cls, guid, parent, data) => len mustEqual 187 cls mustEqual ObjectClass.spitfire_turret guid mustEqual PlanetSideGUID(4208) parent.isDefined mustEqual false data.isDefined mustEqual true data.get.isInstanceOf[SmallTurretData] mustEqual true val turret = data.get.asInstanceOf[SmallTurretData] turret.deploy.pos.coord.x mustEqual 4577.7812f turret.deploy.pos.coord.y mustEqual 5624.828f turret.deploy.pos.coord.z mustEqual 72.046875f turret.deploy.pos.orient.x mustEqual 0f turret.deploy.pos.orient.y mustEqual 2.8125f turret.deploy.pos.orient.z mustEqual 264.375f turret.deploy.faction mustEqual PlanetSideEmpire.NC turret.deploy.destroyed mustEqual true turret.deploy.unk mustEqual 2 turret.deploy.player_guid mustEqual PlanetSideGUID(3871) turret.health mustEqual 0 turret.internals.isDefined mustEqual false case _ => ko } } "decode (spitfire)" in { PacketCoding.DecodePacket(string_spitfire).require match { case ObjectCreateMessage(len, cls, guid, parent, data) => len mustEqual 335 cls mustEqual ObjectClass.spitfire_turret guid mustEqual PlanetSideGUID(4265) parent.isDefined mustEqual false data.isDefined mustEqual true data.get.isInstanceOf[SmallTurretData] mustEqual true val turret = data.get.asInstanceOf[SmallTurretData] turret.deploy.pos.coord.x mustEqual 4527.633f turret.deploy.pos.coord.y mustEqual 6271.3594f turret.deploy.pos.coord.z mustEqual 70.265625f turret.deploy.pos.orient.x mustEqual 0f turret.deploy.pos.orient.y mustEqual 0f turret.deploy.pos.orient.z mustEqual 154.6875f turret.deploy.faction mustEqual PlanetSideEmpire.VS turret.deploy.unk mustEqual 2 turret.deploy.player_guid mustEqual PlanetSideGUID(4232) turret.health mustEqual 255 turret.internals.isDefined mustEqual true val internals = turret.internals.get internals.objectClass mustEqual ObjectClass.spitfire_weapon internals.guid mustEqual PlanetSideGUID(3064) internals.parentSlot mustEqual 0 internals.obj.isInstanceOf[WeaponData] mustEqual true val wep = internals.obj.asInstanceOf[WeaponData] wep.unk1 mustEqual 0x6 wep.unk2 mustEqual 0x8 wep.fire_mode mustEqual 0 val ammo = wep.ammo.head ammo.objectClass mustEqual ObjectClass.spitfire_ammo ammo.guid mustEqual PlanetSideGUID(3694) ammo.parentSlot mustEqual 0 ammo.obj.isInstanceOf[AmmoBoxData] mustEqual true ammo.obj.asInstanceOf[AmmoBoxData].unk mustEqual 8 case _ => ko } } "decode (trap)" in { PacketCoding.DecodePacket(string_trap).require match { case ObjectCreateMessage(len, cls, guid, parent, data) => len mustEqual 187 cls mustEqual ObjectClass.tank_traps guid mustEqual PlanetSideGUID(2659) parent.isDefined mustEqual false data.isDefined mustEqual true data.get.isInstanceOf[TRAPData] mustEqual true val trap = data.get.asInstanceOf[TRAPData] trap.deploy.pos.coord.x mustEqual 3572.4453f trap.deploy.pos.coord.y mustEqual 3277.9766f trap.deploy.pos.coord.z mustEqual 114.0f trap.deploy.pos.orient.x mustEqual 0f trap.deploy.pos.orient.y mustEqual 0f trap.deploy.pos.orient.z mustEqual 90.0f trap.deploy.faction mustEqual PlanetSideEmpire.VS trap.deploy.unk mustEqual 2 trap.health mustEqual 255 trap.deploy.player_guid mustEqual PlanetSideGUID(2502) case _ => ko } } "decode (aegis)" in { PacketCoding.DecodePacket(string_aegis).require match { case ObjectCreateMessage(len, cls, guid, parent, data) => len mustEqual 272 cls mustEqual ObjectClass.deployable_shield_generator guid mustEqual PlanetSideGUID(2556) parent.isDefined mustEqual false data.isDefined mustEqual true data.get.isInstanceOf[AegisShieldGeneratorData] mustEqual true val aegis = data.get.asInstanceOf[AegisShieldGeneratorData] aegis.deploy.pos.coord.x mustEqual 3571.2266f aegis.deploy.pos.coord.y mustEqual 3278.0938f aegis.deploy.pos.coord.z mustEqual 114.0f aegis.deploy.pos.orient.x mustEqual 0f aegis.deploy.pos.orient.y mustEqual 0f aegis.deploy.pos.orient.z mustEqual 90.0f aegis.deploy.faction mustEqual PlanetSideEmpire.VS aegis.deploy.unk mustEqual 2 aegis.health mustEqual 255 aegis.deploy.player_guid mustEqual PlanetSideGUID(2366) case _ => ko } } "decode (orion)" in { PacketCoding.DecodePacket(string_orion).require match { case ObjectCreateMessage(len, cls, guid, parent, data) => len mustEqual 350 cls mustEqual ObjectClass.portable_manned_turret_vs guid mustEqual PlanetSideGUID(2916) parent.isDefined mustEqual false data.isDefined mustEqual true data.get.isInstanceOf[OneMannedFieldTurretData] mustEqual true val omft = data.get.asInstanceOf[OneMannedFieldTurretData] omft.deploy.pos.coord.x mustEqual 3567.1406f omft.deploy.pos.coord.y mustEqual 2988.0078f omft.deploy.pos.coord.z mustEqual 71.84375f omft.deploy.pos.orient.x mustEqual 0f omft.deploy.pos.orient.y mustEqual 0f omft.deploy.pos.orient.z mustEqual 185.625f omft.deploy.faction mustEqual PlanetSideEmpire.VS omft.deploy.unk mustEqual 2 omft.deploy.player_guid mustEqual PlanetSideGUID(2502) omft.health mustEqual 255 omft.internals.isDefined mustEqual true val internals = omft.internals.get internals.objectClass mustEqual ObjectClass.energy_gun_vs internals.guid mustEqual PlanetSideGUID(2615) internals.parentSlot mustEqual 1 internals.obj.isInstanceOf[WeaponData] mustEqual true val wep = internals.obj.asInstanceOf[WeaponData] wep.unk1 mustEqual 0x6 wep.unk2 mustEqual 0x8 wep.fire_mode mustEqual 0 val ammo = wep.ammo.head ammo.objectClass mustEqual ObjectClass.energy_gun_ammo ammo.guid mustEqual PlanetSideGUID(2510) ammo.parentSlot mustEqual 0 ammo.obj.isInstanceOf[AmmoBoxData] mustEqual true ammo.obj.asInstanceOf[AmmoBoxData].unk mustEqual 8 case _ => ko } } "decode (locker container)" in { PacketCoding.DecodePacket(string_locker_container).require match { case ObjectCreateMessage(len, cls, guid, parent, data) => len mustEqual 431 cls mustEqual ObjectClass.locker_container guid mustEqual PlanetSideGUID(3148) parent.isDefined mustEqual false data.isDefined mustEqual true data.get.isInstanceOf[LockerContainerData] mustEqual true val locker = data.get.asInstanceOf[LockerContainerData] val contents = locker.inventory.contents contents.size mustEqual 3 //0 contents.head.objectClass mustEqual ObjectClass.nano_dispenser contents.head.guid mustEqual PlanetSideGUID(2935) contents.head.parentSlot mustEqual 0 contents.head.obj.isInstanceOf[WeaponData] mustEqual true val dispenser = contents.head.obj.asInstanceOf[WeaponData] dispenser.unk1 mustEqual 0x6 dispenser.unk2 mustEqual 0x0 dispenser.ammo.head.objectClass mustEqual ObjectClass.armor_canister dispenser.ammo.head.guid mustEqual PlanetSideGUID(3426) dispenser.ammo.head.parentSlot mustEqual 0 dispenser.ammo.head.obj.isInstanceOf[AmmoBoxData] mustEqual true dispenser.ammo.head.obj.asInstanceOf[AmmoBoxData].unk mustEqual 0 //1 contents(1).objectClass mustEqual ObjectClass.armor_canister contents(1).guid mustEqual PlanetSideGUID(4090) contents(1).parentSlot mustEqual 45 contents(1).obj.isInstanceOf[AmmoBoxData] mustEqual true contents(1).obj.asInstanceOf[AmmoBoxData].unk mustEqual 0 //2 contents(2).objectClass mustEqual ObjectClass.armor_canister contents(2).guid mustEqual PlanetSideGUID(3326) contents(2).parentSlot mustEqual 78 contents(2).obj.isInstanceOf[AmmoBoxData] mustEqual true contents(2).obj.asInstanceOf[AmmoBoxData].unk mustEqual 0 case _ => ko } } "decode (character, alive)" in { PacketCoding.DecodePacket(string_character).require match { case ObjectCreateMessage(len, cls, guid, parent, data) => len mustEqual 1907 cls mustEqual ObjectClass.avatar guid mustEqual PlanetSideGUID(3902) parent.isDefined mustEqual false data.isDefined mustEqual true data.get.isInstanceOf[CharacterData] mustEqual true val pc = data.get.asInstanceOf[CharacterData] pc.appearance.pos.coord.x mustEqual 3674.8438f pc.appearance.pos.coord.y mustEqual 2726.789f pc.appearance.pos.coord.z mustEqual 91.15625f pc.appearance.pos.orient.x mustEqual 0f pc.appearance.pos.orient.y mustEqual 0f pc.appearance.pos.orient.z mustEqual 64.6875f pc.appearance.pos.vel.isDefined mustEqual true pc.appearance.pos.vel.get.x mustEqual 1.4375f pc.appearance.pos.vel.get.y mustEqual -0.4375f pc.appearance.pos.vel.get.z mustEqual 0f pc.appearance.basic_appearance.name mustEqual "ScrawnyRonnie" pc.appearance.basic_appearance.faction mustEqual PlanetSideEmpire.TR pc.appearance.basic_appearance.sex mustEqual CharacterGender.Male pc.appearance.basic_appearance.head mustEqual 5 pc.appearance.basic_appearance.voice mustEqual 5 pc.appearance.voice2 mustEqual 3 pc.appearance.black_ops mustEqual false pc.appearance.jammered mustEqual false pc.appearance.exosuit mustEqual ExoSuitType.Reinforced pc.appearance.outfit_name mustEqual "Black Beret Armoured Corps" pc.appearance.outfit_logo mustEqual 23 pc.appearance.facingPitch mustEqual 340.3125f pc.appearance.facingYawUpper mustEqual 0 pc.appearance.lfs mustEqual false pc.appearance.grenade_state mustEqual GrenadeState.None pc.appearance.is_cloaking mustEqual false pc.appearance.charging_pose mustEqual false pc.appearance.on_zipline mustEqual false pc.appearance.ribbons.upper mustEqual MeritCommendation.MarkovVeteran pc.appearance.ribbons.middle mustEqual MeritCommendation.HeavyInfantry4 pc.appearance.ribbons.lower mustEqual MeritCommendation.TankBuster7 pc.appearance.ribbons.tos mustEqual MeritCommendation.SixYearTR pc.health mustEqual 255 pc.armor mustEqual 253 pc.uniform_upgrade mustEqual UniformStyle.ThirdUpgrade pc.command_rank mustEqual 5 pc.implant_effects.isDefined mustEqual true pc.implant_effects.get mustEqual ImplantEffects.NoEffects pc.cosmetics.isDefined mustEqual true pc.cosmetics.get.no_helmet mustEqual true pc.cosmetics.get.beret mustEqual true pc.cosmetics.get.sunglasses mustEqual true pc.cosmetics.get.earpiece mustEqual true pc.cosmetics.get.brimmed_cap mustEqual false //short test of inventory items pc.inventory.isDefined mustEqual true val contents = pc.inventory.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) pc.drawn_slot mustEqual DrawnSlot.Rifle1 case _ => ko } } "decode (character, backpack)" in { PacketCoding.DecodePacket(string_character_backpack).require match { case ObjectCreateMessage(len, cls, guid, parent, data) => len mustEqual 924L cls mustEqual ObjectClass.avatar guid mustEqual PlanetSideGUID(3380) parent.isDefined mustEqual false data.isDefined mustEqual true data.get.isInstanceOf[CharacterData] mustEqual true val pc = data.get.asInstanceOf[CharacterData] pc.appearance.pos.coord.x mustEqual 4629.8906f pc.appearance.pos.coord.y mustEqual 6316.4453f pc.appearance.pos.coord.z mustEqual 54.734375f pc.appearance.pos.orient.x mustEqual 0f pc.appearance.pos.orient.y mustEqual 0f pc.appearance.pos.orient.z mustEqual 126.5625f pc.appearance.pos.vel.isDefined mustEqual false pc.appearance.basic_appearance.name mustEqual "Angello" pc.appearance.basic_appearance.faction mustEqual PlanetSideEmpire.VS pc.appearance.basic_appearance.sex mustEqual CharacterGender.Male pc.appearance.basic_appearance.head mustEqual 10 pc.appearance.basic_appearance.voice mustEqual 2 pc.appearance.voice2 mustEqual 0 pc.appearance.black_ops mustEqual false pc.appearance.jammered mustEqual false pc.appearance.exosuit mustEqual ExoSuitType.MAX pc.appearance.outfit_name mustEqual "Original District" pc.appearance.outfit_logo mustEqual 23 pc.appearance.facingPitch mustEqual 0 pc.appearance.facingYawUpper mustEqual 180.0f pc.appearance.lfs mustEqual false pc.appearance.grenade_state mustEqual GrenadeState.None pc.appearance.is_cloaking mustEqual false pc.appearance.charging_pose mustEqual false pc.appearance.on_zipline mustEqual false pc.appearance.ribbons.upper mustEqual MeritCommendation.Jacking2 pc.appearance.ribbons.middle mustEqual MeritCommendation.ScavengerVS1 pc.appearance.ribbons.lower mustEqual MeritCommendation.AMSSupport4 pc.appearance.ribbons.tos mustEqual MeritCommendation.SixYearVS pc.health mustEqual 0 pc.armor mustEqual 0 pc.uniform_upgrade mustEqual UniformStyle.ThirdUpgrade pc.command_rank mustEqual 2 pc.implant_effects.isDefined mustEqual false pc.cosmetics.isDefined mustEqual true pc.cosmetics.get.no_helmet mustEqual true pc.cosmetics.get.beret mustEqual true pc.cosmetics.get.sunglasses mustEqual true pc.cosmetics.get.earpiece mustEqual true pc.cosmetics.get.brimmed_cap mustEqual false pc.inventory.isDefined mustEqual false pc.drawn_slot mustEqual DrawnSlot.Pistol1 case _ => ko } } "encode (striker projectile)" in { val obj = TrackedProjectileData.striker( PlacementData(4644.5938f, 5472.0938f, 82.375f, 0f, 30.9375f, 171.5625f), 0 ) val msg = ObjectCreateMessage(ObjectClass.striker_missile_targeting_projectile, PlanetSideGUID(40192), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector pkt.toBitVector.take(132) mustEqual string_striker_projectile.toBitVector.take(132) pkt.toBitVector.drop(133).take(7) mustEqual string_striker_projectile.toBitVector.drop(133).take(7) pkt.toBitVector.drop(141) mustEqual string_striker_projectile.toBitVector.drop(141) } "encode (implant interface)" in { val obj = CommonTerminalData(PlanetSideEmpire.VS) val msg = ObjectCreateMessage(0x199, PlanetSideGUID(1075), ObjectCreateMessageParent(PlanetSideGUID(514), 1), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector pkt mustEqual string_implant_interface } "encode (order terminal a)" in { val obj = DroppedItemData( PlacementData(4579.3438f, 5615.0703f, 72.953125f, 0f, 0f, 98.4375f), CommonTerminalData(PlanetSideEmpire.NC) ) val msg = ObjectCreateMessage(ObjectClass.order_terminala, PlanetSideGUID(3827), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector pkt mustEqual string_order_terminala } "encode (ace, held)" in { val obj = ACEData(4, 8) val msg = ObjectCreateMessage(ObjectClass.ace, PlanetSideGUID(3173), ObjectCreateMessageParent(PlanetSideGUID(3336), 0), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector pkt mustEqual string_ace_held } "encode (boomer trigger, held)" in { val obj = BoomerTriggerData(0) val msg = ObjectCreateMessage(ObjectClass.boomer_trigger, PlanetSideGUID(3600), ObjectCreateMessageParent(PlanetSideGUID(4272), 0), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector pkt mustEqual string_boomertrigger } "encode (detonater, held)" in { val obj = CommandDetonaterData(4) val msg = ObjectCreateMessage(ObjectClass.command_detonater, PlanetSideGUID(4162), ObjectCreateMessageParent(PlanetSideGUID(4149), 0), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector pkt mustEqual string_detonater_held } "encode (lasher, held)" in { val obj = WeaponData(4, 8, ObjectClass.energy_cell, PlanetSideGUID(3548), 0, AmmoBoxData(8)) val msg = ObjectCreateMessage(ObjectClass.lasher, PlanetSideGUID(3033), ObjectCreateMessageParent(PlanetSideGUID(4141), 3), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector pkt mustEqual string_lasher_held } "encode (punisher, held)" in { val obj = WeaponData(4, 8, 0, AmmoBoxData(ObjectClass.bullet_9mm, PlanetSideGUID(3918), 0, AmmoBoxData(8)) :: AmmoBoxData(ObjectClass.rocket, PlanetSideGUID(3941), 1, AmmoBoxData(8)) :: Nil )(2) val msg = ObjectCreateMessage(ObjectClass.punisher, PlanetSideGUID(4147), ObjectCreateMessageParent(PlanetSideGUID(3092), 3), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector pkt mustEqual string_punisher_held } "encode (REK, held)" in { val obj = REKData(0, 8) val msg = ObjectCreateMessage(ObjectClass.remote_electronics_kit, PlanetSideGUID(3893), ObjectCreateMessageParent(PlanetSideGUID(4174), 0), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector pkt mustEqual string_rek_held } "encode (capture flag)" in { val obj = CaptureFlagData(PlacementData(3912.0312f, 5169.4375f, 59.96875f, 0f, 0f, 47.8125f), PlanetSideEmpire.NC, 21, 4, 2838, 9) val msg = ObjectCreateMessage(ObjectClass.capture_flag, PlanetSideGUID(4330), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector pkt mustEqual string_captureflag } "encode (ace, dropped)" in { val obj = DroppedItemData( PlacementData(4708.461f, 5547.539f, 72.703125f, 0f, 0f, 194.0625f), ACEData(8, 8) ) val msg = ObjectCreateMessage(ObjectClass.ace, PlanetSideGUID(4388), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector pkt mustEqual string_ace_dropped } "encode (detonator, dropped)" in { val obj = DroppedItemData( PlacementData(4777.633f, 5485.4062f, 85.8125f, 0f, 0f, 14.0625f), CommandDetonaterData() ) val msg = ObjectCreateMessage(ObjectClass.command_detonater, PlanetSideGUID(3682), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector pkt mustEqual string_detonater_dropped } "encode (shotgun shells, dropped)" in { val obj = DroppedItemData( PlacementData(4684.7344f, 5547.4844f, 83.765625f, 0f, 0f, 199.6875f), AmmoBoxData() ) val msg = ObjectCreateMessage(ObjectClass.shotgun_shell, PlanetSideGUID(3453), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector pkt mustEqual string_shotgunshell_dropped } "encode (lasher, dropped)" in { val obj = DroppedItemData( PlacementData(4691.1953f, 5537.039f, 65.484375f, 0.0f, 0.0f, 0.0f), WeaponData(4, 0, ObjectClass.energy_cell, PlanetSideGUID(3268), 0, AmmoBoxData()) ) val msg = ObjectCreateMessage(ObjectClass.lasher, PlanetSideGUID(3074), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector pkt mustEqual string_lasher_dropped } "encode (punisher, dropped)" in { val obj = DroppedItemData( PlacementData(4789.133f, 5522.3125f, 72.3125f, 0f, 0f, 306.5625f), WeaponData(2, 0, 0, AmmoBoxData(ObjectClass.bullet_9mm, PlanetSideGUID(3528), 0, AmmoBoxData()) :: AmmoBoxData(ObjectClass.rocket, PlanetSideGUID(3031), 1, AmmoBoxData()) :: Nil )(2) ) val msg = ObjectCreateMessage(ObjectClass.punisher, PlanetSideGUID(2978), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector pkt mustEqual string_punisher_dropped } "encode (REK, dropped)" in { val obj = DroppedItemData( PlacementData(4675.039f, 5506.953f, 72.703125f, 0f, 0f, 230.625f), REKData(8, 0, 3) ) val msg = ObjectCreateMessage(ObjectClass.remote_electronics_kit, PlanetSideGUID(4355), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector pkt mustEqual string_rek_dropped } "encode (boomer)" in { val obj = SmallDeployableData( CommonFieldData( PlacementData(4704.172f, 5546.4375f, 82.234375f, 0f, 0f, 272.8125f), PlanetSideEmpire.TR, 0, PlanetSideGUID(4145) ) ) val msg = ObjectCreateMessage(ObjectClass.boomer, PlanetSideGUID(3840), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector pkt mustEqual string_boomer } "encode (spitfire, short)" in { val obj = SmallTurretData( CommonFieldData( PlacementData(4577.7812f, 5624.828f, 72.046875f, 0f, 2.8125f, 264.375f), PlanetSideEmpire.NC, true, 2, PlanetSideGUID(3871) ), 255 //sets to 0 ) val msg = ObjectCreateMessage(ObjectClass.spitfire_turret, PlanetSideGUID(4208), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector val pkt_bitv = pkt.toBitVector val ori_bitv = string_spitfire_short.toBitVector pkt_bitv.take(173) mustEqual ori_bitv.take(173) pkt_bitv.drop(185) mustEqual ori_bitv.drop(185) //TODO work on SmallTurretData to make this pass as a single stream } "encode (spitfire)" in { val obj = SmallTurretData( CommonFieldData( PlacementData(4527.633f, 6271.3594f, 70.265625f, 0f, 0f, 154.6875f), PlanetSideEmpire.VS, 2, PlanetSideGUID(4232) ), 255, SmallTurretData.spitfire(PlanetSideGUID(3064), 0x6, 0x8, PlanetSideGUID(3694), 8) ) val msg = ObjectCreateMessage(ObjectClass.spitfire_turret, PlanetSideGUID(4265), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector val pkt_bitv = pkt.toBitVector val ori_bitv = string_spitfire.toBitVector pkt_bitv.take(173) mustEqual ori_bitv.take(173) pkt_bitv.drop(185) mustEqual ori_bitv.drop(185) //TODO work on SmallTurretData to make this pass as a single stream } "encode (trap)" in { val obj = TRAPData( CommonFieldData( PlacementData(3572.4453f, 3277.9766f, 114.0f, 0f, 0f, 90.0f), PlanetSideEmpire.VS, 2, PlanetSideGUID(2502) ), 255 ) val msg = ObjectCreateMessage(ObjectClass.tank_traps, PlanetSideGUID(2659), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector val pkt_bitv = pkt.toBitVector val ori_bitv = string_trap.toBitVector pkt_bitv.take(173) mustEqual ori_bitv.take(173) pkt_bitv.drop(185) mustEqual ori_bitv.drop(185) //TODO work on TRAPData to make this pass as a single stream } "encode (aegis)" in { val obj = AegisShieldGeneratorData( CommonFieldData( PlacementData(3571.2266f, 3278.0938f, 114.0f, 0f, 0f, 90.0f), PlanetSideEmpire.VS, 2, PlanetSideGUID(2366) ), 255 ) val msg = ObjectCreateMessage(ObjectClass.deployable_shield_generator, PlanetSideGUID(2556), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector pkt mustEqual string_aegis } "encode (orion)" in { val obj = OneMannedFieldTurretData( CommonFieldData( PlacementData(3567.1406f, 2988.0078f, 71.84375f, 0f, 0f, 185.625f), PlanetSideEmpire.VS, 2, PlanetSideGUID(2502) ), 255, OneMannedFieldTurretData.orion(PlanetSideGUID(2615), 0x6, 0x8, PlanetSideGUID(2510), 8) ) val msg = ObjectCreateMessage(ObjectClass.portable_manned_turret_vs, PlanetSideGUID(2916), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector val pkt_bitv = pkt.toBitVector val ori_bitv = string_orion.toBitVector pkt_bitv.take(189) mustEqual ori_bitv.take(189) pkt_bitv.drop(200) mustEqual ori_bitv.drop(200) //TODO work on OneMannedFieldTurretData to make this pass as a single stream } "encode (locker container)" in { val obj = LockerContainerData( InventoryData( InventoryItemData(ObjectClass.nano_dispenser, PlanetSideGUID(2935), 0, WeaponData(0x6, 0x0, ObjectClass.armor_canister, PlanetSideGUID(3426), 0, AmmoBoxData())) :: InventoryItemData(ObjectClass.armor_canister, PlanetSideGUID(4090), 45, AmmoBoxData()) :: InventoryItemData(ObjectClass.armor_canister, PlanetSideGUID(3326), 78, AmmoBoxData()) :: Nil ) ) val msg = ObjectCreateMessage(ObjectClass.locker_container, PlanetSideGUID(3148), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector pkt mustEqual string_locker_container } "encode (character, alive)" in { val obj = CharacterData( CharacterAppearanceData( PlacementData( Vector3(3674.8438f, 2726.789f, 91.15625f), Vector3(0f, 0f, 64.6875f), Some(Vector3(1.4375f, -0.4375f, 0f)) ), BasicCharacterData( "ScrawnyRonnie", PlanetSideEmpire.TR, CharacterGender.Male, 5, 5 ), 3, false, false, ExoSuitType.Reinforced, "Black Beret Armoured Corps", 23, false, 340.3125f, 0f, false, GrenadeState.None, false, false, false, RibbonBars( MeritCommendation.MarkovVeteran, MeritCommendation.HeavyInfantry4, MeritCommendation.TankBuster7, MeritCommendation.SixYearTR ) ), 255, 253, UniformStyle.ThirdUpgrade, 5, Some(ImplantEffects.NoEffects), Some(Cosmetics(true, true, true, true, false)), 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 ), DrawnSlot.Rifle1 ) val msg = ObjectCreateMessage(ObjectClass.avatar, PlanetSideGUID(3902), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector val pkt_bitv = pkt.toBitVector val ori_bitv = string_character.toBitVector pkt_bitv.take(452) mustEqual ori_bitv.take(452) //skip 126 pkt_bitv.drop(578).take(438) mustEqual ori_bitv.drop(578).take(438) //skip 2 pkt_bitv.drop(1018).take(17) mustEqual ori_bitv.drop(1018).take(17) //skip 11 pkt_bitv.drop(1046).take(147) mustEqual ori_bitv.drop(1046).take(147) //skip 3 pkt_bitv.drop(1196) mustEqual ori_bitv.drop(1196) //TODO work on CharacterData to make this pass as a single stream } "encode (character, backpack)" in { val obj = CharacterData( CharacterAppearanceData( PlacementData(4629.8906f, 6316.4453f, 54.734375f, 0f, 0f, 126.5625f), BasicCharacterData( "Angello", PlanetSideEmpire.VS, CharacterGender.Male, 10, 2 ), 0, false, false, ExoSuitType.MAX, "Original District", 23, true, //backpack 0f, 180.0f, false, GrenadeState.None, false, false, false, RibbonBars( MeritCommendation.Jacking2, MeritCommendation.ScavengerVS1, MeritCommendation.AMSSupport4, MeritCommendation.SixYearVS ) ), 0, 0, UniformStyle.ThirdUpgrade, 2, None, Some(Cosmetics(true, true, true, true, false)), None, DrawnSlot.Pistol1 ) val msg = ObjectCreateMessage(ObjectClass.avatar, PlanetSideGUID(3380), obj) val pkt = PacketCoding.EncodePacket(msg).require.toByteVector val pkt_bitv = pkt.toBitVector val ori_bitv = string_character_backpack.toBitVector pkt_bitv.take(300) mustEqual ori_bitv.take(300) //skip 2 pkt_bitv.drop(302).take(14) mustEqual ori_bitv.drop(302).take(14) //skip 126 pkt_bitv.drop(442).take(305) mustEqual ori_bitv.drop(442).take(305) //skip 1 pkt_bitv.drop(748).take(9) mustEqual ori_bitv.drop(748).take(9) // skip 2 pkt_bitv.drop(759).take(157) mustEqual ori_bitv.drop(759).take(157) //skip 1 pkt_bitv.drop(917) mustEqual ori_bitv.drop(917) //TODO work on CharacterData to make this pass as a single stream } }