mirror of
https://github.com/2revoemag/PSF-BotServer.git
synced 2026-02-26 01:33:35 +00:00
Deployables (#230)
* functions for certifcation ui updates (that don't work) * initialization of combat engineering deployables ui on load and certification change * representation classes for ACE and FDU; ability to pull ACE and FDU from equipment terminals * ammo change functionality and fire mode change functionality for ConstructionItems refactored from Tool operations and supported properly (switch between deployable options) * zone-specific structure for keeping track of deployables; abaility to dismiss deployables from the map screen (previous functionality); local client creation of explosive-type deployables * refactored MannedTurret into FacilityTurret and lesser traits to be used in the deployable spitfires and the OMFT's; all ACE deployables are available for placement; partial management of the construction items after the deployable is placed; boomers create boomer triggers * Avatar-specific storage for deployables and for updating UI elements * refactored quite a bit of code in WSA for the benefit of deployable management; refinements to deployable creation; server messages about deployable quantities; corrected the FDU encoding pattern; lots of work dedicated just to synchronizing BoomerTrigger objects * added RemoverActor for deployables and redistributed deconstruction functionality away from WSA to new DeployableRemover; added events to facilitate activities not inheritable with this model * refactored and distributed Deployables classes; copious amounts of testing and document-writing * boomers now explode from trigger; support for deployables being destroyed by weapon discharge, including individual health, soure identification, and damage model; shuffled deployable classes to build different hierarchy * sensor_shield was skipped by accident * identified stray object in Hanish, Ishundar, and added Irkalla, Ishundar's capture console; fixed issue with Warp command and 'Irkalla'; modified building amenity setup and setup testing in Zone; players load and die properly when seated in an omft; reserve ammunition in omft properly registered * added local service channel, capture consoles, fixed tests as much as posible * fixed LocalService tests by booting the ServiceManager; added avatar and local tests * a simple attempt to refactor Actor messages in a way that is acceptable to Travis CI * making the explosive deployables vanish upon explosion; sensor health bars are now supported
This commit is contained in:
parent
6cd18c5623
commit
5f3e7e5df8
113 changed files with 8155 additions and 2312 deletions
|
|
@ -12,6 +12,14 @@ class Vector3Test extends Specification {
|
|||
vec.z mustEqual 3.9f
|
||||
}
|
||||
|
||||
"isolate x,y components" in {
|
||||
vec.xy mustEqual Vector3(1.3f, -2.6f, 0)
|
||||
}
|
||||
|
||||
"promote float values into a specific z-format" in {
|
||||
Vector3.z(3.9f) mustEqual Vector3(0, 0, 3.9f)
|
||||
}
|
||||
|
||||
"calculate magnitude (like a vector) 1" in {
|
||||
val obj = Vector3(2.0f, 0.0f, 0.0f)
|
||||
Vector3.Magnitude(obj) mustEqual 2.0f
|
||||
|
|
|
|||
|
|
@ -12,15 +12,11 @@ class DeployObjectMessageTest extends Specification {
|
|||
|
||||
"decode" in {
|
||||
PacketCoding.DecodePacket(string).require match {
|
||||
case DeployObjectMessage(guid, unk1, pos, roll, pitch, yaw, unk2) =>
|
||||
case DeployObjectMessage(guid, unk1, pos, orient, unk2) =>
|
||||
guid mustEqual PlanetSideGUID(2932)
|
||||
unk1 mustEqual 1000L
|
||||
pos.x mustEqual 5769.297f
|
||||
pos.y mustEqual 3192.8594f
|
||||
pos.z mustEqual 97.96875f
|
||||
roll mustEqual 0
|
||||
pitch mustEqual 0
|
||||
yaw mustEqual 63
|
||||
pos mustEqual Vector3(5769.297f, 3192.8594f, 97.96875f)
|
||||
orient mustEqual Vector3.z(272.8125f)
|
||||
unk2 mustEqual 1L
|
||||
case _ =>
|
||||
ko
|
||||
|
|
@ -28,7 +24,7 @@ class DeployObjectMessageTest extends Specification {
|
|||
}
|
||||
|
||||
"encode" in {
|
||||
val msg = DeployObjectMessage(PlanetSideGUID(2932), 1000L, Vector3(5769.297f, 3192.8594f, 97.96875f), 0, 0, 63, 1L)
|
||||
val msg = DeployObjectMessage(PlanetSideGUID(2932), 1000L, Vector3(5769.297f, 3192.8594f, 97.96875f), Vector3.z(272.8125f), 1L)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string
|
||||
|
|
|
|||
|
|
@ -11,10 +11,10 @@ class ObjectDeployedMessageTest extends Specification {
|
|||
|
||||
"decode" in {
|
||||
PacketCoding.DecodePacket(string_boomer).require match {
|
||||
case ObjectDeployedMessage(unk : Int, desc : String, act : DeploymentOutcome.Value, count : Long, max : Long) =>
|
||||
case ObjectDeployedMessage(unk : Int, desc : String, act : DeployOutcome.Value, count : Long, max : Long) =>
|
||||
unk mustEqual 0
|
||||
desc mustEqual "boomer"
|
||||
act mustEqual DeploymentOutcome.Success
|
||||
act mustEqual DeployOutcome.Success
|
||||
count mustEqual 1
|
||||
max mustEqual 25
|
||||
case _ =>
|
||||
|
|
@ -23,7 +23,7 @@ class ObjectDeployedMessageTest extends Specification {
|
|||
}
|
||||
|
||||
"encode" in {
|
||||
val msg = ObjectDeployedMessage("boomer", DeploymentOutcome.Success, 1, 25)
|
||||
val msg = ObjectDeployedMessage("boomer", DeployOutcome.Success, 1, 25)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string_boomer
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ import scodec.bits._
|
|||
class TriggerEffectMessageTest extends Specification {
|
||||
val string_motionalarmsensor = hex"51 970B 82 6F6E FA00C00000"
|
||||
val string_boomer = hex"51 0000 93 737061776E5F6F626A6563745F656666656374 417BB2CB3B4F8E00000000"
|
||||
val string_boomer_explode = hex"51 DF09 8F 6465746F6E6174655F626F6F6D6572 00"
|
||||
|
||||
"decode (motion alarm sensor)" in {
|
||||
PacketCoding.DecodePacket(string_motionalarmsensor).require match {
|
||||
|
|
@ -32,42 +33,44 @@ class TriggerEffectMessageTest extends Specification {
|
|||
effect mustEqual "spawn_object_effect"
|
||||
unk.isDefined mustEqual false
|
||||
location.isDefined mustEqual true
|
||||
location.get.pos.x mustEqual 3567.0156f
|
||||
location.get.pos.y mustEqual 3278.6953f
|
||||
location.get.pos.z mustEqual 114.484375f
|
||||
location.get.roll mustEqual 0
|
||||
location.get.pitch mustEqual 0
|
||||
location.get.yaw mustEqual 0
|
||||
location.get.pos mustEqual Vector3(3567.0156f, 3278.6953f, 114.484375f)
|
||||
location.get.orient mustEqual Vector3(0, 0, 90)
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"decode (boomer explode)" in {
|
||||
PacketCoding.DecodePacket(string_boomer_explode).require match {
|
||||
case TriggerEffectMessage(guid, effect, unk, location) =>
|
||||
guid mustEqual PlanetSideGUID(2527)
|
||||
effect mustEqual "detonate_boomer"
|
||||
unk.isDefined mustEqual false
|
||||
location.isDefined mustEqual false
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"encode (motion alarm sensor)" in {
|
||||
val msg = TriggerEffectMessage(
|
||||
PlanetSideGUID(2967),
|
||||
"on",
|
||||
Some(TriggeredEffect(true, 1000L)),
|
||||
None
|
||||
)
|
||||
val msg = TriggerEffectMessage(PlanetSideGUID(2967), "on", true, 1000L)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string_motionalarmsensor
|
||||
}
|
||||
|
||||
"encode (boomer)" in {
|
||||
val msg = TriggerEffectMessage(
|
||||
PlanetSideGUID(0),
|
||||
"spawn_object_effect",
|
||||
None,
|
||||
Some(TriggeredEffectLocation(
|
||||
Vector3(3567.0156f, 3278.6953f, 114.484375f),
|
||||
0, 0, 0
|
||||
))
|
||||
)
|
||||
val msg = TriggerEffectMessage("spawn_object_effect", Vector3(3567.0156f, 3278.6953f, 114.484375f), Vector3(0, 0, 90))
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string_boomer
|
||||
}
|
||||
|
||||
"encode (boomer explode)" in {
|
||||
val msg = TriggerEffectMessage(PlanetSideGUID(2527), "detonate_boomer")
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string_boomer_explode
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ package game.objectcreate
|
|||
import net.psforever.packet.PacketCoding
|
||||
import net.psforever.packet.game.{ObjectCreateMessage, PlanetSideGUID}
|
||||
import net.psforever.packet.game.objectcreate._
|
||||
import net.psforever.types.PlanetSideEmpire
|
||||
import net.psforever.types.{PlanetSideEmpire, Vector3}
|
||||
import org.specs2.mutable._
|
||||
import scodec.bits._
|
||||
|
||||
|
|
@ -22,12 +22,8 @@ class AegisShieldGeneratorDataTest extends Specification {
|
|||
data.isDefined mustEqual true
|
||||
data.get.isInstanceOf[AegisShieldGeneratorData] mustEqual true
|
||||
val aegis = data.get.asInstanceOf[AegisShieldGeneratorData]
|
||||
aegis.deploy.pos.coord.x mustEqual 3571.2266f
|
||||
aegis.deploy.pos.coord.y mustEqual 3278.0938f
|
||||
aegis.deploy.pos.coord.z mustEqual 114.0f
|
||||
aegis.deploy.pos.orient.x mustEqual 0f
|
||||
aegis.deploy.pos.orient.y mustEqual 0f
|
||||
aegis.deploy.pos.orient.z mustEqual 90.0f
|
||||
aegis.deploy.pos.coord mustEqual Vector3(3571.2266f, 3278.0938f, 114.0f)
|
||||
aegis.deploy.pos.orient mustEqual Vector3(0, 0, 90)
|
||||
aegis.deploy.faction mustEqual PlanetSideEmpire.VS
|
||||
aegis.deploy.unk mustEqual 2
|
||||
aegis.health mustEqual 255
|
||||
|
|
@ -40,7 +36,7 @@ class AegisShieldGeneratorDataTest extends Specification {
|
|||
"encode" in {
|
||||
val obj = AegisShieldGeneratorData(
|
||||
CommonFieldData(
|
||||
PlacementData(3571.2266f, 3278.0938f, 114.0f, 0f, 0f, 90.0f),
|
||||
PlacementData(Vector3(3571.2266f, 3278.0938f, 114.0f), Vector3(0, 0, 90)),
|
||||
PlanetSideEmpire.VS, 2, PlanetSideGUID(2366)
|
||||
),
|
||||
255
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ package game.objectcreate
|
|||
import net.psforever.packet.PacketCoding
|
||||
import net.psforever.packet.game.{ObjectCreateMessage, PlanetSideGUID}
|
||||
import net.psforever.packet.game.objectcreate._
|
||||
import net.psforever.types.PlanetSideEmpire
|
||||
import net.psforever.types.{PlanetSideEmpire, Vector3}
|
||||
import org.specs2.mutable._
|
||||
import scodec.bits._
|
||||
|
||||
|
|
@ -22,23 +22,19 @@ class OneMannedFieldTurretDataTest extends Specification {
|
|||
data.isDefined mustEqual true
|
||||
data.get.isInstanceOf[OneMannedFieldTurretData] mustEqual true
|
||||
val omft = data.get.asInstanceOf[OneMannedFieldTurretData]
|
||||
omft.deploy.pos.coord.x mustEqual 3567.1406f
|
||||
omft.deploy.pos.coord.y mustEqual 2988.0078f
|
||||
omft.deploy.pos.coord.z mustEqual 71.84375f
|
||||
omft.deploy.pos.orient.x mustEqual 0f
|
||||
omft.deploy.pos.orient.y mustEqual 0f
|
||||
omft.deploy.pos.orient.z mustEqual 185.625f
|
||||
omft.deploy.pos.coord mustEqual Vector3(3567.1406f, 2988.0078f, 71.84375f)
|
||||
omft.deploy.pos.orient mustEqual Vector3(0, 0, 185.625f)
|
||||
omft.deploy.faction mustEqual PlanetSideEmpire.VS
|
||||
omft.deploy.unk mustEqual 2
|
||||
omft.deploy.player_guid mustEqual PlanetSideGUID(2502)
|
||||
omft.deploy.unk1 mustEqual 2
|
||||
omft.deploy.owner_guid mustEqual PlanetSideGUID(2502)
|
||||
omft.health mustEqual 255
|
||||
omft.internals.isDefined mustEqual true
|
||||
val internals = omft.internals.get
|
||||
internals.objectClass mustEqual ObjectClass.energy_gun_vs
|
||||
internals.guid mustEqual PlanetSideGUID(2615)
|
||||
internals.parentSlot mustEqual 1
|
||||
internals.obj.isInstanceOf[WeaponData] mustEqual true
|
||||
val wep = internals.obj.asInstanceOf[WeaponData]
|
||||
val internals = omft.internals.get.contents
|
||||
internals.head.objectClass mustEqual ObjectClass.energy_gun_vs
|
||||
internals.head.guid mustEqual PlanetSideGUID(2615)
|
||||
internals.head.parentSlot mustEqual 1
|
||||
internals.head.obj.isInstanceOf[WeaponData] mustEqual true
|
||||
val wep = internals.head.obj.asInstanceOf[WeaponData]
|
||||
wep.unk1 mustEqual 0x6
|
||||
wep.unk2 mustEqual 0x8
|
||||
wep.fire_mode mustEqual 0
|
||||
|
|
@ -55,20 +51,16 @@ class OneMannedFieldTurretDataTest extends Specification {
|
|||
|
||||
"encode (orion)" in {
|
||||
val obj = OneMannedFieldTurretData(
|
||||
CommonFieldData(
|
||||
PlacementData(3567.1406f, 2988.0078f, 71.84375f, 0f, 0f, 185.625f),
|
||||
PlanetSideEmpire.VS, 2, PlanetSideGUID(2502)
|
||||
SmallDeployableData(
|
||||
PlacementData(Vector3(3567.1406f, 2988.0078f, 71.84375f), Vector3(0, 0, 185.625f)),
|
||||
PlanetSideEmpire.VS, false, false, 2, false, false, PlanetSideGUID(2502)
|
||||
),
|
||||
255,
|
||||
OneMannedFieldTurretData.orion(PlanetSideGUID(2615), 0x6, 0x8, PlanetSideGUID(2510), 8)
|
||||
InventoryData(List(OneMannedFieldTurretData.orion(PlanetSideGUID(2615), 0x6, 0x8, PlanetSideGUID(2510), 8)))
|
||||
)
|
||||
val msg = ObjectCreateMessage(ObjectClass.portable_manned_turret_vs, PlanetSideGUID(2916), obj)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
val pkt_bitv = pkt.toBitVector
|
||||
val ori_bitv = string_orion.toBitVector
|
||||
pkt_bitv.take(189) mustEqual ori_bitv.take(189)
|
||||
pkt_bitv.drop(200) mustEqual ori_bitv.drop(200)
|
||||
//TODO work on OneMannedFieldTurretData to make this pass as a single stream
|
||||
pkt mustEqual string_orion
|
||||
}
|
||||
|
||||
"avenger" in {
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ package game.objectcreate
|
|||
import net.psforever.packet.PacketCoding
|
||||
import net.psforever.packet.game.{ObjectCreateMessage, PlanetSideGUID}
|
||||
import net.psforever.packet.game.objectcreate._
|
||||
import net.psforever.types.PlanetSideEmpire
|
||||
import net.psforever.types.{PlanetSideEmpire, Vector3}
|
||||
import org.specs2.mutable._
|
||||
import scodec.bits._
|
||||
|
||||
|
|
@ -22,14 +22,14 @@ class SmallDeployableDataTest extends Specification {
|
|||
data.isDefined mustEqual true
|
||||
data.get.isInstanceOf[SmallDeployableData] mustEqual true
|
||||
val boomer = data.get.asInstanceOf[SmallDeployableData]
|
||||
boomer.deploy.pos.coord.x mustEqual 4704.172f
|
||||
boomer.deploy.pos.coord.y mustEqual 5546.4375f
|
||||
boomer.deploy.pos.coord.z mustEqual 82.234375f
|
||||
boomer.deploy.pos.orient.x mustEqual 0f
|
||||
boomer.deploy.pos.orient.y mustEqual 0f
|
||||
boomer.deploy.pos.orient.z mustEqual 272.8125f
|
||||
boomer.deploy.unk mustEqual 0
|
||||
boomer.deploy.player_guid mustEqual PlanetSideGUID(4145)
|
||||
boomer.pos.coord.x mustEqual 4704.172f
|
||||
boomer.pos.coord.y mustEqual 5546.4375f
|
||||
boomer.pos.coord.z mustEqual 82.234375f
|
||||
boomer.pos.orient.x mustEqual 0f
|
||||
boomer.pos.orient.y mustEqual 0f
|
||||
boomer.pos.orient.z mustEqual 272.8125f
|
||||
boomer.unk1 mustEqual 0
|
||||
boomer.owner_guid mustEqual PlanetSideGUID(8290)
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
|
|
@ -37,10 +37,8 @@ class SmallDeployableDataTest extends Specification {
|
|||
|
||||
"encode (boomer)" in {
|
||||
val obj = SmallDeployableData(
|
||||
CommonFieldData(
|
||||
PlacementData(4704.172f, 5546.4375f, 82.234375f, 0f, 0f, 272.8125f),
|
||||
PlanetSideEmpire.TR, 0, PlanetSideGUID(4145)
|
||||
)
|
||||
PlacementData(Vector3(4704.172f, 5546.4375f, 82.234375f), Vector3.z(272.8125f)),
|
||||
PlanetSideEmpire.TR, false, false, 0, false, false, PlanetSideGUID(8290)
|
||||
)
|
||||
val msg = ObjectCreateMessage(ObjectClass.boomer, PlanetSideGUID(3840), obj)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@ package game.objectcreate
|
|||
|
||||
import net.psforever.packet.PacketCoding
|
||||
import net.psforever.packet.game.{ObjectCreateMessage, PlanetSideGUID}
|
||||
import net.psforever.packet.game.objectcreate._
|
||||
import net.psforever.types.PlanetSideEmpire
|
||||
import net.psforever.packet.game.objectcreate.{SmallDeployableData, _}
|
||||
import net.psforever.types.{PlanetSideEmpire, Vector3}
|
||||
import org.specs2.mutable._
|
||||
import scodec.bits._
|
||||
|
||||
|
|
@ -23,16 +23,12 @@ class SmallTurretDataTest extends Specification {
|
|||
data.isDefined mustEqual true
|
||||
data.get.isInstanceOf[SmallTurretData] mustEqual true
|
||||
val turret = data.get.asInstanceOf[SmallTurretData]
|
||||
turret.deploy.pos.coord.x mustEqual 4577.7812f
|
||||
turret.deploy.pos.coord.y mustEqual 5624.828f
|
||||
turret.deploy.pos.coord.z mustEqual 72.046875f
|
||||
turret.deploy.pos.orient.x mustEqual 0f
|
||||
turret.deploy.pos.orient.y mustEqual 2.8125f
|
||||
turret.deploy.pos.orient.z mustEqual 264.375f
|
||||
turret.deploy.pos.coord mustEqual Vector3(4577.7812f, 5624.828f, 72.046875f)
|
||||
turret.deploy.pos.orient mustEqual Vector3(0, 2.8125f, 264.375f)
|
||||
turret.deploy.faction mustEqual PlanetSideEmpire.NC
|
||||
turret.deploy.destroyed mustEqual true
|
||||
turret.deploy.unk mustEqual 2
|
||||
turret.deploy.player_guid mustEqual PlanetSideGUID(3871)
|
||||
turret.deploy.unk1 mustEqual 2
|
||||
turret.deploy.owner_guid mustEqual PlanetSideGUID(7742)
|
||||
turret.health mustEqual 0
|
||||
turret.internals.isDefined mustEqual false
|
||||
case _ =>
|
||||
|
|
@ -50,23 +46,19 @@ class SmallTurretDataTest extends Specification {
|
|||
data.isDefined mustEqual true
|
||||
data.get.isInstanceOf[SmallTurretData] mustEqual true
|
||||
val turret = data.get.asInstanceOf[SmallTurretData]
|
||||
turret.deploy.pos.coord.x mustEqual 4527.633f
|
||||
turret.deploy.pos.coord.y mustEqual 6271.3594f
|
||||
turret.deploy.pos.coord.z mustEqual 70.265625f
|
||||
turret.deploy.pos.orient.x mustEqual 0f
|
||||
turret.deploy.pos.orient.y mustEqual 0f
|
||||
turret.deploy.pos.orient.z mustEqual 154.6875f
|
||||
turret.deploy.pos.coord mustEqual Vector3(4527.633f, 6271.3594f, 70.265625f)
|
||||
turret.deploy.pos.orient mustEqual Vector3(0, 0, 154.6875f)
|
||||
turret.deploy.faction mustEqual PlanetSideEmpire.VS
|
||||
turret.deploy.unk mustEqual 2
|
||||
turret.deploy.player_guid mustEqual PlanetSideGUID(4232)
|
||||
turret.deploy.unk1 mustEqual 2
|
||||
turret.deploy.owner_guid mustEqual PlanetSideGUID(8208)
|
||||
turret.health mustEqual 255
|
||||
turret.internals.isDefined mustEqual true
|
||||
val internals = turret.internals.get
|
||||
internals.objectClass mustEqual ObjectClass.spitfire_weapon
|
||||
internals.guid mustEqual PlanetSideGUID(3064)
|
||||
internals.parentSlot mustEqual 0
|
||||
internals.obj.isInstanceOf[WeaponData] mustEqual true
|
||||
val wep = internals.obj.asInstanceOf[WeaponData]
|
||||
val internals = turret.internals.get.contents
|
||||
internals.head.objectClass mustEqual ObjectClass.spitfire_weapon
|
||||
internals.head.guid mustEqual PlanetSideGUID(3064)
|
||||
internals.head.parentSlot mustEqual 0
|
||||
internals.head.obj.isInstanceOf[WeaponData] mustEqual true
|
||||
val wep = internals.head.obj.asInstanceOf[WeaponData]
|
||||
wep.unk1 mustEqual 0x6
|
||||
wep.unk2 mustEqual 0x8
|
||||
wep.fire_mode mustEqual 0
|
||||
|
|
@ -83,37 +75,29 @@ class SmallTurretDataTest extends Specification {
|
|||
|
||||
"encode (spitfire, short)" in {
|
||||
val obj = SmallTurretData(
|
||||
CommonFieldData(
|
||||
PlacementData(4577.7812f, 5624.828f, 72.046875f, 0f, 2.8125f, 264.375f),
|
||||
PlanetSideEmpire.NC, true, 2, PlanetSideGUID(3871)
|
||||
SmallDeployableData(
|
||||
PlacementData(Vector3(4577.7812f, 5624.828f, 72.046875f), Vector3(0, 2.8125f, 264.375f)),
|
||||
PlanetSideEmpire.NC, false, true, 2, false, false, PlanetSideGUID(7742)
|
||||
),
|
||||
255 //sets to 0
|
||||
)
|
||||
val msg = ObjectCreateMessage(ObjectClass.spitfire_turret, PlanetSideGUID(4208), obj)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
val pkt_bitv = pkt.toBitVector
|
||||
val ori_bitv = string_spitfire_short.toBitVector
|
||||
pkt_bitv.take(173) mustEqual ori_bitv.take(173)
|
||||
pkt_bitv.drop(185) mustEqual ori_bitv.drop(185)
|
||||
//TODO work on SmallTurretData to make this pass as a single stream
|
||||
pkt mustEqual string_spitfire_short
|
||||
}
|
||||
|
||||
"encode (spitfire)" in {
|
||||
val obj = SmallTurretData(
|
||||
CommonFieldData(
|
||||
PlacementData(4527.633f, 6271.3594f, 70.265625f, 0f, 0f, 154.6875f),
|
||||
PlanetSideEmpire.VS, 2, PlanetSideGUID(4232)
|
||||
SmallDeployableData(
|
||||
PlacementData(Vector3(4527.633f, 6271.3594f, 70.265625f), Vector3(0, 0, 154.6875f)),
|
||||
PlanetSideEmpire.VS, false, false, 2, false, true, PlanetSideGUID(8208)
|
||||
),
|
||||
255,
|
||||
SmallTurretData.spitfire(PlanetSideGUID(3064), 0x6, 0x8, PlanetSideGUID(3694), 8)
|
||||
InventoryData(List(SmallTurretData.spitfire(PlanetSideGUID(3064), 0x6, 0x8, PlanetSideGUID(3694), 8)))
|
||||
)
|
||||
val msg = ObjectCreateMessage(ObjectClass.spitfire_turret, PlanetSideGUID(4265), obj)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
val pkt_bitv = pkt.toBitVector
|
||||
val ori_bitv = string_spitfire.toBitVector
|
||||
pkt_bitv.take(173) mustEqual ori_bitv.take(173)
|
||||
pkt_bitv.drop(185) mustEqual ori_bitv.drop(185)
|
||||
//TODO work on SmallTurretData to make this pass as a single stream
|
||||
pkt mustEqual string_spitfire
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ package game.objectcreate
|
|||
import net.psforever.packet.PacketCoding
|
||||
import net.psforever.packet.game.{ObjectCreateMessage, PlanetSideGUID}
|
||||
import net.psforever.packet.game.objectcreate._
|
||||
import net.psforever.types.PlanetSideEmpire
|
||||
import net.psforever.types.{PlanetSideEmpire, Vector3}
|
||||
import org.specs2.mutable._
|
||||
import scodec.bits._
|
||||
|
||||
|
|
@ -22,16 +22,11 @@ class TRAPDataTest extends Specification {
|
|||
data.isDefined mustEqual true
|
||||
data.get.isInstanceOf[TRAPData] mustEqual true
|
||||
val trap = data.get.asInstanceOf[TRAPData]
|
||||
trap.deploy.pos.coord.x mustEqual 3572.4453f
|
||||
trap.deploy.pos.coord.y mustEqual 3277.9766f
|
||||
trap.deploy.pos.coord.z mustEqual 114.0f
|
||||
trap.deploy.pos.orient.x mustEqual 0f
|
||||
trap.deploy.pos.orient.y mustEqual 0f
|
||||
trap.deploy.pos.orient.z mustEqual 90.0f
|
||||
trap.deploy.pos.coord mustEqual Vector3(3572.4453f, 3277.9766f, 114.0f)
|
||||
trap.deploy.pos.orient mustEqual Vector3(0, 0, 90)
|
||||
trap.deploy.faction mustEqual PlanetSideEmpire.VS
|
||||
trap.deploy.unk mustEqual 2
|
||||
trap.deploy.owner_guid mustEqual PlanetSideGUID(4748)
|
||||
trap.health mustEqual 255
|
||||
trap.deploy.player_guid mustEqual PlanetSideGUID(2502)
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
|
|
@ -39,9 +34,9 @@ class TRAPDataTest extends Specification {
|
|||
|
||||
"encode" in {
|
||||
val obj = TRAPData(
|
||||
CommonFieldData(
|
||||
SmallDeployableData(
|
||||
PlacementData(3572.4453f, 3277.9766f, 114.0f, 0f, 0f, 90.0f),
|
||||
PlanetSideEmpire.VS, 2, PlanetSideGUID(2502)
|
||||
PlanetSideEmpire.VS, false, false, 2, false, true, PlanetSideGUID(4748)
|
||||
),
|
||||
255
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,15 +1,13 @@
|
|||
// Copyright (c) 2017 PSForever
|
||||
package objects
|
||||
|
||||
import net.psforever.objects.definition.converter.{ACEConverter, CharacterSelectConverter, DestroyedVehicleConverter, REKConverter}
|
||||
import net.psforever.objects.definition.converter.{CharacterSelectConverter, DestroyedVehicleConverter, REKConverter}
|
||||
import net.psforever.objects._
|
||||
import net.psforever.objects.definition._
|
||||
import net.psforever.objects.equipment.CItem.{DeployedItem, Unit}
|
||||
import net.psforever.objects.equipment._
|
||||
import net.psforever.objects.inventory.InventoryTile
|
||||
import net.psforever.objects.serverobject.terminals.Terminal
|
||||
import net.psforever.objects.serverobject.tube.SpawnTube
|
||||
import net.psforever.objects.vehicles.DestroyedVehicle
|
||||
import net.psforever.packet.game.PlanetSideGUID
|
||||
import net.psforever.packet.game.objectcreate._
|
||||
import net.psforever.types.{CharacterGender, CharacterVoice, PlanetSideEmpire, Vector3}
|
||||
|
|
@ -109,13 +107,7 @@ class ConverterTest extends Specification {
|
|||
|
||||
"ConstructionItem" should {
|
||||
"convert to packet" in {
|
||||
val cdef = ConstructionItemDefinition(Unit.advanced_ace)
|
||||
cdef.Modes += DeployedItem.tank_traps
|
||||
cdef.Modes += DeployedItem.portable_manned_turret_tr
|
||||
cdef.Modes += DeployedItem.deployable_shield_generator
|
||||
cdef.Tile = InventoryTile.Tile63
|
||||
cdef.Packet = new ACEConverter()
|
||||
val obj = ConstructionItem(cdef)
|
||||
val obj = ConstructionItem(GlobalDefinitions.ace)
|
||||
obj.GUID = PlanetSideGUID(90)
|
||||
obj.Definition.Packet.DetailedConstructorData(obj) match {
|
||||
case Success(pkt) =>
|
||||
|
|
@ -123,6 +115,7 @@ class ConverterTest extends Specification {
|
|||
case _ =>
|
||||
ko
|
||||
}
|
||||
|
||||
obj.Definition.Packet.ConstructorData(obj) match {
|
||||
case Success(pkt) =>
|
||||
pkt mustEqual ACEData(0,0)
|
||||
|
|
@ -154,6 +147,158 @@ class ConverterTest extends Specification {
|
|||
}
|
||||
}
|
||||
|
||||
"BoomerTrigger" should {
|
||||
"convert" in {
|
||||
val obj = new BoomerTrigger
|
||||
obj.GUID = PlanetSideGUID(90)
|
||||
obj.Definition.Packet.DetailedConstructorData(obj) match {
|
||||
case Success(pkt) =>
|
||||
pkt mustEqual DetailedBoomerTriggerData()
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
obj.Definition.Packet.ConstructorData(obj) match {
|
||||
case Success(pkt) =>
|
||||
pkt mustEqual BoomerTriggerData()
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
"SmallDeployable" should {
|
||||
"convert" in {
|
||||
val obj = new SensorDeployable(GlobalDefinitions.motionalarmsensor)
|
||||
obj.Faction = PlanetSideEmpire.TR
|
||||
obj.Definition.Packet.DetailedConstructorData(obj).isFailure mustEqual true
|
||||
|
||||
obj.Definition.Packet.ConstructorData(obj) match {
|
||||
case Success(pkt) =>
|
||||
pkt mustEqual SmallDeployableData(
|
||||
PlacementData(Vector3.Zero, Vector3.Zero),
|
||||
PlanetSideEmpire.TR,
|
||||
0,
|
||||
false,
|
||||
false
|
||||
)
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
"SmallTurret" should {
|
||||
"convert" in {
|
||||
val obj = new TurretDeployable(GlobalDefinitions.spitfire_turret)
|
||||
obj.Faction = PlanetSideEmpire.TR
|
||||
obj.GUID = PlanetSideGUID(90)
|
||||
obj.Weapons(1).Equipment.get.GUID = PlanetSideGUID(91)
|
||||
obj.Weapons(1).Equipment.get.asInstanceOf[Tool].AmmoSlot.Box.GUID = PlanetSideGUID(92)
|
||||
obj.Definition.Packet.DetailedConstructorData(obj).isFailure mustEqual true
|
||||
|
||||
obj.Definition.Packet.ConstructorData(obj) match {
|
||||
case Success(pkt) =>
|
||||
pkt mustEqual SmallTurretData(
|
||||
SmallDeployableData(
|
||||
PlacementData(Vector3.Zero, Vector3.Zero),
|
||||
PlanetSideEmpire.TR,
|
||||
0,
|
||||
false,
|
||||
false
|
||||
),
|
||||
255,
|
||||
InventoryData(
|
||||
List(InternalSlot(ObjectClass.spitfire_weapon, PlanetSideGUID(91), 1,
|
||||
WeaponData(4, 8, ObjectClass.spitfire_ammo, PlanetSideGUID(92), 0, AmmoBoxData()))
|
||||
)
|
||||
)
|
||||
)
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
"FieldTurret" should {
|
||||
"convert" in {
|
||||
val obj = new TurretDeployable(GlobalDefinitions.portable_manned_turret_tr)
|
||||
obj.Faction = PlanetSideEmpire.TR
|
||||
obj.GUID = PlanetSideGUID(90)
|
||||
obj.Weapons(1).Equipment.get.GUID = PlanetSideGUID(91)
|
||||
obj.Weapons(1).Equipment.get.asInstanceOf[Tool].AmmoSlot.Box.GUID = PlanetSideGUID(92)
|
||||
obj.Definition.Packet.DetailedConstructorData(obj).isFailure mustEqual true
|
||||
|
||||
obj.Definition.Packet.ConstructorData(obj) match {
|
||||
case Success(pkt) =>
|
||||
pkt mustEqual OneMannedFieldTurretData(
|
||||
SmallDeployableData(
|
||||
PlacementData(Vector3.Zero, Vector3.Zero),
|
||||
PlanetSideEmpire.TR,
|
||||
0,
|
||||
false,
|
||||
false
|
||||
),
|
||||
255,
|
||||
InventoryData(
|
||||
List(InternalSlot(ObjectClass.energy_gun_tr, PlanetSideGUID(91), 1,
|
||||
WeaponData(4, 8, ObjectClass.energy_gun_ammo, PlanetSideGUID(92), 0, AmmoBoxData()))
|
||||
)
|
||||
)
|
||||
)
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
"TRAP" should {
|
||||
"convert" in {
|
||||
val obj = new TrapDeployable(GlobalDefinitions.tank_traps)
|
||||
obj.Faction = PlanetSideEmpire.TR
|
||||
obj.GUID = PlanetSideGUID(90)
|
||||
obj.Definition.Packet.DetailedConstructorData(obj).isFailure mustEqual true
|
||||
|
||||
obj.Definition.Packet.ConstructorData(obj) match {
|
||||
case Success(pkt) =>
|
||||
pkt mustEqual TRAPData(
|
||||
SmallDeployableData(
|
||||
PlacementData(Vector3.Zero, Vector3.Zero),
|
||||
PlanetSideEmpire.TR,
|
||||
0,
|
||||
false,
|
||||
false
|
||||
),
|
||||
255
|
||||
)
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
"ShieldGenerator" should {
|
||||
"convert" in {
|
||||
val obj = new ShieldGeneratorDeployable(GlobalDefinitions.deployable_shield_generator)
|
||||
obj.Faction = PlanetSideEmpire.TR
|
||||
obj.GUID = PlanetSideGUID(90)
|
||||
obj.Definition.Packet.DetailedConstructorData(obj).isFailure mustEqual true
|
||||
|
||||
obj.Definition.Packet.ConstructorData(obj) match {
|
||||
case Success(pkt) =>
|
||||
pkt mustEqual AegisShieldGeneratorData(
|
||||
CommonFieldData(
|
||||
PlacementData(Vector3.Zero, Vector3.Zero),
|
||||
PlanetSideEmpire.TR,
|
||||
0
|
||||
),
|
||||
255
|
||||
)
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
"Player" should {
|
||||
val avatar = Avatar("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
|
||||
val obj : Player = {
|
||||
|
|
|
|||
330
common/src/test/scala/objects/DeployableTest.scala
Normal file
330
common/src/test/scala/objects/DeployableTest.scala
Normal file
|
|
@ -0,0 +1,330 @@
|
|||
// Copyright (c) 2017 PSForever
|
||||
package objects
|
||||
|
||||
import akka.actor.{Actor, ActorRef, Props}
|
||||
import base.ActorTest
|
||||
import net.psforever.objects.ce.DeployedItem
|
||||
import net.psforever.objects.serverobject.mount.Mountable
|
||||
import net.psforever.objects.{TurretDeployable, _}
|
||||
import net.psforever.packet.game.PlanetSideGUID
|
||||
import net.psforever.types.{CharacterGender, CharacterVoice, PlanetSideEmpire}
|
||||
import org.specs2.mutable.Specification
|
||||
|
||||
import scala.concurrent.duration._
|
||||
|
||||
class DeployableTest extends Specification {
|
||||
"Deployable" should {
|
||||
"know its owner by GUID" in {
|
||||
val obj = new ExplosiveDeployable(GlobalDefinitions.he_mine)
|
||||
obj.Owner mustEqual None
|
||||
obj.Owner = PlanetSideGUID(10)
|
||||
obj.Owner mustEqual Some(PlanetSideGUID(10))
|
||||
}
|
||||
|
||||
"know its owner by GUID" in {
|
||||
val obj = new ExplosiveDeployable(GlobalDefinitions.he_mine)
|
||||
obj.OwnerName mustEqual None
|
||||
obj.OwnerName = "TestCharacter"
|
||||
obj.OwnerName mustEqual Some("TestCharacter")
|
||||
}
|
||||
|
||||
"know its faction allegiance" in {
|
||||
val obj = new ExplosiveDeployable(GlobalDefinitions.he_mine)
|
||||
obj.Faction mustEqual PlanetSideEmpire.NEUTRAL
|
||||
obj.Faction = PlanetSideEmpire.TR
|
||||
obj.Faction mustEqual PlanetSideEmpire.TR
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class SensorDeployableTest extends Specification {
|
||||
"SensorDeployable" should {
|
||||
"construct" in {
|
||||
new SensorDeployable(GlobalDefinitions.motionalarmsensor)
|
||||
ok
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class ExplosiveDeployableTest extends Specification {
|
||||
"ExplosiveDeployable" should {
|
||||
"construct" in {
|
||||
val obj = new ExplosiveDeployable(GlobalDefinitions.he_mine)
|
||||
obj.Exploded mustEqual false
|
||||
}
|
||||
|
||||
"explode" in {
|
||||
val obj = new ExplosiveDeployable(GlobalDefinitions.he_mine)
|
||||
obj.Exploded mustEqual false
|
||||
obj.Exploded = true
|
||||
obj.Exploded mustEqual true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class BoomerDeployableTest extends Specification {
|
||||
"BoomerDeployable" should {
|
||||
"construct" in {
|
||||
val obj = new BoomerDeployable(GlobalDefinitions.boomer)
|
||||
obj.Exploded mustEqual false
|
||||
obj.Trigger mustEqual None
|
||||
}
|
||||
|
||||
"explode" in {
|
||||
val obj = new BoomerDeployable(GlobalDefinitions.boomer)
|
||||
obj.Exploded mustEqual false
|
||||
obj.Exploded = true
|
||||
obj.Exploded mustEqual true
|
||||
}
|
||||
|
||||
"manage its trigger" in {
|
||||
val obj = new BoomerDeployable(GlobalDefinitions.boomer)
|
||||
obj.Trigger mustEqual None
|
||||
|
||||
val trigger = new BoomerTrigger
|
||||
obj.Trigger = trigger
|
||||
obj.Trigger mustEqual Some(trigger)
|
||||
|
||||
obj.Trigger = None
|
||||
obj.Trigger mustEqual None
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class TrapDeployableTest extends Specification {
|
||||
"SensorDeployable" should {
|
||||
"construct" in {
|
||||
val obj = new TrapDeployable(GlobalDefinitions.tank_traps)
|
||||
obj.Health mustEqual GlobalDefinitions.tank_traps.MaxHealth
|
||||
}
|
||||
|
||||
"update health values" in {
|
||||
val obj = new TrapDeployable(GlobalDefinitions.tank_traps)
|
||||
obj.Health mustEqual GlobalDefinitions.tank_traps.MaxHealth
|
||||
obj.Health = 0
|
||||
obj.Health mustEqual 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class TurretDeployableTest extends Specification {
|
||||
"TurretDeployable" should {
|
||||
"define (valid turret objects)" in {
|
||||
List(
|
||||
DeployedItem.spitfire_turret.id, DeployedItem.spitfire_cloaked.id, DeployedItem.spitfire_aa.id,
|
||||
DeployedItem.portable_manned_turret.id, DeployedItem.portable_manned_turret_tr.id,
|
||||
DeployedItem.portable_manned_turret_nc.id, DeployedItem.portable_manned_turret_vs.id
|
||||
).foreach(id => {
|
||||
try { new TurretDeployableDefinition(id) } catch { case _ : Exception => ko }
|
||||
})
|
||||
ok
|
||||
}
|
||||
|
||||
"define (invalid object)" in {
|
||||
new TurretDeployableDefinition(5) must throwA[NoSuchElementException] //wrong object id altogether
|
||||
}
|
||||
|
||||
"construct" in {
|
||||
val obj = new TurretDeployable(GlobalDefinitions.spitfire_turret)
|
||||
obj.Health mustEqual obj.MaxHealth
|
||||
}
|
||||
|
||||
"update health values" in {
|
||||
val obj = new TurretDeployable(GlobalDefinitions.spitfire_turret)
|
||||
obj.Health mustEqual GlobalDefinitions.spitfire_turret.MaxHealth
|
||||
obj.Health = 0
|
||||
obj.Health mustEqual 0
|
||||
}
|
||||
|
||||
"may have mount point" in {
|
||||
new TurretDeployable(GlobalDefinitions.spitfire_turret).MountPoints mustEqual Map()
|
||||
new TurretDeployable(GlobalDefinitions.portable_manned_turret_vs).MountPoints mustEqual Map(1 -> 0, 2 -> 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class ShieldGeneratorDeployableTest extends Specification {
|
||||
"ShieldGeneratorDeployable" should {
|
||||
"construct" in {
|
||||
val obj = new ShieldGeneratorDeployable(GlobalDefinitions.deployable_shield_generator)
|
||||
obj.Health mustEqual obj.MaxHealth
|
||||
}
|
||||
|
||||
"update health values" in {
|
||||
val obj = new ShieldGeneratorDeployable(GlobalDefinitions.deployable_shield_generator)
|
||||
obj.Health mustEqual GlobalDefinitions.deployable_shield_generator.MaxHealth
|
||||
obj.Health = 0
|
||||
obj.Health mustEqual 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class TurretControlConstructTest extends ActorTest {
|
||||
"TurretControl" should {
|
||||
"construct" in {
|
||||
val obj = new TurretDeployable(GlobalDefinitions.spitfire_turret)
|
||||
system.actorOf(Props(classOf[TurretControl], obj), s"${obj.Definition.Name}_test")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class TurretControlInitializeTest extends ActorTest {
|
||||
"TurretControl" should {
|
||||
"initialize" in {
|
||||
val obj = new TurretDeployable(GlobalDefinitions.spitfire_turret)
|
||||
obj.GUID = PlanetSideGUID(1)
|
||||
assert(obj.Actor == ActorRef.noSender)
|
||||
val init = system.actorOf(Props(classOf[DeployableTest.TurretInitializer], obj), "init_turret_test")
|
||||
init ! "initialize"
|
||||
expectNoMsg(200 milliseconds)
|
||||
assert(obj.Actor != ActorRef.noSender)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class TurretControlUninitializeTest extends ActorTest {
|
||||
"TurretControl" should {
|
||||
"uninitialize" in {
|
||||
val obj = new TurretDeployable(GlobalDefinitions.spitfire_turret)
|
||||
val init = system.actorOf(Props(classOf[DeployableTest.TurretInitializer], obj), "init_turret_test")
|
||||
obj.GUID = PlanetSideGUID(1)
|
||||
init ! "initialize"
|
||||
expectNoMsg(200 milliseconds)
|
||||
assert(obj.Actor != ActorRef.noSender)
|
||||
|
||||
init ! "uninitialize"
|
||||
expectNoMsg(200 milliseconds)
|
||||
assert(obj.Actor == ActorRef.noSender)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class TurretControlMountTest extends ActorTest {
|
||||
"TurretControl" should {
|
||||
"control mounting" in {
|
||||
val obj = new TurretDeployable(GlobalDefinitions.portable_manned_turret_tr) { GUID = PlanetSideGUID(1) }
|
||||
obj.Faction = PlanetSideEmpire.TR
|
||||
obj.Actor = system.actorOf(Props(classOf[TurretControl], obj), s"${obj.Definition.Name}_test")
|
||||
|
||||
assert(obj.Seats(0).Occupant.isEmpty)
|
||||
val player1 = Player(Avatar("test1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
|
||||
obj.Actor ! Mountable.TryMount(player1, 0)
|
||||
val reply1a = receiveOne(200 milliseconds)
|
||||
assert(reply1a.isInstanceOf[Mountable.MountMessages])
|
||||
val reply1b = reply1a.asInstanceOf[Mountable.MountMessages]
|
||||
assert(reply1b.player == player1)
|
||||
assert(reply1b.response.isInstanceOf[Mountable.CanMount])
|
||||
assert(obj.Seats(0).Occupant.contains(player1))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class TurretControlBlockMountTest extends ActorTest {
|
||||
"TurretControl" should {
|
||||
"block mounting by others if already mounted by someone" in {
|
||||
val obj = new TurretDeployable(GlobalDefinitions.portable_manned_turret_tr) { GUID = PlanetSideGUID(1) }
|
||||
obj.Faction = PlanetSideEmpire.TR
|
||||
obj.Actor = system.actorOf(Props(classOf[TurretControl], obj), s"${obj.Definition.Name}_test")
|
||||
|
||||
assert(obj.Seats(0).Occupant.isEmpty)
|
||||
val player1 = Player(Avatar("test1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
|
||||
obj.Actor ! Mountable.TryMount(player1, 0)
|
||||
val reply1a = receiveOne(200 milliseconds)
|
||||
assert(reply1a.isInstanceOf[Mountable.MountMessages])
|
||||
val reply1b = reply1a.asInstanceOf[Mountable.MountMessages]
|
||||
assert(reply1b.player == player1)
|
||||
assert(reply1b.response.isInstanceOf[Mountable.CanMount])
|
||||
assert(obj.Seats(0).Occupant.contains(player1))
|
||||
|
||||
val player2 = Player(Avatar("test2", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
|
||||
obj.Actor ! Mountable.TryMount(player2, 0)
|
||||
val reply2a = receiveOne(200 milliseconds)
|
||||
assert(reply2a.isInstanceOf[Mountable.MountMessages])
|
||||
val reply2b = reply2a.asInstanceOf[Mountable.MountMessages]
|
||||
assert(reply2b.player == player2)
|
||||
assert(reply2b.response.isInstanceOf[Mountable.CanNotMount])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class TurretControlBlockBetrayalMountTest extends ActorTest {
|
||||
"TurretControl" should {
|
||||
"block mounting by players of another faction" in {
|
||||
val obj = new TurretDeployable(GlobalDefinitions.portable_manned_turret_tr) { GUID = PlanetSideGUID(1) }
|
||||
obj.Faction = PlanetSideEmpire.TR
|
||||
obj.Actor = system.actorOf(Props(classOf[TurretControl], obj), s"${obj.Definition.Name}_test")
|
||||
|
||||
assert(obj.Seats(0).Occupant.isEmpty)
|
||||
val player = Player(Avatar("test", PlanetSideEmpire.VS, CharacterGender.Male, 0, CharacterVoice.Mute))
|
||||
obj.Actor ! Mountable.TryMount(player, 0)
|
||||
val reply1a = receiveOne(200 milliseconds)
|
||||
assert(reply1a.isInstanceOf[Mountable.MountMessages])
|
||||
val reply1b = reply1a.asInstanceOf[Mountable.MountMessages]
|
||||
assert(reply1b.player == player)
|
||||
assert(reply1b.response.isInstanceOf[Mountable.CanNotMount])
|
||||
assert(obj.Seats(0).Occupant.isEmpty)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class TurretControlDismountTest extends ActorTest {
|
||||
"TurretControl" should {
|
||||
"control dismounting" in {
|
||||
val obj = new TurretDeployable(GlobalDefinitions.portable_manned_turret_tr) { GUID = PlanetSideGUID(1) }
|
||||
obj.Faction = PlanetSideEmpire.TR
|
||||
obj.Actor = system.actorOf(Props(classOf[TurretControl], obj), s"${obj.Definition.Name}_test")
|
||||
|
||||
assert(obj.Seats(0).Occupant.isEmpty)
|
||||
val player = Player(Avatar("test", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
|
||||
obj.Actor ! Mountable.TryMount(player, 0)
|
||||
val reply1a = receiveOne(200 milliseconds)
|
||||
assert(reply1a.isInstanceOf[Mountable.MountMessages])
|
||||
val reply1b = reply1a.asInstanceOf[Mountable.MountMessages]
|
||||
assert(reply1b.player == player)
|
||||
assert(reply1b.response.isInstanceOf[Mountable.CanMount])
|
||||
assert(obj.Seats(0).Occupant.contains(player))
|
||||
|
||||
obj.Actor ! Mountable.TryDismount(player, 0)
|
||||
val reply2a = receiveOne(200 milliseconds)
|
||||
assert(reply2a.isInstanceOf[Mountable.MountMessages])
|
||||
val reply2b = reply2a.asInstanceOf[Mountable.MountMessages]
|
||||
assert(reply2b.player == player)
|
||||
assert(reply2b.response.isInstanceOf[Mountable.CanDismount])
|
||||
assert(obj.Seats(0).Occupant.isEmpty)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class TurretControlBetrayalMountTest extends ActorTest {
|
||||
"TurretControl" should {
|
||||
"allow all allegiances" in {
|
||||
val obj = new TurretDeployable(
|
||||
new TurretDeployableDefinition(685) { FactionLocked = false } //required (defaults to true)
|
||||
) { GUID = PlanetSideGUID(1) }
|
||||
obj.Faction = PlanetSideEmpire.TR
|
||||
obj.Actor = system.actorOf(Props(classOf[TurretControl], obj), s"${obj.Definition.Name}_test")
|
||||
|
||||
assert(obj.Seats(0).Occupant.isEmpty)
|
||||
val player = Player(Avatar("test", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Mute))
|
||||
assert(player.Faction != obj.Faction)
|
||||
obj.Actor ! Mountable.TryMount(player, 0)
|
||||
val reply1a = receiveOne(200 milliseconds)
|
||||
assert(reply1a.isInstanceOf[Mountable.MountMessages])
|
||||
val reply1b = reply1a.asInstanceOf[Mountable.MountMessages]
|
||||
assert(reply1b.player == player)
|
||||
assert(reply1b.response.isInstanceOf[Mountable.CanMount])
|
||||
assert(obj.Seats(0).Occupant.contains(player))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
object DeployableTest {
|
||||
class TurretInitializer(obj : TurretDeployable) extends Actor {
|
||||
def receive : Receive = {
|
||||
case "initialize" =>
|
||||
obj.Definition.Initialize(obj, context)
|
||||
case "uninitialize" =>
|
||||
obj.Definition.Uninitialize(obj, context)
|
||||
}
|
||||
}
|
||||
}
|
||||
1054
common/src/test/scala/objects/DeployableToolboxTest.scala
Normal file
1054
common/src/test/scala/objects/DeployableToolboxTest.scala
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -2,11 +2,13 @@
|
|||
package objects
|
||||
|
||||
import net.psforever.objects._
|
||||
import net.psforever.objects.equipment.CItem.{DeployedItem, Unit}
|
||||
import net.psforever.objects.equipment._
|
||||
import net.psforever.objects.inventory.InventoryTile
|
||||
import net.psforever.objects.GlobalDefinitions._
|
||||
import net.psforever.objects.ce.DeployedItem
|
||||
import net.psforever.objects.definition._
|
||||
import net.psforever.packet.game.PlanetSideGUID
|
||||
import net.psforever.types.CertificationType
|
||||
import org.specs2.mutable._
|
||||
|
||||
class EquipmentTest extends Specification {
|
||||
|
|
@ -329,62 +331,57 @@ class EquipmentTest extends Specification {
|
|||
}
|
||||
|
||||
"ConstructionItem" should {
|
||||
val advanced_ace_tr = ConstructionItemDefinition(39)
|
||||
advanced_ace_tr.Modes += DeployedItem.tank_traps
|
||||
advanced_ace_tr.Modes += DeployedItem.portable_manned_turret_tr
|
||||
advanced_ace_tr.Modes += DeployedItem.deployable_shield_generator
|
||||
advanced_ace_tr.Tile = InventoryTile.Tile63
|
||||
|
||||
"define" in {
|
||||
val sample = ConstructionItemDefinition(Unit.advanced_ace)
|
||||
sample.Modes += DeployedItem.tank_traps
|
||||
sample.Modes += DeployedItem.portable_manned_turret_tr
|
||||
sample.Modes += DeployedItem.deployable_shield_generator
|
||||
sample.Tile = InventoryTile.Tile63
|
||||
sample.Modes.head mustEqual DeployedItem.tank_traps
|
||||
sample.Modes(1) mustEqual DeployedItem.portable_manned_turret_tr
|
||||
sample.Modes(2) mustEqual DeployedItem.deployable_shield_generator
|
||||
sample.Tile.Width mustEqual InventoryTile.Tile63.Width
|
||||
sample.Tile.Height mustEqual InventoryTile.Tile63.Height
|
||||
}
|
||||
|
||||
"construct" in {
|
||||
val obj : ConstructionItem = ConstructionItem(advanced_ace_tr)
|
||||
obj.Definition.ObjectId mustEqual advanced_ace_tr.ObjectId
|
||||
val obj : ConstructionItem = ConstructionItem(GlobalDefinitions.ace)
|
||||
obj.Definition.ObjectId mustEqual GlobalDefinitions.ace.ObjectId
|
||||
}
|
||||
|
||||
"fire mode" in {
|
||||
//explanation: router_telepad has one fire mode and that fire mode is our only option
|
||||
val router_telepad : ConstructionItemDefinition = ConstructionItemDefinition(Unit.router_telepad)
|
||||
router_telepad.Modes += DeployedItem.router_telepad_deployable
|
||||
val obj : ConstructionItem = ConstructionItem(router_telepad)
|
||||
//fmode = 0
|
||||
obj.FireModeIndex mustEqual 0
|
||||
obj.FireMode mustEqual DeployedItem.router_telepad_deployable
|
||||
//fmode -> 1 (0)
|
||||
obj.FireModeIndex = 1
|
||||
obj.FireModeIndex mustEqual 0
|
||||
obj.FireMode mustEqual DeployedItem.router_telepad_deployable
|
||||
"fire modes" in {
|
||||
val obj : ConstructionItem = ConstructionItem(GlobalDefinitions.ace)
|
||||
obj.AmmoType mustEqual DeployedItem.boomer
|
||||
obj.NextFireMode
|
||||
obj.AmmoType mustEqual DeployedItem.he_mine
|
||||
obj.NextFireMode
|
||||
obj.AmmoType mustEqual DeployedItem.spitfire_turret
|
||||
obj.NextFireMode
|
||||
obj.AmmoType mustEqual DeployedItem.motionalarmsensor
|
||||
obj.NextFireMode
|
||||
obj.AmmoType mustEqual DeployedItem.boomer
|
||||
}
|
||||
|
||||
"multiple fire modes" in {
|
||||
//explanation: advanced_ace_tr has three fire modes; adjusting the FireMode changes between them
|
||||
val obj : ConstructionItem = ConstructionItem(advanced_ace_tr)
|
||||
//fmode = 0
|
||||
obj.FireModeIndex mustEqual 0
|
||||
obj.FireMode mustEqual DeployedItem.tank_traps
|
||||
//fmode -> 1
|
||||
"ammo types" in {
|
||||
val obj : ConstructionItem = ConstructionItem(GlobalDefinitions.ace)
|
||||
obj.NextFireMode
|
||||
obj.FireModeIndex mustEqual 1
|
||||
obj.FireMode mustEqual DeployedItem.portable_manned_turret_tr
|
||||
//fmode -> 2
|
||||
obj.AmmoType mustEqual DeployedItem.he_mine
|
||||
obj.NextAmmoType
|
||||
obj.AmmoType mustEqual DeployedItem.jammer_mine
|
||||
obj.NextAmmoType
|
||||
obj.AmmoType mustEqual DeployedItem.he_mine
|
||||
}
|
||||
|
||||
"when switching fire modes, ammo mode resets to the first entry" in {
|
||||
val obj : ConstructionItem = ConstructionItem(GlobalDefinitions.ace)
|
||||
obj.NextFireMode
|
||||
obj.FireModeIndex mustEqual 2
|
||||
obj.FireMode mustEqual DeployedItem.deployable_shield_generator
|
||||
//fmode -> 0
|
||||
obj.AmmoType mustEqual DeployedItem.he_mine
|
||||
obj.NextAmmoType
|
||||
obj.AmmoType mustEqual DeployedItem.jammer_mine
|
||||
obj.NextFireMode //spitfire_turret
|
||||
obj.NextFireMode //motionalarmsensor
|
||||
obj.NextFireMode //boomer
|
||||
obj.NextFireMode
|
||||
obj.FireModeIndex mustEqual 0
|
||||
obj.FireMode mustEqual DeployedItem.tank_traps
|
||||
obj.AmmoType mustEqual DeployedItem.he_mine
|
||||
}
|
||||
|
||||
"qualify certifications that must be met before ammo types may be used" in {
|
||||
val obj : ConstructionItem = ConstructionItem(GlobalDefinitions.ace)
|
||||
obj.AmmoType mustEqual DeployedItem.boomer
|
||||
obj.ModePermissions mustEqual Set(CertificationType.CombatEngineering)
|
||||
obj.NextFireMode
|
||||
obj.AmmoType mustEqual DeployedItem.he_mine
|
||||
obj.ModePermissions mustEqual Set(CertificationType.CombatEngineering)
|
||||
obj.NextAmmoType
|
||||
obj.AmmoType mustEqual DeployedItem.jammer_mine
|
||||
obj.ModePermissions mustEqual Set(CertificationType.AssaultEngineering)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -399,4 +396,21 @@ class EquipmentTest extends Specification {
|
|||
obj.Definition.ObjectId mustEqual remote_electronics_kit.ObjectId
|
||||
}
|
||||
}
|
||||
|
||||
"BoomerTrigger" should {
|
||||
"construct" in {
|
||||
val obj : BoomerTrigger = new BoomerTrigger
|
||||
obj.Definition.ObjectId mustEqual boomer_trigger.ObjectId
|
||||
obj.Companion mustEqual None
|
||||
}
|
||||
|
||||
"boomer trigger has a companion object referenced by GUID" in {
|
||||
val obj : BoomerTrigger = new BoomerTrigger
|
||||
obj.Companion mustEqual None
|
||||
obj.Companion = PlanetSideGUID(1)
|
||||
obj.Companion.contains(PlanetSideGUID(1)) mustEqual true
|
||||
obj.Companion = None
|
||||
obj.Companion mustEqual None
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,11 +2,8 @@
|
|||
package objects
|
||||
|
||||
import net.psforever.objects._
|
||||
import net.psforever.objects.equipment.CItem.{DeployedItem, Unit}
|
||||
import net.psforever.objects.equipment._
|
||||
import net.psforever.objects.inventory.InventoryTile
|
||||
import net.psforever.objects.GlobalDefinitions._
|
||||
import net.psforever.objects.definition._
|
||||
import net.psforever.types.ExoSuitType
|
||||
import org.specs2.mutable._
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ import net.psforever.objects.{Avatar, GlobalDefinitions, Player, Tool}
|
|||
import net.psforever.objects.definition.ToolDefinition
|
||||
import net.psforever.objects.serverobject.mount.Mountable
|
||||
import net.psforever.objects.serverobject.structures.{Building, StructureType}
|
||||
import net.psforever.objects.serverobject.turret.{MannedTurret, MannedTurretControl, MannedTurretDefinition, TurretUpgrade}
|
||||
import net.psforever.objects.serverobject.turret._
|
||||
import net.psforever.objects.zones.Zone
|
||||
import net.psforever.packet.game.PlanetSideGUID
|
||||
import net.psforever.types.{CharacterGender, CharacterVoice, PlanetSideEmpire}
|
||||
|
|
@ -16,10 +16,10 @@ import org.specs2.mutable.Specification
|
|||
import scala.collection.mutable
|
||||
import scala.concurrent.duration._
|
||||
|
||||
class MannedTurretTest extends Specification {
|
||||
"MannedTurretTest" should {
|
||||
class FacilityTurretTest extends Specification {
|
||||
"FacilityTurretTest" should {
|
||||
"define" in {
|
||||
val obj = new MannedTurretDefinition(480)
|
||||
val obj = new TurretDefinition(480)
|
||||
obj.Weapons mustEqual mutable.HashMap.empty[TurretUpgrade.Value, ToolDefinition]
|
||||
obj.ReserveAmmunition mustEqual false
|
||||
obj.FactionLocked mustEqual true
|
||||
|
|
@ -28,7 +28,7 @@ class MannedTurretTest extends Specification {
|
|||
}
|
||||
|
||||
"construct" in {
|
||||
val obj = MannedTurret(GlobalDefinitions.manned_turret)
|
||||
val obj = FacilityTurret(GlobalDefinitions.manned_turret)
|
||||
obj.Weapons.size mustEqual 1
|
||||
obj.Weapons(1).Equipment match {
|
||||
case Some(tool : Tool) =>
|
||||
|
|
@ -51,7 +51,7 @@ class MannedTurretTest extends Specification {
|
|||
}
|
||||
|
||||
"upgrade to a different weapon" in {
|
||||
val obj = MannedTurret(GlobalDefinitions.manned_turret)
|
||||
val obj = FacilityTurret(GlobalDefinitions.manned_turret)
|
||||
obj.Upgrade = TurretUpgrade.None
|
||||
obj.Weapons(1).Equipment match {
|
||||
case Some(tool : Tool) =>
|
||||
|
|
@ -87,26 +87,26 @@ class MannedTurretTest extends Specification {
|
|||
}
|
||||
}
|
||||
|
||||
class MannedTurretControl1Test extends ActorTest {
|
||||
"MannedTurretControl" should {
|
||||
class FacilityTurretControl1Test extends ActorTest {
|
||||
"FacilityTurretControl" should {
|
||||
"construct" in {
|
||||
val obj = MannedTurret(GlobalDefinitions.manned_turret)
|
||||
obj.Actor = system.actorOf(Props(classOf[MannedTurretControl], obj), "turret-control")
|
||||
val obj = FacilityTurret(GlobalDefinitions.manned_turret)
|
||||
obj.Actor = system.actorOf(Props(classOf[FacilityTurretControl], obj), "turret-control")
|
||||
assert(obj.Actor != ActorRef.noSender)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class MannedTurretControl2Test extends ActorTest {
|
||||
class FacilityTurretControl2Test extends ActorTest {
|
||||
val player = Player(Avatar("", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
|
||||
val obj = MannedTurret(GlobalDefinitions.manned_turret)
|
||||
val obj = FacilityTurret(GlobalDefinitions.manned_turret)
|
||||
obj.GUID = PlanetSideGUID(1)
|
||||
obj.Actor = system.actorOf(Props(classOf[MannedTurretControl], obj), "turret-control")
|
||||
obj.Actor = system.actorOf(Props(classOf[FacilityTurretControl], obj), "turret-control")
|
||||
val bldg = Building(0, Zone.Nowhere, StructureType.Building)
|
||||
bldg.Amenities = obj
|
||||
bldg.Faction = PlanetSideEmpire.TR
|
||||
|
||||
"MannedTurretControl" should {
|
||||
"FacilityTurretControl" should {
|
||||
"seat on faction affiliation when FactionLock is true" in {
|
||||
assert(player.Faction == PlanetSideEmpire.TR)
|
||||
assert(obj.Faction == PlanetSideEmpire.TR)
|
||||
|
|
@ -124,15 +124,15 @@ class MannedTurretControl2Test extends ActorTest {
|
|||
}
|
||||
}
|
||||
|
||||
class MannedTurretControl3Test extends ActorTest {
|
||||
class FacilityTurretControl3Test extends ActorTest {
|
||||
val player = Player(Avatar("", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
|
||||
val obj = MannedTurret(GlobalDefinitions.manned_turret)
|
||||
val obj = FacilityTurret(GlobalDefinitions.manned_turret)
|
||||
obj.GUID = PlanetSideGUID(1)
|
||||
obj.Actor = system.actorOf(Props(classOf[MannedTurretControl], obj), "turret-control")
|
||||
obj.Actor = system.actorOf(Props(classOf[FacilityTurretControl], obj), "turret-control")
|
||||
val bldg = Building(0, Zone.Nowhere, StructureType.Building)
|
||||
bldg.Amenities = obj
|
||||
|
||||
"MannedTurretControl" should {
|
||||
"FacilityTurretControl" should {
|
||||
"block seating on mismatched faction affiliation when FactionLock is true" in {
|
||||
assert(player.Faction == PlanetSideEmpire.TR)
|
||||
assert(obj.Faction == PlanetSideEmpire.NEUTRAL)
|
||||
|
|
@ -150,17 +150,17 @@ class MannedTurretControl3Test extends ActorTest {
|
|||
}
|
||||
}
|
||||
|
||||
class MannedTurretControl4Test extends ActorTest {
|
||||
class FacilityTurretControl4Test extends ActorTest {
|
||||
val player = Player(Avatar("", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
|
||||
val objDef = new MannedTurretDefinition(480)
|
||||
val objDef = new TurretDefinition(480)
|
||||
objDef.FactionLocked = false
|
||||
val obj = MannedTurret(objDef)
|
||||
val obj = FacilityTurret(objDef)
|
||||
obj.GUID = PlanetSideGUID(1)
|
||||
obj.Actor = system.actorOf(Props(classOf[MannedTurretControl], obj), "turret-control")
|
||||
obj.Actor = system.actorOf(Props(classOf[FacilityTurretControl], obj), "turret-control")
|
||||
val bldg = Building(0, Zone.Nowhere, StructureType.Building)
|
||||
bldg.Amenities = obj
|
||||
|
||||
"MannedTurretControl" should {
|
||||
"FacilityTurretControl" should {
|
||||
"seating even with mismatched faction affiliation when FactionLock is false" in {
|
||||
assert(player.Faction == PlanetSideEmpire.TR)
|
||||
assert(obj.Faction == PlanetSideEmpire.NEUTRAL)
|
||||
|
|
@ -191,7 +191,7 @@ class ResourceSiloControlUpdate1Test extends ActorTest {
|
|||
.actionMessage.asInstanceOf[AvatarAction.PlanetsideAttribute].attribute_value == 0)
|
||||
|
||||
val reply4 = probe1.receiveOne(500 milliseconds)
|
||||
assert(obj.LowNtuWarningOn == false)
|
||||
assert(!obj.LowNtuWarningOn)
|
||||
assert(reply4.isInstanceOf[AvatarServiceMessage])
|
||||
assert(reply4.asInstanceOf[AvatarServiceMessage].forChannel == "nowhere")
|
||||
assert(reply4.asInstanceOf[AvatarServiceMessage]
|
||||
|
|
|
|||
|
|
@ -246,20 +246,20 @@ class SpawnTubeObjectBuilderTest extends ActorTest {
|
|||
}
|
||||
}
|
||||
|
||||
class MannedTurretObjectBuilderTest extends ActorTest {
|
||||
class FacilityTurretObjectBuilderTest extends ActorTest {
|
||||
import net.psforever.objects.GlobalDefinitions.manned_turret
|
||||
import net.psforever.objects.serverobject.turret.MannedTurret
|
||||
"MannedTurretObjectBuilder" should {
|
||||
import net.psforever.objects.serverobject.turret.FacilityTurret
|
||||
"FacilityTurretObjectBuilder" should {
|
||||
"build" in {
|
||||
val hub = ServerObjectBuilderTest.NumberPoolHub
|
||||
val actor = system.actorOf(Props(classOf[ServerObjectBuilderTest.BuilderTestActor], ServerObjectBuilder(1,
|
||||
MannedTurret.Constructor(manned_turret)), hub), "spawn-tube")
|
||||
FacilityTurret.Constructor(manned_turret)), hub), "spawn-tube")
|
||||
actor ! "!"
|
||||
|
||||
val reply = receiveOne(Duration.create(1000, "ms"))
|
||||
assert(reply.isInstanceOf[MannedTurret])
|
||||
assert(reply.asInstanceOf[MannedTurret].HasGUID)
|
||||
assert(reply.asInstanceOf[MannedTurret].GUID == PlanetSideGUID(1))
|
||||
assert(reply.isInstanceOf[FacilityTurret])
|
||||
assert(reply.asInstanceOf[FacilityTurret].HasGUID)
|
||||
assert(reply.asInstanceOf[FacilityTurret].GUID == PlanetSideGUID(1))
|
||||
assert(reply == hub(1).get)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import base.ActorTest
|
|||
import net.psforever.objects._
|
||||
import net.psforever.objects.guid.{GUIDTask, TaskResolver}
|
||||
|
||||
class GUIDTaskRegister2Test extends ActorTest {
|
||||
class GUIDTaskRegisterAmmoTest extends ActorTest {
|
||||
"RegisterEquipment -> RegisterObjectTask" in {
|
||||
val (_, uns, taskResolver, probe) = GUIDTaskTest.CommonTestSetup
|
||||
val obj = AmmoBox(GlobalDefinitions.energy_cell)
|
||||
|
|
@ -6,7 +6,7 @@ import net.psforever.objects._
|
|||
import net.psforever.objects.guid.{GUIDTask, TaskResolver}
|
||||
import net.psforever.types.{CharacterGender, CharacterVoice, PlanetSideEmpire}
|
||||
|
||||
class GUIDTaskRegister5Test extends ActorTest {
|
||||
class GUIDTaskRegisterAvatarTest extends ActorTest {
|
||||
"RegisterAvatar" in {
|
||||
val (_, uns, taskResolver, probe) = GUIDTaskTest.CommonTestSetup
|
||||
val obj = Player(Avatar("test", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
|
||||
|
|
@ -4,7 +4,7 @@ package objects.guidtask
|
|||
import base.ActorTest
|
||||
import net.psforever.objects.guid.{GUIDTask, TaskResolver}
|
||||
|
||||
class GUIDTaskRegister1Test extends ActorTest {
|
||||
class GUIDTaskRegisterObjectTest extends ActorTest {
|
||||
"RegisterObjectTask" in {
|
||||
val (_, uns, taskResolver, probe) = GUIDTaskTest.CommonTestSetup
|
||||
val obj = new GUIDTaskTest.TestObject
|
||||
|
|
@ -6,7 +6,7 @@ import net.psforever.objects._
|
|||
import net.psforever.objects.guid.{GUIDTask, TaskResolver}
|
||||
import net.psforever.types.{CharacterGender, CharacterVoice, PlanetSideEmpire}
|
||||
|
||||
class GUIDTaskRegister6Test extends ActorTest {
|
||||
class GUIDTaskRegisterPlayerTest extends ActorTest {
|
||||
"RegisterPlayer" in {
|
||||
val (_, uns, taskResolver, probe) = GUIDTaskTest.CommonTestSetup
|
||||
val obj = Player(Avatar("test", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
|
||||
|
|
@ -5,7 +5,7 @@ import base.ActorTest
|
|||
import net.psforever.objects._
|
||||
import net.psforever.objects.guid.{GUIDTask, TaskResolver}
|
||||
|
||||
class GUIDTaskRegister3Test extends ActorTest {
|
||||
class GUIDTaskRegisterToolTest extends ActorTest {
|
||||
"RegisterEquipment -> RegisterTool" in {
|
||||
val (_, uns, taskResolver, probe) = GUIDTaskTest.CommonTestSetup
|
||||
val obj = Tool(GlobalDefinitions.beamer)
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
// Copyright (c) 2017 PSForever
|
||||
package objects.guidtask
|
||||
|
||||
import base.ActorTest
|
||||
import net.psforever.objects._
|
||||
import net.psforever.objects.guid.{GUIDTask, TaskResolver}
|
||||
|
||||
class GUIDTaskRegisterTurretTest extends ActorTest {
|
||||
"RegisterDeployableTurret" in {
|
||||
val (_, uns, taskResolver, probe) = GUIDTaskTest.CommonTestSetup
|
||||
val obj = new TurretDeployable(GlobalDefinitions.portable_manned_turret_vs)
|
||||
val obj_wep = obj.Weapons(1).Equipment.get
|
||||
val obj_ammo = obj_wep.asInstanceOf[Tool].AmmoSlot.Box
|
||||
val obj_res = obj.Inventory.Items.map(_.obj)
|
||||
|
||||
assert(!obj.HasGUID)
|
||||
assert(!obj_wep.HasGUID)
|
||||
assert(!obj_ammo.HasGUID)
|
||||
obj_res.foreach(box => !box.HasGUID)
|
||||
taskResolver ! TaskResolver.GiveTask(new GUIDTaskTest.RegisterTestTask(probe.ref), List(GUIDTask.RegisterDeployableTurret(obj)(uns)))
|
||||
probe.expectMsg(scala.util.Success)
|
||||
assert(obj.HasGUID)
|
||||
assert(obj_wep.HasGUID)
|
||||
assert(obj_ammo.HasGUID)
|
||||
obj_res.foreach(box => box.HasGUID)
|
||||
}
|
||||
}
|
||||
|
|
@ -5,7 +5,7 @@ import base.ActorTest
|
|||
import net.psforever.objects._
|
||||
import net.psforever.objects.guid.{GUIDTask, TaskResolver}
|
||||
|
||||
class GUIDTaskRegister4Test extends ActorTest {
|
||||
class GUIDTaskRegisterVehicleTest extends ActorTest {
|
||||
"RegisterVehicle" in {
|
||||
val (_, uns, taskResolver, probe) = GUIDTaskTest.CommonTestSetup
|
||||
val obj = Vehicle(GlobalDefinitions.fury)
|
||||
|
|
@ -5,7 +5,7 @@ import base.ActorTest
|
|||
import net.psforever.objects._
|
||||
import net.psforever.objects.guid.{GUIDTask, TaskResolver}
|
||||
|
||||
class GUIDTaskUnregister2Test extends ActorTest {
|
||||
class GUIDTaskUnregisterAmmoTest extends ActorTest {
|
||||
"UnregisterEquipment -> UnregisterObjectTask" in {
|
||||
val (guid, uns, taskResolver, probe) = GUIDTaskTest.CommonTestSetup
|
||||
val obj = AmmoBox(GlobalDefinitions.energy_cell)
|
||||
|
|
@ -6,7 +6,7 @@ import net.psforever.objects._
|
|||
import net.psforever.objects.guid.{GUIDTask, TaskResolver}
|
||||
import net.psforever.types.{CharacterGender, CharacterVoice, PlanetSideEmpire}
|
||||
|
||||
class GUIDTaskUnregister5Test extends ActorTest {
|
||||
class GUIDTaskUnregisterAvatarTest extends ActorTest {
|
||||
"UnregisterAvatar" in {
|
||||
val (guid, uns, taskResolver, probe) = GUIDTaskTest.CommonTestSetup
|
||||
val obj = Player(Avatar("test", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
|
||||
|
|
@ -4,7 +4,7 @@ package objects.guidtask
|
|||
import base.ActorTest
|
||||
import net.psforever.objects.guid.{GUIDTask, TaskResolver}
|
||||
|
||||
class GUIDTaskUnregister1Test extends ActorTest {
|
||||
class GUIDTaskUnregisterObjectTest extends ActorTest {
|
||||
"UnregisterObjectTask" in {
|
||||
val (guid, uns, taskResolver, probe) = GUIDTaskTest.CommonTestSetup
|
||||
val obj = new GUIDTaskTest.TestObject
|
||||
|
|
@ -6,7 +6,7 @@ import net.psforever.objects._
|
|||
import net.psforever.objects.guid.{GUIDTask, TaskResolver}
|
||||
import net.psforever.types.{CharacterGender, CharacterVoice, PlanetSideEmpire}
|
||||
|
||||
class GUIDTaskUnregister6Test extends ActorTest {
|
||||
class GUIDTaskUnregisterPlayerTest extends ActorTest {
|
||||
"UnregisterPlayer" in {
|
||||
val (guid, uns, taskResolver, probe) = GUIDTaskTest.CommonTestSetup
|
||||
val obj = Player(Avatar("test", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
|
||||
|
|
@ -5,7 +5,7 @@ import base.ActorTest
|
|||
import net.psforever.objects._
|
||||
import net.psforever.objects.guid.{GUIDTask, TaskResolver}
|
||||
|
||||
class GUIDTaskUnregister3Test extends ActorTest {
|
||||
class GUIDTaskUnregisterToolTest extends ActorTest {
|
||||
"UnregisterEquipment -> UnregisterTool" in {
|
||||
val (guid, uns, taskResolver, probe) = GUIDTaskTest.CommonTestSetup
|
||||
val obj = Tool(GlobalDefinitions.beamer)
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
// Copyright (c) 2017 PSForever
|
||||
package objects.guidtask
|
||||
|
||||
import base.ActorTest
|
||||
import net.psforever.objects._
|
||||
import net.psforever.objects.guid.{GUIDTask, TaskResolver}
|
||||
|
||||
class GUIDTaskUnregisterTurretTest extends ActorTest {
|
||||
"UnregisterDeployableTurret" in {
|
||||
val (guid, uns, taskResolver, probe) = GUIDTaskTest.CommonTestSetup
|
||||
val obj = new TurretDeployable(GlobalDefinitions.portable_manned_turret_vs)
|
||||
val obj_wep = obj.Weapons(1).Equipment.get
|
||||
val obj_ammo = obj_wep.asInstanceOf[Tool].AmmoSlot.Box
|
||||
val obj_res = obj.Inventory.Items.map(_.obj)
|
||||
guid.register(obj, "dynamic")
|
||||
guid.register(obj_wep, "dynamic")
|
||||
guid.register(obj_ammo, "dynamic")
|
||||
obj_res.foreach(box => guid.register(box, "dynamic"))
|
||||
|
||||
assert(obj.HasGUID)
|
||||
assert(obj_wep.HasGUID)
|
||||
assert(obj_ammo.HasGUID)
|
||||
obj_res.foreach(box => box.HasGUID)
|
||||
taskResolver ! TaskResolver.GiveTask(new GUIDTaskTest.RegisterTestTask(probe.ref), List(GUIDTask.UnregisterDeployableTurret(obj)(uns)))
|
||||
probe.expectMsg(scala.util.Success)
|
||||
assert(!obj.HasGUID)
|
||||
assert(!obj_wep.HasGUID)
|
||||
assert(!obj_ammo.HasGUID)
|
||||
obj_res.foreach(box => !box.HasGUID)
|
||||
}
|
||||
}
|
||||
|
|
@ -5,7 +5,7 @@ import base.ActorTest
|
|||
import net.psforever.objects._
|
||||
import net.psforever.objects.guid.{GUIDTask, TaskResolver}
|
||||
|
||||
class GUIDTaskUnregister4Test extends ActorTest {
|
||||
class GUIDTaskUnregisterVehicleTest extends ActorTest {
|
||||
"RegisterVehicle" in {
|
||||
val (guid, uns, taskResolver, probe) = GUIDTaskTest.CommonTestSetup
|
||||
val obj = Vehicle(GlobalDefinitions.fury)
|
||||
|
|
@ -9,7 +9,7 @@ import net.psforever.objects.guid.actor.{NumberPoolActor, Register, UniqueNumber
|
|||
import net.psforever.objects.guid.selector.RandomSelector
|
||||
import net.psforever.objects.guid.source.LimitedNumberSource
|
||||
|
||||
import scala.concurrent.duration.Duration
|
||||
import scala.concurrent.duration._
|
||||
import scala.util.{Failure, Success}
|
||||
|
||||
class AllocateNumberPoolActors extends ActorTest {
|
||||
|
|
@ -309,6 +309,33 @@ class UniqueNumberSystemTest9 extends ActorTest() {
|
|||
}
|
||||
}
|
||||
|
||||
class UniqueNumberSystemTestA extends ActorTest {
|
||||
class EntityTestClass extends IdentifiableEntity
|
||||
|
||||
"UniqueNumberSystem" should {
|
||||
"remain consistent between registrations" in {
|
||||
val src : LimitedNumberSource = LimitedNumberSource(10)
|
||||
val guid : NumberPoolHub = new NumberPoolHub(src)
|
||||
guid.AddPool("pool1", (0 until 10).toList).Selector = new RandomSelector
|
||||
val uns = system.actorOf(Props(classOf[UniqueNumberSystem], guid, UniqueNumberSystemTest.AllocateNumberPoolActors(guid)), "uns")
|
||||
expectNoMsg(Duration.create(200, "ms"))
|
||||
|
||||
assert(src.CountUsed == 0)
|
||||
(0 to 4).foreach(i => { assert(guid.register(new EntityTestClass(), i).isSuccess) })
|
||||
assert(src.CountUsed == 5)
|
||||
|
||||
(0 to 5).foreach(_ => { uns ! Register(new EntityTestClass(), "pool1") })
|
||||
assert(receiveOne(200 milliseconds).isInstanceOf[Success[_]]) //6th
|
||||
assert(receiveOne(200 milliseconds).isInstanceOf[Success[_]]) //7th
|
||||
assert(receiveOne(200 milliseconds).isInstanceOf[Success[_]]) //8th
|
||||
assert(receiveOne(200 milliseconds).isInstanceOf[Success[_]]) //9th
|
||||
assert(receiveOne(200 milliseconds).isInstanceOf[Success[_]]) //10th
|
||||
assert(receiveOne(200 milliseconds).isInstanceOf[Failure[_]]) //no more
|
||||
assert(src.CountUsed == 10)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
object UniqueNumberSystemTest {
|
||||
/**
|
||||
* @see `UniqueNumberSystem.AllocateNumberPoolActors(NumberPoolHub)(implicit ActorContext)`
|
||||
|
|
|
|||
|
|
@ -122,6 +122,29 @@ class EquipmentInHandTest extends ActorTest {
|
|||
}
|
||||
}
|
||||
|
||||
class DeployItemTest extends ActorTest {
|
||||
ServiceManager.boot(system) ! ServiceManager.Register(RandomPool(1).props(Props[TaskResolver]), "taskResolver")
|
||||
val service = system.actorOf(Props[AvatarService], "deploy-item-test-service")
|
||||
val objDef = GlobalDefinitions.motionalarmsensor
|
||||
val obj = new SensorDeployable(objDef)
|
||||
obj.Position = Vector3(1,2,3)
|
||||
obj.Orientation = Vector3(4,5,6)
|
||||
obj.GUID = PlanetSideGUID(40)
|
||||
val pkt = ObjectCreateMessage(
|
||||
objDef.ObjectId,
|
||||
obj.GUID,
|
||||
objDef.Packet.ConstructorData(obj).get
|
||||
)
|
||||
|
||||
"AvatarService" should {
|
||||
"pass DeployItem" in {
|
||||
service ! Service.Join("test")
|
||||
service ! AvatarServiceMessage("test", AvatarAction.DeployItem(PlanetSideGUID(10), obj))
|
||||
expectMsg(AvatarServiceResponse("/test/Avatar", PlanetSideGUID(10), AvatarResponse.DropItem(pkt)))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class DroptItemTest extends ActorTest {
|
||||
ServiceManager.boot(system) ! ServiceManager.Register(RandomPool(1).props(Props[TaskResolver]), "taskResolver")
|
||||
val service = system.actorOf(Props[AvatarService], "release-test-service")
|
||||
|
|
@ -211,6 +234,18 @@ class ObjectHeldTest extends ActorTest {
|
|||
}
|
||||
}
|
||||
|
||||
class PutDownFDUTest extends ActorTest {
|
||||
"AvatarService" should {
|
||||
"pass PutDownFDU" in {
|
||||
ServiceManager.boot(system)
|
||||
val service = system.actorOf(Props[AvatarService], AvatarServiceTest.TestName)
|
||||
service ! Service.Join("test")
|
||||
service ! AvatarServiceMessage("test", AvatarAction.PutDownFDU(PlanetSideGUID(10)))
|
||||
expectMsg(AvatarServiceResponse("/test/Avatar", PlanetSideGUID(10), AvatarResponse.PutDownFDU(PlanetSideGUID(10))))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class PlanetsideAttributeTest extends ActorTest {
|
||||
"AvatarService" should {
|
||||
"pass PlanetsideAttribute" in {
|
||||
|
|
@ -342,6 +377,33 @@ class ChangeFireStateStopTest extends ActorTest {
|
|||
}
|
||||
}
|
||||
|
||||
class DamageTest extends ActorTest {
|
||||
val test_func_ref : (Any)=>Unit = {
|
||||
def test_func(o : Any) : Unit = { }
|
||||
test_func
|
||||
}
|
||||
val player = Player(Avatar("TestCharacter", PlanetSideEmpire.VS, CharacterGender.Female, 1, CharacterVoice.Voice1))
|
||||
|
||||
"AvatarService" should {
|
||||
"pass Damage" in {
|
||||
ServiceManager.boot(system)
|
||||
val service = system.actorOf(Props[AvatarService], AvatarServiceTest.TestName)
|
||||
service ! Service.Join("test")
|
||||
service ! AvatarServiceMessage("test", AvatarAction.Damage(PlanetSideGUID(10), player, test_func_ref))
|
||||
val msg = receiveOne(1 seconds)
|
||||
assert(msg.isInstanceOf[AvatarServiceResponse])
|
||||
assert(msg.asInstanceOf[AvatarServiceResponse].toChannel == "/test/Avatar")
|
||||
assert(msg.asInstanceOf[AvatarServiceResponse].avatar_guid == PlanetSideGUID(10))
|
||||
assert(msg.asInstanceOf[AvatarServiceResponse].replyMessage
|
||||
.isInstanceOf[AvatarResponse.DamageResolution])
|
||||
assert(msg.asInstanceOf[AvatarServiceResponse].replyMessage
|
||||
.asInstanceOf[AvatarResponse.DamageResolution].target == player)
|
||||
assert(msg.asInstanceOf[AvatarServiceResponse].replyMessage
|
||||
.asInstanceOf[AvatarResponse.DamageResolution].resolution_function == test_func_ref)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class WeaponDryFireTest extends ActorTest {
|
||||
"AvatarService" should {
|
||||
"pass WeaponDryFire" in {
|
||||
|
|
|
|||
|
|
@ -1,27 +1,32 @@
|
|||
// Copyright (c) 2017 PSForever
|
||||
package service
|
||||
|
||||
// Copyright (c) 2017 PSForever
|
||||
import akka.actor.Props
|
||||
import base.ActorTest
|
||||
import net.psforever.objects.{GlobalDefinitions, SensorDeployable}
|
||||
import net.psforever.objects.serverobject.PlanetSideServerObject
|
||||
import net.psforever.packet.game.PlanetSideGUID
|
||||
import net.psforever.packet.game._
|
||||
import net.psforever.types.{PlanetSideEmpire, Vector3}
|
||||
import services.Service
|
||||
import services.{Service, ServiceManager}
|
||||
import services.local._
|
||||
|
||||
class LocalService1Test extends ActorTest {
|
||||
ServiceManager.boot(system)
|
||||
|
||||
"LocalService" should {
|
||||
"construct" in {
|
||||
system.actorOf(Props[LocalService], "service")
|
||||
system.actorOf(Props[LocalService], "l_service")
|
||||
assert(true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class LocalService2Test extends ActorTest {
|
||||
ServiceManager.boot(system)
|
||||
|
||||
"LocalService" should {
|
||||
"subscribe" in {
|
||||
val service = system.actorOf(Props[LocalService], "service")
|
||||
val service = system.actorOf(Props[LocalService], "l_service")
|
||||
service ! Service.Join("test")
|
||||
assert(true)
|
||||
}
|
||||
|
|
@ -29,9 +34,11 @@ class LocalService2Test extends ActorTest {
|
|||
}
|
||||
|
||||
class LocalService3Test extends ActorTest {
|
||||
ServiceManager.boot(system)
|
||||
|
||||
"LocalService" should {
|
||||
"subscribe to a specific channel" in {
|
||||
val service = system.actorOf(Props[LocalService], "service")
|
||||
val service = system.actorOf(Props[LocalService], "l_service")
|
||||
service ! Service.Join("test")
|
||||
service ! Service.Leave()
|
||||
assert(true)
|
||||
|
|
@ -40,9 +47,11 @@ class LocalService3Test extends ActorTest {
|
|||
}
|
||||
|
||||
class LocalService4Test extends ActorTest {
|
||||
ServiceManager.boot(system)
|
||||
|
||||
"LocalService" should {
|
||||
"subscribe" in {
|
||||
val service = system.actorOf(Props[LocalService], "service")
|
||||
val service = system.actorOf(Props[LocalService], "l_service")
|
||||
service ! Service.Join("test")
|
||||
service ! Service.LeaveAll()
|
||||
assert(true)
|
||||
|
|
@ -51,9 +60,11 @@ class LocalService4Test extends ActorTest {
|
|||
}
|
||||
|
||||
class LocalService5Test extends ActorTest {
|
||||
ServiceManager.boot(system)
|
||||
|
||||
"LocalService" should {
|
||||
"pass an unhandled message" in {
|
||||
val service = system.actorOf(Props[LocalService], "service")
|
||||
val service = system.actorOf(Props[LocalService], "l_service")
|
||||
service ! Service.Join("test")
|
||||
service ! "hello"
|
||||
expectNoMsg()
|
||||
|
|
@ -61,10 +72,50 @@ class LocalService5Test extends ActorTest {
|
|||
}
|
||||
}
|
||||
|
||||
class AlertDestroyDeployableTest extends ActorTest {
|
||||
ServiceManager.boot(system)
|
||||
val obj = new SensorDeployable(GlobalDefinitions.motionalarmsensor)
|
||||
|
||||
"LocalService" should {
|
||||
"pass AlertDestroyDeployable" in {
|
||||
val service = system.actorOf(Props[LocalService], "l_service")
|
||||
service ! Service.Join("test")
|
||||
service ! LocalServiceMessage("test", LocalAction.AlertDestroyDeployable(PlanetSideGUID(10), obj))
|
||||
expectMsg(LocalServiceResponse("/test/Local", PlanetSideGUID(0), LocalResponse.AlertDestroyDeployable(obj)))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class DeployableMapIconTest extends ActorTest {
|
||||
ServiceManager.boot(system)
|
||||
|
||||
"LocalService" should {
|
||||
"pass DeployableMapIcon" in {
|
||||
val service = system.actorOf(Props[LocalService], "l_service")
|
||||
service ! Service.Join("test")
|
||||
service ! LocalServiceMessage("test",
|
||||
LocalAction.DeployableMapIcon(
|
||||
PlanetSideGUID(10),
|
||||
DeploymentAction.Build,
|
||||
DeployableInfo(PlanetSideGUID(40), DeployableIcon.Boomer, Vector3(1,2,3), PlanetSideGUID(11))
|
||||
)
|
||||
)
|
||||
expectMsg(LocalServiceResponse("/test/Local", PlanetSideGUID(10),
|
||||
LocalResponse.DeployableMapIcon(
|
||||
DeploymentAction.Build,
|
||||
DeployableInfo(PlanetSideGUID(40), DeployableIcon.Boomer, Vector3(1,2,3), PlanetSideGUID(11))
|
||||
)
|
||||
))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class DoorClosesTest extends ActorTest {
|
||||
ServiceManager.boot(system)
|
||||
|
||||
"LocalService" should {
|
||||
"pass DoorCloses" in {
|
||||
val service = system.actorOf(Props[LocalService], "service")
|
||||
val service = system.actorOf(Props[LocalService], "l_service")
|
||||
service ! Service.Join("test")
|
||||
service ! LocalServiceMessage("test", LocalAction.DoorCloses(PlanetSideGUID(10), PlanetSideGUID(40)))
|
||||
expectMsg(LocalServiceResponse("/test/Local", PlanetSideGUID(10), LocalResponse.DoorCloses(PlanetSideGUID(40))))
|
||||
|
|
@ -73,6 +124,7 @@ class DoorClosesTest extends ActorTest {
|
|||
}
|
||||
|
||||
class HackClearTest extends ActorTest {
|
||||
ServiceManager.boot(system)
|
||||
val obj = new PlanetSideServerObject() {
|
||||
def Faction = PlanetSideEmpire.NEUTRAL
|
||||
def Definition = null
|
||||
|
|
@ -81,7 +133,7 @@ class HackClearTest extends ActorTest {
|
|||
|
||||
"LocalService" should {
|
||||
"pass HackClear" in {
|
||||
val service = system.actorOf(Props[LocalService], "service")
|
||||
val service = system.actorOf(Props[LocalService], "l_service")
|
||||
service ! Service.Join("test")
|
||||
service ! LocalServiceMessage("test", LocalAction.HackClear(PlanetSideGUID(10), obj, 0L, 1000L))
|
||||
expectMsg(LocalServiceResponse("/test/Local", PlanetSideGUID(10), LocalResponse.HackClear(PlanetSideGUID(40), 0L, 1000L)))
|
||||
|
|
@ -90,9 +142,11 @@ class HackClearTest extends ActorTest {
|
|||
}
|
||||
|
||||
class ProximityTerminalEffectTest extends ActorTest {
|
||||
ServiceManager.boot(system)
|
||||
|
||||
"LocalService" should {
|
||||
"pass ProximityTerminalEffect" in {
|
||||
val service = system.actorOf(Props[LocalService], "service")
|
||||
val service = system.actorOf(Props[LocalService], "l_service")
|
||||
service ! Service.Join("test")
|
||||
service ! LocalServiceMessage("test", LocalAction.ProximityTerminalEffect(PlanetSideGUID(10), PlanetSideGUID(40), true))
|
||||
expectMsg(LocalServiceResponse("/test/Local", PlanetSideGUID(10), LocalResponse.ProximityTerminalEffect(PlanetSideGUID(40), true)))
|
||||
|
|
@ -100,12 +154,66 @@ class ProximityTerminalEffectTest extends ActorTest {
|
|||
}
|
||||
}
|
||||
|
||||
class SetEmpireTest extends ActorTest {
|
||||
ServiceManager.boot(system)
|
||||
val obj = new SensorDeployable(GlobalDefinitions.motionalarmsensor)
|
||||
|
||||
"LocalService" should {
|
||||
"pass SetEmpire" in {
|
||||
val service = system.actorOf(Props[LocalService], "l_service")
|
||||
service ! Service.Join("test")
|
||||
service ! LocalServiceMessage("test", LocalAction.SetEmpire(PlanetSideGUID(10), PlanetSideEmpire.TR))
|
||||
expectMsg(LocalServiceResponse("/test/Local", PlanetSideGUID(0), LocalResponse.SetEmpire(PlanetSideGUID(10), PlanetSideEmpire.TR)))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class TriggerEffectTest extends ActorTest {
|
||||
ServiceManager.boot(system)
|
||||
|
||||
"LocalService" should {
|
||||
"pass TriggerEffect (1)" in {
|
||||
val service = system.actorOf(Props[LocalService], "l_service")
|
||||
service ! Service.Join("test")
|
||||
service ! LocalServiceMessage("test", LocalAction.TriggerEffect(PlanetSideGUID(10), "on", PlanetSideGUID(40)))
|
||||
expectMsg(LocalServiceResponse("/test/Local", PlanetSideGUID(10), LocalResponse.TriggerEffect(PlanetSideGUID(40), "on", None, None)))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class TriggerEffectInfoTest extends ActorTest {
|
||||
ServiceManager.boot(system)
|
||||
|
||||
"LocalService" should {
|
||||
"pass TriggerEffect (2)" in {
|
||||
val service = system.actorOf(Props[LocalService], "l_service")
|
||||
service ! Service.Join("test")
|
||||
service ! LocalServiceMessage("test", LocalAction.TriggerEffectInfo(PlanetSideGUID(10), "on", PlanetSideGUID(40), true, 1000))
|
||||
expectMsg(LocalServiceResponse("/test/Local", PlanetSideGUID(10), LocalResponse.TriggerEffect(PlanetSideGUID(40), "on", Some(TriggeredEffect(true, 1000)), None)))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class TriggerEffectLocationTest extends ActorTest {
|
||||
ServiceManager.boot(system)
|
||||
|
||||
"LocalService" should {
|
||||
"pass TriggerEffect (3)" in {
|
||||
val service = system.actorOf(Props[LocalService], "l_service")
|
||||
service ! Service.Join("test")
|
||||
service ! LocalServiceMessage("test", LocalAction.TriggerEffectLocation(PlanetSideGUID(10), "spawn_object_failed_effect", Vector3(1.1f, 2.2f, 3.3f), Vector3(4.4f, 5.5f, 6.6f)))
|
||||
expectMsg(LocalServiceResponse("/test/Local", PlanetSideGUID(10), LocalResponse.TriggerEffect(PlanetSideGUID(0), "spawn_object_failed_effect", None, Some(TriggeredEffectLocation(Vector3(1.1f, 2.2f, 3.3f), Vector3(4.4f, 5.5f, 6.6f))))))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class TriggerSoundTest extends ActorTest {
|
||||
import net.psforever.packet.game.TriggeredSound
|
||||
ServiceManager.boot(system)
|
||||
|
||||
"LocalService" should {
|
||||
"pass TriggerSound" in {
|
||||
val service = system.actorOf(Props[LocalService], "service")
|
||||
val service = system.actorOf(Props[LocalService], "l_service")
|
||||
service ! Service.Join("test")
|
||||
service ! LocalServiceMessage("test", LocalAction.TriggerSound(PlanetSideGUID(10), TriggeredSound.LockedOut, Vector3(1.1f, 2.2f, 3.3f), 0, 0.75f))
|
||||
expectMsg(LocalServiceResponse("/test/Local", PlanetSideGUID(10), LocalResponse.TriggerSound(TriggeredSound.LockedOut, Vector3(1.1f, 2.2f, 3.3f), 0, 0.75f)))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue