mirror of
https://github.com/2revoemag/PSF-BotServer.git
synced 2026-03-19 12:00:39 +00:00
The Blockmap (#852)
* separating geometry classes * 2d geometry; retirement of the *3D suffix * makings of an early block map datastructure * entities in a zone - players, corpses, vehicles, deployables, ground clutter, and buildings - divided between sectors of the zone upon creation, management, or mounting; superfluous messages to keep track of blockmap state, for now * trait for entities to be added to the blockmap; internal entity data keeps track of current blockmap sector information; calls to add/remove/update functions changed * modified pieces of environment into an entities that can be added to a block map and have a countable bounding region; fixes for vehicle control seat occcupant collection; fix for squad individual callback references (original issue still remains?) * introduced the block map into various existijng game calculationa where target selection can be reduced by its probing * he_mines and jammer_mines now trigger if a valid target is detected at the initial point of deploy; they also trigger later, after a valid target has moved into the arming range of the mine * conversion of interactions with zone into a queued, periodic set of tasks * explosive deployable control -> mine deployable control * tests repaired and all tests working * mostly comments and documentation * amenities are now represented on the blockmap
This commit is contained in:
parent
8bf0c4cbff
commit
3966b0264d
66 changed files with 2701 additions and 1011 deletions
|
|
@ -4,6 +4,8 @@ package objects
|
|||
import akka.actor.{ActorRef, Props}
|
||||
import akka.testkit.TestProbe
|
||||
import base.{ActorTest, FreedContextActorTest}
|
||||
import akka.actor.typed.scaladsl.adapter._
|
||||
import net.psforever.actors.zone.ZoneActor
|
||||
import net.psforever.objects.avatar.{Avatar, Certification, PlayerControl}
|
||||
import net.psforever.objects.{ConstructionItem, Deployables, GlobalDefinitions, Player}
|
||||
import net.psforever.objects.ce.{Deployable, DeployedItem}
|
||||
|
|
@ -32,6 +34,8 @@ class DeployableBehaviorSetupTest extends ActorTest {
|
|||
override def AvatarEvents: ActorRef = eventsProbe.ref
|
||||
override def LocalEvents: ActorRef = eventsProbe.ref
|
||||
override def Deployables: ActorRef = deployables
|
||||
|
||||
this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
|
||||
}
|
||||
guid.register(jmine, number = 1)
|
||||
jmine.Faction = PlanetSideEmpire.TR
|
||||
|
|
@ -91,6 +95,8 @@ class DeployableBehaviorSetupOwnedP1Test extends ActorTest {
|
|||
override def Deployables: ActorRef = deployables
|
||||
override def Players = List(avatar)
|
||||
override def LivePlayers = List(player)
|
||||
|
||||
this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
|
||||
}
|
||||
guid.register(jmine, number = 1)
|
||||
guid.register(citem, number = 2)
|
||||
|
|
@ -136,6 +142,8 @@ class DeployableBehaviorSetupOwnedP2Test extends FreedContextActorTest {
|
|||
override def Players = List(avatar)
|
||||
override def LivePlayers = List(player)
|
||||
override def tasks: ActorRef = eventsProbe.ref
|
||||
|
||||
this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
|
||||
}
|
||||
guid.register(jmine, number = 1)
|
||||
guid.register(citem, number = 2)
|
||||
|
|
@ -238,6 +246,8 @@ class DeployableBehaviorDeconstructTest extends ActorTest {
|
|||
override def LocalEvents: ActorRef = eventsProbe.ref
|
||||
override def tasks: ActorRef = eventsProbe.ref
|
||||
override def Deployables: ActorRef = deployables
|
||||
|
||||
this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
|
||||
}
|
||||
guid.register(jmine, number = 1)
|
||||
jmine.Faction = PlanetSideEmpire.TR
|
||||
|
|
@ -295,6 +305,8 @@ class DeployableBehaviorDeconstructOwnedTest extends FreedContextActorTest {
|
|||
override def Players = List(avatar)
|
||||
override def LivePlayers = List(player)
|
||||
override def tasks: ActorRef = eventsProbe.ref
|
||||
|
||||
this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
|
||||
}
|
||||
guid.register(jmine, number = 1)
|
||||
guid.register(citem, number = 2)
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ package objects
|
|||
import akka.actor.{Actor, ActorRef, Props}
|
||||
import akka.testkit.TestProbe
|
||||
import base.ActorTest
|
||||
import net.psforever.actors.zone.ZoneActor
|
||||
import net.psforever.objects.ballistics._
|
||||
import net.psforever.objects.ce.DeployedItem
|
||||
import net.psforever.objects.guid.NumberPoolHub
|
||||
|
|
@ -23,6 +24,8 @@ import net.psforever.objects.vital.base.DamageResolution
|
|||
import net.psforever.objects.vital.interaction.DamageInteraction
|
||||
import net.psforever.objects.vital.projectile.ProjectileReason
|
||||
|
||||
import akka.actor.typed.scaladsl.adapter._
|
||||
|
||||
import scala.collection.mutable.ListBuffer
|
||||
import scala.concurrent.duration._
|
||||
|
||||
|
|
@ -339,7 +342,7 @@ class ExplosiveDeployableJammerTest extends ActorTest {
|
|||
j_mine.Owner = player2
|
||||
j_mine.OwnerName = player2.Name
|
||||
j_mine.Faction = PlanetSideEmpire.NC
|
||||
j_mine.Actor = system.actorOf(Props(classOf[ExplosiveDeployableControl], j_mine), "j-mine-control")
|
||||
j_mine.Actor = system.actorOf(Props(classOf[MineDeployableControl], j_mine), "j-mine-control")
|
||||
|
||||
val jMineSource = SourceEntry(j_mine)
|
||||
val pSource = PlayerSource(player1)
|
||||
|
|
@ -406,6 +409,8 @@ class ExplosiveDeployableJammerExplodeTest extends ActorTest {
|
|||
override def Players = List(avatar1, avatar2)
|
||||
override def LivePlayers = List(player1, player2)
|
||||
override def tasks: ActorRef = eventsProbe.ref
|
||||
|
||||
this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
|
||||
}
|
||||
player1.Spawn()
|
||||
player1.Actor = player1Probe.ref
|
||||
|
|
@ -421,7 +426,9 @@ class ExplosiveDeployableJammerExplodeTest extends ActorTest {
|
|||
h_mine.Owner = player2
|
||||
h_mine.OwnerName = player2.Name
|
||||
h_mine.Faction = PlanetSideEmpire.NC
|
||||
h_mine.Actor = system.actorOf(Props(classOf[ExplosiveDeployableControl], h_mine), "h-mine-control")
|
||||
h_mine.Actor = system.actorOf(Props(classOf[MineDeployableControl], h_mine), "h-mine-control")
|
||||
zone.blockMap.addTo(player1)
|
||||
zone.blockMap.addTo(player2)
|
||||
|
||||
val pSource = PlayerSource(player1)
|
||||
val projectile = weapon.Projectile
|
||||
|
|
@ -527,7 +534,7 @@ class ExplosiveDeployableDestructionTest extends ActorTest {
|
|||
h_mine.Owner = player2
|
||||
h_mine.OwnerName = player2.Name
|
||||
h_mine.Faction = PlanetSideEmpire.NC
|
||||
h_mine.Actor = system.actorOf(Props(classOf[ExplosiveDeployableControl], h_mine), "h-mine-control")
|
||||
h_mine.Actor = system.actorOf(Props(classOf[MineDeployableControl], h_mine), "h-mine-control")
|
||||
|
||||
val hMineSource = SourceEntry(h_mine)
|
||||
val pSource = PlayerSource(player1)
|
||||
|
|
@ -633,6 +640,10 @@ class TurretControlMountTest extends ActorTest {
|
|||
"control mounting" in {
|
||||
val obj = new TurretDeployable(GlobalDefinitions.portable_manned_turret_tr) { GUID = PlanetSideGUID(1) }
|
||||
obj.Faction = PlanetSideEmpire.TR
|
||||
obj.Zone = new Zone("test", new ZoneMap("test"), 0) {
|
||||
override def SetupNumberPools() = {}
|
||||
this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
|
||||
}
|
||||
obj.Actor = system.actorOf(Props(classOf[TurretControl], obj), s"${obj.Definition.Name}_test")
|
||||
|
||||
assert(obj.Seats(0).occupant.isEmpty)
|
||||
|
|
@ -654,6 +665,10 @@ class TurretControlBlockMountTest extends ActorTest {
|
|||
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")
|
||||
obj.Zone = new Zone("test", new ZoneMap("test"), 0) {
|
||||
override def SetupNumberPools() = {}
|
||||
this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
|
||||
}
|
||||
|
||||
assert(obj.Seats(0).occupant.isEmpty)
|
||||
val player1 = Player(Avatar(0, "test1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
|
||||
|
|
@ -701,6 +716,10 @@ class TurretControlDismountTest extends ActorTest {
|
|||
"control dismounting" in {
|
||||
val obj = new TurretDeployable(GlobalDefinitions.portable_manned_turret_tr) { GUID = PlanetSideGUID(1) }
|
||||
obj.Faction = PlanetSideEmpire.TR
|
||||
obj.Zone = new Zone("test", new ZoneMap("test"), 0) {
|
||||
override def SetupNumberPools() = {}
|
||||
this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
|
||||
}
|
||||
obj.Actor = system.actorOf(Props(classOf[TurretControl], obj), s"${obj.Definition.Name}_test")
|
||||
|
||||
assert(obj.Seats(0).occupant.isEmpty)
|
||||
|
|
@ -733,7 +752,13 @@ class TurretControlBetrayalMountTest extends ActorTest {
|
|||
MountPoints += 1 -> MountInfo(0, Vector3.Zero)
|
||||
FactionLocked = false
|
||||
} //required (defaults to true)
|
||||
) { GUID = PlanetSideGUID(1) }
|
||||
) {
|
||||
GUID = PlanetSideGUID(1)
|
||||
Zone = new Zone("test", new ZoneMap("test"), 0) {
|
||||
override def SetupNumberPools() = {}
|
||||
this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
|
||||
}
|
||||
}
|
||||
obj.Faction = PlanetSideEmpire.TR
|
||||
obj.Actor = system.actorOf(Props(classOf[TurretControl], obj), s"${obj.Definition.Name}_test")
|
||||
val probe = new TestProbe(system)
|
||||
|
|
|
|||
|
|
@ -3,7 +3,9 @@ package objects
|
|||
|
||||
import akka.actor.Props
|
||||
import akka.testkit.TestProbe
|
||||
import akka.actor.typed.scaladsl.adapter._
|
||||
import base.ActorTest
|
||||
import net.psforever.actors.zone.ZoneActor
|
||||
import net.psforever.objects.avatar.{Avatar, Certification}
|
||||
import net.psforever.objects.{Default, GlobalDefinitions, Player, Tool}
|
||||
import net.psforever.objects.definition.ToolDefinition
|
||||
|
|
@ -103,6 +105,10 @@ class FacilityTurretControl2Test extends ActorTest {
|
|||
val player = Player(Avatar(0, "", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
|
||||
val obj = FacilityTurret(GlobalDefinitions.manned_turret)
|
||||
obj.GUID = PlanetSideGUID(1)
|
||||
obj.Zone = new Zone("test", new ZoneMap("test"), 0) {
|
||||
override def SetupNumberPools() = {}
|
||||
this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
|
||||
}
|
||||
obj.Actor = system.actorOf(Props(classOf[FacilityTurretControl], obj), "turret-control")
|
||||
val bldg = Building("Building", guid = 0, map_id = 0, Zone.Nowhere, StructureType.Building)
|
||||
bldg.Amenities = obj
|
||||
|
|
@ -156,6 +162,10 @@ class FacilityTurretControl4Test extends ActorTest {
|
|||
val player = Player(Avatar(0, "", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
|
||||
val obj = FacilityTurret(GlobalDefinitions.vanu_sentry_turret)
|
||||
obj.GUID = PlanetSideGUID(1)
|
||||
obj.Zone = new Zone("test", new ZoneMap("test"), 0) {
|
||||
override def SetupNumberPools() = {}
|
||||
this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
|
||||
}
|
||||
obj.Actor = system.actorOf(Props(classOf[FacilityTurretControl], obj), "turret-control")
|
||||
val bldg = Building("Building", guid = 0, map_id = 0, Zone.Nowhere, StructureType.Building)
|
||||
bldg.Amenities = obj
|
||||
|
|
|
|||
|
|
@ -375,6 +375,8 @@ class GeneratorControlKillsTest extends ActorTest {
|
|||
guid.register(gen, 2)
|
||||
guid.register(player1, 3)
|
||||
guid.register(player2, 4)
|
||||
zone.blockMap.addTo(player1)
|
||||
zone.blockMap.addTo(player2)
|
||||
|
||||
val weapon = Tool(GlobalDefinitions.phoenix) //decimator
|
||||
val projectile = weapon.Projectile
|
||||
|
|
|
|||
|
|
@ -1,238 +1,214 @@
|
|||
// Copyright (c) 2021 PSForever
|
||||
package objects
|
||||
|
||||
import net.psforever.objects.geometry._
|
||||
import net.psforever.objects.geometry.d3._
|
||||
import net.psforever.types.Vector3
|
||||
import org.specs2.mutable.Specification
|
||||
|
||||
class GeometryTest extends Specification {
|
||||
"Point3D" should {
|
||||
"Point" should {
|
||||
"construct (1)" in {
|
||||
Point3D(1,2,3.5f)
|
||||
Point(1,2,3.5f)
|
||||
ok
|
||||
}
|
||||
|
||||
"construct (2)" in {
|
||||
Point3D() mustEqual Point3D(0,0,0)
|
||||
Point() mustEqual Point(0,0,0)
|
||||
}
|
||||
|
||||
"construct (3)" in {
|
||||
Point3D(Vector3(1,2,3)) mustEqual Point3D(1,2,3)
|
||||
Point(Vector3(1,2,3)) mustEqual Point(1,2,3)
|
||||
}
|
||||
|
||||
"be its own center point" in {
|
||||
val obj = Point3D(1,2,3.5f)
|
||||
val obj = Point(1,2,3.5f)
|
||||
obj.center mustEqual obj
|
||||
}
|
||||
|
||||
"define its own exterior" in {
|
||||
val obj = Point3D(1,2,3.5f)
|
||||
val obj = Point(1,2,3.5f)
|
||||
obj.pointOnOutside(Vector3(1,0,0)) mustEqual obj
|
||||
obj.pointOnOutside(Vector3(0,1,0)) mustEqual obj
|
||||
obj.pointOnOutside(Vector3(0,0,1)) mustEqual obj
|
||||
}
|
||||
|
||||
"convert to Vector3" in {
|
||||
val obj = Point3D(1,2,3.5f)
|
||||
val obj = Point(1,2,3.5f)
|
||||
obj.asVector3 mustEqual Vector3(1,2,3.5f)
|
||||
}
|
||||
}
|
||||
|
||||
"Ray3D" should {
|
||||
"Ray" should {
|
||||
"construct (1)" in {
|
||||
Ray3D(Point3D(1,2,3.5f), Vector3(1,0,0))
|
||||
Ray(Point(1,2,3.5f), Vector3(1,0,0))
|
||||
ok
|
||||
}
|
||||
|
||||
"construct (2)" in {
|
||||
Ray3D(1,2,3.5f, Vector3(1,0,0)) mustEqual Ray3D(Point3D(1,2,3.5f), Vector3(1,0,0))
|
||||
Ray(1,2,3.5f, Vector3(1,0,0)) mustEqual Ray(Point(1,2,3.5f), Vector3(1,0,0))
|
||||
}
|
||||
|
||||
"construct (3)" in {
|
||||
Ray3D(Vector3(1,2,3.5f), Vector3(1,0,0)) mustEqual Ray3D(Point3D(1,2,3.5f), Vector3(1,0,0))
|
||||
Ray(Vector3(1,2,3.5f), Vector3(1,0,0)) mustEqual Ray(Point(1,2,3.5f), Vector3(1,0,0))
|
||||
}
|
||||
|
||||
"have a unit vector as its direction vector" in {
|
||||
Ray3D(1,2,3.5f, Vector3(1,1,1)) must throwA[AssertionError]
|
||||
Ray(1,2,3.5f, Vector3(1,1,1)) must throwA[AssertionError]
|
||||
}
|
||||
|
||||
"have its target point as the center point" in {
|
||||
val obj = Ray3D(1,2,3.5f, Vector3(1,0,0))
|
||||
obj.center mustEqual Point3D(1,2,3.5f)
|
||||
}
|
||||
|
||||
"define its own exterior" in {
|
||||
val obj1 = Ray3D(1,2,3.5f, Vector3(1,0,0))
|
||||
val obj2 = Point3D(1,2,3.5f)
|
||||
obj1.pointOnOutside(Vector3(1,0,0)) mustEqual obj2
|
||||
obj1.pointOnOutside(Vector3(0,1,0)) mustEqual obj2
|
||||
obj1.pointOnOutside(Vector3(0,0,1)) mustEqual obj2
|
||||
val obj = Ray(1,2,3.5f, Vector3(1,0,0))
|
||||
obj.center mustEqual Point(1,2,3.5f)
|
||||
}
|
||||
}
|
||||
|
||||
"Line3D" should {
|
||||
"Line" should {
|
||||
"construct (1)" in {
|
||||
Line3D(Point3D(1,2,3.5f), Vector3(1,0,0))
|
||||
Line(Point(1,2,3.5f), Vector3(1,0,0))
|
||||
ok
|
||||
}
|
||||
|
||||
"construct (2)" in {
|
||||
Line3D(1,2,3.5f, Vector3(1,0,0))
|
||||
Line(1,2,3.5f, Vector3(1,0,0))
|
||||
ok
|
||||
}
|
||||
|
||||
"construct (3)" in {
|
||||
Line3D(1,2,3.5f, 2,2,3.5f) mustEqual Line3D(1,2,3.5f, Vector3(1,0,0))
|
||||
Line(1,2,3.5f, 2,2,3.5f) mustEqual Line(1,2,3.5f, Vector3(1,0,0))
|
||||
}
|
||||
|
||||
"have a unit vector as its direction vector" in {
|
||||
Line3D(1,2,3.5f, Vector3(1,1,1)) must throwA[AssertionError]
|
||||
Line(1,2,3.5f, Vector3(1,1,1)) must throwA[AssertionError]
|
||||
}
|
||||
|
||||
"have its target point as the center point" in {
|
||||
val obj = Line3D(1,2,3.5f, Vector3(1,0,0))
|
||||
obj.center mustEqual Point3D(1,2,3.5f)
|
||||
}
|
||||
|
||||
"define its own exterior" in {
|
||||
val obj1 = Line3D(1,2,3.5f, Vector3(1,0,0))
|
||||
val obj2 = Point3D(1,2,3.5f)
|
||||
obj1.pointOnOutside(Vector3(1,0,0)) mustEqual obj2
|
||||
obj1.pointOnOutside(Vector3(0,1,0)) mustEqual obj2
|
||||
obj1.pointOnOutside(Vector3(0,0,1)) mustEqual obj2
|
||||
val obj = Line(1,2,3.5f, Vector3(1,0,0))
|
||||
obj.center mustEqual Point(1,2,3.5f)
|
||||
}
|
||||
}
|
||||
|
||||
"Segment3D" should {
|
||||
"Segment" should {
|
||||
"construct (1)" in {
|
||||
Segment3D(Point3D(1,2,3), Point3D(3,2,3))
|
||||
Segment(Point(1,2,3), Point(3,2,3))
|
||||
ok
|
||||
}
|
||||
|
||||
"construct (2)" in {
|
||||
Segment3D(1,2,3, 3,2,3) mustEqual Segment3D(Point3D(1,2,3), Point3D(3,2,3))
|
||||
Segment(1,2,3, 3,2,3) mustEqual Segment(Point(1,2,3), Point(3,2,3))
|
||||
ok
|
||||
}
|
||||
|
||||
"construct (3)" in {
|
||||
Segment3D(Point3D(1,2,3), Vector3(1,0,0)) mustEqual Segment3D(Point3D(1,2,3), Point3D(2,2,3))
|
||||
Segment(Point(1,2,3), Vector3(1,0,0)) mustEqual Segment(Point(1,2,3), Point(2,2,3))
|
||||
}
|
||||
|
||||
"construct (4)" in {
|
||||
Segment3D(1,2,3, Vector3(1,0,0)) mustEqual Segment3D(Point3D(1,2,3), Point3D(2,2,3))
|
||||
Segment(1,2,3, Vector3(1,0,0)) mustEqual Segment(Point(1,2,3), Point(2,2,3))
|
||||
}
|
||||
|
||||
"does not need to have unit vector as its direction vector" in {
|
||||
val obj1 = Segment3D(1,2,3, Vector3(5,1,1))
|
||||
val obj2 = Segment3D(Point3D(1,2,3), Point3D(6,3,4))
|
||||
val obj1 = Segment(1,2,3, Vector3(5,1,1))
|
||||
val obj2 = Segment(Point(1,2,3), Point(6,3,4))
|
||||
obj1 mustEqual obj2
|
||||
obj1.d mustEqual obj2.d
|
||||
}
|
||||
|
||||
"have a midway point between its two endpoints" in {
|
||||
Segment3D(Point3D(1,2,3), Point3D(3,4,5)).center mustEqual Point3D(2,3,4)
|
||||
}
|
||||
|
||||
"report the point on the outside as its center point" in {
|
||||
val obj1 = Segment3D(Point3D(1,2,3), Point3D(3,4,5))
|
||||
val obj2 = obj1.center
|
||||
obj1.pointOnOutside(Vector3(1,0,0)) mustEqual obj2
|
||||
obj1.pointOnOutside(Vector3(0,1,0)) mustEqual obj2
|
||||
obj1.pointOnOutside(Vector3(0,0,1)) mustEqual obj2
|
||||
Segment(Point(1,2,3), Point(3,4,5)).center mustEqual Point(2,3,4)
|
||||
}
|
||||
}
|
||||
|
||||
"Sphere3D" should {
|
||||
"construct (1)" in {
|
||||
Sphere(Point3D(1,2,3), 3)
|
||||
Sphere(Point(1,2,3), 3)
|
||||
ok
|
||||
}
|
||||
|
||||
"construct (2)" in {
|
||||
Sphere(3) mustEqual Sphere(Point3D(0,0,0), 3)
|
||||
Sphere(3) mustEqual Sphere(Point(0,0,0), 3)
|
||||
ok
|
||||
}
|
||||
|
||||
"construct (3)" in {
|
||||
Sphere(1,2,3, 3) mustEqual Sphere(Point3D(1,2,3), 3)
|
||||
Sphere(1,2,3, 3) mustEqual Sphere(Point(1,2,3), 3)
|
||||
}
|
||||
|
||||
"construct (4)" in {
|
||||
Sphere(Vector3(1,2,3), 3) mustEqual Sphere(Point3D(1,2,3), 3)
|
||||
Sphere(Vector3(1,2,3), 3) mustEqual Sphere(Point(1,2,3), 3)
|
||||
}
|
||||
|
||||
"the center point is self-evident" in {
|
||||
Sphere(Point3D(1,2,3), 3).center mustEqual Point3D(1,2,3)
|
||||
Sphere(Point(1,2,3), 3).center mustEqual Point(1,2,3)
|
||||
}
|
||||
|
||||
"report the point on the outside depending on the requested direction" in {
|
||||
val obj1 = Sphere(1,2,3, 3)
|
||||
obj1.pointOnOutside(Vector3( 1, 0, 0)) mustEqual Point3D( 4, 2,3) //east
|
||||
obj1.pointOnOutside(Vector3( 0, 1, 0)) mustEqual Point3D( 1, 5,3) //north
|
||||
obj1.pointOnOutside(Vector3( 0, 0, 1)) mustEqual Point3D( 1, 2,6) //up
|
||||
obj1.pointOnOutside(Vector3(-1, 0, 0)) mustEqual Point3D(-2, 2,3) //west
|
||||
obj1.pointOnOutside(Vector3( 0,-1, 0)) mustEqual Point3D( 1,-1,3) //south
|
||||
obj1.pointOnOutside(Vector3( 0, 0,-1)) mustEqual Point3D( 1, 2,0) //down
|
||||
obj1.pointOnOutside(Vector3( 1, 0, 0)) mustEqual Point( 4, 2,3) //east
|
||||
obj1.pointOnOutside(Vector3( 0, 1, 0)) mustEqual Point( 1, 5,3) //north
|
||||
obj1.pointOnOutside(Vector3( 0, 0, 1)) mustEqual Point( 1, 2,6) //up
|
||||
obj1.pointOnOutside(Vector3(-1, 0, 0)) mustEqual Point(-2, 2,3) //west
|
||||
obj1.pointOnOutside(Vector3( 0,-1, 0)) mustEqual Point( 1,-1,3) //south
|
||||
obj1.pointOnOutside(Vector3( 0, 0,-1)) mustEqual Point( 1, 2,0) //down
|
||||
}
|
||||
}
|
||||
|
||||
"Cylinder (normal)" should {
|
||||
"construct (1)" in {
|
||||
Cylinder(Point3D(1,2,3), Vector3(0,0,1), 2, 3)
|
||||
Cylinder(Point(1,2,3), Vector3(0,0,1), 2, 3)
|
||||
ok
|
||||
}
|
||||
|
||||
"construct (2)" in {
|
||||
Cylinder(Point3D(1,2,3), 2, 3) mustEqual Cylinder(Point3D(1,2,3), Vector3(0,0,1), 2, 3)
|
||||
Cylinder(Point(1,2,3), 2, 3) mustEqual Cylinder(Point(1,2,3), Vector3(0,0,1), 2, 3)
|
||||
}
|
||||
|
||||
"construct (3)" in {
|
||||
Cylinder(Vector3(1,2,3), 2, 3) mustEqual Cylinder(Point3D(1,2,3), Vector3(0,0,1), 2, 3)
|
||||
Cylinder(Vector3(1,2,3), 2, 3) mustEqual Cylinder(Point(1,2,3), Vector3(0,0,1), 2, 3)
|
||||
}
|
||||
|
||||
"construct (4)" in {
|
||||
Cylinder(Vector3(1,2,3), Vector3(0,0,1), 2, 3) mustEqual Cylinder(Point3D(1,2,3), Vector3(0,0,1), 2, 3)
|
||||
Cylinder(Vector3(1,2,3), Vector3(0,0,1), 2, 3) mustEqual Cylinder(Point(1,2,3), Vector3(0,0,1), 2, 3)
|
||||
}
|
||||
|
||||
"report the center point as the center of the cylinder" in {
|
||||
Cylinder(Point3D(1,2,3), 2, 3).center mustEqual Point3D(1,2,4.5f)
|
||||
Cylinder(Point(1,2,3), 2, 3).center mustEqual Point(1,2,4.5f)
|
||||
}
|
||||
|
||||
"the point on the outside is different depending on the requested direction" in {
|
||||
val obj1 = Cylinder(Point3D(1,2,3), 2, 3)
|
||||
obj1.pointOnOutside(Vector3( 1, 0, 0)) mustEqual Point3D( 3, 2, 4.5f) //east
|
||||
obj1.pointOnOutside(Vector3( 0, 1, 0)) mustEqual Point3D( 1, 4, 4.5f) //north
|
||||
obj1.pointOnOutside(Vector3( 0, 0, 1)) mustEqual Point3D( 1, 2, 6f) //up
|
||||
obj1.pointOnOutside(Vector3(-1, 0, 0)) mustEqual Point3D(-1, 2, 4.5f) //west
|
||||
obj1.pointOnOutside(Vector3( 0,-1, 0)) mustEqual Point3D( 1, 0, 4.5f) //south
|
||||
obj1.pointOnOutside(Vector3( 0, 0,-1)) mustEqual Point3D( 1, 2, 3f) //down
|
||||
val obj1 = Cylinder(Point(1,2,3), 2, 3)
|
||||
obj1.pointOnOutside(Vector3( 1, 0, 0)) mustEqual Point( 3, 2, 4.5f) //east
|
||||
obj1.pointOnOutside(Vector3( 0, 1, 0)) mustEqual Point( 1, 4, 4.5f) //north
|
||||
obj1.pointOnOutside(Vector3( 0, 0, 1)) mustEqual Point( 1, 2, 6f) //up
|
||||
obj1.pointOnOutside(Vector3(-1, 0, 0)) mustEqual Point(-1, 2, 4.5f) //west
|
||||
obj1.pointOnOutside(Vector3( 0,-1, 0)) mustEqual Point( 1, 0, 4.5f) //south
|
||||
obj1.pointOnOutside(Vector3( 0, 0,-1)) mustEqual Point( 1, 2, 3f) //down
|
||||
}
|
||||
}
|
||||
|
||||
"Cylinder (side tilt)" should {
|
||||
"not require a specific direction to be relative up" in {
|
||||
Cylinder(Point3D(1,2,3), Vector3(1,0,0), 2, 3)
|
||||
Cylinder(Point(1,2,3), Vector3(1,0,0), 2, 3)
|
||||
ok
|
||||
}
|
||||
|
||||
"require its specific relative up direction to be expressed as a unit vector" in {
|
||||
Cylinder(Point3D(1,2,3), Vector3(4,0,0), 2, 3) must throwA[AssertionError]
|
||||
Cylinder(Point(1,2,3), Vector3(4,0,0), 2, 3) must throwA[AssertionError]
|
||||
}
|
||||
|
||||
"report the center point as the center of the cylinder, as if rotated about its base" in {
|
||||
Cylinder(Point3D(1,2,3), Vector3(1,0,0), 2, 3).center mustEqual Point3D(2.5f, 2, 3)
|
||||
Cylinder(Point(1,2,3), Vector3(1,0,0), 2, 3).center mustEqual Point(2.5f, 2, 3)
|
||||
}
|
||||
|
||||
"report the point on the outside as different depending on the requested direction and the relative up direction" in {
|
||||
val obj1 = Cylinder(Point3D(1,2,3), Vector3(1,0,0), 2, 3)
|
||||
obj1.pointOnOutside(Vector3( 1, 0, 0)) mustEqual Point3D(4, 2, 3) //east
|
||||
obj1.pointOnOutside(Vector3( 0, 1, 0)) mustEqual Point3D(2.5f, 4, 3) //north
|
||||
obj1.pointOnOutside(Vector3( 0, 0, 1)) mustEqual Point3D(2.5f, 2, 5) //up
|
||||
obj1.pointOnOutside(Vector3(-1, 0, 0)) mustEqual Point3D(1, 2, 3) //west
|
||||
obj1.pointOnOutside(Vector3( 0,-1, 0)) mustEqual Point3D(2.5f, 0, 3) //south
|
||||
obj1.pointOnOutside(Vector3( 0, 0,-1)) mustEqual Point3D(2.5f, 2, 1) //down
|
||||
val obj1 = Cylinder(Point(1,2,3), Vector3(1,0,0), 2, 3)
|
||||
obj1.pointOnOutside(Vector3( 1, 0, 0)) mustEqual Point(4, 2, 3) //east
|
||||
obj1.pointOnOutside(Vector3( 0, 1, 0)) mustEqual Point(2.5f, 4, 3) //north
|
||||
obj1.pointOnOutside(Vector3( 0, 0, 1)) mustEqual Point(2.5f, 2, 5) //up
|
||||
obj1.pointOnOutside(Vector3(-1, 0, 0)) mustEqual Point(1, 2, 3) //west
|
||||
obj1.pointOnOutside(Vector3( 0,-1, 0)) mustEqual Point(2.5f, 0, 3) //south
|
||||
obj1.pointOnOutside(Vector3( 0, 0,-1)) mustEqual Point(2.5f, 2, 1) //down
|
||||
|
||||
val obj2 = Cylinder(Point3D(1,2,3), Vector3(0,0,1), 2, 3)
|
||||
val obj2 = Cylinder(Point(1,2,3), Vector3(0,0,1), 2, 3)
|
||||
obj1.pointOnOutside(Vector3( 1, 0, 0)) mustNotEqual obj2.pointOnOutside(Vector3( 1, 0, 0))
|
||||
obj1.pointOnOutside(Vector3( 0, 1, 0)) mustNotEqual obj2.pointOnOutside(Vector3( 1, 1, 0))
|
||||
obj1.pointOnOutside(Vector3( 0, 0, 1)) mustNotEqual obj2.pointOnOutside(Vector3( 1, 0, 1))
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import net.psforever.objects.definition.ObjectDefinition
|
|||
import net.psforever.objects.serverobject.PlanetSideServerObject
|
||||
import net.psforever.objects.serverobject.environment._
|
||||
import net.psforever.objects.vital.{Vitality, VitalityDefinition}
|
||||
import net.psforever.objects.zones.{Zone, ZoneMap}
|
||||
import net.psforever.objects.zones.{InteractsWithZone, Zone, ZoneMap}
|
||||
import net.psforever.types.{PlanetSideEmpire, Vector3}
|
||||
|
||||
import scala.concurrent.duration._
|
||||
|
|
@ -21,6 +21,9 @@ class InteractsWithZoneEnvironmentTest extends ActorTest {
|
|||
}
|
||||
new Zone("test-zone", testMap, zoneNumber = 0)
|
||||
}
|
||||
testZone.blockMap.addTo(pool1)
|
||||
testZone.blockMap.addTo(pool2)
|
||||
testZone.blockMap.addTo(pool3)
|
||||
|
||||
"InteractsWithZoneEnvironment" should {
|
||||
"not interact with any environment when it does not encroach any environment" in {
|
||||
|
|
@ -30,7 +33,7 @@ class InteractsWithZoneEnvironmentTest extends ActorTest {
|
|||
obj.Actor = testProbe.ref
|
||||
|
||||
assert(obj.Position == Vector3.Zero)
|
||||
obj.zoneInteraction()
|
||||
obj.zoneInteractions()
|
||||
testProbe.expectNoMessage(max = 500 milliseconds)
|
||||
}
|
||||
|
||||
|
|
@ -41,15 +44,15 @@ class InteractsWithZoneEnvironmentTest extends ActorTest {
|
|||
obj.Actor = testProbe.ref
|
||||
|
||||
obj.Position = Vector3(1,1,-2)
|
||||
obj.zoneInteraction()
|
||||
obj.zoneInteractions()
|
||||
val msg = testProbe.receiveOne(max = 250 milliseconds)
|
||||
assert(
|
||||
msg match {
|
||||
case InteractWithEnvironment(o, b, _) => (o eq obj) && (b eq pool1)
|
||||
case InteractingWithEnvironment(o, b, _) => (o eq obj) && (b eq pool1)
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
obj.zoneInteraction()
|
||||
obj.zoneInteractions()
|
||||
testProbe.expectNoMessage(max = 500 milliseconds)
|
||||
}
|
||||
|
||||
|
|
@ -60,17 +63,17 @@ class InteractsWithZoneEnvironmentTest extends ActorTest {
|
|||
obj.Actor = testProbe.ref
|
||||
|
||||
obj.Position = Vector3(1,1,-2)
|
||||
obj.zoneInteraction()
|
||||
obj.zoneInteractions()
|
||||
val msg1 = testProbe.receiveOne(max = 250 milliseconds)
|
||||
assert(
|
||||
msg1 match {
|
||||
case InteractWithEnvironment(o, b, _) => (o eq obj) && (b eq pool1)
|
||||
case InteractingWithEnvironment(o, b, _) => (o eq obj) && (b eq pool1)
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
|
||||
obj.Position = Vector3(1,1,1)
|
||||
obj.zoneInteraction()
|
||||
obj.zoneInteractions()
|
||||
val msg2 = testProbe.receiveOne(max = 250 milliseconds)
|
||||
assert(
|
||||
msg2 match {
|
||||
|
|
@ -78,7 +81,7 @@ class InteractsWithZoneEnvironmentTest extends ActorTest {
|
|||
case _ => false
|
||||
}
|
||||
)
|
||||
obj.zoneInteraction()
|
||||
obj.zoneInteractions()
|
||||
testProbe.expectNoMessage(max = 500 milliseconds)
|
||||
}
|
||||
|
||||
|
|
@ -89,21 +92,21 @@ class InteractsWithZoneEnvironmentTest extends ActorTest {
|
|||
obj.Actor = testProbe.ref
|
||||
|
||||
obj.Position = Vector3(7,7,-2)
|
||||
obj.zoneInteraction()
|
||||
obj.zoneInteractions()
|
||||
val msg1 = testProbe.receiveOne(max = 250 milliseconds)
|
||||
assert(
|
||||
msg1 match {
|
||||
case InteractWithEnvironment(o, b, _) => (o eq obj) && (b eq pool1)
|
||||
case InteractingWithEnvironment(o, b, _) => (o eq obj) && (b eq pool1)
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
|
||||
obj.Position = Vector3(12,7,-2)
|
||||
obj.zoneInteraction()
|
||||
obj.zoneInteractions()
|
||||
val msg2 = testProbe.receiveOne(max = 250 milliseconds)
|
||||
assert(
|
||||
msg2 match {
|
||||
case InteractWithEnvironment(o, b, _) => (o eq obj) && (b eq pool2)
|
||||
case InteractingWithEnvironment(o, b, _) => (o eq obj) && (b eq pool2)
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
|
|
@ -117,17 +120,17 @@ class InteractsWithZoneEnvironmentTest extends ActorTest {
|
|||
obj.Actor = testProbe.ref
|
||||
|
||||
obj.Position = Vector3(7,7,-2)
|
||||
obj.zoneInteraction()
|
||||
obj.zoneInteractions()
|
||||
val msg1 = testProbe.receiveOne(max = 250 milliseconds)
|
||||
assert(
|
||||
msg1 match {
|
||||
case InteractWithEnvironment(o, b, _) => (o eq obj) && (b eq pool1)
|
||||
case InteractingWithEnvironment(o, b, _) => (o eq obj) && (b eq pool1)
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
|
||||
obj.Position = Vector3(7,12,-2)
|
||||
obj.zoneInteraction()
|
||||
obj.zoneInteractions()
|
||||
val msgs = testProbe.receiveN(2, max = 250 milliseconds)
|
||||
assert(
|
||||
msgs.head match {
|
||||
|
|
@ -137,7 +140,7 @@ class InteractsWithZoneEnvironmentTest extends ActorTest {
|
|||
)
|
||||
assert(
|
||||
msgs(1) match {
|
||||
case InteractWithEnvironment(o, b, _) => (o eq obj) && (b eq pool3)
|
||||
case InteractingWithEnvironment(o, b, _) => (o eq obj) && (b eq pool3)
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
|
|
@ -152,24 +155,22 @@ class InteractsWithZoneEnvironmentTest extends ActorTest {
|
|||
obj.Actor = testProbe.ref
|
||||
|
||||
obj.Position = Vector3(1,1,-2)
|
||||
obj.zoneInteraction()
|
||||
obj.zoneInteractions()
|
||||
val msg1 = testProbe.receiveOne(max = 250 milliseconds)
|
||||
assert(
|
||||
msg1 match {
|
||||
case InteractWithEnvironment(o, b, _) => (o eq obj) && (b eq pool1)
|
||||
case InteractingWithEnvironment(o, b, _) => (o eq obj) && (b eq pool1)
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
|
||||
obj.allowZoneEnvironmentInteractions = false
|
||||
obj.allowInteraction = false
|
||||
val msg2 = testProbe.receiveOne(max = 250 milliseconds)
|
||||
assert(
|
||||
msg2 match {
|
||||
case EscapeFromEnvironment(o, b, _) => (o eq obj) && (b eq pool1)
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
obj.zoneInteraction()
|
||||
msg2 match {
|
||||
case EscapeFromEnvironment(o, b, _) => assert((o eq obj) && (b eq pool1))
|
||||
case _ => assert( false)
|
||||
}
|
||||
obj.zoneInteractions()
|
||||
testProbe.expectNoMessage(max = 500 milliseconds)
|
||||
}
|
||||
|
||||
|
|
@ -179,16 +180,16 @@ class InteractsWithZoneEnvironmentTest extends ActorTest {
|
|||
obj.Zone = testZone
|
||||
obj.Actor = testProbe.ref
|
||||
|
||||
obj.allowZoneEnvironmentInteractions = false
|
||||
obj.allowInteraction = false
|
||||
obj.Position = Vector3(1,1,-2)
|
||||
obj.zoneInteraction()
|
||||
obj.zoneInteractions()
|
||||
testProbe.expectNoMessage(max = 500 milliseconds)
|
||||
|
||||
obj.allowZoneEnvironmentInteractions = true
|
||||
obj.allowInteraction = true
|
||||
val msg1 = testProbe.receiveOne(max = 250 milliseconds)
|
||||
assert(
|
||||
msg1 match {
|
||||
case InteractWithEnvironment(o, b, _) => (o eq obj) && (b eq pool1)
|
||||
case InteractingWithEnvironment(o, b, _) => (o eq obj) && (b eq pool1)
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
|
|
@ -196,10 +197,11 @@ class InteractsWithZoneEnvironmentTest extends ActorTest {
|
|||
}
|
||||
|
||||
object InteractsWithZoneEnvironmentTest {
|
||||
def testObject(): PlanetSideServerObject with InteractsWithZoneEnvironment = {
|
||||
def testObject(): PlanetSideServerObject with InteractsWithZone = {
|
||||
new PlanetSideServerObject
|
||||
with InteractsWithZoneEnvironment
|
||||
with InteractsWithZone
|
||||
with Vitality {
|
||||
interaction(new InteractWithEnvironment())
|
||||
def Faction: PlanetSideEmpire.Value = PlanetSideEmpire.VS
|
||||
def DamageModel = null
|
||||
def Definition: ObjectDefinition with VitalityDefinition = new ObjectDefinition(objectId = 0) with VitalityDefinition {
|
||||
|
|
|
|||
|
|
@ -2,12 +2,16 @@
|
|||
package objects
|
||||
|
||||
import akka.actor.{Actor, ActorRef, Props}
|
||||
import akka.testkit.TestProbe
|
||||
import akka.actor.typed.scaladsl.adapter._
|
||||
import base.ActorTest
|
||||
import net.psforever.actors.zone.ZoneActor
|
||||
import net.psforever.objects.Player
|
||||
import net.psforever.objects.avatar.Avatar
|
||||
import net.psforever.objects.definition.ObjectDefinition
|
||||
import net.psforever.objects.serverobject.mount._
|
||||
import net.psforever.objects.serverobject.PlanetSideServerObject
|
||||
import net.psforever.objects.zones.{Zone, ZoneMap}
|
||||
import net.psforever.types.{CharacterSex, CharacterVoice, PlanetSideEmpire, PlanetSideGUID}
|
||||
|
||||
import scala.concurrent.duration.Duration
|
||||
|
|
@ -27,6 +31,10 @@ class MountableControl2Test extends ActorTest {
|
|||
"let a player mount" in {
|
||||
val player = Player(Avatar(0, "test", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
|
||||
val obj = new MountableTest.MountableTestObject
|
||||
obj.Zone = new Zone("test", new ZoneMap("test"), 0) {
|
||||
override def SetupNumberPools() = {}
|
||||
this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
|
||||
}
|
||||
obj.Actor = system.actorOf(Props(classOf[MountableTest.MountableTestControl], obj), "mountable")
|
||||
val msg = Mountable.TryMount(player, 0)
|
||||
|
||||
|
|
@ -69,9 +77,8 @@ class MountableControl3Test extends ActorTest {
|
|||
object MountableTest {
|
||||
class MountableTestObject extends PlanetSideServerObject with Mountable {
|
||||
seats += 0 -> new Seat(new SeatDefinition())
|
||||
GUID = PlanetSideGUID(1)
|
||||
//eh whatever
|
||||
def Faction = PlanetSideEmpire.TR
|
||||
GUID = PlanetSideGUID(1) //eh whatever
|
||||
def Faction = PlanetSideEmpire.TR
|
||||
def Definition = new ObjectDefinition(1) with MountableDefinition {
|
||||
MountPoints += 0 -> MountInfo(0)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import akka.actor.{ActorRef, Props}
|
|||
import akka.routing.RandomPool
|
||||
import akka.testkit.TestProbe
|
||||
import base.FreedContextActorTest
|
||||
import net.psforever.actors.zone.BuildingActor
|
||||
import net.psforever.actors.zone.{BuildingActor, ZoneActor}
|
||||
import net.psforever.objects.guid.actor.UniqueNumberSystem
|
||||
import net.psforever.objects.{GlobalDefinitions, Vehicle}
|
||||
import net.psforever.objects.guid.{NumberPoolHub, TaskResolver}
|
||||
|
|
@ -56,6 +56,9 @@ class OrbitalShuttlePadControltest extends FreedContextActorTest {
|
|||
override def Vehicles = { vehicles.toList }
|
||||
override def Buildings = { buildingMap.toMap }
|
||||
override def tasks = { resolver }
|
||||
|
||||
import akka.actor.typed.scaladsl.adapter._
|
||||
this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
|
||||
}
|
||||
val building = new Building(
|
||||
name = "test-orbital-building-tr",
|
||||
|
|
|
|||
|
|
@ -786,6 +786,8 @@ class PlayerControlInteractWithWaterTest extends ActorTest {
|
|||
override def LivePlayers = List(player1)
|
||||
override def AvatarEvents = avatarProbe.ref
|
||||
}
|
||||
zone.blockMap.addTo(player1)
|
||||
zone.blockMap.addTo(pool)
|
||||
|
||||
player1.Zone = zone
|
||||
player1.Spawn()
|
||||
|
|
@ -799,7 +801,7 @@ class PlayerControlInteractWithWaterTest extends ActorTest {
|
|||
"cause drowning when player steps too deep in water" in {
|
||||
assert(player1.Health == 100)
|
||||
player1.Position = Vector3(5,5,-3) //right in the pool
|
||||
player1.zoneInteraction() //trigger
|
||||
player1.zoneInteractions() //trigger
|
||||
|
||||
val msg_drown = avatarProbe.receiveOne(250 milliseconds)
|
||||
assert(
|
||||
|
|
@ -838,6 +840,8 @@ class PlayerControlStopInteractWithWaterTest extends ActorTest {
|
|||
override def LivePlayers = List(player1)
|
||||
override def AvatarEvents = avatarProbe.ref
|
||||
}
|
||||
zone.blockMap.addTo(player1)
|
||||
zone.blockMap.addTo(pool)
|
||||
|
||||
player1.Zone = zone
|
||||
player1.Spawn()
|
||||
|
|
@ -851,7 +855,7 @@ class PlayerControlStopInteractWithWaterTest extends ActorTest {
|
|||
"stop drowning if player steps out of deep water" in {
|
||||
assert(player1.Health == 100)
|
||||
player1.Position = Vector3(5,5,-3) //right in the pool
|
||||
player1.zoneInteraction() //trigger
|
||||
player1.zoneInteractions() //trigger
|
||||
|
||||
val msg_drown = avatarProbe.receiveOne(250 milliseconds)
|
||||
assert(
|
||||
|
|
@ -865,7 +869,7 @@ class PlayerControlStopInteractWithWaterTest extends ActorTest {
|
|||
)
|
||||
//player would normally die in 60s
|
||||
player1.Position = Vector3.Zero //pool's closed
|
||||
player1.zoneInteraction() //trigger
|
||||
player1.zoneInteractions() //trigger
|
||||
val msg_recover = avatarProbe.receiveOne(250 milliseconds)
|
||||
assert(
|
||||
msg_recover match {
|
||||
|
|
@ -902,6 +906,8 @@ class PlayerControlInteractWithLavaTest extends ActorTest {
|
|||
override def AvatarEvents = avatarProbe.ref
|
||||
override def Activity = TestProbe().ref
|
||||
}
|
||||
zone.blockMap.addTo(player1)
|
||||
zone.blockMap.addTo(pool)
|
||||
|
||||
player1.Zone = zone
|
||||
player1.Spawn()
|
||||
|
|
@ -915,7 +921,7 @@ class PlayerControlInteractWithLavaTest extends ActorTest {
|
|||
"take continuous damage if player steps into lava" in {
|
||||
assert(player1.Health == 100) //alive
|
||||
player1.Position = Vector3(5,5,-3) //right in the pool
|
||||
player1.zoneInteraction() //trigger
|
||||
player1.zoneInteractions() //trigger
|
||||
|
||||
val msg_burn = avatarProbe.receiveN(3, 1 seconds)
|
||||
assert(
|
||||
|
|
@ -962,6 +968,8 @@ class PlayerControlInteractWithDeathTest extends ActorTest {
|
|||
override def AvatarEvents = avatarProbe.ref
|
||||
override def Activity = TestProbe().ref
|
||||
}
|
||||
zone.blockMap.addTo(player1)
|
||||
zone.blockMap.addTo(pool)
|
||||
|
||||
player1.Zone = zone
|
||||
player1.Spawn()
|
||||
|
|
@ -975,7 +983,7 @@ class PlayerControlInteractWithDeathTest extends ActorTest {
|
|||
"take continuous damage if player steps into a pool of death" in {
|
||||
assert(player1.Health == 100) //alive
|
||||
player1.Position = Vector3(5,5,-3) //right in the pool
|
||||
player1.zoneInteraction() //trigger
|
||||
player1.zoneInteractions() //trigger
|
||||
|
||||
probe.receiveOne(250 milliseconds) //wait until oplayer1's implants deinitialize
|
||||
assert(player1.Health == 0) //ded
|
||||
|
|
|
|||
|
|
@ -2,8 +2,10 @@
|
|||
package objects
|
||||
|
||||
import akka.actor.{ActorRef, Props}
|
||||
import akka.actor.typed.scaladsl.adapter._
|
||||
import akka.testkit.TestProbe
|
||||
import base.ActorTest
|
||||
import net.psforever.actors.zone.ZoneActor
|
||||
import net.psforever.objects._
|
||||
import net.psforever.objects.ce.{DeployableCategory, DeployedItem, TelepadLike}
|
||||
import net.psforever.objects.guid.NumberPoolHub
|
||||
|
|
@ -33,6 +35,8 @@ class TelepadDeployableNoRouterTest extends ActorTest {
|
|||
override def AvatarEvents: ActorRef = eventsProbe.ref
|
||||
override def LocalEvents: ActorRef = eventsProbe.ref
|
||||
override def Deployables: ActorRef = deployables
|
||||
|
||||
this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
|
||||
}
|
||||
guid.register(telepad, number = 1)
|
||||
|
||||
|
|
@ -96,6 +100,8 @@ class TelepadDeployableNoActivationTest extends ActorTest {
|
|||
override def LocalEvents: ActorRef = eventsProbe.ref
|
||||
override def Deployables: ActorRef = deployables
|
||||
override def Vehicles: List[Vehicle] = List(router)
|
||||
|
||||
this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
|
||||
}
|
||||
guid.register(telepad, number = 1)
|
||||
guid.register(router, number = 2)
|
||||
|
|
@ -165,6 +171,8 @@ class TelepadDeployableAttemptTest extends ActorTest {
|
|||
override def LocalEvents: ActorRef = eventsProbe.ref
|
||||
override def Deployables: ActorRef = deployables
|
||||
override def Vehicles: List[Vehicle] = List(router)
|
||||
|
||||
this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
|
||||
}
|
||||
guid.register(telepad, number = 1)
|
||||
guid.register(router, number = 2)
|
||||
|
|
@ -226,6 +234,8 @@ class TelepadDeployableResponseFromRouterTest extends ActorTest {
|
|||
override def VehicleEvents: ActorRef = eventsProbe.ref
|
||||
override def Deployables: ActorRef = deployables
|
||||
override def Vehicles: List[Vehicle] = List(router)
|
||||
|
||||
this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
|
||||
}
|
||||
guid.register(telepad, number = 1)
|
||||
guid.register(router, number = 2)
|
||||
|
|
|
|||
|
|
@ -329,6 +329,7 @@ class VehicleControlMountingBlockedExosuitTest extends ActorTest {
|
|||
override def LocalEvents: ActorRef = catchall
|
||||
override def VehicleEvents: ActorRef = catchall
|
||||
override def Activity: ActorRef = catchall
|
||||
this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
|
||||
}
|
||||
val vehicle = Vehicle(GlobalDefinitions.apc_tr)
|
||||
vehicle.Faction = PlanetSideEmpire.TR
|
||||
|
|
@ -392,6 +393,10 @@ class VehicleControlMountingBlockedSeatPermissionTest extends ActorTest {
|
|||
vehicle.Faction = PlanetSideEmpire.TR
|
||||
vehicle.GUID = PlanetSideGUID(10)
|
||||
vehicle.Actor = system.actorOf(Props(classOf[VehicleControl], vehicle), "vehicle-test")
|
||||
vehicle.Zone = new Zone("test", new ZoneMap("test-map"), 0) {
|
||||
override def SetupNumberPools(): Unit = {}
|
||||
this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
|
||||
}
|
||||
|
||||
val player1 = Player(VehicleTest.avatar1)
|
||||
player1.GUID = PlanetSideGUID(1)
|
||||
|
|
@ -418,6 +423,10 @@ class VehicleControlMountingDriverSeatTest extends ActorTest {
|
|||
vehicle.Faction = PlanetSideEmpire.TR
|
||||
vehicle.GUID = PlanetSideGUID(10)
|
||||
vehicle.Actor = system.actorOf(Props(classOf[VehicleControl], vehicle), "vehicle-test")
|
||||
vehicle.Zone = new Zone("test", new ZoneMap("test-map"), 0) {
|
||||
override def SetupNumberPools(): Unit = {}
|
||||
this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
|
||||
}
|
||||
val player1 = Player(VehicleTest.avatar1)
|
||||
player1.GUID = PlanetSideGUID(1)
|
||||
|
||||
|
|
@ -439,6 +448,11 @@ class VehicleControlMountingOwnedLockedDriverSeatTest extends ActorTest {
|
|||
vehicle.Faction = PlanetSideEmpire.TR
|
||||
vehicle.GUID = PlanetSideGUID(10)
|
||||
vehicle.Actor = system.actorOf(Props(classOf[VehicleControl], vehicle), "vehicle-test")
|
||||
vehicle.Zone = new Zone("test", new ZoneMap("test-map"), 0) {
|
||||
override def SetupNumberPools(): Unit = {}
|
||||
this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
|
||||
}
|
||||
|
||||
val player1 = Player(VehicleTest.avatar1)
|
||||
player1.GUID = PlanetSideGUID(1)
|
||||
val player2 = Player(VehicleTest.avatar1)
|
||||
|
|
@ -470,6 +484,11 @@ class VehicleControlMountingOwnedUnlockedDriverSeatTest extends ActorTest {
|
|||
vehicle.Faction = PlanetSideEmpire.TR
|
||||
vehicle.GUID = PlanetSideGUID(10)
|
||||
vehicle.Actor = system.actorOf(Props(classOf[VehicleControl], vehicle), "vehicle-test")
|
||||
vehicle.Zone = new Zone("test", new ZoneMap("test-map"), 0) {
|
||||
override def SetupNumberPools(): Unit = {}
|
||||
this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
|
||||
}
|
||||
|
||||
val player1 = Player(VehicleTest.avatar1)
|
||||
player1.GUID = PlanetSideGUID(1)
|
||||
val player2 = Player(VehicleTest.avatar1)
|
||||
|
|
@ -640,6 +659,8 @@ class VehicleControlInteractWithWaterPartialTest extends ActorTest {
|
|||
override def LivePlayers = List(player1)
|
||||
override def Vehicles = List(vehicle)
|
||||
}
|
||||
zone.blockMap.addTo(vehicle)
|
||||
zone.blockMap.addTo(pool)
|
||||
|
||||
guid.register(player1, 1)
|
||||
guid.register(vehicle, 2)
|
||||
|
|
@ -655,12 +676,12 @@ class VehicleControlInteractWithWaterPartialTest extends ActorTest {
|
|||
"VehicleControl" should {
|
||||
"causes disability when the vehicle drives too deep in water (check driver messaging)" in {
|
||||
vehicle.Position = Vector3(5,5,-3) //right in the pool
|
||||
vehicle.zoneInteraction() //trigger
|
||||
vehicle.zoneInteractions() //trigger
|
||||
|
||||
val msg_drown = playerProbe.receiveOne(250 milliseconds)
|
||||
assert(
|
||||
msg_drown match {
|
||||
case InteractWithEnvironment(
|
||||
case InteractingWithEnvironment(
|
||||
p1,
|
||||
p2,
|
||||
Some(OxygenStateTarget(PlanetSideGUID(2), OxygenState.Suffocation, 100f))
|
||||
|
|
@ -693,7 +714,11 @@ class VehicleControlInteractWithWaterTest extends ActorTest {
|
|||
override def Vehicles = List(vehicle)
|
||||
override def AvatarEvents = avatarProbe.ref
|
||||
override def VehicleEvents = vehicleProbe.ref
|
||||
|
||||
this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
|
||||
}
|
||||
zone.blockMap.addTo(vehicle)
|
||||
zone.blockMap.addTo(pool)
|
||||
|
||||
guid.register(player1, 1)
|
||||
guid.register(vehicle, 2)
|
||||
|
|
@ -711,7 +736,7 @@ class VehicleControlInteractWithWaterTest extends ActorTest {
|
|||
"VehicleControl" should {
|
||||
"causes disability when the vehicle drives too deep in water" in {
|
||||
vehicle.Position = Vector3(5,5,-3) //right in the pool
|
||||
vehicle.zoneInteraction() //trigger
|
||||
vehicle.zoneInteractions() //trigger
|
||||
|
||||
val msg_drown = avatarProbe.receiveOne(250 milliseconds)
|
||||
assert(
|
||||
|
|
@ -728,16 +753,14 @@ class VehicleControlInteractWithWaterTest extends ActorTest {
|
|||
)
|
||||
//player will die in 60s
|
||||
//vehicle will disable in 5s; driver will be kicked
|
||||
val msg_kick = vehicleProbe.receiveOne(6 seconds)
|
||||
assert(
|
||||
msg_kick match {
|
||||
case VehicleServiceMessage(
|
||||
"test-zone",
|
||||
VehicleAction.KickPassenger(PlanetSideGUID(1), 4, _, PlanetSideGUID(2))
|
||||
) => true
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
val msg_kick = vehicleProbe.receiveOne(10 seconds)
|
||||
msg_kick match {
|
||||
case VehicleServiceMessage(
|
||||
"test-zone",
|
||||
VehicleAction.KickPassenger(PlanetSideGUID(1), 4, _, PlanetSideGUID(2))
|
||||
) => assert(true)
|
||||
case _ => assert(false)
|
||||
}
|
||||
//player will die, but detailing players death messages is not necessary for this test
|
||||
}
|
||||
}
|
||||
|
|
@ -762,6 +785,8 @@ class VehicleControlStopInteractWithWaterTest extends ActorTest {
|
|||
override def LivePlayers = List(player1)
|
||||
override def Vehicles = List(vehicle)
|
||||
}
|
||||
zone.blockMap.addTo(vehicle)
|
||||
zone.blockMap.addTo(pool)
|
||||
|
||||
guid.register(player1, 1)
|
||||
guid.register(vehicle, 2)
|
||||
|
|
@ -777,11 +802,11 @@ class VehicleControlStopInteractWithWaterTest extends ActorTest {
|
|||
"VehicleControl" should {
|
||||
"stop becoming disabled if the vehicle drives out of the water" in {
|
||||
vehicle.Position = Vector3(5,5,-3) //right in the pool
|
||||
vehicle.zoneInteraction() //trigger
|
||||
vehicle.zoneInteractions() //trigger
|
||||
val msg_drown = playerProbe.receiveOne(250 milliseconds)
|
||||
assert(
|
||||
msg_drown match {
|
||||
case InteractWithEnvironment(
|
||||
case InteractingWithEnvironment(
|
||||
p1,
|
||||
p2,
|
||||
Some(OxygenStateTarget(PlanetSideGUID(2), OxygenState.Suffocation, 100f))
|
||||
|
|
@ -791,7 +816,7 @@ class VehicleControlStopInteractWithWaterTest extends ActorTest {
|
|||
)
|
||||
|
||||
vehicle.Position = Vector3.Zero //that's enough of that
|
||||
vehicle.zoneInteraction()
|
||||
vehicle.zoneInteractions()
|
||||
val msg_recover = playerProbe.receiveOne(250 milliseconds)
|
||||
assert(
|
||||
msg_recover match {
|
||||
|
|
@ -830,6 +855,8 @@ class VehicleControlInteractWithLavaTest extends ActorTest {
|
|||
override def VehicleEvents = vehicleProbe.ref
|
||||
override def Activity = TestProbe().ref
|
||||
}
|
||||
zone.blockMap.addTo(vehicle)
|
||||
zone.blockMap.addTo(pool)
|
||||
|
||||
guid.register(player1, 1)
|
||||
guid.register(vehicle, 2)
|
||||
|
|
@ -849,7 +876,7 @@ class VehicleControlInteractWithLavaTest extends ActorTest {
|
|||
assert(vehicle.Health > 0) //alive
|
||||
assert(player1.Health == 100) //alive
|
||||
vehicle.Position = Vector3(5,5,-3) //right in the pool
|
||||
vehicle.zoneInteraction() //trigger
|
||||
vehicle.zoneInteractions() //trigger
|
||||
|
||||
val msg_burn = vehicleProbe.receiveN(3,1 seconds)
|
||||
msg_burn.foreach { msg =>
|
||||
|
|
@ -888,6 +915,8 @@ class VehicleControlInteractWithDeathTest extends ActorTest {
|
|||
override def AvatarEvents = TestProbe().ref
|
||||
override def VehicleEvents = TestProbe().ref
|
||||
}
|
||||
zone.blockMap.addTo(vehicle)
|
||||
zone.blockMap.addTo(pool)
|
||||
|
||||
guid.register(player1, 1)
|
||||
guid.register(vehicle, 2)
|
||||
|
|
@ -907,7 +936,7 @@ class VehicleControlInteractWithDeathTest extends ActorTest {
|
|||
assert(vehicle.Health > 0) //alive
|
||||
assert(player1.Health == 100) //alive
|
||||
vehicle.Position = Vector3(5,5,-3) //right in the pool
|
||||
vehicle.zoneInteraction() //trigger
|
||||
vehicle.zoneInteractions() //trigger
|
||||
|
||||
probe.receiveOne(2 seconds) //wait until player1's implants deinitialize
|
||||
assert(vehicle.Health == 0) //ded
|
||||
|
|
|
|||
|
|
@ -2,7 +2,9 @@
|
|||
package objects.terminal
|
||||
|
||||
import akka.actor.{ActorSystem, Props}
|
||||
import akka.testkit.TestProbe
|
||||
import base.ActorTest
|
||||
import net.psforever.actors.zone.ZoneActor
|
||||
import net.psforever.objects.avatar.Avatar
|
||||
import net.psforever.objects.{Default, GlobalDefinitions, Player}
|
||||
import net.psforever.objects.guid.NumberPoolHub
|
||||
|
|
@ -156,11 +158,14 @@ class ImplantTerminalMechControl5Test extends ActorTest {
|
|||
|
||||
object ImplantTerminalMechTest {
|
||||
def SetUpAgents(faction: PlanetSideEmpire.Value)(implicit system: ActorSystem): (Player, ImplantTerminalMech) = {
|
||||
import akka.actor.typed.scaladsl.adapter._
|
||||
|
||||
val guid = new NumberPoolHub(new MaxNumberSource(10))
|
||||
val map = new ZoneMap("test")
|
||||
val zone = new Zone("test", map, 0) {
|
||||
override def SetupNumberPools() = {}
|
||||
GUID(guid)
|
||||
this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
|
||||
}
|
||||
val building = new Building(
|
||||
"Building",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue