mirror of
https://github.com/2revoemag/PSF-BotServer.git
synced 2026-03-02 19:50:21 +00:00
Merge branch 'master' into Updates
This commit is contained in:
commit
ed9bc36b56
77 changed files with 6760 additions and 1489 deletions
|
|
@ -4,6 +4,7 @@ package game
|
|||
import org.specs2.mutable._
|
||||
import net.psforever.packet._
|
||||
import net.psforever.packet.game._
|
||||
import net.psforever.types.ExoSuitType
|
||||
import scodec.bits._
|
||||
|
||||
class ArmorChangedMessageTest extends Specification {
|
||||
|
|
@ -13,7 +14,7 @@ class ArmorChangedMessageTest extends Specification {
|
|||
PacketCoding.DecodePacket(string).require match {
|
||||
case ArmorChangedMessage(player_guid, armor, subtype) =>
|
||||
player_guid mustEqual PlanetSideGUID(273)
|
||||
armor mustEqual 2
|
||||
armor mustEqual ExoSuitType.MAX
|
||||
subtype mustEqual 3
|
||||
case _ =>
|
||||
ko
|
||||
|
|
@ -21,7 +22,7 @@ class ArmorChangedMessageTest extends Specification {
|
|||
}
|
||||
|
||||
"encode" in {
|
||||
val msg = ArmorChangedMessage(PlanetSideGUID(273), 2, 3)
|
||||
val msg = ArmorChangedMessage(PlanetSideGUID(273), ExoSuitType.MAX, 3)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string
|
||||
|
|
|
|||
33
common/src/test/scala/game/AvatarDeadStateMessageTest.scala
Normal file
33
common/src/test/scala/game/AvatarDeadStateMessageTest.scala
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
// 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 AvatarDeadStateMessageTest extends Specification {
|
||||
val string = hex"ad3c1260801c12608009f99861fb0741e040000010"
|
||||
|
||||
"decode" in {
|
||||
PacketCoding.DecodePacket(string).require match {
|
||||
case AvatarDeadStateMessage(unk1,unk2,unk3,pos,unk4,unk5) =>
|
||||
unk1 mustEqual 1
|
||||
unk2 mustEqual 300000
|
||||
unk3 mustEqual 300000
|
||||
pos mustEqual Vector3(6552.617f,4602.375f,60.90625f)
|
||||
unk4 mustEqual 2
|
||||
unk5 mustEqual true
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"encode" in {
|
||||
val msg = AvatarDeadStateMessage(1, 300000, 300000, Vector3(6552.617f,4602.375f,60.90625f), 2, true)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string
|
||||
}
|
||||
}
|
||||
|
|
@ -4,6 +4,7 @@ package game
|
|||
import org.specs2.mutable._
|
||||
import net.psforever.packet._
|
||||
import net.psforever.packet.game._
|
||||
import net.psforever.types.GrenadeState
|
||||
import scodec.bits._
|
||||
|
||||
class AvatarGrenadeStateMessageTest extends Specification {
|
||||
|
|
@ -13,14 +14,14 @@ class AvatarGrenadeStateMessageTest extends Specification {
|
|||
PacketCoding.DecodePacket(string).require match {
|
||||
case AvatarGrenadeStateMessage(player_guid, state) =>
|
||||
player_guid mustEqual PlanetSideGUID(4570)
|
||||
state mustEqual GrenadeState.PRIMED
|
||||
state mustEqual GrenadeState.Primed
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"encode" in {
|
||||
val msg = AvatarGrenadeStateMessage(PlanetSideGUID(4570), GrenadeState.PRIMED)
|
||||
val msg = AvatarGrenadeStateMessage(PlanetSideGUID(4570), GrenadeState.Primed)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string
|
||||
|
|
|
|||
332
common/src/test/scala/game/BattleplanMessageTest.scala
Normal file
332
common/src/test/scala/game/BattleplanMessageTest.scala
Normal file
|
|
@ -0,0 +1,332 @@
|
|||
// Copyright (c) 2017 PSForever
|
||||
package game
|
||||
|
||||
import org.specs2.mutable._
|
||||
import net.psforever.packet._
|
||||
import net.psforever.packet.game._
|
||||
import scodec.bits._
|
||||
|
||||
class BattleplanMessageTest extends Specification {
|
||||
val string_start = hex"b3 3a197902 94 59006500740041006e006f0074006800650072004600610069006c0075007200650041006c007400 0000 01 e0"
|
||||
val string_stop = hex"b3 3a197902 94 59006500740041006e006f0074006800650072004600610069006c0075007200650041006c007400 0000 01 f0"
|
||||
val string_line = hex"b3 85647702 8c 4f0075007400730074006100620075006c006f0075007300 0a00 20 2aba2b4aae8bd2aba334aae8dd2aca3b4ab28fd2aca414ab29152aca474ab292d2ada4d4ab69452ada534ab695d2ada594ab696d2ada5d4ab697d2ada614ab698d2ada654ab699d2ada694ab69ad2aea6d4aba9bd2aea714aba9cd2aea754aba9dd2aea794aba9ed"
|
||||
val string_style = hex"b3856477028c4f0075007400730074006100620075006c006f00750073000a00031d22aba2f4aae8cd"
|
||||
val string_message = hex"b3 85647702 8c 4f0075007400730074006100620075006c006f0075007300 0a00 01 6aba2b5011c0480065006c006c006f00200041007500720061007800690073002100"
|
||||
//0xb3856477028c4f0075007400730074006100620075006c006f00750073000a000130
|
||||
|
||||
"decode (start)" in {
|
||||
PacketCoding.DecodePacket(string_start).require match {
|
||||
case BattleplanMessage(char_id, player_name, zone_id, diagrams) =>
|
||||
char_id mustEqual 41490746
|
||||
player_name mustEqual "YetAnotherFailureAlt"
|
||||
zone_id mustEqual PlanetSideGUID(0)
|
||||
diagrams.size mustEqual 1
|
||||
//0
|
||||
diagrams.head.action mustEqual DiagramActionCode.StartDrawing
|
||||
diagrams.head.stroke.isDefined mustEqual false
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"decode (end)" in {
|
||||
PacketCoding.DecodePacket(string_stop).require match {
|
||||
case BattleplanMessage(char_id, player_name, zone_id, diagrams) =>
|
||||
char_id mustEqual 41490746
|
||||
player_name mustEqual "YetAnotherFailureAlt"
|
||||
zone_id mustEqual PlanetSideGUID(0)
|
||||
diagrams.size mustEqual 1
|
||||
//0
|
||||
diagrams.head.action mustEqual DiagramActionCode.StopDrawing
|
||||
diagrams.head.stroke.isDefined mustEqual false
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"decode (stop)" in {
|
||||
PacketCoding.DecodePacket(string_line).require match {
|
||||
case BattleplanMessage(char_id, player_name, zone_id, diagrams) =>
|
||||
char_id mustEqual 41378949
|
||||
player_name mustEqual "Outstabulous"
|
||||
zone_id mustEqual PlanetSideGUID(10)
|
||||
diagrams.size mustEqual 32
|
||||
//0
|
||||
diagrams.head.action mustEqual DiagramActionCode.Vertex
|
||||
diagrams.head.stroke.isDefined mustEqual true
|
||||
diagrams.head.stroke.get.isInstanceOf[Vertex] mustEqual true
|
||||
diagrams.head.stroke.get.asInstanceOf[Vertex].x mustEqual 7512.0f
|
||||
diagrams.head.stroke.get.asInstanceOf[Vertex].y mustEqual 6312.0f
|
||||
//1
|
||||
diagrams(1).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(1).stroke.get.asInstanceOf[Vertex].x mustEqual 7512.0f
|
||||
diagrams(1).stroke.get.asInstanceOf[Vertex].y mustEqual 6328.0f
|
||||
//2
|
||||
diagrams(2).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(2).stroke.get.asInstanceOf[Vertex].x mustEqual 7512.0f
|
||||
diagrams(2).stroke.get.asInstanceOf[Vertex].y mustEqual 6344.0f
|
||||
//3
|
||||
diagrams(3).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(3).stroke.get.asInstanceOf[Vertex].x mustEqual 7512.0f
|
||||
diagrams(3).stroke.get.asInstanceOf[Vertex].y mustEqual 6360.0f
|
||||
//4
|
||||
diagrams(4).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(4).stroke.get.asInstanceOf[Vertex].x mustEqual 7520.0f
|
||||
diagrams(4).stroke.get.asInstanceOf[Vertex].y mustEqual 6376.0f
|
||||
//5
|
||||
diagrams(5).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(5).stroke.get.asInstanceOf[Vertex].x mustEqual 7520.0f
|
||||
diagrams(5).stroke.get.asInstanceOf[Vertex].y mustEqual 6392.0f
|
||||
//6
|
||||
diagrams(6).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(6).stroke.get.asInstanceOf[Vertex].x mustEqual 7520.0f
|
||||
diagrams(6).stroke.get.asInstanceOf[Vertex].y mustEqual 6400.0f
|
||||
//7
|
||||
diagrams(7).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(7).stroke.get.asInstanceOf[Vertex].x mustEqual 7520.0f
|
||||
diagrams(7).stroke.get.asInstanceOf[Vertex].y mustEqual 6416.0f
|
||||
//8
|
||||
diagrams(8).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(8).stroke.get.asInstanceOf[Vertex].x mustEqual 7520.0f
|
||||
diagrams(8).stroke.get.asInstanceOf[Vertex].y mustEqual 6424.0f
|
||||
//9
|
||||
diagrams(9).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(9).stroke.get.asInstanceOf[Vertex].x mustEqual 7520.0f
|
||||
diagrams(9).stroke.get.asInstanceOf[Vertex].y mustEqual 6440.0f
|
||||
//10
|
||||
diagrams(10).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(10).stroke.get.asInstanceOf[Vertex].x mustEqual 7528.0f
|
||||
diagrams(10).stroke.get.asInstanceOf[Vertex].y mustEqual 6448.0f
|
||||
//11
|
||||
diagrams(11).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(11).stroke.get.asInstanceOf[Vertex].x mustEqual 7528.0f
|
||||
diagrams(11).stroke.get.asInstanceOf[Vertex].y mustEqual 6464.0f
|
||||
//12
|
||||
diagrams(12).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(12).stroke.get.asInstanceOf[Vertex].x mustEqual 7528.0f
|
||||
diagrams(12).stroke.get.asInstanceOf[Vertex].y mustEqual 6472.0f
|
||||
//13
|
||||
diagrams(13).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(13).stroke.get.asInstanceOf[Vertex].x mustEqual 7528.0f
|
||||
diagrams(13).stroke.get.asInstanceOf[Vertex].y mustEqual 6488.0f
|
||||
//14
|
||||
diagrams(14).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(14).stroke.get.asInstanceOf[Vertex].x mustEqual 7528.0f
|
||||
diagrams(14).stroke.get.asInstanceOf[Vertex].y mustEqual 6496.0f
|
||||
//15
|
||||
diagrams(15).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(15).stroke.get.asInstanceOf[Vertex].x mustEqual 7528.0f
|
||||
diagrams(15).stroke.get.asInstanceOf[Vertex].y mustEqual 6504.0f
|
||||
//16
|
||||
diagrams(16).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(16).stroke.get.asInstanceOf[Vertex].x mustEqual 7528.0f
|
||||
diagrams(16).stroke.get.asInstanceOf[Vertex].y mustEqual 6512.0f
|
||||
//17
|
||||
diagrams(17).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(17).stroke.get.asInstanceOf[Vertex].x mustEqual 7528.0f
|
||||
diagrams(17).stroke.get.asInstanceOf[Vertex].y mustEqual 6520.0f
|
||||
//18
|
||||
diagrams(18).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(18).stroke.get.asInstanceOf[Vertex].x mustEqual 7528.0f
|
||||
diagrams(18).stroke.get.asInstanceOf[Vertex].y mustEqual 6528.0f
|
||||
//19
|
||||
diagrams(19).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(19).stroke.get.asInstanceOf[Vertex].x mustEqual 7528.0f
|
||||
diagrams(19).stroke.get.asInstanceOf[Vertex].y mustEqual 6536.0f
|
||||
//20
|
||||
diagrams(20).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(20).stroke.get.asInstanceOf[Vertex].x mustEqual 7528.0f
|
||||
diagrams(20).stroke.get.asInstanceOf[Vertex].y mustEqual 6544.0f
|
||||
//21
|
||||
diagrams(21).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(21).stroke.get.asInstanceOf[Vertex].x mustEqual 7528.0f
|
||||
diagrams(21).stroke.get.asInstanceOf[Vertex].y mustEqual 6552.0f
|
||||
//22
|
||||
diagrams(22).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(22).stroke.get.asInstanceOf[Vertex].x mustEqual 7528.0f
|
||||
diagrams(22).stroke.get.asInstanceOf[Vertex].y mustEqual 6560.0f
|
||||
//23
|
||||
diagrams(23).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(23).stroke.get.asInstanceOf[Vertex].x mustEqual 7528.0f
|
||||
diagrams(23).stroke.get.asInstanceOf[Vertex].y mustEqual 6568.0f
|
||||
//24
|
||||
diagrams(24).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(24).stroke.get.asInstanceOf[Vertex].x mustEqual 7536.0f
|
||||
diagrams(24).stroke.get.asInstanceOf[Vertex].y mustEqual 6576.0f
|
||||
//25
|
||||
diagrams(25).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(25).stroke.get.asInstanceOf[Vertex].x mustEqual 7536.0f
|
||||
diagrams(25).stroke.get.asInstanceOf[Vertex].y mustEqual 6584.0f
|
||||
//26
|
||||
diagrams(26).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(26).stroke.get.asInstanceOf[Vertex].x mustEqual 7536.0f
|
||||
diagrams(26).stroke.get.asInstanceOf[Vertex].y mustEqual 6592.0f
|
||||
//27
|
||||
diagrams(27).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(27).stroke.get.asInstanceOf[Vertex].x mustEqual 7536.0f
|
||||
diagrams(27).stroke.get.asInstanceOf[Vertex].y mustEqual 6600.0f
|
||||
//28
|
||||
diagrams(28).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(28).stroke.get.asInstanceOf[Vertex].x mustEqual 7536.0f
|
||||
diagrams(28).stroke.get.asInstanceOf[Vertex].y mustEqual 6608.0f
|
||||
//29
|
||||
diagrams(29).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(29).stroke.get.asInstanceOf[Vertex].x mustEqual 7536.0f
|
||||
diagrams(29).stroke.get.asInstanceOf[Vertex].y mustEqual 6616.0f
|
||||
//30
|
||||
diagrams(30).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(30).stroke.get.asInstanceOf[Vertex].x mustEqual 7536.0f
|
||||
diagrams(30).stroke.get.asInstanceOf[Vertex].y mustEqual 6624.0f
|
||||
//31
|
||||
diagrams(31).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(31).stroke.get.asInstanceOf[Vertex].x mustEqual 7536.0f
|
||||
diagrams(31).stroke.get.asInstanceOf[Vertex].y mustEqual 6632.0f
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"decode (style)" in {
|
||||
PacketCoding.DecodePacket(string_style).require match {
|
||||
case BattleplanMessage(char_id, player_name, zone_id, diagrams) =>
|
||||
char_id mustEqual 41378949
|
||||
player_name mustEqual "Outstabulous"
|
||||
zone_id mustEqual PlanetSideGUID(10)
|
||||
diagrams.size mustEqual 3
|
||||
//0
|
||||
diagrams.head.action mustEqual DiagramActionCode.Style
|
||||
diagrams.head.stroke.isDefined mustEqual true
|
||||
diagrams.head.stroke.get.isInstanceOf[Style] mustEqual true
|
||||
diagrams.head.stroke.get.asInstanceOf[Style].thickness mustEqual 3.0f
|
||||
diagrams.head.stroke.get.asInstanceOf[Style].color mustEqual 2
|
||||
//1
|
||||
diagrams(1).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(1).stroke.get.asInstanceOf[Vertex].x mustEqual 7512.0f
|
||||
diagrams(1).stroke.get.asInstanceOf[Vertex].y mustEqual 6328.0f
|
||||
//2
|
||||
diagrams(2).action mustEqual DiagramActionCode.Vertex
|
||||
diagrams(2).stroke.get.asInstanceOf[Vertex].x mustEqual 7512.0f
|
||||
diagrams(2).stroke.get.asInstanceOf[Vertex].y mustEqual 6344.0f
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"decode (message)" in {
|
||||
PacketCoding.DecodePacket(string_message).require match {
|
||||
case BattleplanMessage(char_id, player_name, zone_id, diagrams) =>
|
||||
char_id mustEqual 41378949
|
||||
player_name mustEqual "Outstabulous"
|
||||
zone_id mustEqual PlanetSideGUID(10)
|
||||
diagrams.size mustEqual 1
|
||||
//0
|
||||
diagrams.head.action mustEqual DiagramActionCode.DrawString
|
||||
diagrams.head.stroke.isDefined mustEqual true
|
||||
diagrams.head.stroke.get.isInstanceOf[DrawString] mustEqual true
|
||||
diagrams.head.stroke.get.asInstanceOf[DrawString].x mustEqual 7512.0f
|
||||
diagrams.head.stroke.get.asInstanceOf[DrawString].y mustEqual 6312.0f
|
||||
diagrams.head.stroke.get.asInstanceOf[DrawString].color mustEqual 2
|
||||
diagrams.head.stroke.get.asInstanceOf[DrawString].channel mustEqual 0
|
||||
diagrams.head.stroke.get.asInstanceOf[DrawString].message mustEqual "Hello Auraxis!"
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"encode (start)" in {
|
||||
val msg = BattleplanMessage(
|
||||
41490746,
|
||||
"YetAnotherFailureAlt",
|
||||
PlanetSideGUID(0),
|
||||
BattleDiagramAction(DiagramActionCode.StartDrawing) ::
|
||||
Nil
|
||||
)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string_start
|
||||
}
|
||||
|
||||
"encode (stop)" in {
|
||||
val msg = BattleplanMessage(
|
||||
41490746,
|
||||
"YetAnotherFailureAlt",
|
||||
PlanetSideGUID(0),
|
||||
BattleDiagramAction(DiagramActionCode.StopDrawing) ::
|
||||
Nil
|
||||
)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string_stop
|
||||
}
|
||||
|
||||
"encode (line)" in {
|
||||
val msg = BattleplanMessage(
|
||||
41378949,
|
||||
"Outstabulous",
|
||||
PlanetSideGUID(10),
|
||||
BattleDiagramAction.vertex(7512.0f, 6312.0f) ::
|
||||
BattleDiagramAction.vertex(7512.0f, 6328.0f) ::
|
||||
BattleDiagramAction.vertex(7512.0f, 6344.0f) ::
|
||||
BattleDiagramAction.vertex(7512.0f, 6360.0f) ::
|
||||
BattleDiagramAction.vertex(7520.0f, 6376.0f) ::
|
||||
BattleDiagramAction.vertex(7520.0f, 6392.0f) ::
|
||||
BattleDiagramAction.vertex(7520.0f, 6400.0f) ::
|
||||
BattleDiagramAction.vertex(7520.0f, 6416.0f) ::
|
||||
BattleDiagramAction.vertex(7520.0f, 6424.0f) ::
|
||||
BattleDiagramAction.vertex(7520.0f, 6440.0f) ::
|
||||
BattleDiagramAction.vertex(7528.0f, 6448.0f) ::
|
||||
BattleDiagramAction.vertex(7528.0f, 6464.0f) ::
|
||||
BattleDiagramAction.vertex(7528.0f, 6472.0f) ::
|
||||
BattleDiagramAction.vertex(7528.0f, 6488.0f) ::
|
||||
BattleDiagramAction.vertex(7528.0f, 6496.0f) ::
|
||||
BattleDiagramAction.vertex(7528.0f, 6504.0f) ::
|
||||
BattleDiagramAction.vertex(7528.0f, 6512.0f) ::
|
||||
BattleDiagramAction.vertex(7528.0f, 6520.0f) ::
|
||||
BattleDiagramAction.vertex(7528.0f, 6528.0f) ::
|
||||
BattleDiagramAction.vertex(7528.0f, 6536.0f) ::
|
||||
BattleDiagramAction.vertex(7528.0f, 6544.0f) ::
|
||||
BattleDiagramAction.vertex(7528.0f, 6552.0f) ::
|
||||
BattleDiagramAction.vertex(7528.0f, 6560.0f) ::
|
||||
BattleDiagramAction.vertex(7528.0f, 6568.0f) ::
|
||||
BattleDiagramAction.vertex(7536.0f, 6576.0f) ::
|
||||
BattleDiagramAction.vertex(7536.0f, 6584.0f) ::
|
||||
BattleDiagramAction.vertex(7536.0f, 6592.0f) ::
|
||||
BattleDiagramAction.vertex(7536.0f, 6600.0f) ::
|
||||
BattleDiagramAction.vertex(7536.0f, 6608.0f) ::
|
||||
BattleDiagramAction.vertex(7536.0f, 6616.0f) ::
|
||||
BattleDiagramAction.vertex(7536.0f, 6624.0f) ::
|
||||
BattleDiagramAction.vertex(7536.0f, 6632.0f) ::
|
||||
Nil
|
||||
)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string_line
|
||||
}
|
||||
|
||||
"encode (style)" in {
|
||||
val msg = BattleplanMessage(
|
||||
41378949,
|
||||
"Outstabulous",
|
||||
PlanetSideGUID(10),
|
||||
BattleDiagramAction.style(3.0f, 2) ::
|
||||
BattleDiagramAction.vertex(7512.0f, 6328.0f) ::
|
||||
BattleDiagramAction.vertex(7512.0f, 6344.0f) ::
|
||||
Nil
|
||||
)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string_style
|
||||
}
|
||||
|
||||
"encode (message)" in {
|
||||
val msg = BattleplanMessage(
|
||||
41378949,
|
||||
"Outstabulous",
|
||||
PlanetSideGUID(10),
|
||||
BattleDiagramAction.drawString(7512.0f, 6312.0f, 2, 0, "Hello Auraxis!") :: Nil
|
||||
)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string_message
|
||||
}
|
||||
}
|
||||
27
common/src/test/scala/game/BeginZoningMessageTest.scala
Normal file
27
common/src/test/scala/game/BeginZoningMessageTest.scala
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
// Copyright (c) 2017 PSForever
|
||||
package game
|
||||
|
||||
import org.specs2.mutable._
|
||||
import net.psforever.packet._
|
||||
import net.psforever.packet.game._
|
||||
import scodec.bits._
|
||||
|
||||
class BeginZoningMessageTest extends Specification {
|
||||
val string = hex"43" //yes, just the opcode
|
||||
|
||||
"decode" in {
|
||||
PacketCoding.DecodePacket(string).require match {
|
||||
case BeginZoningMessage() =>
|
||||
ok
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"encode" in {
|
||||
val msg = BeginZoningMessage()
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string
|
||||
}
|
||||
}
|
||||
29
common/src/test/scala/game/ChildObjectStateMessageTest.scala
Normal file
29
common/src/test/scala/game/ChildObjectStateMessageTest.scala
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
// Copyright (c) 2017 PSForever
|
||||
package game
|
||||
|
||||
import org.specs2.mutable._
|
||||
import net.psforever.packet._
|
||||
import net.psforever.packet.game._
|
||||
import scodec.bits._
|
||||
|
||||
class ChildObjectStateMessageTest extends Specification {
|
||||
val string = hex"1E 640B 06 47"
|
||||
|
||||
"decode" in {
|
||||
PacketCoding.DecodePacket(string).require match {
|
||||
case ChildObjectStateMessage(object_guid, pitch, yaw) =>
|
||||
object_guid mustEqual PlanetSideGUID(2916)
|
||||
pitch mustEqual 6
|
||||
yaw mustEqual 71
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"encode" in {
|
||||
val msg = ChildObjectStateMessage(PlanetSideGUID(2916), 6, 71)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string
|
||||
}
|
||||
}
|
||||
37
common/src/test/scala/game/DeployObjectMessageTest.scala
Normal file
37
common/src/test/scala/game/DeployObjectMessageTest.scala
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
// 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 DeployObjectMessageTest extends Specification {
|
||||
//fake data; see comments in packet; this test exists to maintain code coverage
|
||||
val string = hex"5D 0000 00000000 00000 00000 0000 00 00 00 00000000"
|
||||
|
||||
"decode" in {
|
||||
PacketCoding.DecodePacket(string).require match {
|
||||
case DeployObjectMessage(guid, unk1, pos, unk2, unk3, unk4, unk5) =>
|
||||
guid mustEqual PlanetSideGUID(0)
|
||||
unk1 mustEqual 0L
|
||||
pos.x mustEqual 0f
|
||||
pos.y mustEqual 0f
|
||||
pos.z mustEqual 0f
|
||||
unk2 mustEqual 0
|
||||
unk3 mustEqual 0
|
||||
unk4 mustEqual 0
|
||||
unk5 mustEqual 0L
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"encode" in {
|
||||
val msg = DeployObjectMessage(PlanetSideGUID(0), 0L, Vector3(0f, 0f, 0f), 0, 0, 0, 0L)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
// Copyright (c) 2017 PSForever
|
||||
package game
|
||||
|
||||
import org.specs2.mutable._
|
||||
import net.psforever.packet._
|
||||
import net.psforever.packet.game.{PlanetSideGUID, DeploymentAction, DeployableIcon, DeployableInfo, DeployableObjectsInfoMessage}
|
||||
import net.psforever.types.Vector3
|
||||
import scodec.bits._
|
||||
|
||||
class DeployableObjectsInfoMessageTest extends Specification {
|
||||
val string = hex"76 00 80 00 00 31 85 41 CF D3 7E B3 34 00 E6 30 48" //this was a TRAP @ Ogma, Forseral
|
||||
|
||||
"decode" in {
|
||||
PacketCoding.DecodePacket(string).require match {
|
||||
case DeployableObjectsInfoMessage(action, list) =>
|
||||
action mustEqual DeploymentAction.Dismiss
|
||||
list.size mustEqual 1
|
||||
//0
|
||||
list.head.object_guid mustEqual PlanetSideGUID(2659)
|
||||
list.head.icon mustEqual DeployableIcon.TRAP
|
||||
list.head.pos.x mustEqual 3572.4453f
|
||||
list.head.pos.y mustEqual 3277.9766f
|
||||
list.head.pos.z mustEqual 114.0f
|
||||
list.head.player_guid mustEqual PlanetSideGUID(2502)
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"encode" in {
|
||||
val msg = DeployableObjectsInfoMessage(
|
||||
DeploymentAction.Dismiss,
|
||||
DeployableInfo(PlanetSideGUID(2659), DeployableIcon.TRAP, Vector3(3572.4453f, 3277.9766f, 114.0f), PlanetSideGUID(2502))
|
||||
)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string
|
||||
}
|
||||
}
|
||||
33
common/src/test/scala/game/LashMessageTest.scala
Normal file
33
common/src/test/scala/game/LashMessageTest.scala
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
// 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 LashMessageTest extends Specification {
|
||||
val string = hex"4f644a82e2c297a738a1ed0b01b886c0"
|
||||
|
||||
"decode" in {
|
||||
PacketCoding.DecodePacket(string).require match {
|
||||
case LashMessage(seq_time,player,victim,bullet,pos,unk1) =>
|
||||
seq_time mustEqual 356
|
||||
player mustEqual PlanetSideGUID(2858)
|
||||
victim mustEqual PlanetSideGUID(2699)
|
||||
bullet mustEqual PlanetSideGUID(40030)
|
||||
pos mustEqual Vector3(5903.7656f,3456.5156f,111.53125f)
|
||||
unk1 mustEqual 0
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"encode" in {
|
||||
val msg = LashMessage(356, PlanetSideGUID(2858), PlanetSideGUID(2699), PlanetSideGUID(40030), Vector3(5903.7656f,3456.5156f,111.53125f), 0)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string
|
||||
}
|
||||
}
|
||||
30
common/src/test/scala/game/MailMessageTest.scala
Normal file
30
common/src/test/scala/game/MailMessageTest.scala
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
// Copyright (c) 2017 PSForever
|
||||
package game
|
||||
|
||||
import org.specs2.mutable._
|
||||
import net.psforever.packet._
|
||||
import net.psforever.packet.game._
|
||||
import scodec.bits._
|
||||
|
||||
class MailMessageTest extends Specification {
|
||||
//we've never received this packet before so this whole test is faked
|
||||
val string = hex"F1 86466174654A489250726 96F72697479204D61696C2054657374 8E48656C6C6F204175726178697321"
|
||||
|
||||
"decode" in {
|
||||
PacketCoding.DecodePacket(string).require match {
|
||||
case MailMessage(sender, subject, msg) =>
|
||||
sender mustEqual "FateJH"
|
||||
subject mustEqual "Priority Mail Test"
|
||||
msg mustEqual "Hello Auraxis!"
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"encode" in {
|
||||
val msg = MailMessage("FateJH", "Priority Mail Test", "Hello Auraxis!")
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string
|
||||
}
|
||||
}
|
||||
423
common/src/test/scala/game/ObjectCreateDetailedMessageTest.scala
Normal file
423
common/src/test/scala/game/ObjectCreateDetailedMessageTest.scala
Normal file
|
|
@ -0,0 +1,423 @@
|
|||
// Copyright (c) 2017 PSForever
|
||||
package game
|
||||
|
||||
import org.specs2.mutable._
|
||||
import net.psforever.packet._
|
||||
import net.psforever.packet.game._
|
||||
import net.psforever.packet.game.objectcreate._
|
||||
import net.psforever.types._
|
||||
import scodec.bits._
|
||||
|
||||
class ObjectCreateDetailedMessageTest extends Specification {
|
||||
val packet = hex"18 CF 13 00 00 BC 87 00 0A F0 16 C3 43 A1 30 90 00 02 C0 40 00 08 70 43 00 68 00 6F 00 72 00 64 00 54 00 52 00 82 65 1F F5 9E 80 80 00 00 00 00 00 3F FF C0 00 00 00 20 00 00 00 20 27 03 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FC CC 10 00 03 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 90 01 90 00 00 00 00 01 00 7E C8 00 C8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 C0 00 42 C5 46 86 C7 00 00 02 A0 00 00 12 60 78 70 65 5F 77 61 72 70 5F 67 61 74 65 5F 75 73 61 67 65 92 78 70 65 5F 69 6E 73 74 61 6E 74 5F 61 63 74 69 6F 6E 92 78 70 65 5F 73 61 6E 63 74 75 61 72 79 5F 68 65 6C 70 91 78 70 65 5F 62 61 74 74 6C 65 5F 72 61 6E 6B 5F 32 8E 78 70 65 5F 66 6F 72 6D 5F 73 71 75 61 64 8E 78 70 65 5F 74 68 5F 6E 6F 6E 73 61 6E 63 8B 78 70 65 5F 74 68 5F 61 6D 6D 6F 90 78 70 65 5F 74 68 5F 66 69 72 65 6D 6F 64 65 73 8F 75 73 65 64 5F 63 68 61 69 6E 62 6C 61 64 65 9A 76 69 73 69 74 65 64 5F 62 72 6F 61 64 63 61 73 74 5F 77 61 72 70 67 61 74 65 8E 76 69 73 69 74 65 64 5F 6C 6F 63 6B 65 72 8D 75 73 65 64 5F 70 75 6E 69 73 68 65 72 88 75 73 65 64 5F 72 65 6B 8D 75 73 65 64 5F 72 65 70 65 61 74 65 72 9F 76 69 73 69 74 65 64 5F 64 65 63 6F 6E 73 74 72 75 63 74 69 6F 6E 5F 74 65 72 6D 69 6E 61 6C 8F 75 73 65 64 5F 73 75 70 70 72 65 73 73 6F 72 96 76 69 73 69 74 65 64 5F 6F 72 64 65 72 5F 74 65 72 6D 69 6E 61 6C 85 6D 61 70 31 35 85 6D 61 70 31 34 85 6D 61 70 31 32 85 6D 61 70 30 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 0A 36 13 88 04 00 40 00 00 10 00 04 00 00 4D 6E 40 10 41 00 00 00 40 00 18 08 38 1C C0 20 32 00 00 07 80 15 E1 D0 02 10 20 00 00 08 00 03 01 07 13 A8 04 06 40 00 00 10 03 20 BB 00 42 E4 00 00 01 00 0E 07 70 08 6C 80 00 06 40 01 C0 F0 01 13 90 00 00 C8 00 38 1E 40 23 32 00 00 19 00 07 03 D0 05 0E 40 00 03 20 00 E8 7B 00 A4 C8 00 00 64 00 DA 4F 80 14 E1 00 00 00 40 00 18 08 38 1F 40 20 32 00 00 0A 00 08 " //fake data?
|
||||
val packet2 = hex"18 F8 00 00 00 BC 8C 10 90 3B 45 C6 FA 94 00 9F F0 00 00 40 00 08 C0 44 00 69 00 66 00 66 00 45" //fake data
|
||||
//val packet2Rest = packet2.bits.drop(8 + 32 + 1 + 11 + 16)
|
||||
var string_inventoryItem = hex"46 04 C0 08 08 80 00 00 20 00 0C 04 10 29 A0 10 19 00 00 04 00 00"
|
||||
val string_detonater = hex"18 87000000 6506 EA8 7420 80 8000000200008"
|
||||
val string_ace = hex"18 87000000 1006 100 C70B 80 8800000200008"
|
||||
val string_9mm = hex"18 7C000000 2580 0E0 0005 A1 C8000064000"
|
||||
val string_gauss = hex"18 DC000000 2580 2C9 B905 82 480000020000C04 1C00C0B0190000078000"
|
||||
val string_punisher = hex"18 27010000 2580 612 a706 82 080000020000c08 1c13a0d01900000780 13a4701a072000000800"
|
||||
val string_rek = hex"18 97000000 2580 6C2 9F05 81 48000002000080000"
|
||||
val string_boomer_trigger = hex"18 87000000 6304CA8760B 80 C800000200008"
|
||||
val string_testchar = hex"18 570C0000 BC8 4B00 6C2D7 65535 CA16 0 00 01 34 40 00 0970 49006C006C006C004900490049006C006C006C0049006C0049006C006C0049006C006C006C0049006C006C004900 84 52 70 76 1E 80 80 00 00 00 00 00 3FFFC 0 00 00 00 20 00 00 0F F6 A7 03 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FC 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 90 01 90 00 64 00 00 01 00 7E C8 00 C8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 C0 00 42 C5 46 86 C7 00 00 00 80 00 00 12 40 78 70 65 5F 73 61 6E 63 74 75 61 72 79 5F 68 65 6C 70 90 78 70 65 5F 74 68 5F 66 69 72 65 6D 6F 64 65 73 8B 75 73 65 64 5F 62 65 61 6D 65 72 85 6D 61 70 31 33 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 0A 23 02 60 04 04 40 00 00 10 00 06 02 08 14 D0 08 0C 80 00 02 00 02 6B 4E 00 82 88 00 00 02 00 00 C0 41 C0 9E 01 01 90 00 00 64 00 44 2A 00 10 91 00 00 00 40 00 18 08 38 94 40 20 32 00 00 00 80 19 05 48 02 17 20 00 00 08 00 70 29 80 43 64 00 00 32 00 0E 05 40 08 9C 80 00 06 40 01 C0 AA 01 19 90 00 00 C8 00 3A 15 80 28 72 00 00 19 00 04 0A B8 05 26 40 00 03 20 06 C2 58 00 A7 88 00 00 02 00 00 80 00 00"
|
||||
|
||||
"decode (2)" in {
|
||||
//an invalid bit representation will fail to turn into an object
|
||||
PacketCoding.DecodePacket(packet2).require match {
|
||||
case ObjectCreateDetailedMessage(len, cls, guid, parent, data) =>
|
||||
len mustEqual 248
|
||||
cls mustEqual ObjectClass.avatar
|
||||
guid mustEqual PlanetSideGUID(2497)
|
||||
parent mustEqual None
|
||||
data.isDefined mustEqual false
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"decode (detonater)" in {
|
||||
PacketCoding.DecodePacket(string_detonater).require match {
|
||||
case ObjectCreateDetailedMessage(len, cls, guid, parent, data) =>
|
||||
len mustEqual 135
|
||||
cls mustEqual ObjectClass.command_detonater
|
||||
guid mustEqual PlanetSideGUID(8308)
|
||||
parent.isDefined mustEqual true
|
||||
parent.get.guid mustEqual PlanetSideGUID(3530)
|
||||
parent.get.slot mustEqual 0
|
||||
data.isDefined mustEqual true
|
||||
data.get.isInstanceOf[DetailedCommandDetonaterData] mustEqual true
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"decode (ace)" in {
|
||||
PacketCoding.DecodePacket(string_ace).require match {
|
||||
case ObjectCreateDetailedMessage(len, cls, guid, parent, data) =>
|
||||
len mustEqual 135
|
||||
cls mustEqual ObjectClass.ace
|
||||
guid mustEqual PlanetSideGUID(3015)
|
||||
parent.isDefined mustEqual true
|
||||
parent.get.guid mustEqual PlanetSideGUID(3104)
|
||||
parent.get.slot mustEqual 0
|
||||
data.isDefined mustEqual true
|
||||
data.get.isInstanceOf[DetailedACEData] mustEqual true
|
||||
data.get.asInstanceOf[DetailedACEData].unk mustEqual 8
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"decode (9mm)" in {
|
||||
PacketCoding.DecodePacket(string_9mm).require match {
|
||||
case ObjectCreateDetailedMessage(len, cls, guid, parent, data) =>
|
||||
len mustEqual 124
|
||||
cls mustEqual ObjectClass.bullet_9mm
|
||||
guid mustEqual PlanetSideGUID(1280)
|
||||
parent.isDefined mustEqual true
|
||||
parent.get.guid mustEqual PlanetSideGUID(75)
|
||||
parent.get.slot mustEqual 33
|
||||
data.isDefined mustEqual true
|
||||
data.get.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 50
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"decode (gauss)" in {
|
||||
PacketCoding.DecodePacket(string_gauss).require match {
|
||||
case ObjectCreateDetailedMessage(len, cls, guid, parent, data) =>
|
||||
len mustEqual 220
|
||||
cls mustEqual ObjectClass.gauss
|
||||
guid mustEqual PlanetSideGUID(1465)
|
||||
parent.isDefined mustEqual true
|
||||
parent.get.guid mustEqual PlanetSideGUID(75)
|
||||
parent.get.slot mustEqual 2
|
||||
data.isDefined mustEqual true
|
||||
val obj_wep = data.get.asInstanceOf[DetailedWeaponData]
|
||||
obj_wep.unk mustEqual 4
|
||||
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
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"decode (punisher)" in {
|
||||
PacketCoding.DecodePacket(string_punisher).require match {
|
||||
case ObjectCreateDetailedMessage(len, cls, guid, parent, data) =>
|
||||
len mustEqual 295
|
||||
cls mustEqual ObjectClass.punisher
|
||||
guid mustEqual PlanetSideGUID(1703)
|
||||
parent.isDefined mustEqual true
|
||||
parent.get.guid mustEqual PlanetSideGUID(75)
|
||||
parent.get.slot mustEqual 2
|
||||
data.isDefined mustEqual true
|
||||
val obj_wep = data.get.asInstanceOf[DetailedConcurrentFeedWeaponData]
|
||||
obj_wep.unk1 mustEqual 0
|
||||
obj_wep.unk2 mustEqual 8
|
||||
val obj_ammo = obj_wep.ammo
|
||||
obj_ammo.size mustEqual 2
|
||||
obj_ammo.head.objectClass mustEqual ObjectClass.bullet_9mm
|
||||
obj_ammo.head.guid mustEqual PlanetSideGUID(1693)
|
||||
obj_ammo.head.parentSlot mustEqual 0
|
||||
obj_ammo.head.obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 30
|
||||
obj_ammo(1).objectClass mustEqual ObjectClass.jammer_cartridge
|
||||
obj_ammo(1).guid mustEqual PlanetSideGUID(1564)
|
||||
obj_ammo(1).parentSlot mustEqual 1
|
||||
obj_ammo(1).obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 1
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"decode (rek)" in {
|
||||
PacketCoding.DecodePacket(string_rek).require match {
|
||||
case ObjectCreateDetailedMessage(len, cls, guid, parent, data) =>
|
||||
len mustEqual 151
|
||||
cls mustEqual ObjectClass.remote_electronics_kit
|
||||
guid mustEqual PlanetSideGUID(1439)
|
||||
parent.isDefined mustEqual true
|
||||
parent.get.guid mustEqual PlanetSideGUID(75)
|
||||
parent.get.slot mustEqual 1
|
||||
data.isDefined mustEqual true
|
||||
data.get.asInstanceOf[DetailedREKData].unk mustEqual 4
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"decode (boomer trigger)" in {
|
||||
PacketCoding.DecodePacket(string_boomer_trigger).require match {
|
||||
case ObjectCreateDetailedMessage(len, cls, guid, parent, data) =>
|
||||
len mustEqual 135
|
||||
cls mustEqual ObjectClass.boomer_trigger
|
||||
guid mustEqual PlanetSideGUID(2934)
|
||||
parent.isDefined mustEqual true
|
||||
parent.get.guid mustEqual PlanetSideGUID(2502)
|
||||
parent.get.slot mustEqual 0
|
||||
data.isDefined mustEqual true
|
||||
data.get.isInstanceOf[DetailedBoomerTriggerData] mustEqual true
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"decode (character)" in {
|
||||
PacketCoding.DecodePacket(string_testchar).require match {
|
||||
case ObjectCreateDetailedMessage(len, cls, guid, parent, data) =>
|
||||
len mustEqual 3159
|
||||
cls mustEqual ObjectClass.avatar
|
||||
guid mustEqual PlanetSideGUID(75)
|
||||
parent.isDefined mustEqual false
|
||||
data.isDefined mustEqual true
|
||||
val char = data.get.asInstanceOf[DetailedCharacterData]
|
||||
char.appearance.pos.coord.x mustEqual 3674.8438f
|
||||
char.appearance.pos.coord.y mustEqual 2726.789f
|
||||
char.appearance.pos.coord.z mustEqual 91.15625f
|
||||
char.appearance.pos.roll mustEqual 0
|
||||
char.appearance.pos.pitch mustEqual 0
|
||||
char.appearance.pos.yaw mustEqual 19
|
||||
char.appearance.basic_appearance.name mustEqual "IlllIIIlllIlIllIlllIllI"
|
||||
char.appearance.basic_appearance.faction mustEqual PlanetSideEmpire.VS
|
||||
char.appearance.basic_appearance.sex mustEqual CharacterGender.Female
|
||||
char.appearance.basic_appearance.head mustEqual 41
|
||||
char.appearance.basic_appearance.voice mustEqual 1 //female 1
|
||||
char.appearance.voice2 mustEqual 3
|
||||
char.appearance.black_ops mustEqual false
|
||||
char.appearance.jammered mustEqual false
|
||||
char.appearance.exosuit mustEqual ExoSuitType.Standard
|
||||
char.appearance.outfit_name mustEqual ""
|
||||
char.appearance.outfit_logo mustEqual 0
|
||||
char.appearance.backpack mustEqual false
|
||||
char.appearance.facingPitch mustEqual 127
|
||||
char.appearance.facingYawUpper mustEqual 181
|
||||
char.appearance.lfs mustEqual true
|
||||
char.appearance.grenade_state mustEqual GrenadeState.None
|
||||
char.appearance.is_cloaking mustEqual false
|
||||
char.appearance.charging_pose mustEqual false
|
||||
char.appearance.on_zipline mustEqual false
|
||||
char.appearance.ribbons.upper mustEqual 0xFFFFFFFFL //none
|
||||
char.appearance.ribbons.middle mustEqual 0xFFFFFFFFL //none
|
||||
char.appearance.ribbons.lower mustEqual 0xFFFFFFFFL //none
|
||||
char.appearance.ribbons.tos mustEqual 0xFFFFFFFFL //none
|
||||
char.healthMax mustEqual 100
|
||||
char.health mustEqual 100
|
||||
char.armor mustEqual 50 //standard exosuit value
|
||||
char.unk1 mustEqual 1
|
||||
char.unk2 mustEqual 7
|
||||
char.unk3 mustEqual 7
|
||||
char.staminaMax mustEqual 100
|
||||
char.stamina mustEqual 100
|
||||
char.unk4 mustEqual 28
|
||||
char.unk5 mustEqual 4
|
||||
char.unk6 mustEqual 44
|
||||
char.unk7 mustEqual 84
|
||||
char.unk8 mustEqual 104
|
||||
char.unk9 mustEqual 1900
|
||||
char.firstTimeEvents.size mustEqual 4
|
||||
char.firstTimeEvents.head mustEqual "xpe_sanctuary_help"
|
||||
char.firstTimeEvents(1) mustEqual "xpe_th_firemodes"
|
||||
char.firstTimeEvents(2) mustEqual "used_beamer"
|
||||
char.firstTimeEvents(3) mustEqual "map13"
|
||||
char.tutorials.size mustEqual 0
|
||||
char.inventory.isDefined mustEqual true
|
||||
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
|
||||
//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
|
||||
//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
|
||||
//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
|
||||
//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
|
||||
//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
|
||||
//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
|
||||
//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
|
||||
//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
|
||||
//9
|
||||
inventory(9).item.objectClass mustEqual ObjectClass.remote_electronics_kit
|
||||
inventory(9).item.guid mustEqual PlanetSideGUID(88)
|
||||
inventory(9).item.parentSlot mustEqual 39
|
||||
//the rek has data but none worth testing here
|
||||
char.drawn_slot mustEqual DrawnSlot.Pistol1
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"encode (2)" in {
|
||||
//the lack of an object will fail to turn into a bad bitstream
|
||||
val msg = ObjectCreateDetailedMessage(0L, ObjectClass.avatar, PlanetSideGUID(2497), None, None)
|
||||
PacketCoding.EncodePacket(msg).isFailure mustEqual true
|
||||
}
|
||||
|
||||
"encode (detonater)" in {
|
||||
val obj = DetailedCommandDetonaterData()
|
||||
val msg = ObjectCreateDetailedMessage(ObjectClass.command_detonater, PlanetSideGUID(8308), ObjectCreateMessageParent(PlanetSideGUID(3530), 0), obj)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string_detonater
|
||||
}
|
||||
|
||||
"encode (ace)" in {
|
||||
val obj = DetailedACEData(8)
|
||||
val msg = ObjectCreateDetailedMessage(ObjectClass.ace, PlanetSideGUID(3015), ObjectCreateMessageParent(PlanetSideGUID(3104), 0), obj)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string_ace
|
||||
}
|
||||
|
||||
"encode (9mm)" in {
|
||||
val obj = DetailedAmmoBoxData(8, 50)
|
||||
val msg = ObjectCreateDetailedMessage(ObjectClass.bullet_9mm, PlanetSideGUID(1280), ObjectCreateMessageParent(PlanetSideGUID(75), 33), obj)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string_9mm
|
||||
}
|
||||
|
||||
"encode (gauss)" in {
|
||||
val obj = DetailedWeaponData(4, 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
|
||||
|
||||
pkt mustEqual string_gauss
|
||||
}
|
||||
|
||||
"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 msg = ObjectCreateDetailedMessage(ObjectClass.punisher, PlanetSideGUID(1703), ObjectCreateMessageParent(PlanetSideGUID(75), 2), obj)
|
||||
var pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string_punisher
|
||||
}
|
||||
|
||||
"encode (rek)" in {
|
||||
val obj = DetailedREKData(4)
|
||||
val msg = ObjectCreateDetailedMessage(ObjectClass.remote_electronics_kit, PlanetSideGUID(1439), ObjectCreateMessageParent(PlanetSideGUID(75), 1), obj)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string_rek
|
||||
}
|
||||
|
||||
"encode (boomer trigger)" in {
|
||||
val obj = DetailedBoomerTriggerData()
|
||||
val msg = ObjectCreateDetailedMessage(ObjectClass.boomer_trigger, PlanetSideGUID(2934), ObjectCreateMessageParent(PlanetSideGUID(2502), 0), obj)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string_boomer_trigger
|
||||
}
|
||||
|
||||
"encode (character)" in {
|
||||
val app = CharacterAppearanceData(
|
||||
PlacementData(
|
||||
Vector3(3674.8438f, 2726.789f, 91.15625f),
|
||||
0, 0,
|
||||
19
|
||||
),
|
||||
BasicCharacterData(
|
||||
"IlllIIIlllIlIllIlllIllI",
|
||||
PlanetSideEmpire.VS,
|
||||
CharacterGender.Female,
|
||||
41,
|
||||
1
|
||||
),
|
||||
3,
|
||||
false,
|
||||
false,
|
||||
ExoSuitType.Standard,
|
||||
"",
|
||||
0,
|
||||
false,
|
||||
127, 181,
|
||||
true,
|
||||
GrenadeState.None,
|
||||
false,
|
||||
false,
|
||||
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))) ::
|
||||
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)) ::
|
||||
InventoryItem(ObjectClass.bullet_9mm, PlanetSideGUID(85), 12, DetailedAmmoBoxData(8, 50)) ::
|
||||
InventoryItem(ObjectClass.bullet_9mm_AP, PlanetSideGUID(86), 33, DetailedAmmoBoxData(8, 50)) ::
|
||||
InventoryItem(ObjectClass.energy_cell, PlanetSideGUID(87), 36, DetailedAmmoBoxData(8, 50)) ::
|
||||
InventoryItem(ObjectClass.remote_electronics_kit, PlanetSideGUID(88), 39, DetailedREKData(8)) ::
|
||||
Nil
|
||||
val obj = DetailedCharacterData(
|
||||
app,
|
||||
100, 100,
|
||||
50,
|
||||
1, 7, 7,
|
||||
100, 100,
|
||||
28, 4, 44, 84, 104, 1900,
|
||||
"xpe_sanctuary_help" :: "xpe_th_firemodes" :: "used_beamer" :: "map13" :: Nil,
|
||||
List.empty,
|
||||
InventoryData(inv),
|
||||
DrawnSlot.Pistol1
|
||||
)
|
||||
val msg = ObjectCreateDetailedMessage(0x79, PlanetSideGUID(75), obj)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
val pkt_bitv = pkt.toBitVector
|
||||
val ori_bitv = string_testchar.toBitVector
|
||||
pkt_bitv.take(153) mustEqual ori_bitv.take(153) //skip 1
|
||||
pkt_bitv.drop(154).take(422) mustEqual ori_bitv.drop(154).take(422) //skip 126
|
||||
pkt_bitv.drop(702) mustEqual ori_bitv.drop(702)
|
||||
//TODO work on DetailedCharacterData to make this pass as a single stream
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load diff
31
common/src/test/scala/game/ObjectDeployedMessageTest.scala
Normal file
31
common/src/test/scala/game/ObjectDeployedMessageTest.scala
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
// Copyright (c) 2017 PSForever
|
||||
package game
|
||||
|
||||
import org.specs2.mutable._
|
||||
import net.psforever.packet._
|
||||
import net.psforever.packet.game._
|
||||
import scodec.bits._
|
||||
|
||||
class ObjectDeployedMessageTest extends Specification {
|
||||
val string_boomer = hex"86 000086626F6F6D6572040000000100000019000000"
|
||||
|
||||
"decode" in {
|
||||
PacketCoding.DecodePacket(string_boomer).require match {
|
||||
case ObjectDeployedMessage(unk : Int, desc : String, act : DeploymentOutcome.Value, count : Long, max : Long) =>
|
||||
unk mustEqual 0
|
||||
desc mustEqual "boomer"
|
||||
act mustEqual DeploymentOutcome.Success
|
||||
count mustEqual 1
|
||||
max mustEqual 25
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"encode" in {
|
||||
val msg = ObjectDeployedMessage("boomer", DeploymentOutcome.Success, 1, 25)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string_boomer
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
// Copyright (c) 2017 PSForever
|
||||
package game
|
||||
|
||||
import org.specs2.mutable._
|
||||
import net.psforever.packet._
|
||||
import net.psforever.packet.game._
|
||||
import scodec.bits.HexStringSyntax
|
||||
|
||||
class ReleaseAvatarRequestMessageTest extends Specification {
|
||||
val string = hex"ac"
|
||||
|
||||
"decode" in {
|
||||
PacketCoding.DecodePacket(string).require match {
|
||||
case ReleaseAvatarRequestMessage() =>
|
||||
ok
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"encode" in {
|
||||
val msg = ReleaseAvatarRequestMessage()
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
// Copyright (c) 2017 PSForever
|
||||
package game
|
||||
|
||||
import org.specs2.mutable._
|
||||
import net.psforever.packet._
|
||||
import net.psforever.packet.game._
|
||||
import scodec.bits._
|
||||
|
||||
class TriggerEnvironmentalDamageMessageTest extends Specification {
|
||||
val string = hex"74 a7c44140000000"
|
||||
|
||||
"decode" in {
|
||||
PacketCoding.DecodePacket(string).require match {
|
||||
case TriggerEnvironmentalDamageMessage(unk1, guid, unk2) =>
|
||||
unk1 mustEqual 2
|
||||
guid mustEqual PlanetSideGUID(4511)
|
||||
unk2 mustEqual 5L
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"encode" in {
|
||||
val msg = TriggerEnvironmentalDamageMessage(2, PlanetSideGUID(4511), 5L)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue