mirror of
https://github.com/2revoemag/PSF-BotServer.git
synced 2026-03-20 04:20:40 +00:00
Separate Vehicle Controls (#871)
* broke vehicle control agency down into specific agencies for different types of vehicles * moved shared cargo vehicle pain onto the carrier control agency; apc-type vehicles have charging capacitors and emit emp's * comments and documentation; cargo learning about damage to carrier corrected; fixed tests and added tests * adjustment to explosive deployable distance filtering; apc now uses this filter when determining valid emp targets by distance
This commit is contained in:
parent
2216958d72
commit
c7ebe6a34f
24 changed files with 1061 additions and 530 deletions
|
|
@ -3,7 +3,8 @@ package objects
|
|||
|
||||
import akka.actor.Props
|
||||
import akka.testkit.TestProbe
|
||||
import base.ActorTest
|
||||
import base.{ActorTest, FreedContextActorTest}
|
||||
import net.psforever.actors.zone.ZoneActor
|
||||
import net.psforever.objects._
|
||||
import net.psforever.objects.ballistics._
|
||||
import net.psforever.objects.equipment.JammableUnit
|
||||
|
|
@ -15,7 +16,7 @@ import net.psforever.objects.serverobject.structures.{Building, StructureType}
|
|||
import net.psforever.objects.serverobject.terminals.{Terminal, TerminalControl, TerminalDefinition}
|
||||
import net.psforever.objects.serverobject.tube.SpawnTube
|
||||
import net.psforever.objects.serverobject.turret.{FacilityTurret, FacilityTurretControl, TurretUpgrade}
|
||||
import net.psforever.objects.vehicles.VehicleControl
|
||||
import net.psforever.objects.vehicles.control.VehicleControl
|
||||
import net.psforever.objects.vital.Vitality
|
||||
import net.psforever.objects.zones.{Zone, ZoneMap}
|
||||
import net.psforever.packet.game.DamageWithPositionMessage
|
||||
|
|
@ -1222,7 +1223,7 @@ class DamageableVehicleDamageTest extends ActorTest {
|
|||
}
|
||||
}
|
||||
|
||||
class DamageableVehicleDamageMountedTest extends ActorTest {
|
||||
class DamageableVehicleDamageMountedTest extends FreedContextActorTest {
|
||||
val guid = new NumberPoolHub(new MaxNumberSource(15))
|
||||
val zone = new Zone("test", new ZoneMap("test"), 0) {
|
||||
override def SetupNumberPools() = {}
|
||||
|
|
@ -1234,6 +1235,8 @@ class DamageableVehicleDamageMountedTest extends ActorTest {
|
|||
zone.Activity = activityProbe.ref
|
||||
zone.AvatarEvents = avatarProbe.ref
|
||||
zone.VehicleEvents = vehicleProbe.ref
|
||||
import akka.actor.typed.scaladsl.adapter._
|
||||
zone.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
|
||||
|
||||
val lodestar = Vehicle(GlobalDefinitions.lodestar) //guid=1 & 4,5,6,7,8,9
|
||||
lodestar.Position = Vector3(1, 0, 0)
|
||||
|
|
@ -1271,7 +1274,7 @@ class DamageableVehicleDamageMountedTest extends ActorTest {
|
|||
guid.register(atv, 11)
|
||||
|
||||
//the lodestar control actor needs to load after the utilities have guid's assigned
|
||||
lodestar.Actor = system.actorOf(Props(classOf[VehicleControl], lodestar), "lodestar-control")
|
||||
lodestar.Definition.Initialize(lodestar, context)
|
||||
lodestar.Zone = zone
|
||||
lodestar.Seats(0).mount(player2)
|
||||
player2.VehicleSeated = lodestar.GUID
|
||||
|
|
@ -1314,50 +1317,38 @@ class DamageableVehicleDamageMountedTest extends ActorTest {
|
|||
assert(atv.Shields == 1)
|
||||
|
||||
lodestar.Actor ! Vitality.Damage(applyDamageTo)
|
||||
val msg12 = vehicleProbe.receiveN(2, 200 milliseconds)
|
||||
val msg3 = activityProbe.receiveOne(200 milliseconds)
|
||||
val msg45 = avatarProbe.receiveN(2,200 milliseconds)
|
||||
assert(
|
||||
msg12.head match {
|
||||
case VehicleServiceMessage(_, VehicleAction.PlanetsideAttribute(PlanetSideGUID(0), PlanetSideGUID(1), 68, _)) => true
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
assert(
|
||||
msg12(1) match {
|
||||
case VehicleServiceMessage("test", VehicleAction.PlanetsideAttribute(PlanetSideGUID(0), PlanetSideGUID(1), 0, _)) => true
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
assert(
|
||||
msg3 match {
|
||||
case activity: Zone.HotSpot.Activity =>
|
||||
activity.attacker == pSource &&
|
||||
activity.defender == SourceEntry(lodestar) &&
|
||||
activity.location == Vector3(1, 0, 0)
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
assert(
|
||||
msg45.head match {
|
||||
case AvatarServiceMessage(
|
||||
"TestCharacter2",
|
||||
AvatarAction.SendResponse(Service.defaultPlayerGUID, DamageWithPositionMessage(400, Vector3(2, 0, 0)))
|
||||
) =>
|
||||
true
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
assert(
|
||||
msg45(1) match {
|
||||
case AvatarServiceMessage(
|
||||
"TestCharacter3",
|
||||
AvatarAction.SendResponse(Service.defaultPlayerGUID, DamageWithPositionMessage(0, Vector3(2, 0, 0)))
|
||||
) =>
|
||||
true
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
val msg12 = vehicleProbe.receiveN(2, 500 milliseconds)
|
||||
val msg3 = activityProbe.receiveOne(500 milliseconds)
|
||||
val msg45 = avatarProbe.receiveN(2,500 milliseconds)
|
||||
msg12.head match {
|
||||
case VehicleServiceMessage(_, VehicleAction.PlanetsideAttribute(PlanetSideGUID(0), PlanetSideGUID(1), 68, _)) => ;
|
||||
case _ => assert(false)
|
||||
}
|
||||
msg12(1) match {
|
||||
case VehicleServiceMessage("test", VehicleAction.PlanetsideAttribute(PlanetSideGUID(0), PlanetSideGUID(1), 0, _)) => ;
|
||||
case _ => assert(false)
|
||||
}
|
||||
msg3 match {
|
||||
case activity: Zone.HotSpot.Activity =>
|
||||
assert(activity.attacker == pSource &&
|
||||
activity.defender == SourceEntry(lodestar) &&
|
||||
activity.location == Vector3(1, 0, 0))
|
||||
case _ => assert(false)
|
||||
}
|
||||
msg45.head match {
|
||||
case AvatarServiceMessage(
|
||||
"TestCharacter2",
|
||||
AvatarAction.SendResponse(Service.defaultPlayerGUID, DamageWithPositionMessage(400, Vector3(2, 0, 0)))
|
||||
) => ;
|
||||
case _ => assert(false)
|
||||
}
|
||||
msg45(1) match {
|
||||
case AvatarServiceMessage(
|
||||
"TestCharacter3",
|
||||
AvatarAction.SendResponse(Service.defaultPlayerGUID, DamageWithPositionMessage(0, Vector3(2, 0, 0)))
|
||||
) => ;
|
||||
case _ => assert(false)
|
||||
}
|
||||
assert(lodestar.Health < lodestar.Definition.DefaultHealth)
|
||||
assert(lodestar.Shields == 0)
|
||||
assert(atv.Health == atv.Definition.DefaultHealth)
|
||||
|
|
@ -1365,7 +1356,7 @@ class DamageableVehicleDamageMountedTest extends ActorTest {
|
|||
}
|
||||
}
|
||||
|
||||
class DamageableVehicleJammeringMountedTest extends ActorTest {
|
||||
class DamageableVehicleJammeringMountedTest extends FreedContextActorTest {
|
||||
val guid = new NumberPoolHub(new MaxNumberSource(15))
|
||||
val zone = new Zone("test", new ZoneMap("test"), 0) {
|
||||
override def SetupNumberPools() = {}
|
||||
|
|
@ -1417,7 +1408,7 @@ class DamageableVehicleJammeringMountedTest extends ActorTest {
|
|||
guid.register(player2, 12)
|
||||
guid.register(player3, 13)
|
||||
|
||||
lodestar.Actor = system.actorOf(Props(classOf[VehicleControl], lodestar), "lodestar-control")
|
||||
lodestar.Definition.Initialize(lodestar, context)
|
||||
atv.Zone = zone
|
||||
lodestar.Zone = zone
|
||||
atv.Seats(0).mount(player2)
|
||||
|
|
@ -1585,7 +1576,7 @@ class DamageableVehicleDestroyTest extends ActorTest {
|
|||
}
|
||||
}
|
||||
|
||||
class DamageableVehicleDestroyMountedTest extends ActorTest {
|
||||
class DamageableVehicleDestroyMountedTest extends FreedContextActorTest {
|
||||
val atv = Vehicle(GlobalDefinitions.quadassault) //guid=1
|
||||
atv.Actor = system.actorOf(Props(classOf[VehicleControl], atv), "atv-control")
|
||||
atv.Position = Vector3(1, 0, 0)
|
||||
|
|
@ -1611,19 +1602,22 @@ class DamageableVehicleDestroyMountedTest extends ActorTest {
|
|||
val player3Probe = TestProbe()
|
||||
player3.Actor = player3Probe.ref
|
||||
|
||||
|
||||
val activityProbe = TestProbe()
|
||||
val avatarProbe = TestProbe()
|
||||
val vehicleProbe = TestProbe()
|
||||
val catchall = TestProbe()
|
||||
val guid = new NumberPoolHub(new MaxNumberSource(15))
|
||||
val zone = new Zone("test", new ZoneMap("test"), 0) {
|
||||
override def SetupNumberPools() = {}
|
||||
GUID(guid)
|
||||
override def LivePlayers = List(player1, player2, player3)
|
||||
override def Activity = activityProbe.ref
|
||||
override def AvatarEvents = avatarProbe.ref
|
||||
override def VehicleEvents = vehicleProbe.ref
|
||||
override def tasks = catchall.ref
|
||||
import akka.actor.typed.scaladsl.adapter._
|
||||
this.actor = catchall.ref.toTyped[ZoneActor.Command]
|
||||
}
|
||||
val activityProbe = TestProbe()
|
||||
val avatarProbe = TestProbe()
|
||||
val vehicleProbe = TestProbe()
|
||||
zone.Activity = activityProbe.ref
|
||||
zone.AvatarEvents = avatarProbe.ref
|
||||
zone.VehicleEvents = vehicleProbe.ref
|
||||
|
||||
guid.register(atv, 1)
|
||||
guid.register(atvWeapon, 2)
|
||||
|
|
@ -1639,7 +1633,7 @@ class DamageableVehicleDestroyMountedTest extends ActorTest {
|
|||
guid.register(player2, 12)
|
||||
guid.register(player3, 13)
|
||||
|
||||
lodestar.Actor = system.actorOf(Props(classOf[VehicleControl], lodestar), "lodestar-control")
|
||||
lodestar.Definition.Initialize(lodestar, context)
|
||||
atv.Zone = zone
|
||||
lodestar.Zone = zone
|
||||
atv.Seats(0).mount(player2)
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ import net.psforever.objects.serverobject.generator.{Generator, GeneratorControl
|
|||
import net.psforever.objects.serverobject.structures.{Building, StructureType}
|
||||
import net.psforever.objects.serverobject.terminals.{Terminal, TerminalControl}
|
||||
import net.psforever.objects.serverobject.turret.{FacilityTurret, FacilityTurretControl}
|
||||
import net.psforever.objects.vehicles.VehicleControl
|
||||
import net.psforever.objects.vehicles.control.VehicleControl
|
||||
import net.psforever.objects.zones.{Zone, ZoneMap}
|
||||
import net.psforever.packet.game.{InventoryStateMessage, RepairMessage}
|
||||
import net.psforever.types._
|
||||
|
|
|
|||
|
|
@ -4,14 +4,14 @@ package objects
|
|||
import akka.actor.{ActorRef, Props}
|
||||
import akka.actor.typed.scaladsl.adapter._
|
||||
import akka.testkit.TestProbe
|
||||
import base.ActorTest
|
||||
import base.{ActorTest, FreedContextActorTest}
|
||||
import net.psforever.actors.zone.ZoneActor
|
||||
import net.psforever.objects._
|
||||
import net.psforever.objects.ce.{DeployableCategory, DeployedItem, TelepadLike}
|
||||
import net.psforever.objects.guid.NumberPoolHub
|
||||
import net.psforever.objects.guid.source.MaxNumberSource
|
||||
import net.psforever.objects.serverobject.deploy.Deployment
|
||||
import net.psforever.objects.vehicles.{Utility, UtilityType, VehicleControl}
|
||||
import net.psforever.objects.vehicles.{Utility, UtilityType}
|
||||
import net.psforever.objects.zones.{Zone, ZoneDeployableActor, ZoneMap}
|
||||
import net.psforever.packet.game.objectcreate.ObjectCreateMessageParent
|
||||
import net.psforever.packet.game._
|
||||
|
|
@ -214,7 +214,7 @@ class TelepadDeployableAttemptTest extends ActorTest {
|
|||
}
|
||||
}
|
||||
|
||||
class TelepadDeployableResponseFromRouterTest extends ActorTest {
|
||||
class TelepadDeployableResponseFromRouterTest extends FreedContextActorTest {
|
||||
val eventsProbe = new TestProbe(system)
|
||||
val telepad = new TelepadDeployable(TelepadRouterTest.router_telepad_deployable) //guid=1
|
||||
val router = Vehicle(GlobalDefinitions.router) //guid=2
|
||||
|
|
@ -242,17 +242,20 @@ class TelepadDeployableResponseFromRouterTest extends ActorTest {
|
|||
guid.register(internal, number = 3)
|
||||
guid.register(router.Utility(UtilityType.teleportpad_terminal).get, number = 4) //necessary
|
||||
router.Zone = zone
|
||||
router.Actor = system.actorOf(Props(classOf[VehicleControl], router), "test-router")
|
||||
router.Definition.Initialize(router, context)
|
||||
telepad.Router = PlanetSideGUID(2) //artificial
|
||||
|
||||
"TelepadDeployable" should {
|
||||
"link with a connected router" in {
|
||||
assert(!telepad.Active, "link to router test - telepad active earlier than intended (1)")
|
||||
assert(!internal.Active, "link to router test - router internals active earlier than intended")
|
||||
router.Actor.tell(Deployment.TryDeploy(DriveState.Deploying), new TestProbe(system).ref)
|
||||
val deploymentProbe = new TestProbe(system)
|
||||
router.Actor.tell(Deployment.TryDeploy(DriveState.Deploying), deploymentProbe.ref)
|
||||
eventsProbe.receiveN(10, 10.seconds) //flush all messages related to deployment
|
||||
deploymentProbe.receiveOne(2.seconds) //CanDeploy
|
||||
deploymentProbe.expectNoMessage(2.seconds) //intentional delay
|
||||
assert(internal.Active, "link to router test - router internals not active when expected")
|
||||
assert(!telepad.Active, "link to router test - telepad active earlier than intended (2)")
|
||||
assert(internal.Active, "link to router test - router internals active not active when expected")
|
||||
|
||||
assert(deployableList.isEmpty, "link to router test - deployable list is not empty")
|
||||
zone.Deployables ! Zone.Deployable.Build(telepad)
|
||||
|
|
|
|||
|
|
@ -7,15 +7,17 @@ import akka.testkit.TestProbe
|
|||
import base.{ActorTest, FreedContextActorTest}
|
||||
import net.psforever.actors.zone.ZoneActor
|
||||
import net.psforever.objects.avatar.{Avatar, PlayerControl}
|
||||
import net.psforever.objects.{GlobalDefinitions, Player, Vehicle}
|
||||
import net.psforever.objects.ce.DeployedItem
|
||||
import net.psforever.objects._
|
||||
import net.psforever.objects.guid.NumberPoolHub
|
||||
import net.psforever.objects.guid.source.MaxNumberSource
|
||||
import net.psforever.objects.serverobject.environment._
|
||||
import net.psforever.objects.serverobject.mount.Mountable
|
||||
import net.psforever.objects.vehicles.{VehicleControl, VehicleLockState}
|
||||
import net.psforever.objects.vital.VehicleShieldCharge
|
||||
import net.psforever.objects.vehicles.VehicleLockState
|
||||
import net.psforever.objects.vehicles.control.VehicleControl
|
||||
import net.psforever.objects.vital.{VehicleShieldCharge, Vitality}
|
||||
import net.psforever.objects.zones.{Zone, ZoneMap}
|
||||
import net.psforever.packet.game.{CargoMountPointStatusMessage, ObjectDetachMessage, PlanetsideAttributeMessage}
|
||||
import net.psforever.packet.game._
|
||||
import net.psforever.services.ServiceManager
|
||||
import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage}
|
||||
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage}
|
||||
|
|
@ -201,12 +203,16 @@ class VehicleControlPrepareForDeletionMountedInTest extends FreedContextActorTes
|
|||
}
|
||||
|
||||
class VehicleControlPrepareForDeletionMountedCargoTest extends FreedContextActorTest {
|
||||
val vehicleProbe = new TestProbe(system)
|
||||
val catchall = new TestProbe(system)
|
||||
val guid = new NumberPoolHub(new MaxNumberSource(10))
|
||||
ServiceManager.boot
|
||||
val zone = new Zone("test", new ZoneMap("test"), 0) {
|
||||
GUID(guid)
|
||||
|
||||
override def SetupNumberPools(): Unit = {}
|
||||
override def VehicleEvents = vehicleProbe.ref
|
||||
override def tasks = catchall.ref
|
||||
}
|
||||
zone.actor = system.spawn(ZoneActor(zone), "test-zone-actor")
|
||||
// crappy workaround but without it the zone doesn't get initialized in time
|
||||
|
|
@ -219,6 +225,7 @@ class VehicleControlPrepareForDeletionMountedCargoTest extends FreedContextActor
|
|||
vehicle.Actor = cargoProbe.ref
|
||||
val lodestar = Vehicle(GlobalDefinitions.lodestar)
|
||||
lodestar.Faction = PlanetSideEmpire.TR
|
||||
lodestar.Zone = zone
|
||||
val player1 = Player(VehicleTest.avatar1) //name="test1"
|
||||
val player2 = Player(VehicleTest.avatar2) //name="test2"
|
||||
|
||||
|
|
@ -237,85 +244,64 @@ class VehicleControlPrepareForDeletionMountedCargoTest extends FreedContextActor
|
|||
player2.VehicleSeated = lodestar.GUID
|
||||
lodestar.CargoHolds(1).mount(vehicle)
|
||||
vehicle.MountedIn = lodestar.GUID
|
||||
|
||||
val vehicleProbe = new TestProbe(system)
|
||||
zone.VehicleEvents = vehicleProbe.ref
|
||||
zone.Transport ! Zone.Vehicle.Spawn(lodestar) //can not fake this
|
||||
lodestar.Definition.Initialize(lodestar, context)
|
||||
|
||||
"VehicleControl" should {
|
||||
"if with mounted cargo, eject it when marked for deconstruction" in {
|
||||
lodestar.Actor ! Vehicle.Deconstruct()
|
||||
|
||||
val vehicle_msg = vehicleProbe.receiveN(6, 500 milliseconds)
|
||||
assert(
|
||||
vehicle_msg.head match {
|
||||
case VehicleServiceMessage(
|
||||
vehicle_msg(5) match {
|
||||
case VehicleServiceMessage(
|
||||
"test",
|
||||
VehicleAction.KickPassenger(PlanetSideGUID(4), 4, false, PlanetSideGUID(2))
|
||||
) =>
|
||||
true
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
) => ;
|
||||
case _ => assert(false)
|
||||
}
|
||||
assert(player2.VehicleSeated.isEmpty)
|
||||
assert(lodestar.Seats(0).occupant.isEmpty)
|
||||
//cargo dismounting messages
|
||||
assert(
|
||||
vehicle_msg(1) match {
|
||||
case VehicleServiceMessage(
|
||||
vehicle_msg.head match {
|
||||
case VehicleServiceMessage(
|
||||
_,
|
||||
VehicleAction.SendResponse(_, PlanetsideAttributeMessage(PlanetSideGUID(1), 0, _))
|
||||
) =>
|
||||
true
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
assert(
|
||||
vehicle_msg(2) match {
|
||||
case VehicleServiceMessage(
|
||||
) => ;
|
||||
case _ => assert(false)
|
||||
}
|
||||
vehicle_msg(1) match {
|
||||
case VehicleServiceMessage(
|
||||
_,
|
||||
VehicleAction.SendResponse(_, PlanetsideAttributeMessage(PlanetSideGUID(1), 68, _))
|
||||
) =>
|
||||
true
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
assert(
|
||||
vehicle_msg(3) match {
|
||||
case VehicleServiceMessage(
|
||||
) => ;
|
||||
case _ => assert(false)
|
||||
}
|
||||
vehicle_msg(2) match {
|
||||
case VehicleServiceMessage(
|
||||
"test",
|
||||
VehicleAction.SendResponse(
|
||||
_,
|
||||
CargoMountPointStatusMessage(PlanetSideGUID(2), _, PlanetSideGUID(1), _, 1, CargoStatus.InProgress, 0)
|
||||
_,
|
||||
CargoMountPointStatusMessage(PlanetSideGUID(2), _, PlanetSideGUID(1), _, 1, CargoStatus.InProgress, 0)
|
||||
)
|
||||
) =>
|
||||
true
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
assert(
|
||||
vehicle_msg(4) match {
|
||||
case VehicleServiceMessage(
|
||||
) => ;
|
||||
case _ => assert(false)
|
||||
}
|
||||
vehicle_msg(3) match {
|
||||
case VehicleServiceMessage(
|
||||
"test",
|
||||
VehicleAction.SendResponse(_, ObjectDetachMessage(PlanetSideGUID(2), PlanetSideGUID(1), _, _, _, _))
|
||||
) =>
|
||||
true
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
assert(
|
||||
vehicle_msg(5) match {
|
||||
case VehicleServiceMessage(
|
||||
) => ;
|
||||
case _ => assert(false)
|
||||
}
|
||||
vehicle_msg(4) match {
|
||||
case VehicleServiceMessage(
|
||||
"test",
|
||||
VehicleAction.SendResponse(
|
||||
_,
|
||||
CargoMountPointStatusMessage(PlanetSideGUID(2), _, _, PlanetSideGUID(1), 1, CargoStatus.Empty, 0)
|
||||
_,
|
||||
CargoMountPointStatusMessage(PlanetSideGUID(2), _, _, PlanetSideGUID(1), 1, CargoStatus.Empty, 0)
|
||||
)
|
||||
) =>
|
||||
true
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
) => ;
|
||||
case _ => assert(false)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -945,6 +931,142 @@ class VehicleControlInteractWithDeathTest extends ActorTest {
|
|||
}
|
||||
}
|
||||
|
||||
class ApcControlCanChargeCapacitor extends FreedContextActorTest {
|
||||
val apc = Vehicle(GlobalDefinitions.apc_tr) //guid=1, weapons not registered
|
||||
|
||||
val guid = new NumberPoolHub(new MaxNumberSource(max = 5))
|
||||
val localProbe = TestProbe()
|
||||
val vehicleProbe = TestProbe()
|
||||
val catchall = TestProbe()
|
||||
val zone = new Zone(id = "test-zone", new ZoneMap(name = "test-map"), zoneNumber = 0) {
|
||||
override def SetupNumberPools(): Unit = {}
|
||||
GUID(guid)
|
||||
override def Vehicles = List(apc)
|
||||
override def VehicleEvents = vehicleProbe.ref
|
||||
override def LocalEvents = localProbe.ref
|
||||
override def AvatarEvents = catchall.ref
|
||||
override def Activity = catchall.ref
|
||||
}
|
||||
|
||||
guid.register(apc, number = 1)
|
||||
apc.Faction = PlanetSideEmpire.VS
|
||||
apc.Zone = zone
|
||||
//apc.Definition.Initialize(apc, context) //do later ...
|
||||
zone.blockMap.addTo(apc)
|
||||
|
||||
val maxCapacitor = apc.Definition.MaxCapacitor
|
||||
|
||||
"ApcControl" should {
|
||||
"charge its capacitors when initialized" in {
|
||||
assert(apc.Capacitor == 0)
|
||||
apc.Definition.Initialize(apc, context)
|
||||
do {
|
||||
val msg = vehicleProbe.receiveOne(3.seconds)
|
||||
msg match {
|
||||
case VehicleServiceMessage(_, VehicleAction.PlanetsideAttribute(_, PlanetSideGUID(1), 113, capacitance)) =>
|
||||
assert(capacitance > 0)
|
||||
case _ =>
|
||||
assert(false)
|
||||
}
|
||||
}
|
||||
while(apc.Capacitor < maxCapacitor)
|
||||
vehicleProbe.expectNoMessage(5.seconds)
|
||||
assert(apc.Capacitor == maxCapacitor)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class ApcControlCanEmp extends FreedContextActorTest {
|
||||
val apc = Vehicle(GlobalDefinitions.apc_vs) //guid=1, weapons not registered
|
||||
val fury = Vehicle(GlobalDefinitions.fury) //guid=2, weapons not registered
|
||||
val boomer = Deployables.Make(DeployedItem.boomer)() //guid=3, no trigger
|
||||
val boomer2 = Deployables.Make(DeployedItem.boomer)() //guid=4, no trigger
|
||||
|
||||
val guid = new NumberPoolHub(new MaxNumberSource(max = 5))
|
||||
val localProbe = TestProbe()
|
||||
val vehicleProbe = TestProbe()
|
||||
val catchall = TestProbe()
|
||||
val zone = new Zone(id = "test-zone", new ZoneMap(name = "test-map"), zoneNumber = 0) {
|
||||
override def SetupNumberPools(): Unit = {}
|
||||
GUID(guid)
|
||||
override def Vehicles = List(apc, fury)
|
||||
override def DeployableList = List(boomer, boomer2)
|
||||
override def VehicleEvents = vehicleProbe.ref
|
||||
override def LocalEvents = localProbe.ref
|
||||
override def AvatarEvents = catchall.ref
|
||||
override def Activity = catchall.ref
|
||||
}
|
||||
|
||||
guid.register(apc, number = 1)
|
||||
apc.Faction = PlanetSideEmpire.VS
|
||||
apc.Zone = zone
|
||||
apc.Capacitor = apc.Definition.MaxCapacitor
|
||||
apc.Definition.Initialize(apc, context)
|
||||
zone.blockMap.addTo(apc)
|
||||
|
||||
val furyProbe = TestProbe()
|
||||
guid.register(fury, number = 2)
|
||||
fury.Position = Vector3(4, 0, 0) //within 15m of apc
|
||||
fury.Faction = PlanetSideEmpire.TR
|
||||
fury.Zone = zone
|
||||
fury.Actor = furyProbe.ref
|
||||
zone.blockMap.addTo(fury)
|
||||
|
||||
val boomerProbe = TestProbe()
|
||||
guid.register(boomer, number = 3)
|
||||
boomer.Position = Vector3(0, 14, 0) //within 15m of apc
|
||||
boomer.Faction = PlanetSideEmpire.TR
|
||||
boomer.Zone = zone
|
||||
boomer.Actor = boomerProbe.ref
|
||||
zone.blockMap.addTo(boomer)
|
||||
|
||||
val boomer2Probe = TestProbe()
|
||||
guid.register(boomer2, number = 4)
|
||||
boomer2.Position = Vector3(0, 30, 0) //beyond 15m of apc
|
||||
boomer2.Faction = PlanetSideEmpire.TR
|
||||
boomer2.Zone = zone
|
||||
boomer2.Actor = boomer2Probe.ref
|
||||
zone.blockMap.addTo(boomer2)
|
||||
|
||||
"ApcControl" should {
|
||||
"charge its capacitors when initialized" in {
|
||||
assert(apc.Capacitor == apc.Definition.MaxCapacitor)
|
||||
apc.Definition.Initialize(apc, context)
|
||||
vehicleProbe.expectNoMessage(5.seconds) //the capacitor is max, so no charging is needed
|
||||
|
||||
apc.Actor ! SpecialEmp.Burst()
|
||||
val vehicleMsgs = vehicleProbe.receiveN(2, 500.milliseconds)
|
||||
vehicleMsgs.head match {
|
||||
case VehicleServiceMessage(_, VehicleAction.PlanetsideAttribute(_, PlanetSideGUID(1), 113, 0)) => ;
|
||||
case _ => assert(false)
|
||||
}
|
||||
vehicleMsgs(1) match {
|
||||
case VehicleServiceMessage(
|
||||
"test-zone",
|
||||
VehicleAction.SendResponse(
|
||||
_,
|
||||
TriggerEffectMessage(_, "apc_explosion_emp_vs", None, Some(TriggeredEffectLocation(Vector3.Zero, Vector3.Zero)))
|
||||
)
|
||||
) => ;
|
||||
case _ => assert(false)
|
||||
}
|
||||
assert(apc.Capacitor == 0)
|
||||
|
||||
val furyMsg = furyProbe.receiveOne(200.milliseconds)
|
||||
furyMsg match {
|
||||
case Vitality.Damage(_) => ;
|
||||
case _ => assert(false)
|
||||
}
|
||||
val boomerMsg = boomerProbe.receiveOne(200.milliseconds)
|
||||
boomerMsg match {
|
||||
case Vitality.Damage(_) => ;
|
||||
case _ => assert(false)
|
||||
}
|
||||
boomer2Probe.expectNoMessage(400.milliseconds) //out of range
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
object VehicleControlTest {
|
||||
import net.psforever.objects.avatar.Avatar
|
||||
import net.psforever.types.{CharacterSex, PlanetSideEmpire}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue