From 20a4fdfe4537110b7f201222fb5bf49e13969a51 Mon Sep 17 00:00:00 2001 From: FateJH Date: Sat, 16 Jun 2018 00:34:29 -0400 Subject: [PATCH] documentation for projectiles; moved LocalProjectile construction intoMaps.scala; extensive test corrections --- .../psforever/objects/LocalProjectile.scala | 18 +- .../objects/ballistics/DamageProfile.scala | 4 + .../objects/ballistics/DamageType.scala | 2 + .../objects/ballistics/Projectile.scala | 40 +++- .../ballistics/ProjectileResolution.scala | 15 +- .../net/psforever/objects/zones/Zone.scala | 28 ++- common/src/test/scala/objects/ActorTest.scala | 6 +- .../objects/ServerObjectBuilderTest.scala | 18 ++ .../scala/objects/VehicleSpawnPadTest.scala | 4 +- common/src/test/scala/objects/ZoneTest.scala | 186 +++++++++--------- .../guidtask/GUIDTaskRegister1Test.scala | 53 +---- .../objects/number/NumberPoolActorTest.scala | 6 +- pslogin/src/main/scala/Maps.scala | 104 +++++++--- .../src/main/scala/WorldSessionActor.scala | 24 +++ pslogin/src/test/scala/ActorTest.scala | 6 +- .../src/test/scala/AvatarServiceTest.scala | 6 +- 16 files changed, 330 insertions(+), 190 deletions(-) diff --git a/common/src/main/scala/net/psforever/objects/LocalProjectile.scala b/common/src/main/scala/net/psforever/objects/LocalProjectile.scala index 86afd33e..2481deb5 100644 --- a/common/src/main/scala/net/psforever/objects/LocalProjectile.scala +++ b/common/src/main/scala/net/psforever/objects/LocalProjectile.scala @@ -1,6 +1,10 @@ // Copyright (c) 2017 PSForever package net.psforever.objects +import akka.actor.ActorContext +import net.psforever.objects.serverobject.PlanetSideServerObject +import net.psforever.types.PlanetSideEmpire + /** * A `LocalProjectile` is a server-side object designed to populate a fake shared space. * It is a placeholder intended to block out the existence of projectiles communicated from clients. @@ -10,11 +14,23 @@ package net.psforever.objects * `Projectile.BaseUID`
* `Projectile.RangeUID` */ -class LocalProjectile extends PlanetSideGameObject { +class LocalProjectile extends PlanetSideServerObject { + def Faction = PlanetSideEmpire.NEUTRAL + def Definition = LocalProjectile.local } object LocalProjectile { import net.psforever.objects.definition.ObjectDefinition def local = new ObjectDefinition(0) { Name = "projectile" } + + /** + * Instantiate and configure a `LocalProjectile` object. + * @param id the unique id that will be assigned to this entity + * @param context a context to allow the object to properly set up `ActorSystem` functionality + * @return the `LocalProjectile` object + */ + def Constructor(id : Int, context : ActorContext) : LocalProjectile = { + new LocalProjectile() + } } diff --git a/common/src/main/scala/net/psforever/objects/ballistics/DamageProfile.scala b/common/src/main/scala/net/psforever/objects/ballistics/DamageProfile.scala index 4f4b2b46..1d2e877e 100644 --- a/common/src/main/scala/net/psforever/objects/ballistics/DamageProfile.scala +++ b/common/src/main/scala/net/psforever/objects/ballistics/DamageProfile.scala @@ -1,6 +1,10 @@ // Copyright (c) 2017 PSForever package net.psforever.objects.ballistics +/** + * The different values for five common types of damage that can be dealt, based on target and application. + * In the same way, the five damage modifiers that are applied to the same kind of damage. + */ trait DamageProfile { def Damage0 : Int diff --git a/common/src/main/scala/net/psforever/objects/ballistics/DamageType.scala b/common/src/main/scala/net/psforever/objects/ballistics/DamageType.scala index dbbf59a4..8f2722b0 100644 --- a/common/src/main/scala/net/psforever/objects/ballistics/DamageType.scala +++ b/common/src/main/scala/net/psforever/objects/ballistics/DamageType.scala @@ -3,6 +3,8 @@ package net.psforever.objects.ballistics /** * An `Enumeration` of the damage type. + * These types are not necessarily representative of the kind of projectile being used; + * for example, the bolt driver's `bolt` is considered "splash." */ object DamageType extends Enumeration(1) { type Type = Value diff --git a/common/src/main/scala/net/psforever/objects/ballistics/Projectile.scala b/common/src/main/scala/net/psforever/objects/ballistics/Projectile.scala index aaf48c5a..790a4227 100644 --- a/common/src/main/scala/net/psforever/objects/ballistics/Projectile.scala +++ b/common/src/main/scala/net/psforever/objects/ballistics/Projectile.scala @@ -5,6 +5,18 @@ import net.psforever.objects.definition.{ProjectileDefinition, ToolDefinition} import net.psforever.objects.entity.SimpleWorldEntity import net.psforever.types.Vector3 +/** + * A summation of weapon (`Tool`) discharge. + * @param profile an explanation of the damage that can be performed by this discharge + * @param tool_def the weapon that caused this discharge + * @param shot_origin where the projectile started + * @param shot_angle in which direction the projectile was aimed when it was discharged + * @param resolution whether this projectile has encountered a target or wall; + * defaults to `Unresolved` + * @param fire_time when the weapon discharged was recorded; + * defaults to `System.nanoTime` + * @param hit_time when the discharge had its resolution status updated + */ final case class Projectile(profile : ProjectileDefinition, tool_def : ToolDefinition, shot_origin : Vector3, @@ -12,15 +24,29 @@ final case class Projectile(profile : ProjectileDefinition, resolution : ProjectileResolution.Value, fire_time : Long = System.nanoTime, hit_time : Long = 0) { + /** Information about the current world coordinates and orientation of the projectile */ val current : SimpleWorldEntity = new SimpleWorldEntity() - def Resolve(hitPos : Vector3, hitAng : Vector3, resolution : ProjectileResolution.Value) : Projectile = { + /** + * Give the projectile the suggested resolution status. + * Update the world coordinates and orientation. + * @param pos the current position + * @param ang the current orientation + * @param resolution the resolution status + * @return a new projectile with the suggested resolution status, or the original projectile + */ + def Resolve(pos : Vector3, ang : Vector3, resolution : ProjectileResolution.Value) : Projectile = { val obj = Resolve(resolution) - obj.current.Position = hitPos - obj.current.Orientation = hitAng + obj.current.Position = pos + obj.current.Orientation = ang obj } + /** + * Give the projectile the suggested resolution status. + * @param resolution the resolution status + * @return a new projectile with the suggested resolution status, or the original projectile + */ def Resolve(resolution : ProjectileResolution.Value) : Projectile = { resolution match { case ProjectileResolution.Unresolved => @@ -38,6 +64,14 @@ object Projectile { * 40125 to 40149 are being reserved as a guard against undetected overflow */ final val RangeUID : Int = 40150 + /** + * Overloaded constructor for an `Unresolved` projectile. + * @param profile an explanation of the damage that can be performed by this discharge + * @param tool_def the weapon that caused this discharge + * @param shot_origin where the projectile started + * @param shot_angle in which direction the projectile was aimed when it was discharged + * @return the `Projectile` object + */ def apply(profile : ProjectileDefinition, tool_def : ToolDefinition, shot_origin : Vector3, shot_angle : Vector3) : Projectile = { Projectile(profile, tool_def, shot_origin, shot_angle, ProjectileResolution.Unresolved) } diff --git a/common/src/main/scala/net/psforever/objects/ballistics/ProjectileResolution.scala b/common/src/main/scala/net/psforever/objects/ballistics/ProjectileResolution.scala index c4afcd5e..5b9436c9 100644 --- a/common/src/main/scala/net/psforever/objects/ballistics/ProjectileResolution.scala +++ b/common/src/main/scala/net/psforever/objects/ballistics/ProjectileResolution.scala @@ -1,15 +1,18 @@ // Copyright (c) 2017 PSForever package net.psforever.objects.ballistics +/** + * An `Enumeration` of outcomes regarding what actually happened to the projectile. + */ object ProjectileResolution extends Enumeration { type Type = Value val - Unresolved, - Resolved, - MissedShot, - Hit, - Splash, - Lash + Unresolved, //original basic non-resolution + MissedShot, //projectile did not encounter any collision object and was despawned + Resolved, //a general "projectile encountered something" status with a more specific resolution + Hit, //direct hit, one target + Splash, //area of effect damage, potentially multiple targets + Lash //lashing damage, potentially multiple targets = Value } diff --git a/common/src/main/scala/net/psforever/objects/zones/Zone.scala b/common/src/main/scala/net/psforever/objects/zones/Zone.scala index 849b7150..cca3d3f1 100644 --- a/common/src/main/scala/net/psforever/objects/zones/Zone.scala +++ b/common/src/main/scala/net/psforever/objects/zones/Zone.scala @@ -46,9 +46,6 @@ class Zone(private val zoneId : String, zoneMap : ZoneMap, zoneNumber : Int) { private var accessor : ActorRef = ActorRef.noSender /** The basic support structure for the globally unique number system used by this `Zone`. */ private var guid : NumberPoolHub = new NumberPoolHub(new LimitedNumberSource(65536)) - guid.AddPool("environment", (0 to 3000).toList) //TODO tailer ro suit requirements of zone - guid.AddPool("dynamic", (3001 to 10000).toList).Selector = new RandomSelector //TODO unlump pools later; do not make too big - guid.AddPool("projectiles", (Projectile.BaseUID until Projectile.RangeUID).toList) //TODO unlump pools later; do not make too big /** A synchronized `List` of items (`Equipment`) dropped by players on the ground and can be collected again. */ private val equipmentOnGround : ListBuffer[Equipment] = ListBuffer[Equipment]() /** */ @@ -90,6 +87,7 @@ class Zone(private val zoneId : String, zoneMap : ZoneMap, zoneNumber : Int) { def Init(implicit context : ActorContext) : Unit = { if(accessor == ActorRef.noSender) { implicit val guid : NumberPoolHub = this.guid //passed into builderObject.Build implicitly + SetupNumberPools() accessor = context.actorOf(RandomPool(25).props(Props(classOf[UniqueNumberSystem], guid, UniqueNumberSystem.AllocateNumberPoolActors(guid))), s"$Id-uns") ground = context.actorOf(Props(classOf[ZoneGroundActor], this, equipmentOnGround), s"$Id-ground") transport = context.actorOf(Props(classOf[ZoneVehicleActor], this, vehicles), s"$Id-vehicles") @@ -99,10 +97,28 @@ class Zone(private val zoneId : String, zoneMap : ZoneMap, zoneNumber : Int) { MakeBuildings(context) AssignAmenities() CreateSpawnGroups() - MakeLocalProjectiles() } } + def SetupNumberPools() : Unit = { + guid.AddPool("environment", (0 to 3000).toList) //TODO tailor to suit requirements of zone + //TODO unlump pools later; do not make any single pool too big + guid.AddPool("dynamic", (3001 to 10000).toList).Selector = new RandomSelector //TODO all things will be registered here, for now + guid.AddPool("b", (10001 to 15000).toList).Selector = new RandomSelector + guid.AddPool("c", (15001 to 20000).toList).Selector = new RandomSelector + guid.AddPool("d", (20001 to 25000).toList).Selector = new RandomSelector + guid.AddPool("e", (25001 to 30000).toList).Selector = new RandomSelector + guid.AddPool("f", (30001 to 35000).toList).Selector = new RandomSelector + guid.AddPool("g", (35001 to 40100).toList).Selector = new RandomSelector + guid.AddPool("projectiles", (Projectile.BaseUID until Projectile.RangeUID).toList) + //TODO disabled temporarily to lighten load times + //guid.AddPool("h", (40150 to 45000).toList).Selector = new RandomSelector + //guid.AddPool("i", (45001 to 50000).toList).Selector = new RandomSelector + //guid.AddPool("j", (50001 to 55000).toList).Selector = new RandomSelector + //guid.AddPool("k", (55001 to 60000).toList).Selector = new RandomSelector + //guid.AddPool("l", (60001 to 65535).toList).Selector = new RandomSelector + } + /** * A reference to the primary `Actor` that governs this `Zone`. * @return an `ActorRef` @@ -303,10 +319,6 @@ class Zone(private val zoneId : String, zoneMap : ZoneMap, zoneNumber : Int) { entry } - def MakeLocalProjectiles() : Unit = { - (Projectile.BaseUID until Projectile.RangeUID) foreach { guid.register(new LocalProjectile(), _) } - } - /** * Provide bulk correspondence on all map entities that can be composed into packet messages and reported to a client. * These messages are sent in this fashion at the time of joining the server:
diff --git a/common/src/test/scala/objects/ActorTest.scala b/common/src/test/scala/objects/ActorTest.scala index 9c772cd9..6d37c315 100644 --- a/common/src/test/scala/objects/ActorTest.scala +++ b/common/src/test/scala/objects/ActorTest.scala @@ -17,7 +17,9 @@ abstract class ActorTest(sys : ActorSystem = ActorSystem("system", ConfigFactory object ActorTest { import scala.collection.JavaConverters._ private val LoggingConfig = Map( - "akka.loglevel" -> ConfigValueFactory.fromAnyRef("OFF"), - "akka.stdout-loglevel" -> ConfigValueFactory.fromAnyRef("OFF") + "akka.loggers" -> List("akka.testkit.TestEventListener").asJava, + "akka.loglevel" -> "OFF", + "akka.stdout-loglevel" -> "OFF", + "akka.log-dead-letters" -> "OFF" ).asJava } diff --git a/common/src/test/scala/objects/ServerObjectBuilderTest.scala b/common/src/test/scala/objects/ServerObjectBuilderTest.scala index 49678d5f..dacd1e4e 100644 --- a/common/src/test/scala/objects/ServerObjectBuilderTest.scala +++ b/common/src/test/scala/objects/ServerObjectBuilderTest.scala @@ -170,6 +170,24 @@ class VehicleSpawnPadObjectBuilderTest extends ActorTest { } } +class LocalProjectileBuilderTest extends ActorTest { + import net.psforever.objects.LocalProjectile + "Local ProjectileBuilder" should { + "build" in { + val hub = ServerObjectBuilderTest.NumberPoolHub + val actor = system.actorOf(Props(classOf[ServerObjectBuilderTest.BuilderTestActor], ServerObjectBuilder(1, + LocalProjectile.Constructor), hub), "locker") + actor ! "!" + + val reply = receiveOne(Duration.create(1000, "ms")) + assert(reply.isInstanceOf[LocalProjectile]) + assert(reply.asInstanceOf[LocalProjectile].HasGUID) + assert(reply.asInstanceOf[LocalProjectile].GUID == PlanetSideGUID(1)) + assert(reply == hub(1).get) + } + } +} + class LockerObjectBuilderTest extends ActorTest { import net.psforever.objects.serverobject.mblocker.Locker "LockerObjectBuilder" should { diff --git a/common/src/test/scala/objects/VehicleSpawnPadTest.scala b/common/src/test/scala/objects/VehicleSpawnPadTest.scala index 3e3c8a2e..f780a817 100644 --- a/common/src/test/scala/objects/VehicleSpawnPadTest.scala +++ b/common/src/test/scala/objects/VehicleSpawnPadTest.scala @@ -324,10 +324,10 @@ object VehicleSpawnPadControlTest { import net.psforever.objects.Tool import net.psforever.types.CharacterGender - val zone = new Zone("test-zone", map, 0) + val zone = new Zone("test-zone", map, 0) { override def SetupNumberPools() = { } } val vehicle = Vehicle(GlobalDefinitions.two_man_assault_buggy) val weapon = vehicle.WeaponControlledFromSeat(1).get.asInstanceOf[Tool] - val guid : NumberPoolHub = new NumberPoolHub(LimitedNumberSource(40150)) + val guid : NumberPoolHub = new NumberPoolHub(LimitedNumberSource(5)) guid.AddPool("test-pool", (0 to 2).toList) guid.register(vehicle, "test-pool") guid.register(weapon, "test-pool") diff --git a/common/src/test/scala/objects/ZoneTest.scala b/common/src/test/scala/objects/ZoneTest.scala index 3fa320ac..234afa89 100644 --- a/common/src/test/scala/objects/ZoneTest.scala +++ b/common/src/test/scala/objects/ZoneTest.scala @@ -3,7 +3,7 @@ package objects import java.util.concurrent.atomic.AtomicInteger -import akka.actor.{Actor, ActorContext, ActorRef, Props} +import akka.actor.{ActorContext, ActorRef, Props} import net.psforever.objects.entity.IdentifiableEntity import net.psforever.objects.equipment.Equipment import net.psforever.objects.guid.NumberPoolHub @@ -16,7 +16,6 @@ import net.psforever.types.{CharacterGender, CharacterVoice, PlanetSideEmpire, V import net.psforever.objects.serverobject.structures.{Building, FoundationBuilder, StructureType} import net.psforever.objects.zones.{Zone, ZoneActor, ZoneMap} import net.psforever.objects.Vehicle -import net.psforever.objects.ballistics.Projectile import org.specs2.mutable.Specification import scala.concurrent.duration._ @@ -113,14 +112,14 @@ class ZoneTest extends Specification { class ZoneActorTest extends ActorTest { "Zone" should { "have an Actor" in { - val zone = new Zone("test", new ZoneMap("map6"), 1) + val zone = new Zone("test", new ZoneMap("map6"), 1) { override def SetupNumberPools() = { } } zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), "test-actor") expectNoMsg(Duration.create(100, "ms")) assert(zone.Actor != ActorRef.noSender) } "create new number pools before the Actor is started" in { - val zone = new Zone("test", new ZoneMap("map6"), 1) + val zone = new Zone("test", new ZoneMap("map6"), 1) { override def SetupNumberPools() = { } } zone.GUID(new NumberPoolHub(new LimitedNumberSource(10))) assert( zone.AddPool("test1", 1 to 2) ) @@ -129,7 +128,7 @@ class ZoneActorTest extends ActorTest { } "remove existing number pools before the Actor is started" in { - val zone = new Zone("test", new ZoneMap("map6"), 1) + val zone = new Zone("test", new ZoneMap("map6"), 1) { override def SetupNumberPools() = { } } zone.GUID(new NumberPoolHub(new LimitedNumberSource(10))) assert( zone.AddPool("test1", 1 to 2) ) assert( zone.RemovePool("test1") ) @@ -140,19 +139,19 @@ class ZoneActorTest extends ActorTest { } "refuse new number pools after the Actor is started" in { - val zone = new Zone("test", new ZoneMap("map6"), 1) + val zone = new Zone("test", new ZoneMap("map6"), 1) { override def SetupNumberPools() = { } } zone.GUID(new NumberPoolHub(new LimitedNumberSource(40150))) zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), "test-add-pool-actor-init") zone.Actor ! Zone.Init() - expectNoMsg(Duration.create(300, "ms")) + expectNoMsg(Duration.create(500, "ms")) assert( !zone.AddPool("test1", 1 to 2) ) } "refuse to remove number pools after the Actor is started" in { - val zone = new Zone("test", new ZoneMap("map6"), 1) + val zone = new Zone("test", new ZoneMap("map6"), 1) { override def SetupNumberPools() = { } } - zone.GUID(new NumberPoolHub(new LimitedNumberSource(40150))) + zone.GUID(new NumberPoolHub(new LimitedNumberSource(10))) zone.AddPool("test", 1 to 2) zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), "test-remove-pool-actor-init") zone.Actor ! Zone.Init() @@ -183,7 +182,7 @@ class ZoneActorTest extends ActorTest { ObjectToBuilding(5, 3) ObjectToBuilding(6, 3) } - val zone = new Zone("test", map6, 1) + val zone = new Zone("test", map6, 1) { override def SetupNumberPools() = { } } zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), "test-init") zone.Actor ! Zone.Init() expectNoMsg(Duration.create(300, "ms")) @@ -221,7 +220,7 @@ class ZoneActorTest extends ActorTest { LocalObject(5, SpawnTube.Constructor(Vector3.Zero, Vector3.Zero)) ObjectToBuilding(5, 3) } - val zone = new Zone("test", map6, 1) + val zone = new Zone("test", map6, 1) { override def SetupNumberPools() = { } } zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), "test-spawn") zone.Actor ! Zone.Init() expectNoMsg(Duration.create(300, "ms")) @@ -252,7 +251,7 @@ class ZoneActorTest extends ActorTest { LocalObject(5, SpawnTube.Constructor(Vector3.Zero, Vector3.Zero)) ObjectToBuilding(5, 3) } - val zone = new Zone("test", map6, 1) + val zone = new Zone("test", map6, 1) { override def SetupNumberPools() = { } } zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), "test-no-spawn") zone.Actor ! Zone.Init() expectNoMsg(Duration.create(300, "ms")) @@ -265,32 +264,16 @@ class ZoneActorTest extends ActorTest { assert(reply.asInstanceOf[Zone.Lattice.NoValidSpawnPoint].spawn_group.contains(7)) } } - - "populate a series of reference projectiles" in { - val zone = new Zone("test", new ZoneMap("map6"), 1) - zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), "test-projectiles") - zone.Actor ! Zone.Init() - expectNoMsg(Duration.create(300, "ms")) - - (Projectile.BaseUID until Projectile.RangeUID) - .map { zone.GUID } - .collect { - case Some(_ : LocalProjectile) => ; //pass - case _ => assert(false) - } - } } class ZonePopulationTest extends ActorTest { - val testNum = new AtomicInteger(1) - def TestName : String = s"test${testNum.getAndIncrement()}" - "ZonePopulationActor" should { "add new user to zones" in { - val zone = new Zone("test", new ZoneMap(""), 0) + val zone = new Zone("test", new ZoneMap(""), 0) { override def SetupNumberPools() = { } } val avatar = Avatar("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5) - system.actorOf(Props(classOf[ZoneTest.ZoneInitActor], zone), TestName) ! "!" - receiveOne(Duration.create(200, "ms")) //consume + zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), ZoneTest.TestName) + zone.Actor ! Zone.Init() + expectNoMsg(200 milliseconds) assert(zone.Players.isEmpty) assert(zone.LivePlayers.isEmpty) @@ -302,9 +285,10 @@ class ZonePopulationTest extends ActorTest { } "remove user from zones" in { - val zone = new Zone("test", new ZoneMap(""), 0) + val zone = new Zone("test", new ZoneMap(""), 0) { override def SetupNumberPools() = { } } val avatar = Avatar("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5) - system.actorOf(Props(classOf[ZoneTest.ZoneInitActor], zone), TestName) ! "!" + zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), ZoneTest.TestName) + zone.Actor ! Zone.Init() receiveOne(Duration.create(200, "ms")) //consume zone.Population ! Zone.Population.Join(avatar) expectNoMsg(Duration.create(100, "ms")) @@ -317,11 +301,12 @@ class ZonePopulationTest extends ActorTest { } "associate user with a character" in { - val zone = new Zone("test", new ZoneMap(""), 0) + val zone = new Zone("test", new ZoneMap(""), 0) { override def SetupNumberPools() = { } } val avatar = Avatar("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5) val player = Player(avatar) - system.actorOf(Props(classOf[ZoneTest.ZoneInitActor], zone), TestName) ! "!" - receiveOne(Duration.create(200, "ms")) //consume + zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), ZoneTest.TestName) + zone.Actor ! Zone.Init() + expectNoMsg(200 milliseconds) zone.Population ! Zone.Population.Join(avatar) expectNoMsg(Duration.create(100, "ms")) @@ -337,11 +322,12 @@ class ZonePopulationTest extends ActorTest { } "disassociate character from a user" in { - val zone = new Zone("test", new ZoneMap(""), 0) + val zone = new Zone("test", new ZoneMap(""), 0) { override def SetupNumberPools() = { } } val avatar = Avatar("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5) val player = Player(avatar) - system.actorOf(Props(classOf[ZoneTest.ZoneInitActor], zone), TestName) ! "!" - receiveOne(Duration.create(200, "ms")) //consume + zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), ZoneTest.TestName) + zone.Actor ! Zone.Init() + expectNoMsg(200 milliseconds) zone.Population ! Zone.Population.Join(avatar) expectNoMsg(Duration.create(100, "ms")) zone.Population ! Zone.Population.Spawn(avatar, player) @@ -359,11 +345,12 @@ class ZonePopulationTest extends ActorTest { } "user tries to Leave, but still has an associated character" in { - val zone = new Zone("test", new ZoneMap(""), 0) + val zone = new Zone("test", new ZoneMap(""), 0) { override def SetupNumberPools() = { } } val avatar = Avatar("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5) val player = Player(avatar) - system.actorOf(Props(classOf[ZoneTest.ZoneInitActor], zone), TestName) ! "!" - receiveOne(Duration.create(500, "ms")) //consume + zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), ZoneTest.TestName) + zone.Actor ! Zone.Init() + expectNoMsg(200 milliseconds) zone.Population ! Zone.Population.Join(avatar) expectNoMsg(Duration.create(100, "ms")) zone.Population ! Zone.Population.Spawn(avatar, player) @@ -383,12 +370,13 @@ class ZonePopulationTest extends ActorTest { } "user tries to Spawn a character, but an associated character already exists" in { - val zone = new Zone("test", new ZoneMap(""), 0) + val zone = new Zone("test", new ZoneMap(""), 0) { override def SetupNumberPools() = { } } val avatar = Avatar("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5) val player1 = Player(avatar) val player2 = Player(avatar) - system.actorOf(Props(classOf[ZoneTest.ZoneInitActor], zone), TestName) ! "!" - receiveOne(Duration.create(200, "ms")) //consume + zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), ZoneTest.TestName) + zone.Actor ! Zone.Init() + expectNoMsg(200 milliseconds) zone.Population ! Zone.Population.Join(avatar) expectNoMsg(Duration.create(100, "ms")) zone.Population ! Zone.Population.Spawn(avatar, player1) @@ -409,11 +397,12 @@ class ZonePopulationTest extends ActorTest { } "user tries to Spawn a character, but did not Join first" in { - val zone = new Zone("test", new ZoneMap(""), 0) + val zone = new Zone("test", new ZoneMap(""), 0) { override def SetupNumberPools() = { } } val avatar = Avatar("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5) val player = Player(avatar) - system.actorOf(Props(classOf[ZoneTest.ZoneInitActor], zone), TestName) ! "!" - receiveOne(Duration.create(200, "ms")) //consume + zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), ZoneTest.TestName) + zone.Actor ! Zone.Init() + expectNoMsg(200 milliseconds) assert(zone.Players.isEmpty) assert(zone.LivePlayers.isEmpty) @@ -427,10 +416,11 @@ class ZonePopulationTest extends ActorTest { } "user tries to Release a character, but did not Spawn a character first" in { - val zone = new Zone("test", new ZoneMap(""), 0) + val zone = new Zone("test", new ZoneMap(""), 0) { override def SetupNumberPools() = { } } val avatar = Avatar("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5) - system.actorOf(Props(classOf[ZoneTest.ZoneInitActor], zone), TestName) ! "!" - receiveOne(Duration.create(200, "ms")) //consume + zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), ZoneTest.TestName) + zone.Actor ! Zone.Init() + expectNoMsg(200 milliseconds) zone.Population ! Zone.Population.Join(avatar) expectNoMsg(Duration.create(100, "ms")) @@ -448,11 +438,12 @@ class ZonePopulationTest extends ActorTest { } "user adds character to list of retired characters" in { - val zone = new Zone("test", new ZoneMap(""), 0) + val zone = new Zone("test", new ZoneMap(""), 0) { override def SetupNumberPools() = { } } val player = Player(Avatar("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)) player.Release - system.actorOf(Props(classOf[ZoneTest.ZoneInitActor], zone), TestName) ! "!" - receiveOne(Duration.create(200, "ms")) //consume + zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), ZoneTest.TestName) + zone.Actor ! Zone.Init() + expectNoMsg(200 milliseconds) assert(zone.Corpses.isEmpty) zone.Population ! Zone.Corpse.Add(player) @@ -462,11 +453,12 @@ class ZonePopulationTest extends ActorTest { } "user removes character from the list of retired characters" in { - val zone = new Zone("test", new ZoneMap(""), 0) + val zone = new Zone("test", new ZoneMap(""), 0) { override def SetupNumberPools() = { } } val player = Player(Avatar("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)) player.Release - system.actorOf(Props(classOf[ZoneTest.ZoneInitActor], zone), TestName) ! "!" - receiveOne(Duration.create(200, "ms")) //consume + zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), ZoneTest.TestName) + zone.Actor ! Zone.Init() + expectNoMsg(200 milliseconds) zone.Population ! Zone.Corpse.Add(player) expectNoMsg(Duration.create(100, "ms")) @@ -478,15 +470,16 @@ class ZonePopulationTest extends ActorTest { } "user removes THE CORRECT character from the list of retired characters" in { - val zone = new Zone("test", new ZoneMap(""), 0) + val zone = new Zone("test", new ZoneMap(""), 0) { override def SetupNumberPools() = { } } val player1 = Player(Avatar("Chord1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)) player1.Release val player2 = Player(Avatar("Chord2", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)) player2.Release val player3 = Player(Avatar("Chord3", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)) player3.Release - system.actorOf(Props(classOf[ZoneTest.ZoneInitActor], zone), TestName) ! "!" - receiveOne(Duration.create(200, "ms")) //consume + zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), ZoneTest.TestName) + zone.Actor ! Zone.Init() + expectNoMsg(200 milliseconds) zone.Population ! Zone.Corpse.Add(player1) zone.Population ! Zone.Corpse.Add(player2) zone.Population ! Zone.Corpse.Add(player3) @@ -504,11 +497,12 @@ class ZonePopulationTest extends ActorTest { } "user tries to add character to list of retired characters, but is not in correct state" in { - val zone = new Zone("test", new ZoneMap(""), 0) + val zone = new Zone("test", new ZoneMap(""), 0) { override def SetupNumberPools() = { } } val player = Player(Avatar("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)) //player.Release !!important - system.actorOf(Props(classOf[ZoneTest.ZoneInitActor], zone), "testC") ! "!" - receiveOne(Duration.create(500, "ms")) //consume + zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), ZoneTest.TestName) + zone.Actor ! Zone.Init() + expectNoMsg(200 milliseconds) assert(zone.Corpses.isEmpty) zone.Population ! Zone.Corpse.Add(player) @@ -520,11 +514,13 @@ class ZonePopulationTest extends ActorTest { class ZoneGroundDropItemTest extends ActorTest { val item = AmmoBox(GlobalDefinitions.bullet_9mm) - val hub = new NumberPoolHub(new LimitedNumberSource(40150)) + val hub = new NumberPoolHub(new LimitedNumberSource(20)) hub.register(item, 10) - val zone = new Zone("test", new ZoneMap("test-map"), 0) + val zone = new Zone("test", new ZoneMap("test-map"), 0) { override def SetupNumberPools() = { } } zone.GUID(hub) - system.actorOf(Props(classOf[ZoneTest.ZoneInitActor], zone), "drop-test-zone") ! "!" + zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), ZoneTest.TestName) + zone.Actor ! Zone.Init() + expectNoMsg(200 milliseconds) "DropItem" should { "drop item on ground" in { @@ -544,11 +540,13 @@ class ZoneGroundDropItemTest extends ActorTest { class ZoneGroundCanNotDropItem1Test extends ActorTest { val item = AmmoBox(GlobalDefinitions.bullet_9mm) - val hub = new NumberPoolHub(new LimitedNumberSource(40150)) + val hub = new NumberPoolHub(new LimitedNumberSource(20)) //hub.register(item, 10) //!important - val zone = new Zone("test", new ZoneMap("test-map"), 0) + val zone = new Zone("test", new ZoneMap("test-map"), 0) { override def SetupNumberPools() = { } } zone.GUID(hub) - system.actorOf(Props(classOf[ZoneTest.ZoneInitActor], zone), "drop-test-zone") ! "!" + zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), ZoneTest.TestName) + zone.Actor ! Zone.Init() + expectNoMsg(200 milliseconds) "DropItem" should { "not drop an item that is not registered" in { @@ -570,9 +568,11 @@ class ZoneGroundCanNotDropItem2Test extends ActorTest { val item = AmmoBox(GlobalDefinitions.bullet_9mm) val hub = new NumberPoolHub(new LimitedNumberSource(20)) hub.register(item, 10) //!important - val zone = new Zone("test", new ZoneMap("test-map"), 0) + val zone = new Zone("test", new ZoneMap("test-map"), 0) { override def SetupNumberPools() = { } } //zone.GUID(hub) //!important - system.actorOf(Props(classOf[ZoneTest.ZoneInitActor], zone), "drop-test-zone") ! "!" + zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), ZoneTest.TestName) + zone.Actor ! Zone.Init() + expectNoMsg(200 milliseconds) "DropItem" should { "not drop an item that is not registered to the zone" in { @@ -592,11 +592,13 @@ class ZoneGroundCanNotDropItem2Test extends ActorTest { class ZoneGroundCanNotDropItem3Test extends ActorTest { val item = AmmoBox(GlobalDefinitions.bullet_9mm) - val hub = new NumberPoolHub(new LimitedNumberSource(40150)) + val hub = new NumberPoolHub(new LimitedNumberSource(20)) hub.register(item, 10) //!important - val zone = new Zone("test", new ZoneMap("test-map"), 0) + val zone = new Zone("test", new ZoneMap("test-map"), 0) { override def SetupNumberPools() = { } } zone.GUID(hub) //!important - system.actorOf(Props(classOf[ZoneTest.ZoneInitActor], zone), "drop-test-zone") ! "!" + zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), ZoneTest.TestName) + zone.Actor ! Zone.Init() + expectNoMsg(200 milliseconds) "DropItem" should { "not drop an item that has already been dropped" in { @@ -624,11 +626,13 @@ class ZoneGroundCanNotDropItem3Test extends ActorTest { class ZoneGroundPickupItemTest extends ActorTest { val item = AmmoBox(GlobalDefinitions.bullet_9mm) - val hub = new NumberPoolHub(new LimitedNumberSource(40150)) + val hub = new NumberPoolHub(new LimitedNumberSource(20)) hub.register(item, 10) - val zone = new Zone("test", new ZoneMap("test-map"), 0) + val zone = new Zone("test", new ZoneMap("test-map"), 0) { override def SetupNumberPools() = { } } zone.GUID(hub) - system.actorOf(Props(classOf[ZoneTest.ZoneInitActor], zone), "drop-test-zone") ! "!" + zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), ZoneTest.TestName) + zone.Actor ! Zone.Init() + expectNoMsg(200 milliseconds) "PickupItem" should { "pickup an item from ground" in { @@ -651,11 +655,13 @@ class ZoneGroundPickupItemTest extends ActorTest { class ZoneGroundCanNotPickupItemTest extends ActorTest { val item = AmmoBox(GlobalDefinitions.bullet_9mm) - val hub = new NumberPoolHub(new LimitedNumberSource(40150)) + val hub = new NumberPoolHub(new LimitedNumberSource(20)) hub.register(item, 10) - val zone = new Zone("test", new ZoneMap("test-map"), 0) + val zone = new Zone("test", new ZoneMap("test-map"), 0) { override def SetupNumberPools() = { } } zone.GUID(hub) //still registered to this zone - system.actorOf(Props(classOf[ZoneTest.ZoneInitActor], zone), "drop-test-zone") ! "!" + zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), ZoneTest.TestName) + zone.Actor ! Zone.Init() + expectNoMsg(200 milliseconds) "PickupItem" should { "not pickup an item if it can not be found" in { @@ -674,11 +680,13 @@ class ZoneGroundCanNotPickupItemTest extends ActorTest { class ZoneGroundRemoveItemTest extends ActorTest { val item = AmmoBox(GlobalDefinitions.bullet_9mm) - val hub = new NumberPoolHub(new LimitedNumberSource(40150)) + val hub = new NumberPoolHub(new LimitedNumberSource(20)) hub.register(item, 10) - val zone = new Zone("test", new ZoneMap("test-map"), 0) + val zone = new Zone("test", new ZoneMap("test-map"), 0) { override def SetupNumberPools() = { } } zone.GUID(hub) //still registered to this zone - system.actorOf(Props(classOf[ZoneTest.ZoneInitActor], zone), "drop-test-zone") ! "!" + zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), ZoneTest.TestName) + zone.Actor ! Zone.Init() + expectNoMsg(200 milliseconds) "RemoveItem" should { "remove an item from the ground without callback (even if the item is not found)" in { @@ -700,12 +708,6 @@ class ZoneGroundRemoveItemTest extends ActorTest { } object ZoneTest { - class ZoneInitActor(zone : Zone) extends Actor { - def receive : Receive = { - case "!" => - zone.Init(context) - sender ! "!" - case _ => ; - } - } + val testNum = new AtomicInteger(1) + def TestName : String = s"test${testNum.getAndIncrement()}" } diff --git a/common/src/test/scala/objects/guidtask/GUIDTaskRegister1Test.scala b/common/src/test/scala/objects/guidtask/GUIDTaskRegister1Test.scala index 803a6024..bf9ea192 100644 --- a/common/src/test/scala/objects/guidtask/GUIDTaskRegister1Test.scala +++ b/common/src/test/scala/objects/guidtask/GUIDTaskRegister1Test.scala @@ -1,52 +1,17 @@ // Copyright (c) 2017 PSForever package objects.guidtask -import akka.actor.{Actor, ActorSystem, Props} import net.psforever.objects.guid.{GUIDTask, TaskResolver} -import org.specs2.mutable.Specification +import objects.ActorTest -import scala.concurrent.Await -import akka.pattern.ask -import akka.util.Timeout -import scala.concurrent.duration._ +class GUIDTaskRegister1Test extends ActorTest { + "RegisterObjectTask" in { + val (_, uns, taskResolver, probe) = GUIDTaskTest.CommonTestSetup + val obj = new GUIDTaskTest.TestObject -class GUIDTaskRegister1Test extends Specification { - "RegisterObjectTask" should { - "register (1)" in { - val system = ActorSystem("sys") - val test = system.actorOf(Props(classOf[GUIDTaskRegister1TestActor], system), "test") - - implicit val timeout = Timeout(5 seconds) - val future = test ? "test" - val result = Await.result(future, timeout.duration).asInstanceOf[String] - result mustEqual "success" - } + assert(!obj.HasGUID) + taskResolver ! TaskResolver.GiveTask(new GUIDTaskTest.RegisterTestTask(probe.ref), List(GUIDTask.RegisterObjectTask(obj)(uns))) + probe.expectMsg(scala.util.Success) + assert(obj.HasGUID) } } - -private class GUIDTaskRegister1TestActor(implicit system : ActorSystem) extends Actor { - def receive : Receive = { - case "test" => - val (_, uns, taskResolver, probe) = GUIDTaskTest.CommonTestSetup - val obj = new GUIDTaskTest.TestObject - - assert(!obj.HasGUID) - taskResolver ! TaskResolver.GiveTask(new GUIDTaskTest.RegisterTestTask(probe.ref), List(GUIDTask.RegisterObjectTask(obj)(uns))) - probe.expectMsg(scala.util.Success) - assert(obj.HasGUID) - sender ! "success" - case _ => ; - } -} - -//class GUIDTaskRegister1Test extends ActorTest() { -// "RegisterObjectTask" in { -// val (_, uns, taskResolver, probe) = GUIDTaskTest.CommonTestSetup -// val obj = new GUIDTaskTest.TestObject -// -// assert(!obj.HasGUID) -// taskResolver ! TaskResolver.GiveTask(new GUIDTaskTest.RegisterTestTask(probe.ref), List(GUIDTask.RegisterObjectTask(obj)(uns))) -// probe.expectMsg(scala.util.Success) -// assert(obj.HasGUID) -// } -//} diff --git a/common/src/test/scala/objects/number/NumberPoolActorTest.scala b/common/src/test/scala/objects/number/NumberPoolActorTest.scala index e9596a0d..e4b8cf47 100644 --- a/common/src/test/scala/objects/number/NumberPoolActorTest.scala +++ b/common/src/test/scala/objects/number/NumberPoolActorTest.scala @@ -9,7 +9,7 @@ import objects.ActorTest import scala.concurrent.duration.Duration -class NumberPoolActorTest extends ActorTest(ActorSystem("test")) { +class NumberPoolActorTest extends ActorTest() { "NumberPoolActor" should { "GetAnyNumber" in { val pool = new ExclusivePool((25 to 50).toList) @@ -22,7 +22,7 @@ class NumberPoolActorTest extends ActorTest(ActorSystem("test")) { } } -class NumberPoolActorTest1 extends ActorTest(ActorSystem("test")) { +class NumberPoolActorTest1 extends ActorTest() { "NumberPoolActor" should { "GetSpecificNumber" in { val pool = new ExclusivePool((25 to 50).toList) @@ -34,7 +34,7 @@ class NumberPoolActorTest1 extends ActorTest(ActorSystem("test")) { } } -class NumberPoolActorTest2 extends ActorTest(ActorSystem("test")) { +class NumberPoolActorTest2 extends ActorTest() { "NumberPoolActor" should { "NoNumber" in { val pool = new ExclusivePool((25 to 25).toList) //pool only has one number - 25 diff --git a/pslogin/src/main/scala/Maps.scala b/pslogin/src/main/scala/Maps.scala index 911979b8..89d8d324 100644 --- a/pslogin/src/main/scala/Maps.scala +++ b/pslogin/src/main/scala/Maps.scala @@ -1,6 +1,8 @@ // Copyright (c) 2017 PSForever import net.psforever.objects.zones.ZoneMap import net.psforever.objects.GlobalDefinitions._ +import net.psforever.objects.LocalProjectile +import net.psforever.objects.ballistics.Projectile import net.psforever.objects.serverobject.doors.Door import net.psforever.objects.serverobject.implantmech.ImplantTerminalMech import net.psforever.objects.serverobject.locks.IFFLock @@ -13,15 +15,25 @@ import net.psforever.objects.serverobject.resourcesilo.ResourceSilo import net.psforever.types.Vector3 object Maps { - val map1 = new ZoneMap("map01") + val map1 = new ZoneMap("map01") { + Projectiles(this) + } - val map2 = new ZoneMap("map02") + val map2 = new ZoneMap("map02") { + Projectiles(this) + } - val map3 = new ZoneMap("map03") + val map3 = new ZoneMap("map03") { + Projectiles(this) + } - val map4 = new ZoneMap("map04") + val map4 = new ZoneMap("map04") { + Projectiles(this) + } - val map5 = new ZoneMap("map05") + val map5 = new ZoneMap("map05") { + Projectiles(this) + } val map6 = new ZoneMap("map06") { Building2() @@ -29,6 +41,7 @@ object Maps { Building42() Building48() Building49() + Projectiles(this) def Building2() : Unit = { //Anguta @@ -420,17 +433,29 @@ object Maps { } } - val map7 = new ZoneMap("map07") + val map7 = new ZoneMap("map07") { + Projectiles(this) + } - val map8 = new ZoneMap("map08") + val map8 = new ZoneMap("map08") { + Projectiles(this) + } - val map9 = new ZoneMap("map09") + val map9 = new ZoneMap("map09") { + Projectiles(this) + } - val map10 = new ZoneMap("map10") + val map10 = new ZoneMap("map10") { + Projectiles(this) + } - val map11 = new ZoneMap("map11") + val map11 = new ZoneMap("map11") { + Projectiles(this) + } - val map12 = new ZoneMap("map12") + val map12 = new ZoneMap("map12") { + Projectiles(this) + } val map13 = new ZoneMap("map13") { Building1() @@ -443,6 +468,7 @@ object Maps { Building77() Building79() Building81() + Projectiles(this) def Building1() : Unit = { //warpgate? @@ -716,29 +742,59 @@ object Maps { } } - val map14 = new ZoneMap("map14") + val map14 = new ZoneMap("map14") { + Projectiles(this) + } - val map15 = new ZoneMap("map15") + val map15 = new ZoneMap("map15") { + Projectiles(this) + } - val map16 = new ZoneMap("map16") + val map16 = new ZoneMap("map16") { + Projectiles(this) + } - val ugd01 = new ZoneMap("ugd01") + val ugd01 = new ZoneMap("ugd01") { + Projectiles(this) + } - val ugd02 = new ZoneMap("ugd02") + val ugd02 = new ZoneMap("ugd02") { + Projectiles(this) + } - val ugd03 = new ZoneMap("ugd03") + val ugd03 = new ZoneMap("ugd03") { + Projectiles(this) + } - val ugd04 = new ZoneMap("ugd04") + val ugd04 = new ZoneMap("ugd04") { + Projectiles(this) + } - val ugd05 = new ZoneMap("ugd05") + val ugd05 = new ZoneMap("ugd05") { + Projectiles(this) + } - val ugd06 = new ZoneMap("ugd06") + val ugd06 = new ZoneMap("ugd06") { + Projectiles(this) + } - val map96 = new ZoneMap("map96") + val map96 = new ZoneMap("map96") { + Projectiles(this) + } - val map97 = new ZoneMap("map97") + val map97 = new ZoneMap("map97") { + Projectiles(this) + } - val map98 = new ZoneMap("map98") + val map98 = new ZoneMap("map98") { + Projectiles(this) + } - val map99 = new ZoneMap("map99") + val map99 = new ZoneMap("map99") { + Projectiles(this) + } + + private def Projectiles(zmap : ZoneMap) : Unit = { + (Projectile.BaseUID until Projectile.RangeUID) foreach { zmap.LocalObject(_, LocalProjectile.Constructor) } + } } diff --git a/pslogin/src/main/scala/WorldSessionActor.scala b/pslogin/src/main/scala/WorldSessionActor.scala index c9d962ca..fae23dcb 100644 --- a/pslogin/src/main/scala/WorldSessionActor.scala +++ b/pslogin/src/main/scala/WorldSessionActor.scala @@ -5256,6 +5256,13 @@ class WorldSessionActor extends Actor with MDCContextAware { } } + /** + * Given a globally unique identifier in the 40100 to 40124 range + * (with an optional 25 as buffer), + * find a projectile. + * @param projectile_guid the projectile's GUID + * @return the discovered projectile + */ def FindProjectileEntry(projectile_guid : PlanetSideGUID) : Option[Projectile] = { val index = projectile_guid.guid - Projectile.BaseUID if(0 <= index && index < projectiles.length) { @@ -5267,6 +5274,13 @@ class WorldSessionActor extends Actor with MDCContextAware { } } + /** + * Find a projectile with the given globally unique identifier and mark it as a resolved shot. + * A `Resolved` shot has either encountered an obstacle or is being cleaned up for not finding an obstacle. + * @param projectile_guid the projectile GUID + * @param resolution the resolution status to promote the projectile + * @return the projectile + */ def ResolveProjectileEntry(projectile_guid : PlanetSideGUID, resolution : ProjectileResolution.Value) : Option[Projectile] = { FindProjectileEntry(projectile_guid) match { case Some(projectile) => @@ -5278,6 +5292,16 @@ class WorldSessionActor extends Actor with MDCContextAware { } } + /** + * Find a projectile with the given globally unique identifier and mark it as a resolved shot. + * A `Resolved` shot has either encountered an obstacle or is being cleaned up for not finding an obstacle. + * The internal copy of the projectile is retained as merely `Resolved` + * while the observed projectile is promoted to the suggested resolution status. + * @param projectile the projectile object + * @param index where the projectile was found + * @param resolution the resolution status to promote the projectile + * @return a copy of the projectile + */ def ResolveProjectileEntry(projectile : Projectile, index : Int, resolution : ProjectileResolution.Value) : Option[Projectile] = { if(projectiles(index).contains(projectile)) { projectiles(index) = Some(projectile.Resolve(ProjectileResolution.Resolved)) diff --git a/pslogin/src/test/scala/ActorTest.scala b/pslogin/src/test/scala/ActorTest.scala index 21e57b5a..c2e03982 100644 --- a/pslogin/src/test/scala/ActorTest.scala +++ b/pslogin/src/test/scala/ActorTest.scala @@ -17,8 +17,10 @@ abstract class ActorTest(sys : ActorSystem = ActorSystem("system", ConfigFactory object ActorTest { import scala.collection.JavaConverters._ private val LoggingConfig = Map( - "akka.loglevel" -> ConfigValueFactory.fromAnyRef("OFF"), - "akka.stdout-loglevel" -> ConfigValueFactory.fromAnyRef("OFF") + "akka.loggers" -> List("akka.testkit.TestEventListener").asJava, + "akka.loglevel" -> "OFF", + "akka.stdout-loglevel" -> "OFF", + "akka.log-dead-letters" -> "OFF" ).asJava final case class MDCGamePacket(packet : GamePacket) diff --git a/pslogin/src/test/scala/AvatarServiceTest.scala b/pslogin/src/test/scala/AvatarServiceTest.scala index 9d521c1b..993b02ba 100644 --- a/pslogin/src/test/scala/AvatarServiceTest.scala +++ b/pslogin/src/test/scala/AvatarServiceTest.scala @@ -384,7 +384,7 @@ Even with all this work, the tests have a high chance of failure just due to bei class AvatarReleaseTest extends ActorTest { ServiceManager.boot(system) ! ServiceManager.Register(RandomPool(1).props(Props[TaskResolver]), "taskResolver") val service = system.actorOf(Props[AvatarService], "release-test-service") - val zone = new Zone("test", new ZoneMap("test-map"), 0) + val zone = new Zone("test", new ZoneMap("test-map"), 0) { override def SetupNumberPools() = { AddPool("dynamic", 1 to 10) } } val taskResolver = system.actorOf(Props[TaskResolver], "release-test-resolver") zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), "release-test-zone") zone.Actor ! Zone.Init() @@ -433,7 +433,7 @@ class AvatarReleaseTest extends ActorTest { class AvatarReleaseEarly1Test extends ActorTest { ServiceManager.boot(system) ! ServiceManager.Register(RandomPool(1).props(Props[TaskResolver]), "taskResolver") val service = system.actorOf(Props[AvatarService], "release-test-service") - val zone = new Zone("test", new ZoneMap("test-map"), 0) + val zone = new Zone("test", new ZoneMap("test-map"), 0) { override def SetupNumberPools() = { AddPool("dynamic", 1 to 10) } } val taskResolver = system.actorOf(Props[TaskResolver], "release-test-resolver") zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), "release-test-zone") zone.Actor ! Zone.Init() @@ -483,7 +483,7 @@ class AvatarReleaseEarly1Test extends ActorTest { class AvatarReleaseEarly2Test extends ActorTest { ServiceManager.boot(system) ! ServiceManager.Register(RandomPool(1).props(Props[TaskResolver]), "taskResolver") val service = system.actorOf(Props[AvatarService], "release-test-service") - val zone = new Zone("test", new ZoneMap("test-map"), 0) + val zone = new Zone("test", new ZoneMap("test-map"), 0) { override def SetupNumberPools() = { AddPool("dynamic", 1 to 10) } } val taskResolver = system.actorOf(Props[TaskResolver], "release-test-resolver") zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), "release-test-zone") zone.Actor ! Zone.Init()