Merge pull request #151 from Fate-JH/object-create-updates

Object Create Message Update #2.5
This commit is contained in:
Fate-JH 2017-06-03 13:44:14 -04:00 committed by GitHub
commit 986594de87
62 changed files with 2259 additions and 677 deletions

View file

@ -96,12 +96,13 @@ class ObjectCreateDetailedMessageTest extends Specification {
parent.get.slot mustEqual 2
data.isDefined mustEqual true
val obj_wep = data.get.asInstanceOf[DetailedWeaponData]
obj_wep.unk mustEqual 4
obj_wep.unk1 mustEqual 2
obj_wep.unk2 mustEqual 8
val obj_ammo = obj_wep.ammo
obj_ammo.objectClass mustEqual 28
obj_ammo.guid mustEqual PlanetSideGUID(1286)
obj_ammo.parentSlot mustEqual 0
obj_ammo.obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 30
obj_ammo.head.objectClass mustEqual 28
obj_ammo.head.guid mustEqual PlanetSideGUID(1286)
obj_ammo.head.parentSlot mustEqual 0
obj_ammo.head.obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 30
case _ =>
ko
}
@ -117,7 +118,7 @@ class ObjectCreateDetailedMessageTest extends Specification {
parent.get.guid mustEqual PlanetSideGUID(75)
parent.get.slot mustEqual 2
data.isDefined mustEqual true
val obj_wep = data.get.asInstanceOf[DetailedConcurrentFeedWeaponData]
val obj_wep = data.get.asInstanceOf[DetailedWeaponData]
obj_wep.unk1 mustEqual 0
obj_wep.unk2 mustEqual 8
val obj_ammo = obj_wep.ammo
@ -229,66 +230,66 @@ class ObjectCreateDetailedMessageTest extends Specification {
val inventory = char.inventory.get.contents
inventory.size mustEqual 10
//0
inventory.head.item.objectClass mustEqual ObjectClass.beamer
inventory.head.item.guid mustEqual PlanetSideGUID(76)
inventory.head.item.parentSlot mustEqual 0
var wep = inventory.head.item.obj.asInstanceOf[DetailedWeaponData]
wep.ammo.objectClass mustEqual ObjectClass.energy_cell
wep.ammo.guid mustEqual PlanetSideGUID(77)
wep.ammo.parentSlot mustEqual 0
wep.ammo.obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 16
inventory.head.objectClass mustEqual ObjectClass.beamer
inventory.head.guid mustEqual PlanetSideGUID(76)
inventory.head.parentSlot mustEqual 0
var wep = inventory.head.obj.asInstanceOf[DetailedWeaponData]
wep.ammo.head.objectClass mustEqual ObjectClass.energy_cell
wep.ammo.head.guid mustEqual PlanetSideGUID(77)
wep.ammo.head.parentSlot mustEqual 0
wep.ammo.head.obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 16
//1
inventory(1).item.objectClass mustEqual ObjectClass.suppressor
inventory(1).item.guid mustEqual PlanetSideGUID(78)
inventory(1).item.parentSlot mustEqual 2
wep = inventory(1).item.obj.asInstanceOf[DetailedWeaponData]
wep.ammo.objectClass mustEqual ObjectClass.bullet_9mm
wep.ammo.guid mustEqual PlanetSideGUID(79)
wep.ammo.parentSlot mustEqual 0
wep.ammo.obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 25
inventory(1).objectClass mustEqual ObjectClass.suppressor
inventory(1).guid mustEqual PlanetSideGUID(78)
inventory(1).parentSlot mustEqual 2
wep = inventory(1).obj.asInstanceOf[DetailedWeaponData]
wep.ammo.head.objectClass mustEqual ObjectClass.bullet_9mm
wep.ammo.head.guid mustEqual PlanetSideGUID(79)
wep.ammo.head.parentSlot mustEqual 0
wep.ammo.head.obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 25
//2
inventory(2).item.objectClass mustEqual ObjectClass.forceblade
inventory(2).item.guid mustEqual PlanetSideGUID(80)
inventory(2).item.parentSlot mustEqual 4
wep = inventory(2).item.obj.asInstanceOf[DetailedWeaponData]
wep.ammo.objectClass mustEqual ObjectClass.melee_ammo
wep.ammo.guid mustEqual PlanetSideGUID(81)
wep.ammo.parentSlot mustEqual 0
wep.ammo.obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 1
inventory(2).objectClass mustEqual ObjectClass.forceblade
inventory(2).guid mustEqual PlanetSideGUID(80)
inventory(2).parentSlot mustEqual 4
wep = inventory(2).obj.asInstanceOf[DetailedWeaponData]
wep.ammo.head.objectClass mustEqual ObjectClass.melee_ammo
wep.ammo.head.guid mustEqual PlanetSideGUID(81)
wep.ammo.head.parentSlot mustEqual 0
wep.ammo.head.obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 1
//3
inventory(3).item.objectClass mustEqual ObjectClass.locker_container
inventory(3).item.guid mustEqual PlanetSideGUID(82)
inventory(3).item.parentSlot mustEqual 5
inventory(3).item.obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 1
inventory(3).objectClass mustEqual ObjectClass.locker_container
inventory(3).guid mustEqual PlanetSideGUID(82)
inventory(3).parentSlot mustEqual 5
inventory(3).obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 1
//4
inventory(4).item.objectClass mustEqual ObjectClass.bullet_9mm
inventory(4).item.guid mustEqual PlanetSideGUID(83)
inventory(4).item.parentSlot mustEqual 6
inventory(4).item.obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 50
inventory(4).objectClass mustEqual ObjectClass.bullet_9mm
inventory(4).guid mustEqual PlanetSideGUID(83)
inventory(4).parentSlot mustEqual 6
inventory(4).obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 50
//5
inventory(5).item.objectClass mustEqual ObjectClass.bullet_9mm
inventory(5).item.guid mustEqual PlanetSideGUID(84)
inventory(5).item.parentSlot mustEqual 9
inventory(5).item.obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 50
inventory(5).objectClass mustEqual ObjectClass.bullet_9mm
inventory(5).guid mustEqual PlanetSideGUID(84)
inventory(5).parentSlot mustEqual 9
inventory(5).obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 50
//6
inventory(6).item.objectClass mustEqual ObjectClass.bullet_9mm
inventory(6).item.guid mustEqual PlanetSideGUID(85)
inventory(6).item.parentSlot mustEqual 12
inventory(6).item.obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 50
inventory(6).objectClass mustEqual ObjectClass.bullet_9mm
inventory(6).guid mustEqual PlanetSideGUID(85)
inventory(6).parentSlot mustEqual 12
inventory(6).obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 50
//7
inventory(7).item.objectClass mustEqual ObjectClass.bullet_9mm_AP
inventory(7).item.guid mustEqual PlanetSideGUID(86)
inventory(7).item.parentSlot mustEqual 33
inventory(7).item.obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 50
inventory(7).objectClass mustEqual ObjectClass.bullet_9mm_AP
inventory(7).guid mustEqual PlanetSideGUID(86)
inventory(7).parentSlot mustEqual 33
inventory(7).obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 50
//8
inventory(8).item.objectClass mustEqual ObjectClass.energy_cell
inventory(8).item.guid mustEqual PlanetSideGUID(87)
inventory(8).item.parentSlot mustEqual 36
inventory(8).item.obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 50
inventory(8).objectClass mustEqual ObjectClass.energy_cell
inventory(8).guid mustEqual PlanetSideGUID(87)
inventory(8).parentSlot mustEqual 36
inventory(8).obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 50
//9
inventory(9).item.objectClass mustEqual ObjectClass.remote_electronics_kit
inventory(9).item.guid mustEqual PlanetSideGUID(88)
inventory(9).item.parentSlot mustEqual 39
inventory(9).objectClass mustEqual ObjectClass.remote_electronics_kit
inventory(9).guid mustEqual PlanetSideGUID(88)
inventory(9).parentSlot mustEqual 39
//the rek has data but none worth testing here
char.drawn_slot mustEqual DrawnSlot.Pistol1
case _ =>
@ -327,7 +328,7 @@ class ObjectCreateDetailedMessageTest extends Specification {
}
"encode (gauss)" in {
val obj = DetailedWeaponData(4, ObjectClass.bullet_9mm, PlanetSideGUID(1286), 0, DetailedAmmoBoxData(8, 30))
val obj = DetailedWeaponData(2, 8, ObjectClass.bullet_9mm, PlanetSideGUID(1286), 0, DetailedAmmoBoxData(8, 30))
val msg = ObjectCreateDetailedMessage(ObjectClass.gauss, PlanetSideGUID(1465), ObjectCreateMessageParent(PlanetSideGUID(75), 2), obj)
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
@ -335,7 +336,11 @@ class ObjectCreateDetailedMessageTest extends Specification {
}
"encode (punisher)" in {
val obj = DetailedConcurrentFeedWeaponData(0, 8, DetailedAmmoBoxData(ObjectClass.bullet_9mm, PlanetSideGUID(1693), 0, DetailedAmmoBoxData(8, 30)) :: DetailedAmmoBoxData(ObjectClass.jammer_cartridge, PlanetSideGUID(1564), 1, DetailedAmmoBoxData(8, 1)) :: Nil)
val obj = DetailedWeaponData(0, 8,
DetailedAmmoBoxData(ObjectClass.bullet_9mm, PlanetSideGUID(1693), 0, DetailedAmmoBoxData(8, 30)) ::
DetailedAmmoBoxData(ObjectClass.jammer_cartridge, PlanetSideGUID(1564), 1, DetailedAmmoBoxData(8, 1)) ::
Nil
)(2)
val msg = ObjectCreateDetailedMessage(ObjectClass.punisher, PlanetSideGUID(1703), ObjectCreateMessageParent(PlanetSideGUID(75), 2), obj)
var pkt = PacketCoding.EncodePacket(msg).require.toByteVector
@ -387,9 +392,9 @@ class ObjectCreateDetailedMessageTest extends Specification {
false,
RibbonBars()
)
val inv = InventoryItem(ObjectClass.beamer, PlanetSideGUID(76), 0, DetailedWeaponData(8, ObjectClass.energy_cell, PlanetSideGUID(77), 0, DetailedAmmoBoxData(8, 16))) ::
InventoryItem(ObjectClass.suppressor, PlanetSideGUID(78), 2, DetailedWeaponData(8, ObjectClass.bullet_9mm, PlanetSideGUID(79), 0, DetailedAmmoBoxData(8, 25))) ::
InventoryItem(ObjectClass.forceblade, PlanetSideGUID(80), 4, DetailedWeaponData(8, ObjectClass.melee_ammo, PlanetSideGUID(81), 0, DetailedAmmoBoxData(8, 1))) ::
val inv = InventoryItem(ObjectClass.beamer, PlanetSideGUID(76), 0, DetailedWeaponData(4, 8, ObjectClass.energy_cell, PlanetSideGUID(77), 0, DetailedAmmoBoxData(8, 16))) ::
InventoryItem(ObjectClass.suppressor, PlanetSideGUID(78), 2, DetailedWeaponData(4, 8, ObjectClass.bullet_9mm, PlanetSideGUID(79), 0, DetailedAmmoBoxData(8, 25))) ::
InventoryItem(ObjectClass.forceblade, PlanetSideGUID(80), 4, DetailedWeaponData(4, 8, ObjectClass.melee_ammo, PlanetSideGUID(81), 0, DetailedAmmoBoxData(8, 1))) ::
InventoryItem(ObjectClass.locker_container, PlanetSideGUID(82), 5, DetailedAmmoBoxData(8, 1)) ::
InventoryItem(ObjectClass.bullet_9mm, PlanetSideGUID(83), 6, DetailedAmmoBoxData(8, 50)) ::
InventoryItem(ObjectClass.bullet_9mm, PlanetSideGUID(84), 9, DetailedAmmoBoxData(8, 50)) ::

View file

@ -2,7 +2,7 @@
package game
import net.psforever.packet._
import net.psforever.packet.game._
import net.psforever.packet.game.{ObjectCreateMessage, _}
import net.psforever.packet.game.objectcreate._
import net.psforever.types._
import org.specs2.mutable._
@ -35,7 +35,7 @@ class ObjectCreateMessageTest extends Specification {
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"
"deocde (striker projectile)" in {
"decode (striker projectile)" in {
PacketCoding.DecodePacket(string_striker_projectile).require match {
case ObjectCreateMessage(len, cls, guid, parent, data) =>
len mustEqual 197
@ -68,7 +68,8 @@ class ObjectCreateMessageTest extends Specification {
parent.get.guid mustEqual PlanetSideGUID(514)
parent.get.slot mustEqual 1
data.isDefined mustEqual true
data.get.isInstanceOf[ImplantInterfaceData] mustEqual true
data.get.isInstanceOf[CommonTerminalData] mustEqual true
data.get.asInstanceOf[CommonTerminalData].faction mustEqual PlanetSideEmpire.VS
case _ =>
ko
}
@ -82,14 +83,18 @@ class ObjectCreateMessageTest extends Specification {
guid mustEqual PlanetSideGUID(3827)
parent.isDefined mustEqual false
data.isDefined mustEqual true
val term = data.get.asInstanceOf[CommonTerminalData]
term.pos.coord.x mustEqual 4579.3438f
term.pos.coord.y mustEqual 5615.0703f
term.pos.coord.z mustEqual 72.953125f
term.pos.pitch mustEqual 0
term.pos.roll mustEqual 0
term.pos.yaw mustEqual 125
ok
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.pitch mustEqual 0
drop.pos.roll mustEqual 0
drop.pos.yaw mustEqual 125
drop.obj.isInstanceOf[CommonTerminalData] mustEqual true
val term = drop.obj.asInstanceOf[CommonTerminalData]
term.faction mustEqual PlanetSideEmpire.NC
term.unk mustEqual 0
case _ =>
ko
}
@ -163,14 +168,14 @@ class ObjectCreateMessageTest extends Specification {
data.isDefined mustEqual true
data.get.isInstanceOf[WeaponData] mustEqual true
val wep = data.get.asInstanceOf[WeaponData]
wep.unk1 mustEqual 8
wep.unk1 mustEqual 4
wep.unk2 mustEqual 8
wep.fire_mode mustEqual 0
wep.ammo.objectClass mustEqual ObjectClass.energy_cell
wep.ammo.guid mustEqual PlanetSideGUID(3548)
wep.ammo.parentSlot mustEqual 0
wep.ammo.obj.isInstanceOf[AmmoBoxData] mustEqual true
val ammo = wep.ammo.obj.asInstanceOf[AmmoBoxData]
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
@ -187,9 +192,9 @@ class ObjectCreateMessageTest extends Specification {
parent.get.guid mustEqual PlanetSideGUID(3092)
parent.get.slot mustEqual 3
data.isDefined mustEqual true
data.get.isInstanceOf[ConcurrentFeedWeaponData] mustEqual true
val wep = data.get.asInstanceOf[ConcurrentFeedWeaponData]
wep.unk1 mustEqual 8
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
@ -345,14 +350,14 @@ class ObjectCreateMessageTest extends Specification {
drop.pos.yaw mustEqual 32
drop.obj.isInstanceOf[WeaponData] mustEqual true
val wep = drop.obj.asInstanceOf[WeaponData]
wep.unk1 mustEqual 8
wep.unk1 mustEqual 4
wep.unk2 mustEqual 0
wep.fire_mode mustEqual 0
wep.ammo.objectClass mustEqual ObjectClass.energy_cell
wep.ammo.guid mustEqual PlanetSideGUID(3268)
wep.ammo.parentSlot mustEqual 0
wep.ammo.obj.isInstanceOf[AmmoBoxData] mustEqual true
val ammo = wep.ammo.obj.asInstanceOf[AmmoBoxData]
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
@ -375,9 +380,9 @@ class ObjectCreateMessageTest extends Specification {
drop.pos.roll mustEqual 0
drop.pos.pitch mustEqual 0
drop.pos.yaw mustEqual 51
drop.obj.isInstanceOf[ConcurrentFeedWeaponData] mustEqual true
val wep = drop.obj.asInstanceOf[ConcurrentFeedWeaponData]
wep.unk1 mustEqual 4
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
@ -464,7 +469,8 @@ class ObjectCreateMessageTest extends Specification {
turret.deploy.pos.roll mustEqual 0
turret.deploy.pos.pitch mustEqual 127
turret.deploy.pos.yaw mustEqual 66
turret.deploy.unk mustEqual 44
turret.deploy.faction mustEqual PlanetSideEmpire.NC
turret.deploy.unk mustEqual 12
turret.deploy.player_guid mustEqual PlanetSideGUID(3871)
turret.health mustEqual 0
turret.internals.isDefined mustEqual false
@ -489,7 +495,8 @@ class ObjectCreateMessageTest extends Specification {
turret.deploy.pos.roll mustEqual 0
turret.deploy.pos.pitch mustEqual 0
turret.deploy.pos.yaw mustEqual 105
turret.deploy.unk mustEqual 68
turret.deploy.faction mustEqual PlanetSideEmpire.VS
turret.deploy.unk mustEqual 4
turret.deploy.player_guid mustEqual PlanetSideGUID(4232)
turret.health mustEqual 255
turret.internals.isDefined mustEqual true
@ -499,10 +506,10 @@ class ObjectCreateMessageTest extends Specification {
internals.parentSlot mustEqual 0
internals.obj.isInstanceOf[WeaponData] mustEqual true
val wep = internals.obj.asInstanceOf[WeaponData]
wep.unk1 mustEqual 0xC
wep.unk1 mustEqual 0x6
wep.unk2 mustEqual 0x8
wep.fire_mode mustEqual 0
val ammo = wep.ammo
val ammo = wep.ammo.head
ammo.objectClass mustEqual ObjectClass.spitfire_ammo
ammo.guid mustEqual PlanetSideGUID(3694)
ammo.parentSlot mustEqual 0
@ -529,7 +536,8 @@ class ObjectCreateMessageTest extends Specification {
trap.deploy.pos.roll mustEqual 0
trap.deploy.pos.pitch mustEqual 0
trap.deploy.pos.yaw mustEqual 0
trap.deploy.unk mustEqual 68
trap.deploy.faction mustEqual PlanetSideEmpire.VS
trap.deploy.unk mustEqual 4
trap.health mustEqual 255
trap.deploy.player_guid mustEqual PlanetSideGUID(2502)
case _ =>
@ -553,7 +561,8 @@ class ObjectCreateMessageTest extends Specification {
aegis.deploy.pos.roll mustEqual 0
aegis.deploy.pos.pitch mustEqual 0
aegis.deploy.pos.yaw mustEqual 0
aegis.deploy.unk mustEqual 68
aegis.deploy.faction mustEqual PlanetSideEmpire.VS
aegis.deploy.unk mustEqual 4
aegis.health mustEqual 255
aegis.deploy.player_guid mustEqual PlanetSideGUID(2366)
case _ =>
@ -577,9 +586,9 @@ class ObjectCreateMessageTest extends Specification {
omft.deploy.pos.roll mustEqual 0
omft.deploy.pos.pitch mustEqual 0
omft.deploy.pos.yaw mustEqual 94
omft.deploy.unk mustEqual 68
omft.deploy.player_guid mustEqual PlanetSideGUID(0)
omft.player_guid mustEqual PlanetSideGUID(2502)
omft.deploy.faction mustEqual PlanetSideEmpire.VS
omft.deploy.unk mustEqual 4
omft.deploy.player_guid mustEqual PlanetSideGUID(2502)
omft.health mustEqual 255
omft.internals.isDefined mustEqual true
val internals = omft.internals.get
@ -588,10 +597,10 @@ class ObjectCreateMessageTest extends Specification {
internals.parentSlot mustEqual 1
internals.obj.isInstanceOf[WeaponData] mustEqual true
val wep = internals.obj.asInstanceOf[WeaponData]
wep.unk1 mustEqual 0xC
wep.unk1 mustEqual 0x6
wep.unk2 mustEqual 0x8
wep.fire_mode mustEqual 0
val ammo = wep.ammo
val ammo = wep.ammo.head
ammo.objectClass mustEqual ObjectClass.energy_gun_ammo
ammo.guid mustEqual PlanetSideGUID(2510)
ammo.parentSlot mustEqual 0
@ -612,35 +621,33 @@ class ObjectCreateMessageTest extends Specification {
data.isDefined mustEqual true
data.get.isInstanceOf[LockerContainerData] mustEqual true
val locker = data.get.asInstanceOf[LockerContainerData]
locker.inventory.unk1 mustEqual false
locker.inventory.unk2 mustEqual false
val contents = locker.inventory.contents
contents.size mustEqual 3
//0
contents.head.item.objectClass mustEqual ObjectClass.nano_dispenser
contents.head.item.guid mustEqual PlanetSideGUID(2935)
contents.head.item.parentSlot mustEqual 0
contents.head.item.obj.isInstanceOf[WeaponData] mustEqual true
val dispenser = contents.head.item.obj.asInstanceOf[WeaponData]
dispenser.unk1 mustEqual 0xC
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.objectClass mustEqual ObjectClass.armor_canister
dispenser.ammo.guid mustEqual PlanetSideGUID(3426)
dispenser.ammo.parentSlot mustEqual 0
dispenser.ammo.obj.isInstanceOf[AmmoBoxData] mustEqual true
dispenser.ammo.obj.asInstanceOf[AmmoBoxData].unk mustEqual 0
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).item.objectClass mustEqual ObjectClass.armor_canister
contents(1).item.guid mustEqual PlanetSideGUID(4090)
contents(1).item.parentSlot mustEqual 45
contents(1).item.obj.isInstanceOf[AmmoBoxData] mustEqual true
contents(1).item.obj.asInstanceOf[AmmoBoxData].unk mustEqual 0
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).item.objectClass mustEqual ObjectClass.armor_canister
contents(2).item.guid mustEqual PlanetSideGUID(3326)
contents(2).item.parentSlot mustEqual 78
contents(2).item.obj.isInstanceOf[AmmoBoxData] mustEqual true
contents(2).item.obj.asInstanceOf[AmmoBoxData].unk mustEqual 0
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
}
@ -662,10 +669,10 @@ class ObjectCreateMessageTest extends Specification {
pc.appearance.pos.roll mustEqual 0
pc.appearance.pos.pitch mustEqual 0
pc.appearance.pos.yaw mustEqual 9
pc.appearance.pos.init_move.isDefined mustEqual true
pc.appearance.pos.init_move.get.x mustEqual 1.4375f
pc.appearance.pos.init_move.get.y mustEqual -0.4375f
pc.appearance.pos.init_move.get.z mustEqual 0f
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
@ -705,40 +712,40 @@ class ObjectCreateMessageTest extends Specification {
val contents = pc.inventory.get.contents
contents.size mustEqual 5
//0
contents.head.item.objectClass mustEqual ObjectClass.plasma_grenade
contents.head.item.guid mustEqual PlanetSideGUID(3662)
contents.head.item.parentSlot mustEqual 0
contents.head.item.obj.asInstanceOf[WeaponData].fire_mode mustEqual 0
contents.head.item.obj.asInstanceOf[WeaponData].ammo.objectClass mustEqual ObjectClass.plasma_grenade_ammo
contents.head.item.obj.asInstanceOf[WeaponData].ammo.guid mustEqual PlanetSideGUID(3751)
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).item.objectClass mustEqual ObjectClass.bank
contents(1).item.guid mustEqual PlanetSideGUID(3908)
contents(1).item.parentSlot mustEqual 1
contents(1).item.obj.asInstanceOf[WeaponData].fire_mode mustEqual 1
contents(1).item.obj.asInstanceOf[WeaponData].ammo.objectClass mustEqual ObjectClass.armor_canister
contents(1).item.obj.asInstanceOf[WeaponData].ammo.guid mustEqual PlanetSideGUID(4143)
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).item.objectClass mustEqual ObjectClass.mini_chaingun
contents(2).item.guid mustEqual PlanetSideGUID(4164)
contents(2).item.parentSlot mustEqual 2
contents(2).item.obj.asInstanceOf[WeaponData].fire_mode mustEqual 0
contents(2).item.obj.asInstanceOf[WeaponData].ammo.objectClass mustEqual ObjectClass.bullet_9mm
contents(2).item.obj.asInstanceOf[WeaponData].ammo.guid mustEqual PlanetSideGUID(3728)
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).item.objectClass mustEqual ObjectClass.phoenix //actually, a decimator
contents(3).item.guid mustEqual PlanetSideGUID(3603)
contents(3).item.parentSlot mustEqual 3
contents(3).item.obj.asInstanceOf[WeaponData].fire_mode mustEqual 0
contents(3).item.obj.asInstanceOf[WeaponData].ammo.objectClass mustEqual ObjectClass.phoenix_missile
contents(3).item.obj.asInstanceOf[WeaponData].ammo.guid mustEqual PlanetSideGUID(3056)
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).item.objectClass mustEqual ObjectClass.chainblade
contents(4).item.guid mustEqual PlanetSideGUID(4088)
contents(4).item.parentSlot mustEqual 4
contents(4).item.obj.asInstanceOf[WeaponData].fire_mode mustEqual 1
contents(4).item.obj.asInstanceOf[WeaponData].ammo.objectClass mustEqual ObjectClass.melee_ammo
contents(4).item.obj.asInstanceOf[WeaponData].ammo.guid mustEqual PlanetSideGUID(3279)
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
@ -761,7 +768,7 @@ class ObjectCreateMessageTest extends Specification {
pc.appearance.pos.roll mustEqual 0
pc.appearance.pos.pitch mustEqual 0
pc.appearance.pos.yaw mustEqual 115
pc.appearance.pos.init_move.isDefined mustEqual false
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
@ -814,7 +821,7 @@ class ObjectCreateMessageTest extends Specification {
}
"encode (implant interface)" in {
val obj = ImplantInterfaceData()
val obj = CommonTerminalData(PlanetSideEmpire.VS)
val msg = ObjectCreateMessage(0x199, PlanetSideGUID(1075), ObjectCreateMessageParent(PlanetSideGUID(514), 1), obj)
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
@ -822,7 +829,10 @@ class ObjectCreateMessageTest extends Specification {
}
"encode (order terminal a)" in {
val obj = CommonTerminalData(PlacementData(Vector3(4579.3438f, 5615.0703f, 72.953125f), 0, 0, 125))
val obj = DroppedItemData(
PlacementData(4579.3438f, 5615.0703f, 72.953125f, 0, 0, 125),
CommonTerminalData(PlanetSideEmpire.NC)
)
val msg = ObjectCreateMessage(ObjectClass.order_terminala, PlanetSideGUID(3827), obj)
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
@ -854,7 +864,7 @@ class ObjectCreateMessageTest extends Specification {
}
"encode (lasher, held)" in {
val obj = WeaponData(8, 8, ObjectClass.energy_cell, PlanetSideGUID(3548), 0, AmmoBoxData(8))
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
@ -862,11 +872,12 @@ class ObjectCreateMessageTest extends Specification {
}
"encode (punisher, held)" in {
val obj = ConcurrentFeedWeaponData(8, 8, 0,
AmmoBoxData(ObjectClass.bullet_9mm, PlanetSideGUID(3918), 0, AmmoBoxData(8)) ::
AmmoBoxData(ObjectClass.rocket, PlanetSideGUID(3941), 1, AmmoBoxData(8)) ::
Nil
)
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
@ -925,7 +936,7 @@ class ObjectCreateMessageTest extends Specification {
"encode (lasher, dropped)" in {
val obj = DroppedItemData(
PlacementData(Vector3(4691.1953f, 5537.039f, 65.484375f), 0, 0, 32),
WeaponData(8, 0, ObjectClass.energy_cell, PlanetSideGUID(3268), 0, AmmoBoxData())
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
@ -936,11 +947,11 @@ class ObjectCreateMessageTest extends Specification {
"encode (punisher, dropped)" in {
val obj = DroppedItemData(
PlacementData(Vector3(4789.133f, 5522.3125f, 72.3125f), 0, 0, 51),
ConcurrentFeedWeaponData(4, 0, 0,
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
@ -961,9 +972,9 @@ class ObjectCreateMessageTest extends Specification {
"encode (boomer)" in {
val obj = SmallDeployableData(
ACEDeployableData(
CommonFieldData(
PlacementData(Vector3(4704.172f, 5546.4375f, 82.234375f), 0, 0, 63),
0, PlanetSideGUID(4145)
PlanetSideEmpire.TR, 0, PlanetSideGUID(4145)
)
)
val msg = ObjectCreateMessage(ObjectClass.boomer, PlanetSideGUID(3840), obj)
@ -974,10 +985,9 @@ class ObjectCreateMessageTest extends Specification {
"encode (spitfire, short)" in {
val obj = SmallTurretData(
ACEDeployableData(
PlacementData(Vector3(4577.7812f, 5624.828f, 72.046875f), 0, 127, 66),
44,
PlanetSideGUID(3871)
CommonFieldData(
PlacementData(Vector3(4577.7812f, 5624.828f, 72.046875f), 0, 127, 66),
PlanetSideEmpire.NC, 12, PlanetSideGUID(3871)
),
255 //sets to 0
)
@ -993,13 +1003,12 @@ class ObjectCreateMessageTest extends Specification {
"encode (spitfire)" in {
val obj = SmallTurretData(
ACEDeployableData(
CommonFieldData(
PlacementData(Vector3(4527.633f, 6271.3594f, 70.265625f), 0, 0, 105),
68,
PlanetSideGUID(4232)
PlanetSideEmpire.VS, 4, PlanetSideGUID(4232)
),
255,
SmallTurretData.spitfire(PlanetSideGUID(3064), 0xC, 0x8, PlanetSideGUID(3694), 8)
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
@ -1013,10 +1022,9 @@ class ObjectCreateMessageTest extends Specification {
"encode (trap)" in {
val obj = TRAPData(
ACEDeployableData(
CommonFieldData(
PlacementData(Vector3(3572.4453f, 3277.9766f, 114.0f), 0, 0, 0),
68,
PlanetSideGUID(2502)
PlanetSideEmpire.VS, 4, PlanetSideGUID(2502)
),
255
)
@ -1032,10 +1040,9 @@ class ObjectCreateMessageTest extends Specification {
"encode (aegis)" in {
val obj = AegisShieldGeneratorData(
ACEDeployableData(
CommonFieldData(
PlacementData(Vector3(3571.2266f, 3278.0938f, 114.0f), 0, 0, 0),
68,
PlanetSideGUID(2366)
PlanetSideEmpire.VS, 4, PlanetSideGUID(2366)
),
255
)
@ -1047,14 +1054,12 @@ class ObjectCreateMessageTest extends Specification {
"encode (orion)" in {
val obj = OneMannedFieldTurretData(
ACEDeployableData(
CommonFieldData(
PlacementData(Vector3(3567.1406f, 2988.0078f, 71.84375f), 0, 0, 94),
68,
PlanetSideGUID(0)
PlanetSideEmpire.VS, 4, PlanetSideGUID(2502)
),
PlanetSideGUID(2502),
255,
OneMannedFieldTurretData.orion(PlanetSideGUID(2615), 0xC, 0x8, PlanetSideGUID(2510), 8)
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
@ -1069,7 +1074,7 @@ class ObjectCreateMessageTest extends Specification {
"encode (locker container)" in {
val obj = LockerContainerData(
InventoryData(
InventoryItem(ObjectClass.nano_dispenser, PlanetSideGUID(2935), 0, WeaponData(0xC, 0x0, ObjectClass.armor_canister, PlanetSideGUID(3426), 0, AmmoBoxData())) ::
InventoryItem(ObjectClass.nano_dispenser, PlanetSideGUID(2935), 0, WeaponData(0x6, 0x0, ObjectClass.armor_canister, PlanetSideGUID(3426), 0, AmmoBoxData())) ::
InventoryItem(ObjectClass.armor_canister, PlanetSideGUID(4090), 45, AmmoBoxData()) ::
InventoryItem(ObjectClass.armor_canister, PlanetSideGUID(3326), 78, AmmoBoxData()) ::
Nil

View file

@ -0,0 +1,531 @@
// Copyright (c) 2017 PSForever
package game
import net.psforever.packet._
import net.psforever.packet.game.{ObjectCreateMessage, _}
import net.psforever.packet.game.objectcreate.{DriveState, _}
import net.psforever.types._
import org.specs2.mutable._
import scodec.bits._
class ObjectCreateMessageVehiclesTest extends Specification {
val string_fury = hex"17 50010000 A79 9D01 FBC1C 12A83 2F06 00 00 21 4400003FC00101140C800C0E40000004048F3600301900000"
val string_ant = hex"17 C2000000 9E0 7C01 6C2D7 65535 CA16 00 00 00 4400003FC000000"
val string_lightning = hex"17 8b010000 df1 5a00 6c2d7 65535 ca16 00 00 00 4400003fc00101300ad8040c4000000408190b801018000002617402070000000"
val string_mediumtransport = hex"17 DA010000 8A2 8301 FBC1C 12A83 2F06 00 00 21 2400003FC079020593F80C2E400000040410148030190000017458050D90000001010401F814064000000"
val string_ams = hex"17 B8010000 970 3D10 002D765535CA16000000 402285BB0037E4100749E1D03000000620D83A0A00000195798741C00000332E40D84800000"
val string_ams_destroyed = hex"17 8D000000 978 3D10 002D765535CA16000000 0"
val string_switchblade = hex"17 93010000 A7B A201 FBC1C12A832F06000021 4400003FC00001013AD3180C0E4000000408330DC03019000006620406072000000"
val string_droppod = hex"17 C1000000 8110B0E00FA9000ACFFFF000000 4400007F83C0900"
val string_orbital_shuttle_1 = hex"17 82000000 0901B026904838000001FE0700"
val string_orbital_shuttle_2 = hex"17 C3000000 B02670402F5AA14F88C210000604000007F8FF03C0"
"decode (fury)" in {
PacketCoding.DecodePacket(string_fury).require match {
case ObjectCreateMessage(len, cls, guid, parent, data) =>
len mustEqual 336
cls mustEqual ObjectClass.fury
guid mustEqual PlanetSideGUID(413)
parent.isDefined mustEqual false
data.isDefined mustEqual true
data.get.isInstanceOf[VehicleData] mustEqual true
val fury = data.get.asInstanceOf[VehicleData]
fury.basic.pos.coord.x mustEqual 6531.961f
fury.basic.pos.coord.y mustEqual 1872.1406f
fury.basic.pos.coord.z mustEqual 24.734375f
fury.basic.pos.roll mustEqual 0
fury.basic.pos.pitch mustEqual 0
fury.basic.pos.yaw mustEqual 33
fury.basic.pos.vel.isDefined mustEqual false
fury.basic.faction mustEqual PlanetSideEmpire.VS
fury.basic.unk mustEqual 4
fury.basic.player_guid mustEqual PlanetSideGUID(0)
fury.health mustEqual 255
//
fury.mountings.isDefined mustEqual true
fury.mountings.get.size mustEqual 1
val mounting = fury.mountings.get.head
mounting.objectClass mustEqual ObjectClass.fury_weapon_systema
mounting.guid mustEqual PlanetSideGUID(400)
mounting.parentSlot mustEqual 1
mounting.obj.isInstanceOf[WeaponData] mustEqual true
val weapon = mounting.obj.asInstanceOf[WeaponData]
weapon.unk1 mustEqual 0x6
weapon.unk2 mustEqual 0x8
weapon.fire_mode mustEqual 0
weapon.ammo.size mustEqual 1
val ammo = weapon.ammo.head
ammo.objectClass mustEqual ObjectClass.hellfire_ammo
ammo.guid mustEqual PlanetSideGUID(432)
ammo.parentSlot mustEqual 0
ammo.obj.isInstanceOf[AmmoBoxData] mustEqual true
ammo.obj.asInstanceOf[AmmoBoxData].unk mustEqual 0x8
case _ =>
ko
}
}
"decode (ant)" in {
PacketCoding.DecodePacket(string_ant).require match {
case ObjectCreateMessage(len, cls, guid, parent, data) =>
len mustEqual 194L
cls mustEqual ObjectClass.ant
guid mustEqual PlanetSideGUID(380)
parent.isDefined mustEqual false
data.isDefined mustEqual true
data.get.isInstanceOf[ANTData] mustEqual true
val ant = data.get.asInstanceOf[ANTData]
ant.basic.pos.coord.x mustEqual 3674.8438f
ant.basic.pos.coord.y mustEqual 2726.789f
ant.basic.pos.coord.z mustEqual 91.15625f
ant.basic.pos.roll mustEqual 0
ant.basic.pos.pitch mustEqual 0
ant.basic.pos.yaw mustEqual 0
ant.basic.faction mustEqual PlanetSideEmpire.VS
ant.basic.unk mustEqual 4
ant.basic.player_guid mustEqual PlanetSideGUID(0)
ant.health mustEqual 255
ant.driveState mustEqual DriveState.Mobile
case _ =>
ko
}
}
"decode (lightning)" in {
PacketCoding.DecodePacket(string_lightning).require match {
case ObjectCreateMessage(len, cls, guid, parent, data) =>
len mustEqual 395L
cls mustEqual ObjectClass.lightning
guid mustEqual PlanetSideGUID(90)
parent.isDefined mustEqual false
data.isDefined mustEqual true
data.get.isInstanceOf[VehicleData] mustEqual true
val lightning = data.get.asInstanceOf[VehicleData]
lightning.basic.pos.coord.x mustEqual 3674.8438f
lightning.basic.pos.coord.y mustEqual 2726.789f
lightning.basic.pos.coord.z mustEqual 91.15625f
lightning.basic.pos.roll mustEqual 0
lightning.basic.pos.pitch mustEqual 0
lightning.basic.pos.yaw mustEqual 0
lightning.basic.faction mustEqual PlanetSideEmpire.VS
lightning.basic.unk mustEqual 4
lightning.basic.player_guid mustEqual PlanetSideGUID(0)
lightning.health mustEqual 255
lightning.mountings.isDefined mustEqual true
lightning.mountings.get.size mustEqual 1
val mounting = lightning.mountings.get.head
mounting.objectClass mustEqual ObjectClass.lightning_weapon_system
mounting.guid mustEqual PlanetSideGUID(91)
mounting.parentSlot mustEqual 1
mounting.obj.isInstanceOf[WeaponData] mustEqual true
val weapon = mounting.obj.asInstanceOf[WeaponData]
weapon.unk1 mustEqual 0x4
weapon.unk2 mustEqual 0x8
weapon.fire_mode mustEqual 0
weapon.ammo.size mustEqual 2
//0
var ammo = weapon.ammo.head
ammo.objectClass mustEqual ObjectClass.bullet_75mm
ammo.guid mustEqual PlanetSideGUID(92)
ammo.parentSlot mustEqual 0
ammo.obj.isInstanceOf[AmmoBoxData] mustEqual true
ammo.obj.asInstanceOf[AmmoBoxData].unk mustEqual 0x0
//1
ammo = weapon.ammo(1)
ammo.objectClass mustEqual ObjectClass.bullet_25mm
ammo.guid mustEqual PlanetSideGUID(93)
ammo.parentSlot mustEqual 1
ammo.obj.isInstanceOf[AmmoBoxData] mustEqual true
ammo.obj.asInstanceOf[AmmoBoxData].unk mustEqual 0x0
case _ =>
ko
}
}
"decode (medium transport)" in {
PacketCoding.DecodePacket(string_mediumtransport).require match {
case ObjectCreateMessage(len, cls, guid, parent, data) =>
len mustEqual 474L
cls mustEqual ObjectClass.mediumtransport
guid mustEqual PlanetSideGUID(387)
parent.isDefined mustEqual false
data.isDefined mustEqual true
data.get.isInstanceOf[VehicleData] mustEqual true
val deliverer = data.get.asInstanceOf[VehicleData]
deliverer.basic.pos.coord.x mustEqual 6531.961f
deliverer.basic.pos.coord.y mustEqual 1872.1406f
deliverer.basic.pos.coord.z mustEqual 24.734375f
deliverer.basic.pos.roll mustEqual 0
deliverer.basic.pos.pitch mustEqual 0
deliverer.basic.pos.yaw mustEqual 33
deliverer.basic.faction mustEqual PlanetSideEmpire.NC
deliverer.basic.unk mustEqual 4
deliverer.basic.player_guid mustEqual PlanetSideGUID(0)
deliverer.unk1 mustEqual 0
deliverer.health mustEqual 255
deliverer.unk2 mustEqual 0
deliverer.driveState mustEqual DriveState.State7
deliverer.unk4 mustEqual true
deliverer.unk5 mustEqual 0
deliverer.mountings.isDefined mustEqual true
deliverer.mountings.get.size mustEqual 2
//0
var mounting = deliverer.mountings.get.head
mounting.objectClass mustEqual ObjectClass.mediumtransport_weapon_systemA
mounting.guid mustEqual PlanetSideGUID(383)
mounting.parentSlot mustEqual 5
mounting.obj.isInstanceOf[WeaponData] mustEqual true
var weapon = mounting.obj.asInstanceOf[WeaponData]
weapon.unk1 mustEqual 0x6
weapon.unk2 mustEqual 0x8
weapon.fire_mode mustEqual 0
weapon.ammo.size mustEqual 1
var ammo = weapon.ammo.head
ammo.objectClass mustEqual ObjectClass.bullet_20mm
ammo.guid mustEqual PlanetSideGUID(420)
ammo.parentSlot mustEqual 0
ammo.obj.isInstanceOf[AmmoBoxData] mustEqual true
ammo.obj.asInstanceOf[AmmoBoxData].unk mustEqual 0x8
//1
mounting = deliverer.mountings.get(1)
mounting.objectClass mustEqual ObjectClass.mediumtransport_weapon_systemB
mounting.guid mustEqual PlanetSideGUID(556)
mounting.parentSlot mustEqual 6
mounting.obj.isInstanceOf[WeaponData] mustEqual true
weapon = mounting.obj.asInstanceOf[WeaponData]
weapon.unk1 mustEqual 0x6
weapon.unk2 mustEqual 0x8
weapon.fire_mode mustEqual 0
weapon.ammo.size mustEqual 1
ammo = weapon.ammo.head
ammo.objectClass mustEqual ObjectClass.bullet_20mm
ammo.guid mustEqual PlanetSideGUID(575)
ammo.parentSlot mustEqual 0
ammo.obj.isInstanceOf[AmmoBoxData] mustEqual true
ammo.obj.asInstanceOf[AmmoBoxData].unk mustEqual 0x8
case _ =>
ko
}
}
"decode (ams)" in {
PacketCoding.DecodePacket(string_ams).require match {
case ObjectCreateMessage(len, cls, guid, parent, data) =>
len mustEqual 440L
cls mustEqual ObjectClass.ams
guid mustEqual PlanetSideGUID(4157)
parent.isDefined mustEqual false
data.isDefined mustEqual true
data.get.isInstanceOf[AMSData] mustEqual true
val ams = data.get.asInstanceOf[AMSData]
ams.basic.pos.coord.x mustEqual 3674.0f
ams.basic.pos.coord.y mustEqual 2726.789f
ams.basic.pos.coord.z mustEqual 91.15625f
ams.basic.pos.roll mustEqual 0
ams.basic.pos.pitch mustEqual 0
ams.basic.pos.yaw mustEqual 0
ams.basic.faction mustEqual PlanetSideEmpire.VS
ams.basic.unk mustEqual 0
ams.basic.player_guid mustEqual PlanetSideGUID(34082)
ams.unk1 mustEqual 2
ams.health mustEqual 236
ams.unk2 mustEqual 0
ams.driveState mustEqual DriveState.Deployed
ams.matrix_guid mustEqual PlanetSideGUID(3663)
ams.respawn_guid mustEqual PlanetSideGUID(3638)
ams.term_a_guid mustEqual PlanetSideGUID(3827)
ams.term_b_guid mustEqual PlanetSideGUID(3556)
case _ =>
ko
}
}
"decode (ams, destroyed)" in {
PacketCoding.DecodePacket(string_ams_destroyed).require match {
case ObjectCreateMessage(len, cls, guid, parent, data) =>
len mustEqual 141L
cls mustEqual ObjectClass.ams_destroyed
guid mustEqual PlanetSideGUID(4157)
parent.isDefined mustEqual false
data.isDefined mustEqual true
data.get.isInstanceOf[DestroyedVehicleData] mustEqual true
val dams = data.get.asInstanceOf[DestroyedVehicleData]
dams.pos.coord.x mustEqual 3674.0f
dams.pos.coord.y mustEqual 2726.789f
dams.pos.coord.z mustEqual 91.15625f
dams.pos.roll mustEqual 0
dams.pos.pitch mustEqual 0
dams.pos.yaw mustEqual 0
case _ =>
ko
}
}
"decode (switchblade)" in {
PacketCoding.DecodePacket(string_switchblade).require match {
case ObjectCreateMessage(len, cls, guid, parent, data) =>
len mustEqual 403L
cls mustEqual ObjectClass.switchblade
guid mustEqual PlanetSideGUID(418)
parent.isDefined mustEqual false
data.isDefined mustEqual true
data.get.isInstanceOf[Vehicle2Data] mustEqual true
val switchblade = data.get.asInstanceOf[Vehicle2Data]
switchblade.basic.pos.coord.x mustEqual 6531.961f
switchblade.basic.pos.coord.y mustEqual 1872.1406f
switchblade.basic.pos.coord.z mustEqual 24.734375f
switchblade.basic.pos.roll mustEqual 0
switchblade.basic.pos.pitch mustEqual 0
switchblade.basic.pos.yaw mustEqual 33
switchblade.basic.faction mustEqual PlanetSideEmpire.VS
switchblade.basic.unk mustEqual 4
switchblade.health mustEqual 255
switchblade.driveState mustEqual DriveState.Mobile
switchblade.mountings.isDefined mustEqual true
switchblade.mountings.get.size mustEqual 1
//0
val weapon = switchblade.mountings.get.head
weapon.objectClass mustEqual ObjectClass.scythe
weapon.guid mustEqual PlanetSideGUID(355)
weapon.parentSlot mustEqual 1
weapon.obj.asInstanceOf[WeaponData].unk1 mustEqual 0x6
weapon.obj.asInstanceOf[WeaponData].unk2 mustEqual 0x8
weapon.obj.asInstanceOf[WeaponData].ammo.size mustEqual 2
//ammo-0
var ammo = weapon.obj.asInstanceOf[WeaponData].ammo.head
ammo.objectClass mustEqual ObjectClass.ancient_ammo_vehicle
ammo.guid mustEqual PlanetSideGUID(366)
ammo.parentSlot mustEqual 0
ammo.obj.asInstanceOf[AmmoBoxData].unk mustEqual 0x8
//ammo-1
ammo = weapon.obj.asInstanceOf[WeaponData].ammo(1)
ammo.objectClass mustEqual ObjectClass.ancient_ammo_vehicle
ammo.guid mustEqual PlanetSideGUID(385)
ammo.parentSlot mustEqual 1
ammo.obj.asInstanceOf[AmmoBoxData].unk mustEqual 0x8
case _ =>
ko
}
}
"decode (droppod)" in {
PacketCoding.DecodePacket(string_droppod).require match {
case ObjectCreateMessage(len, cls, guid, parent, data) =>
len mustEqual 193L
cls mustEqual ObjectClass.droppod
guid mustEqual PlanetSideGUID(3595)
parent.isDefined mustEqual false
data.isDefined mustEqual true
data.get.isInstanceOf[DroppodData] mustEqual true
val droppod = data.get.asInstanceOf[DroppodData]
droppod.basic.pos.coord.x mustEqual 5108.0f
droppod.basic.pos.coord.y mustEqual 6164.0f
droppod.basic.pos.coord.z mustEqual 1023.9844f
droppod.basic.pos.roll mustEqual 0
droppod.basic.pos.pitch mustEqual 0
droppod.basic.pos.yaw mustEqual 0
droppod.basic.unk mustEqual 4
droppod.basic.player_guid mustEqual PlanetSideGUID(0)
droppod.burn mustEqual false
droppod.health mustEqual 255
case _ =>
ko
}
}
"decode (shuttle 1)" in {
PacketCoding.DecodePacket(string_orbital_shuttle_1).require match {
case ObjectCreateMessage(len, cls, guid, parent, data) =>
len mustEqual 130
cls mustEqual ObjectClass.orbital_shuttle
guid mustEqual PlanetSideGUID(1129)
parent.isDefined mustEqual true
parent.get.guid mustEqual PlanetSideGUID(786)
parent.get.slot mustEqual 3
data.isDefined mustEqual true
data.get.isInstanceOf[OrbitalShuttleData] mustEqual true
data.get.asInstanceOf[OrbitalShuttleData].faction mustEqual PlanetSideEmpire.VS
data.get.asInstanceOf[OrbitalShuttleData].pos.isDefined mustEqual false
case _ =>
ko
}
}
"decode (shuttle 2)" in {
PacketCoding.DecodePacket(string_orbital_shuttle_2).require match {
case ObjectCreateMessage(len, cls, guid, parent, data) =>
len mustEqual 195
cls mustEqual ObjectClass.orbital_shuttle
guid mustEqual PlanetSideGUID(1127)
parent.isDefined mustEqual false
data.isDefined mustEqual true
data.get.isInstanceOf[OrbitalShuttleData] mustEqual true
val shuttle = data.get.asInstanceOf[OrbitalShuttleData]
shuttle.faction mustEqual PlanetSideEmpire.VS
shuttle.pos.isDefined mustEqual true
shuttle.pos.get.coord.x mustEqual 5610.0156f
shuttle.pos.get.coord.y mustEqual 4255.258f
shuttle.pos.get.coord.z mustEqual 134.1875f
shuttle.pos.get.roll mustEqual 0
shuttle.pos.get.pitch mustEqual 0
shuttle.pos.get.yaw mustEqual 96
case _ =>
ko
}
}
"encode (fury)" in {
val obj = VehicleData(
CommonFieldData(
PlacementData(6531.961f, 1872.1406f, 24.734375f, 0, 0, 33),
PlanetSideEmpire.VS, 4
),
255,
MountItem(ObjectClass.fury_weapon_systema, PlanetSideGUID(400), 1,
WeaponData(0x6, 0x8, 0, ObjectClass.hellfire_ammo, PlanetSideGUID(432), 0, AmmoBoxData(0x8))
)
)
val msg = ObjectCreateMessage(ObjectClass.fury, PlanetSideGUID(413), obj)
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
pkt mustEqual string_fury
}
"encode (ant)" in {
val obj = ANTData(
CommonFieldData(
PlacementData(3674.8438f, 2726.789f, 91.15625f),
PlanetSideEmpire.VS, 4
),
255,
DriveState.Mobile
)
val msg = ObjectCreateMessage(ObjectClass.ant, PlanetSideGUID(380), obj)
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
pkt mustEqual string_ant
}
"encode (lightning)" in {
val obj = VehicleData(
CommonFieldData(
PlacementData(3674.8438f, 2726.789f, 91.15625f),
PlanetSideEmpire.VS, 4
),
255,
MountItem(ObjectClass.lightning_weapon_system, PlanetSideGUID(91), 1,
WeaponData(4, 8, 0, ObjectClass.bullet_75mm, PlanetSideGUID(92), 0, AmmoBoxData(), ObjectClass.bullet_25mm, PlanetSideGUID(93), 1, AmmoBoxData())
)
)
val msg = ObjectCreateMessage(ObjectClass.lightning, PlanetSideGUID(90), obj)
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
pkt mustEqual string_lightning
}
"encode (deliverer)" in {
val obj = VehicleData(
CommonFieldData(
PlacementData(6531.961f, 1872.1406f, 24.734375f, 0, 0, 33),
PlanetSideEmpire.NC, 4
),
0,
255,
0,
DriveState.State7,
true,
0,
Some(
MountItem(
ObjectClass.mediumtransport_weapon_systemA, PlanetSideGUID(383), 5,
WeaponData(6, 8, ObjectClass.bullet_20mm, PlanetSideGUID(420), 0, AmmoBoxData(8))
) ::
MountItem(
ObjectClass.mediumtransport_weapon_systemB, PlanetSideGUID(556), 6,
WeaponData(6, 8, ObjectClass.bullet_20mm, PlanetSideGUID(575), 0, AmmoBoxData(8))
) ::
Nil
)
)(2)
val msg = ObjectCreateMessage(ObjectClass.mediumtransport, PlanetSideGUID(387), obj)
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
pkt mustEqual string_mediumtransport
}
"encode (ams)" in {
val obj = AMSData(
CommonFieldData(PlacementData(3674.0f, 2726.789f, 91.15625f, 0, 0, 0),
PlanetSideEmpire.VS, 0,
PlanetSideGUID(34082)
),
2,
236,
0,
DriveState.Deployed,
63,
PlanetSideGUID(3663),
PlanetSideGUID(3638),
PlanetSideGUID(3827),
PlanetSideGUID(3556)
)
val msg = ObjectCreateMessage(ObjectClass.ams, PlanetSideGUID(4157), obj)
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
pkt mustEqual string_ams
}
"encode (ams, destroyed)" in {
val obj = DestroyedVehicleData(PlacementData(3674.0f, 2726.789f, 91.15625f))
val msg = ObjectCreateMessage(ObjectClass.ams_destroyed, PlanetSideGUID(4157), obj)
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
pkt mustEqual string_ams_destroyed
}
"encode (switchblade(" in {
val obj = Vehicle2Data(
CommonFieldData(PlacementData(6531.961f, 1872.1406f, 24.734375f ,0 ,0 ,33),
PlanetSideEmpire.VS, 4
),
255,
DriveState.Mobile,
MountItem(ObjectClass.scythe, PlanetSideGUID(355), 1,
WeaponData(0x6, 0x8, 0, ObjectClass.ancient_ammo_vehicle, PlanetSideGUID(366), 0, AmmoBoxData(0x8), ObjectClass.ancient_ammo_vehicle, PlanetSideGUID(385), 1, AmmoBoxData(0x8))
)
)
val msg = ObjectCreateMessage(ObjectClass.switchblade, PlanetSideGUID(418), obj)
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
pkt mustEqual string_switchblade
}
"encode (droppod)" in {
val obj = DroppodData(
CommonFieldData(
PlacementData(5108.0f, 6164.0f, 1023.9844f),
PlanetSideEmpire.VS, 4
)
)
val msg = ObjectCreateMessage(ObjectClass.droppod, PlanetSideGUID(3595), obj)
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
pkt mustEqual string_droppod
}
"encode (shuttle 1)" in {
val obj = OrbitalShuttleData(PlanetSideEmpire.VS)
val msg = ObjectCreateMessage(ObjectClass.orbital_shuttle, PlanetSideGUID(1129), ObjectCreateMessageParent(PlanetSideGUID(786), 3), obj)
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
pkt mustEqual string_orbital_shuttle_1
}
"encode (shuttle 2)" in {
val obj = OrbitalShuttleData(PlacementData(5610.0156f, 4255.258f, 134.1875f, 0, 0, 96), PlanetSideEmpire.VS)
val msg = ObjectCreateMessage(ObjectClass.orbital_shuttle, PlanetSideGUID(1127), obj)
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
pkt mustEqual string_orbital_shuttle_2
}
}

View file

@ -0,0 +1,54 @@
// Copyright (c) 2017 PSForever
package game
import org.specs2.mutable._
import net.psforever.packet._
import net.psforever.packet.game._
import net.psforever.types.Vector3
import scodec.bits._
class VehicleStateMessageTest extends Specification {
val string = hex"1b 9d010d85aecaa6b8c2dfdfefffc020008006000078"
"decode" in {
PacketCoding.DecodePacket(string).require match {
case VehicleStateMessage(guid, unk1, pos, roll, pitch, yaw, vel, unk2, unk3, unk4, wheel, unk5, unk6) =>
guid mustEqual PlanetSideGUID(413)
unk1 mustEqual 0
pos.x mustEqual 3674.8438f
pos.y mustEqual 2726.789f
pos.z mustEqual 91.09375f
roll mustEqual 359.29688f
pitch mustEqual 1.0546875f
yaw mustEqual 90.35156f
vel.isDefined mustEqual true
vel.get.x mustEqual 0.0f
vel.get.y mustEqual 0.0f
vel.get.z mustEqual 0.03125f
unk2.isDefined mustEqual false
unk3 mustEqual 0
unk4 mustEqual 0
wheel mustEqual 15
unk5 mustEqual false
unk6 mustEqual false
case _ =>
ko
}
}
"encode" in {
val msg = VehicleStateMessage(
PlanetSideGUID(413),
0,
Vector3(3674.8438f, 2726.789f, 91.09375f),
359.29688f, 1.0546875f, 90.35156f,
Some(Vector3(0.0f, 0.0f, 0.03125f)),
None,
0, 0, 15,
false, false
)
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
pkt mustEqual string
}
}