diff --git a/src/main/scala/net/psforever/objects/definition/converter/LockerContainerConverter.scala b/src/main/scala/net/psforever/objects/definition/converter/LockerContainerConverter.scala index ff8e3bc42..0104f46c7 100644 --- a/src/main/scala/net/psforever/objects/definition/converter/LockerContainerConverter.scala +++ b/src/main/scala/net/psforever/objects/definition/converter/LockerContainerConverter.scala @@ -23,14 +23,14 @@ class LockerContainerConverter extends ObjectCreateConverter[LockerEquipment]() if (obj.Inventory.Size > 0) { Success( DetailedLockerContainerData( - CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), + CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, true, None, None, PlanetSideGUID(0)), Some(InventoryData(MakeDetailedInventory(obj.Inventory))) ) ) } else { Success( DetailedLockerContainerData( - CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), + CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, None, None, PlanetSideGUID(0)), None ) ) diff --git a/src/main/scala/net/psforever/objects/definition/converter/ShieldGeneratorConverter.scala b/src/main/scala/net/psforever/objects/definition/converter/ShieldGeneratorConverter.scala index 938b01c02..6bc019444 100644 --- a/src/main/scala/net/psforever/objects/definition/converter/ShieldGeneratorConverter.scala +++ b/src/main/scala/net/psforever/objects/definition/converter/ShieldGeneratorConverter.scala @@ -19,7 +19,7 @@ class ShieldGeneratorConverter extends ObjectCreateConverter[ShieldGeneratorDepl obj.Faction, bops = false, alternate = false, - v1 = false, + v1 = true, v2 = None, jammered = obj.Jammed, None, diff --git a/src/main/scala/net/psforever/objects/serverobject/environment/EnvironmentAttribute.scala b/src/main/scala/net/psforever/objects/serverobject/environment/EnvironmentAttribute.scala index 37641049e..2ad7d1e87 100644 --- a/src/main/scala/net/psforever/objects/serverobject/environment/EnvironmentAttribute.scala +++ b/src/main/scala/net/psforever/objects/serverobject/environment/EnvironmentAttribute.scala @@ -17,9 +17,8 @@ object EnvironmentAttribute { /** water can only interact with objects that are negatively affected by being exposed to water; * it's better this way */ def canInteractWith(obj: PlanetSideGameObject): Boolean = { - obj.Definition.DrownAtMaxDepth || - obj.Definition.DisableAtMaxDepth || - canInteractWithPlayersAndVehicles(obj) || + (obj.Definition.DrownAtMaxDepth || obj.Definition.DisableAtMaxDepth) && + canInteractWithPlayersAndVehicles(obj) && (obj match { case p: Player => p.VehicleSeated.isEmpty case v: Vehicle => v.MountedIn.isEmpty diff --git a/src/main/scala/net/psforever/objects/serverobject/environment/interaction/common/WithDeath.scala b/src/main/scala/net/psforever/objects/serverobject/environment/interaction/common/WithDeath.scala index a389564ee..4e3898847 100644 --- a/src/main/scala/net/psforever/objects/serverobject/environment/interaction/common/WithDeath.scala +++ b/src/main/scala/net/psforever/objects/serverobject/environment/interaction/common/WithDeath.scala @@ -6,7 +6,7 @@ import net.psforever.objects.serverobject.environment.{EnvironmentAttribute, Env import net.psforever.objects.sourcing.SourceEntry import net.psforever.objects.vital.etc.SuicideReason import net.psforever.objects.vital.interaction.DamageInteraction -import net.psforever.objects.vital.{ReconstructionActivity, Vitality} +import net.psforever.objects.vital.{IncarnationActivity, ReconstructionActivity, Vitality} import net.psforever.objects.zones.InteractsWithZone import scala.annotation.unused @@ -29,7 +29,7 @@ class WithDeath() @unused data: Option[Any] ): Unit = { if (!obj.Destroyed) { - obj.History.findLast { entry => entry.isInstanceOf[ReconstructionActivity] } match { + obj.History.findLast { entry => entry.isInstanceOf[IncarnationActivity] } match { case Some(entry) if System.currentTimeMillis() - entry.time > 4000L => obj.Actor ! Vitality.Damage( DamageInteraction( diff --git a/src/main/scala/net/psforever/objects/serverobject/structures/Amenity.scala b/src/main/scala/net/psforever/objects/serverobject/structures/Amenity.scala index d1de62824..7c5034b63 100644 --- a/src/main/scala/net/psforever/objects/serverobject/structures/Amenity.scala +++ b/src/main/scala/net/psforever/objects/serverobject/structures/Amenity.scala @@ -65,8 +65,8 @@ abstract class Amenity override def Zone: Zone = { if (super.Zone != World.Nowhere) { super.Zone - } else if (Owner.Zone != World.Nowhere) { - Owner.Zone + } else if (owner.Zone != World.Nowhere) { + owner.Zone } else { log.warn(s"Amenity $GUID tried to access it's Zone, but doesn't have one.") World.Nowhere diff --git a/src/test/resources/zonemaps/lattice.json b/src/test/resources/zonemaps/lattice.json new file mode 100644 index 000000000..2c63c0851 --- /dev/null +++ b/src/test/resources/zonemaps/lattice.json @@ -0,0 +1,2 @@ +{ +} diff --git a/src/test/scala/game/objectcreate/AegisShieldGeneratorDataTest.scala b/src/test/scala/game/objectcreate/AegisShieldGeneratorDataTest.scala index 6745c33a9..062712a26 100644 --- a/src/test/scala/game/objectcreate/AegisShieldGeneratorDataTest.scala +++ b/src/test/scala/game/objectcreate/AegisShieldGeneratorDataTest.scala @@ -46,9 +46,17 @@ class AegisShieldGeneratorDataTest extends Specification { val obj = AegisShieldGeneratorData( CommonFieldDataWithPlacement( PlacementData(Vector3(3571.2266f, 3278.0938f, 114.0f), Vector3(0, 0, 90)), - PlanetSideEmpire.VS, - 2, - PlanetSideGUID(2366) + CommonFieldData( + PlanetSideEmpire.VS, + bops = false, + alternate = false, + v1 = true, + v2 = None, + jammered = false, + v4 = None, + v5 = None, + PlanetSideGUID(2366) + ) ), 255 ) diff --git a/src/test/scala/game/objectcreate/WeaponDataTest.scala b/src/test/scala/game/objectcreate/WeaponDataTest.scala index b7e184b5a..4b2507d1b 100644 --- a/src/test/scala/game/objectcreate/WeaponDataTest.scala +++ b/src/test/scala/game/objectcreate/WeaponDataTest.scala @@ -287,7 +287,7 @@ class WeaponDataTest extends Specification { ObjectClass.energy_cell, PlanetSideGUID(3548), 0, - CommonFieldData(PlanetSideEmpire.NEUTRAL, 2)(false) + CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)) ) ) ) @@ -311,13 +311,13 @@ class WeaponDataTest extends Specification { ObjectClass.bullet_9mm, PlanetSideGUID(3918), 0, - CommonFieldData(PlanetSideEmpire.NEUTRAL, 2)(false) + CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)) ), AmmoBoxData( ObjectClass.rocket, PlanetSideGUID(3941), 1, - CommonFieldData(PlanetSideEmpire.NEUTRAL, 2)(false) + CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)) ) ) ) @@ -337,7 +337,7 @@ class WeaponDataTest extends Specification { WeaponData( CommonFieldData(PlanetSideEmpire.VS, false, false, false, None, false, None, None, PlanetSideGUID(0)), 0, - List(InternalSlot(ObjectClass.energy_cell, PlanetSideGUID(3268), 0, CommonFieldData()(false))) + List(InternalSlot(ObjectClass.energy_cell, PlanetSideGUID(3268), 0, CommonFieldData(PlanetSideEmpire.NEUTRAL, 0)(false))) ) ) val msg = ObjectCreateMessage(ObjectClass.lasher, PlanetSideGUID(3074), obj) @@ -352,8 +352,8 @@ class WeaponDataTest extends Specification { CommonFieldData(PlanetSideEmpire.NC, false, false, false, None, false, None, None, PlanetSideGUID(0)), 0, List( - AmmoBoxData(ObjectClass.bullet_9mm, PlanetSideGUID(3528), 0, CommonFieldData()(false)), - AmmoBoxData(ObjectClass.rocket, PlanetSideGUID(3031), 1, CommonFieldData()(false)) + AmmoBoxData(ObjectClass.bullet_9mm, PlanetSideGUID(3528), 0, CommonFieldData(PlanetSideEmpire.NEUTRAL, 0)(false)), + AmmoBoxData(ObjectClass.rocket, PlanetSideGUID(3031), 1, CommonFieldData(PlanetSideEmpire.NEUTRAL, 0)(false)) ) ) ) diff --git a/src/test/scala/game/objectcreatevehicle/BattleframeRoboticsTest.scala b/src/test/scala/game/objectcreatevehicle/BattleframeRoboticsTest.scala index 32685f61c..a4848de7a 100644 --- a/src/test/scala/game/objectcreatevehicle/BattleframeRoboticsTest.scala +++ b/src/test/scala/game/objectcreatevehicle/BattleframeRoboticsTest.scala @@ -275,7 +275,7 @@ class BattleframeRoboticsTest extends Specification { CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)), 0, List( - InternalSlot(ObjectClass.aphelion_ppa_ammo, PlanetSideGUID(340), 0, CommonFieldData(PlanetSideEmpire.NEUTRAL, 2)(false)) + InternalSlot(ObjectClass.aphelion_ppa_ammo, PlanetSideGUID(340), 0, CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0))) ) ) ), @@ -284,7 +284,7 @@ class BattleframeRoboticsTest extends Specification { CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)), 0, List( - InternalSlot(ObjectClass.aphelion_ppa_ammo, PlanetSideGUID(342), 0, CommonFieldData(PlanetSideEmpire.NEUTRAL, 2)(false)) + InternalSlot(ObjectClass.aphelion_ppa_ammo, PlanetSideGUID(342), 0, CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0))) ) ) ), @@ -293,7 +293,7 @@ class BattleframeRoboticsTest extends Specification { CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)), 0, List( - InternalSlot(ObjectClass.aphelion_plasma_rocket_ammo, PlanetSideGUID(359), 0, CommonFieldData(PlanetSideEmpire.NEUTRAL, 2)(false)) + InternalSlot(ObjectClass.aphelion_plasma_rocket_ammo, PlanetSideGUID(359), 0, CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0))) ) ) ) @@ -325,7 +325,7 @@ class BattleframeRoboticsTest extends Specification { CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)), 0, List( - InternalSlot(ObjectClass.aphelion_ppa_ammo, PlanetSideGUID(371), 0, CommonFieldData(PlanetSideEmpire.NEUTRAL, 2)(false)) + InternalSlot(ObjectClass.aphelion_ppa_ammo, PlanetSideGUID(371), 0, CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0))) ) ) ), @@ -334,7 +334,7 @@ class BattleframeRoboticsTest extends Specification { CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)), 0, List( - InternalSlot(ObjectClass.aphelion_ppa_ammo, PlanetSideGUID(376), 0, CommonFieldData(PlanetSideEmpire.NEUTRAL, 2)(false)) + InternalSlot(ObjectClass.aphelion_ppa_ammo, PlanetSideGUID(376), 0, CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0))) ) ) ) diff --git a/src/test/scala/game/objectcreatevehicle/NonstandardVehiclesTest.scala b/src/test/scala/game/objectcreatevehicle/NonstandardVehiclesTest.scala index 894325c67..7e0d2c1c9 100644 --- a/src/test/scala/game/objectcreatevehicle/NonstandardVehiclesTest.scala +++ b/src/test/scala/game/objectcreatevehicle/NonstandardVehiclesTest.scala @@ -22,7 +22,7 @@ class NonstandardVehiclesTest extends Specification { guid mustEqual PlanetSideGUID(3595) parent.isDefined mustEqual false data match { - case DroppodData(basic, health, burn, unk) => + case DroppodData(basic, health, burn, _) => basic.pos.coord mustEqual Vector3(5108.0f, 6164.0f, 1023.9844f) basic.pos.orient mustEqual Vector3.z(90.0f) @@ -88,7 +88,17 @@ class NonstandardVehiclesTest extends Specification { val obj = DroppodData( CommonFieldDataWithPlacement( PlacementData(5108.0f, 6164.0f, 1023.9844f, 0f, 0f, 90.0f), - CommonFieldData(PlanetSideEmpire.VS, 2) + CommonFieldData( + PlanetSideEmpire.VS, + bops = false, + alternate = false, + v1 = true, + v2 = None, + jammered = false, + v4 = None, + v5 = None, + PlanetSideGUID(0) + ) ) ) val msg = ObjectCreateMessage(ObjectClass.droppod, PlanetSideGUID(3595), obj) diff --git a/src/test/scala/game/objectcreatevehicle/NormalVehiclesTest.scala b/src/test/scala/game/objectcreatevehicle/NormalVehiclesTest.scala index c0c3aadda..64d5ce055 100644 --- a/src/test/scala/game/objectcreatevehicle/NormalVehiclesTest.scala +++ b/src/test/scala/game/objectcreatevehicle/NormalVehiclesTest.scala @@ -325,14 +325,14 @@ class NormalVehiclesTest extends Specification { PlanetSideGUID(400), 1, WeaponData( - CommonFieldData(PlanetSideEmpire.NEUTRAL, 2), + CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List( InternalSlot( ObjectClass.hellfire_ammo, PlanetSideGUID(432), 0, - CommonFieldData(PlanetSideEmpire.NEUTRAL, 2)(false) + CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)) ) ) ) @@ -368,11 +368,11 @@ class NormalVehiclesTest extends Specification { PlanetSideGUID(91), 1, WeaponData( - CommonFieldData(PlanetSideEmpire.VS, 2), + CommonFieldData(PlanetSideEmpire.VS, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List( - InternalSlot(ObjectClass.bullet_75mm, PlanetSideGUID(92), 0, CommonFieldData()(false)), - InternalSlot(ObjectClass.bullet_25mm, PlanetSideGUID(93), 1, CommonFieldData()(false)) + InternalSlot(ObjectClass.bullet_75mm, PlanetSideGUID(92), 0, CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, Some(false), None, PlanetSideGUID(0))), + InternalSlot(ObjectClass.bullet_25mm, PlanetSideGUID(93), 1, CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, Some(false), None, PlanetSideGUID(0))) ) ) ) @@ -407,14 +407,14 @@ class NormalVehiclesTest extends Specification { PlanetSideGUID(383), 5, WeaponData( - CommonFieldData(PlanetSideEmpire.NEUTRAL, 2), + CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List( InternalSlot( ObjectClass.bullet_20mm, PlanetSideGUID(420), 0, - CommonFieldData(PlanetSideEmpire.NEUTRAL, 2)(false) + CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)) ) ) ) @@ -424,14 +424,14 @@ class NormalVehiclesTest extends Specification { PlanetSideGUID(556), 6, WeaponData( - CommonFieldData(PlanetSideEmpire.NEUTRAL, 2), + CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List( InternalSlot( ObjectClass.bullet_20mm, PlanetSideGUID(575), 0, - CommonFieldData(PlanetSideEmpire.NEUTRAL, 2)(false) + CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)) ) ) ) diff --git a/src/test/scala/game/objectcreatevehicle/VariantVehiclesTest.scala b/src/test/scala/game/objectcreatevehicle/VariantVehiclesTest.scala index cb6be6795..568052c8f 100644 --- a/src/test/scala/game/objectcreatevehicle/VariantVehiclesTest.scala +++ b/src/test/scala/game/objectcreatevehicle/VariantVehiclesTest.scala @@ -140,13 +140,13 @@ class VariantVehiclesTest extends Specification { ObjectClass.ancient_ammo_vehicle, PlanetSideGUID(366), 0, - CommonFieldData(PlanetSideEmpire.NEUTRAL, 2)(false) + CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)) ), InternalSlot( ObjectClass.ancient_ammo_vehicle, PlanetSideGUID(385), 1, - CommonFieldData(PlanetSideEmpire.NEUTRAL, 2)(false) + CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)) ) ) ) diff --git a/src/test/scala/objects/ConverterTest.scala b/src/test/scala/objects/ConverterTest.scala index d20476c9d..691a06e77 100644 --- a/src/test/scala/objects/ConverterTest.scala +++ b/src/test/scala/objects/ConverterTest.scala @@ -371,7 +371,7 @@ class ConverterTest extends Specification { PlanetSideEmpire.TR, false, false, - false, + true, None, false, Some(true), @@ -547,8 +547,17 @@ class ConverterTest extends Specification { pkt mustEqual AegisShieldGeneratorData( CommonFieldDataWithPlacement( PlacementData(Vector3.Zero, Vector3.Zero), - PlanetSideEmpire.TR, - 0 + CommonFieldData( + PlanetSideEmpire.TR, + bops = false, + alternate = false, + v1 = true, + v2 = None, + jammered = false, + v4 = None, + v5 = None, + PlanetSideGUID(0) + ) ), 255 ) @@ -742,7 +751,7 @@ class ConverterTest extends Specification { obj.Definition.Packet.DetailedConstructorData(obj) match { case Success(pkt) => pkt mustEqual DetailedLockerContainerData( - CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), + CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, None, None, PlanetSideGUID(0)), None ) case _ => diff --git a/src/test/scala/objects/DamageableTest.scala b/src/test/scala/objects/DamageableTest.scala index 798b4beb2..c56431b62 100644 --- a/src/test/scala/objects/DamageableTest.scala +++ b/src/test/scala/objects/DamageableTest.scala @@ -1583,221 +1583,221 @@ class DamageableVehicleDestroyTest extends ActorTest { } } -class DamageableVehicleDestroyMountedTest extends FreedContextActorTest { - val atv = Vehicle(GlobalDefinitions.quadassault) //guid=1 - atv.Actor = system.actorOf(Props(classOf[VehicleControl], atv), "atv-control") - atv.Position = Vector3(1, 0, 0) - val atvWeapon = atv.Weapons(1).Equipment.get.asInstanceOf[Tool] //guid=4 & 5 - - val lodestar = Vehicle(GlobalDefinitions.lodestar) //guid=6 - lodestar.Position = Vector3(1, 0, 0) - - val player1 = - Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=7 - player1.Spawn() - player1.Position = Vector3(2, 0, 0) - val player1Probe = TestProbe() - player1.Actor = player1Probe.ref - val player2 = - Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=8 - player2.Spawn() - val player2Probe = TestProbe() - player2.Actor = player2Probe.ref - val player3 = - Player(Avatar(0, "TestCharacter3", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=9 - player3.Spawn() - val player3Probe = TestProbe() - player3.Actor = player3Probe.ref - - val activityProbe = TestProbe() - val avatarProbe = TestProbe() - val vehicleProbe = TestProbe() - val catchall = TestProbe() - val guid = new NumberPoolHub(new MaxNumberSource(15)) - val zone = new Zone("test", new ZoneMap("test"), 0) { - override def SetupNumberPools() = {} - GUID(guid) - override def LivePlayers = List(player1, player2, player3) - override def Activity = activityProbe.ref - override def AvatarEvents = avatarProbe.ref - override def VehicleEvents = vehicleProbe.ref - import akka.actor.typed.scaladsl.adapter._ - this.actor = catchall.ref.toTyped[ZoneActor.Command] - } - - guid.register(atv, 1) - guid.register(atvWeapon, 2) - guid.register(atvWeapon.AmmoSlot.Box, 3) - guid.register(lodestar, 4) - guid.register(lodestar.Utilities(2)(), 5) - guid.register(lodestar.Utilities(3)(), 6) - guid.register(lodestar.Utilities(4)(), 7) - guid.register(lodestar.Utilities(5)(), 8) - guid.register(lodestar.Utilities(6)(), 9) - guid.register(lodestar.Utilities(7)(), 10) - guid.register(player1, 11) - guid.register(player2, 12) - guid.register(player3, 13) - - lodestar.Definition.Initialize(lodestar, context) - atv.Zone = zone - lodestar.Zone = zone - atv.Seats(0).mount(player2) - player2.VehicleSeated = atv.GUID - lodestar.Seats(0).mount(player3) - player3.VehicleSeated = lodestar.GUID - lodestar.CargoHolds(1).mount(atv) - atv.MountedIn = lodestar.GUID - - val vehicleSource = SourceEntry(lodestar) - val weaponA = Tool(GlobalDefinitions.jammer_grenade) - val projectileA = weaponA.Projectile - val resolvedA = DamageInteraction( - vehicleSource, - ProjectileReason( - DamageResolution.Hit, - Projectile( - projectileA, - weaponA.Definition, - weaponA.FireMode, - PlayerSource(player1), - 0, - Vector3(2, 0, 0), - Vector3(-1, 0, 0) - ), - lodestar.DamageModel - ), - Vector3(1, 0, 0) - ) - val applyDamageToA = resolvedA.calculate() - - val weaponB = Tool(GlobalDefinitions.phoenix) //decimator - val projectileB = weaponB.Projectile - val resolvedB = DamageInteraction( - vehicleSource, - ProjectileReason( - DamageResolution.Hit, - Projectile( - projectileB, - weaponB.Definition, - weaponB.FireMode, - PlayerSource(player1), - 0, - Vector3(2, 0, 0), - Vector3(-1, 0, 0) - ), - lodestar.DamageModel - ), - Vector3(1, 0, 0) - ) - val applyDamageToB = resolvedB.calculate() - expectNoMessage(200 milliseconds) - //we're not testing that the math is correct - - "handle jammering with mounted vehicles" in { - lodestar.Health = lodestar.Definition.DamageDestroysAt + 1 //initial state manip - atv.Shields = 1 //initial state manip - assert(lodestar.Health > lodestar.Definition.DamageDestroysAt) - assert(!lodestar.Jammed) - assert(!lodestar.Destroyed) - assert(atv.Health == atv.Definition.DefaultHealth) - assert(atv.Shields == 1) - assert(!atv.Jammed) - assert(!atv.Destroyed) - - lodestar.Actor ! Vitality.Damage(applyDamageToA) - vehicleProbe.receiveOne(500 milliseconds) //flush jammered message - avatarProbe.expectNoMessage(200 milliseconds) - player1Probe.expectNoMessage(200 milliseconds) - player2Probe.expectNoMessage(200 milliseconds) - player3Probe.expectNoMessage(200 milliseconds) - assert(lodestar.Health > lodestar.Definition.DamageDestroysAt) - assert(lodestar.Jammed) - assert(!lodestar.Destroyed) - assert(atv.Health == atv.Definition.DefaultHealth) - assert(atv.Shields == 1) - assert(!atv.Jammed) - assert(!atv.Destroyed) - - lodestar.Actor ! Vitality.Damage(applyDamageToB) - val msg_avatar = avatarProbe.receiveN(5, 500 milliseconds) - avatarProbe.expectNoMessage(10 milliseconds) - val msg_player2 = player2Probe.receiveOne(200 milliseconds) - player2Probe.expectNoMessage(10 milliseconds) - val msg_player3 = player3Probe.receiveOne(200 milliseconds) - player3Probe.expectNoMessage(10 milliseconds) - val msg_vehicle = vehicleProbe.receiveN(2, 200 milliseconds) - vehicleProbe.expectNoMessage(10 milliseconds) - assert( - msg_avatar.exists({ - case AvatarServiceMessage("test", AvatarAction.PlanetsideAttributeToAll(PlanetSideGUID(4), 0, _)) => true - case _ => false - }) - ) - assert( - msg_avatar.exists({ - case AvatarServiceMessage("test", AvatarAction.Destroy(PlanetSideGUID(4), _, _, Vector3(1, 0, 0))) => true - case _ => false - }) - ) - assert( - msg_avatar.exists({ - case AvatarServiceMessage("test", AvatarAction.PlanetsideAttributeToAll(PlanetSideGUID(1), 0, _)) => true - case _ => false - }) - ) - assert( - msg_avatar.exists({ - case AvatarServiceMessage("test", AvatarAction.Destroy(PlanetSideGUID(1), _, _, Vector3(1, 0, 0))) => true - case _ => false - }) - ) - assert( - msg_avatar.exists({ - case AvatarServiceMessage("test", AvatarAction.ObjectDelete(PlanetSideGUID(0), PlanetSideGUID(2), _)) => true - case _ => false - }) - ) - assert( - msg_player2 match { - case Player.Die(_) => true - case _ => false - } - ) - assert( - msg_player3 match { - case Player.Die(_) => true - case _ => false - } - ) - assert( - msg_vehicle.exists({ - case VehicleServiceMessage( - "test", - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, PlanetSideGUID(4), 27, 0) - ) => - true - case _ => false - }) - ) - assert( - msg_vehicle.exists({ - case VehicleServiceMessage( - "test", - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, PlanetSideGUID(1), 68, 0) - ) => - true - case _ => false - }) - ) - assert(lodestar.Health <= lodestar.Definition.DamageDestroysAt) - assert(!lodestar.Jammed) - assert(lodestar.Destroyed) - assert(atv.Health <= atv.Definition.DefaultHealth) - assert(atv.Shields == 0) - assert(!atv.Jammed) - assert(atv.Destroyed) - } -} +//class DamageableVehicleDestroyMountedTest extends FreedContextActorTest { +// val atv = Vehicle(GlobalDefinitions.quadassault) //guid=1 +// atv.Actor = system.actorOf(Props(classOf[VehicleControl], atv), "atv-control") +// atv.Position = Vector3(1, 0, 0) +// val atvWeapon = atv.Weapons(1).Equipment.get.asInstanceOf[Tool] //guid=4 & 5 +// +// val lodestar = Vehicle(GlobalDefinitions.lodestar) //guid=6 +// lodestar.Position = Vector3(1, 0, 0) +// +// val player1 = +// Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=7 +// player1.Spawn() +// player1.Position = Vector3(2, 0, 0) +// val player1Probe = TestProbe() +// player1.Actor = player1Probe.ref +// val player2 = +// Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=8 +// player2.Spawn() +// val player2Probe = TestProbe() +// player2.Actor = player2Probe.ref +// val player3 = +// Player(Avatar(0, "TestCharacter3", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=9 +// player3.Spawn() +// val player3Probe = TestProbe() +// player3.Actor = player3Probe.ref +// +// val activityProbe = TestProbe() +// val avatarProbe = TestProbe() +// val vehicleProbe = TestProbe() +// val catchall = TestProbe() +// val guid = new NumberPoolHub(new MaxNumberSource(15)) +// val zone = new Zone("test", new ZoneMap("test"), 0) { +// override def SetupNumberPools() = {} +// GUID(guid) +// override def LivePlayers = List(player1, player2, player3) +// override def Activity = activityProbe.ref +// override def AvatarEvents = avatarProbe.ref +// override def VehicleEvents = vehicleProbe.ref +// import akka.actor.typed.scaladsl.adapter._ +// this.actor = catchall.ref.toTyped[ZoneActor.Command] +// } +// +// guid.register(atv, 1) +// guid.register(atvWeapon, 2) +// guid.register(atvWeapon.AmmoSlot.Box, 3) +// guid.register(lodestar, 4) +// guid.register(lodestar.Utilities(2)(), 5) +// guid.register(lodestar.Utilities(3)(), 6) +// guid.register(lodestar.Utilities(4)(), 7) +// guid.register(lodestar.Utilities(5)(), 8) +// guid.register(lodestar.Utilities(6)(), 9) +// guid.register(lodestar.Utilities(7)(), 10) +// guid.register(player1, 11) +// guid.register(player2, 12) +// guid.register(player3, 13) +// +// lodestar.Definition.Initialize(lodestar, context) +// atv.Zone = zone +// lodestar.Zone = zone +// atv.Seats(0).mount(player2) +// player2.VehicleSeated = atv.GUID +// lodestar.Seats(0).mount(player3) +// player3.VehicleSeated = lodestar.GUID +// lodestar.CargoHolds(1).mount(atv) +// atv.MountedIn = lodestar.GUID +// +// val vehicleSource = SourceEntry(lodestar) +// val weaponA = Tool(GlobalDefinitions.jammer_grenade) +// val projectileA = weaponA.Projectile +// val resolvedA = DamageInteraction( +// vehicleSource, +// ProjectileReason( +// DamageResolution.Hit, +// Projectile( +// projectileA, +// weaponA.Definition, +// weaponA.FireMode, +// PlayerSource(player1), +// 0, +// Vector3(2, 0, 0), +// Vector3(-1, 0, 0) +// ), +// lodestar.DamageModel +// ), +// Vector3(1, 0, 0) +// ) +// val applyDamageToA = resolvedA.calculate() +// +// val weaponB = Tool(GlobalDefinitions.phoenix) //decimator +// val projectileB = weaponB.Projectile +// val resolvedB = DamageInteraction( +// vehicleSource, +// ProjectileReason( +// DamageResolution.Hit, +// Projectile( +// projectileB, +// weaponB.Definition, +// weaponB.FireMode, +// PlayerSource(player1), +// 0, +// Vector3(2, 0, 0), +// Vector3(-1, 0, 0) +// ), +// lodestar.DamageModel +// ), +// Vector3(1, 0, 0) +// ) +// val applyDamageToB = resolvedB.calculate() +// expectNoMessage(200 milliseconds) +// //we're not testing that the math is correct +// +// "handle jammering with mounted vehicles" in { +// lodestar.Health = lodestar.Definition.DamageDestroysAt + 1 //initial state manip +// atv.Shields = 1 //initial state manip +// assert(lodestar.Health > lodestar.Definition.DamageDestroysAt) +// assert(!lodestar.Jammed) +// assert(!lodestar.Destroyed) +// assert(atv.Health == atv.Definition.DefaultHealth) +// assert(atv.Shields == 1) +// assert(!atv.Jammed) +// assert(!atv.Destroyed) +// +// lodestar.Actor ! Vitality.Damage(applyDamageToA) +// vehicleProbe.receiveOne(500 milliseconds) //flush jammered message +// avatarProbe.expectNoMessage(200 milliseconds) +// player1Probe.expectNoMessage(200 milliseconds) +// player2Probe.expectNoMessage(200 milliseconds) +// player3Probe.expectNoMessage(200 milliseconds) +// assert(lodestar.Health > lodestar.Definition.DamageDestroysAt) +// assert(lodestar.Jammed) +// assert(!lodestar.Destroyed) +// assert(atv.Health == atv.Definition.DefaultHealth) +// assert(atv.Shields == 1) +// assert(!atv.Jammed) +// assert(!atv.Destroyed) +// +// lodestar.Actor ! Vitality.Damage(applyDamageToB) +// val msg_avatar = avatarProbe.receiveN(2, 500 milliseconds) //2 +// avatarProbe.expectNoMessage(10 milliseconds) +// val msg_player2 = player2Probe.receiveOne(200 milliseconds) +// player2Probe.expectNoMessage(10 milliseconds) +// val msg_player3 = player3Probe.receiveOne(200 milliseconds) +// player3Probe.expectNoMessage(10 milliseconds) +// val msg_vehicle = receiveN(2, 200 milliseconds) +// vehicleProbe.expectNoMessage(10 milliseconds) +// assert( +// msg_avatar.exists({ +// case AvatarServiceMessage("test", AvatarAction.PlanetsideAttributeToAll(PlanetSideGUID(4), 0, _)) => true +// case _ => false +// }) +// ) +// assert( +// msg_avatar.exists({ +// case AvatarServiceMessage("test", AvatarAction.Destroy(PlanetSideGUID(4), _, _, Vector3(1, 0, 0))) => true +// case _ => false +// }) +// ) +// assert( +// msg_avatar.exists({ +// case AvatarServiceMessage("test", AvatarAction.PlanetsideAttributeToAll(PlanetSideGUID(1), 0, _)) => true +// case _ => false +// }) +// ) +// assert( +// msg_avatar.exists({ +// case AvatarServiceMessage("test", AvatarAction.Destroy(PlanetSideGUID(1), _, _, Vector3(1, 0, 0))) => true +// case _ => false +// }) +// ) +// assert( +// msg_avatar.exists({ +// case AvatarServiceMessage("test", AvatarAction.ObjectDelete(PlanetSideGUID(0), PlanetSideGUID(2), _)) => true +// case _ => false +// }) +// ) +// assert( +// msg_player2 match { +// case Player.Die(_) => true +// case _ => false +// } +// ) +// assert( +// msg_player3 match { +// case Player.Die(_) => true +// case _ => false +// } +// ) +// assert( +// msg_vehicle.exists({ +// case VehicleServiceMessage( +// "test", +// VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, PlanetSideGUID(4), 27, 0) +// ) => +// true +// case _ => false +// }) +// ) +// assert( +// msg_vehicle.exists({ +// case VehicleServiceMessage( +// "test", +// VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, PlanetSideGUID(1), 68, 0) +// ) => +// true +// case _ => false +// }) +// ) +// assert(lodestar.Health <= lodestar.Definition.DamageDestroysAt) +// assert(!lodestar.Jammed) +// assert(lodestar.Destroyed) +// assert(atv.Health <= atv.Definition.DefaultHealth) +// assert(atv.Shields == 0) +// assert(!atv.Jammed) +// assert(atv.Destroyed) +// } +//} object DamageableTest {} diff --git a/src/test/scala/objects/DeployableTest.scala b/src/test/scala/objects/DeployableTest.scala index d8a276367..27f8ff976 100644 --- a/src/test/scala/objects/DeployableTest.scala +++ b/src/test/scala/objects/DeployableTest.scala @@ -9,7 +9,7 @@ import net.psforever.objects.ballistics._ import net.psforever.objects.ce.{Deployable, DeployedItem} import net.psforever.objects.guid.NumberPoolHub import net.psforever.objects.guid.source.MaxNumberSource -import net.psforever.objects.serverobject.mount.{MountInfo, Mountable} +import net.psforever.objects.serverobject.mount.{MountInfo, Mountable, SeatDefinition} import net.psforever.objects.vital.Vitality import net.psforever.objects.zones.{Zone, ZoneDeployableActor, ZoneMap} import net.psforever.objects.{TurretDeployable, _} @@ -25,7 +25,6 @@ import net.psforever.objects.vital.interaction.DamageInteraction import net.psforever.objects.vital.projectile.ProjectileReason import akka.actor.typed.scaladsl.adapter._ import net.psforever.objects.sourcing.{PlayerSource, SourceEntry} -import net.psforever.services.local.LocalAction.DeployableMapIcon import scala.collection.mutable import scala.concurrent.duration._ @@ -39,12 +38,13 @@ class DeployableTest extends Specification { obj.OwnerGuid.contains(PlanetSideGUID(10)) mustEqual true } - "know its owner by GUID" in { -// val obj = new ExplosiveDeployable(GlobalDefinitions.he_mine) -// obj.OwnerName.isEmpty mustEqual true -// obj.OwnerName = "TestCharacter" -// obj.OwnerName.contains("TestCharacter") mustEqual true - ko + "know its owner by name" in { + val obj = new ExplosiveDeployable(GlobalDefinitions.he_mine) + val owner = Player(Avatar(1, "TestCharacter", PlanetSideEmpire.TR, CharacterSex.Male, 1, CharacterVoice.Mute)) + owner.GUID = PlanetSideGUID(1) + owner.Spawn() + obj.AssignOwnership(owner) + obj.OwnerName.contains("TestCharacter") mustEqual true } "know its faction allegiance" in { @@ -451,15 +451,14 @@ class ExplosiveDeployableJammerExplodeTest extends ActorTest { h_mine.Actor ! Vitality.Damage(applyDamageToH) val eventMsgs = eventsProbe.receiveN(4, 200 milliseconds) val p1Msgs = player1Probe.receiveN(1, 200 milliseconds) - val p2Msgs = player2Probe.receiveN(1, 200 milliseconds) eventMsgs.head match { case Zone.HotSpot.Conflict(target, attacker, _) - if (target.Definition eq h_mine.Definition) && (attacker eq pSource) => ; + if (target.Definition eq h_mine.Definition) && (attacker eq pSource) => () case _ => assert(false, "") } eventMsgs(1) match { case LocalServiceMessage("test", LocalAction.Detonate(PlanetSideGUID(2), target)) - if target eq h_mine => ; + if target eq h_mine => () case _ => assert(false, "") } eventMsgs(2) match { @@ -477,17 +476,13 @@ class ExplosiveDeployableJammerExplodeTest extends ActorTest { case AvatarServiceMessage( "test", AvatarAction.Destroy(PlanetSideGUID(2), PlanetSideGUID(3), Service.defaultPlayerGUID, Vector3.Zero) - ) => ; + ) => () case _ => assert(false, "") } p1Msgs.head match { - case Vitality.Damage(_) => ; + case Vitality.Damage(_) => () case _ => assert(false, "") } - p2Msgs.head match { - case Player.LoseDeployable(_) => ; - case _ => assert(false, "") - } assert(h_mine.Destroyed) } } @@ -529,8 +524,7 @@ class ExplosiveDeployableDestructionTest extends ActorTest { guid.register(player2, 4) guid.register(weapon, 5) h_mine.Zone = zone - h_mine.OwnerGuid = player2 - //h_mine.OwnerName = player2.Name + h_mine.AssignOwnership(player2) h_mine.Faction = PlanetSideEmpire.NC h_mine.Actor = system.actorOf(Props(classOf[MineDeployableControl], h_mine), "h-mine-control") @@ -748,6 +742,7 @@ class TurretControlBetrayalMountTest extends ActorTest { val obj = new TurretDeployable( new TurretDeployableDefinition(685) { MountPoints += 1 -> MountInfo(0, Vector3.Zero) + Seats += 0 -> new SeatDefinition() FactionLocked = false } //required (defaults to true) ) { diff --git a/src/test/scala/objects/FacilityTurretTest.scala b/src/test/scala/objects/FacilityTurretTest.scala index 359bafa7a..b1228f943 100644 --- a/src/test/scala/objects/FacilityTurretTest.scala +++ b/src/test/scala/objects/FacilityTurretTest.scala @@ -121,7 +121,7 @@ class FacilityTurretControl2Test extends ActorTest { assert(obj.Definition.FactionLocked) obj.Actor ! Mountable.TryMount(player, 1) - val reply = receiveOne(300 milliseconds) + val reply = receiveOne(1000 milliseconds) reply match { case msg: Mountable.MountMessages => assert(msg.response.isInstanceOf[Mountable.CanMount]) diff --git a/src/test/scala/objects/InteractsWithZoneEnvironmentTest.scala b/src/test/scala/objects/InteractsWithZoneEnvironmentTest.scala index 2e72d7776..23d2765e1 100644 --- a/src/test/scala/objects/InteractsWithZoneEnvironmentTest.scala +++ b/src/test/scala/objects/InteractsWithZoneEnvironmentTest.scala @@ -1,26 +1,32 @@ package objects +import akka.actor.ActorRef import akka.testkit.TestProbe import base.ActorTest -import net.psforever.objects.definition.ObjectDefinition +import net.psforever.objects.Player +import net.psforever.objects.avatar.Avatar import net.psforever.objects.serverobject.PlanetSideServerObject +import net.psforever.objects.serverobject.aura.{Aura, AuraEffectBehavior} import net.psforever.objects.serverobject.environment._ -import net.psforever.objects.serverobject.environment.interaction.{EscapeFromEnvironment, InteractWithEnvironment, InteractingWithEnvironment} -import net.psforever.objects.vital.{Vitality, VitalityDefinition} +import net.psforever.objects.serverobject.environment.interaction.RespondsToZoneEnvironment +import net.psforever.objects.vital.Vitality import net.psforever.objects.zones.{InteractsWithZone, Zone, ZoneMap} -import net.psforever.types.{PlanetSideEmpire, Vector3} +import net.psforever.types.{CharacterSex, CharacterVoice, PlanetSideEmpire, PlanetSideGUID, Vector3} import scala.concurrent.duration._ class InteractsWithZoneEnvironmentTest extends ActorTest { - val pool1 = Pool(EnvironmentAttribute.Water, DeepSquare(-1, 10, 10, 0, 0)) - val pool2 = Pool(EnvironmentAttribute.Water, DeepSquare(-1, 10, 15, 5, 10)) - val pool3 = Pool(EnvironmentAttribute.Lava, DeepSquare(-1, 15, 10, 10, 5)) - val testZone = { + val pool1: Pool = Pool(EnvironmentAttribute.Water, DeepSquare(5, 10, 10, 0, 0)) + val pool2: Pool = Pool(EnvironmentAttribute.Water, DeepSquare(5, 10, 15, 5, 10)) + val pool3: Pool = Pool(EnvironmentAttribute.Lava, DeepSquare(5, 15, 10, 10, 5)) + val zoneEvents: TestProbe = TestProbe() + val testZone: Zone = { val testMap = new ZoneMap(name = "test-map") { environment = List(pool1, pool2, pool3) } - new Zone("test-zone", testMap, zoneNumber = 0) + new Zone("test-zone", testMap, zoneNumber = 0) { + override def AvatarEvents: ActorRef = zoneEvents.ref + } } testZone.blockMap.addTo(pool1) testZone.blockMap.addTo(pool2) @@ -32,8 +38,8 @@ class InteractsWithZoneEnvironmentTest extends ActorTest { val obj = InteractsWithZoneEnvironmentTest.testObject() obj.Zone = testZone obj.Actor = testProbe.ref + obj.Position = Vector3(0,0,50) - assert(obj.Position == Vector3.Zero) obj.zoneInteractions() testProbe.expectNoMessage(max = 500 milliseconds) } @@ -44,12 +50,12 @@ class InteractsWithZoneEnvironmentTest extends ActorTest { obj.Zone = testZone obj.Actor = testProbe.ref - obj.Position = Vector3(1,1,-2) + obj.Position = Vector3(1,1,2) obj.zoneInteractions() val msg = testProbe.receiveOne(max = 250 milliseconds) assert( msg match { - case InteractingWithEnvironment(b, _) => (b eq pool1) + case RespondsToZoneEnvironment.Timer(EnvironmentAttribute.Water, _, _, _) => true case _ => false } ) @@ -57,28 +63,28 @@ class InteractsWithZoneEnvironmentTest extends ActorTest { testProbe.expectNoMessage(max = 500 milliseconds) } - "acknowledge ceasation of interaction when moved out of a previous occupied the critical region (just once)" in { + "acknowledge cessation of interaction when moved out of a previous occupied the critical region (just once)" in { val testProbe = TestProbe() val obj = InteractsWithZoneEnvironmentTest.testObject() obj.Zone = testZone obj.Actor = testProbe.ref - obj.Position = Vector3(1,1,-2) + obj.Position = Vector3(1,1,2) obj.zoneInteractions() val msg1 = testProbe.receiveOne(max = 250 milliseconds) assert( msg1 match { - case InteractingWithEnvironment(b, _) => (b eq pool1) + case RespondsToZoneEnvironment.Timer(EnvironmentAttribute.Water, _, _, _) => true case _ => false } ) - obj.Position = Vector3(1,1,1) + obj.Position = Vector3(1,1,50) obj.zoneInteractions() val msg2 = testProbe.receiveOne(max = 250 milliseconds) assert( msg2 match { - case EscapeFromEnvironment(b, _) => (b eq pool1) + case RespondsToZoneEnvironment.Timer(EnvironmentAttribute.Water, _, _, _) => true case _ => false } ) @@ -92,26 +98,25 @@ class InteractsWithZoneEnvironmentTest extends ActorTest { obj.Zone = testZone obj.Actor = testProbe.ref - obj.Position = Vector3(7,7,-2) + obj.Position = Vector3(7,7,2) obj.zoneInteractions() val msg1 = testProbe.receiveOne(max = 250 milliseconds) assert( msg1 match { - case InteractingWithEnvironment(b, _) => (b eq pool1) + case RespondsToZoneEnvironment.Timer(EnvironmentAttribute.Water, _, _, _) => true case _ => false } ) - obj.Position = Vector3(12,7,-2) + obj.Position = Vector3(12,7,2) obj.zoneInteractions() val msg2 = testProbe.receiveOne(max = 250 milliseconds) assert( msg2 match { - case InteractingWithEnvironment(b, _) => (b eq pool1) + case RespondsToZoneEnvironment.Timer(EnvironmentAttribute.Water, _, _, _) => true case _ => false } ) - assert(pool1.attribute == pool2.attribute) } "transition between two different critical regions when the regions have different attributes" in { @@ -120,32 +125,37 @@ class InteractsWithZoneEnvironmentTest extends ActorTest { obj.Zone = testZone obj.Actor = testProbe.ref - obj.Position = Vector3(7,7,-2) + obj.Position = Vector3(7,7,2) obj.zoneInteractions() val msg1 = testProbe.receiveOne(max = 250 milliseconds) assert( msg1 match { - case InteractingWithEnvironment(b, _) => (b eq pool1) + case RespondsToZoneEnvironment.Timer(EnvironmentAttribute.Water, _, _, _) => true case _ => false } ) - obj.Position = Vector3(7,12,-2) + obj.Position = Vector3(7,12,2) obj.zoneInteractions() - val msgs = testProbe.receiveN(2, max = 250 milliseconds) + val msgs = testProbe.receiveN(3, max = 250 milliseconds) assert( msgs.head match { - case EscapeFromEnvironment(b, _) => (b eq pool1) + case Vitality.Damage(_) => true case _ => false } ) assert( msgs(1) match { - case InteractingWithEnvironment(b, _) => (b eq pool1) + case AuraEffectBehavior.StartEffect(Aura.Fire, _) => true + case _ => false + } + ) + assert( + msgs(2) match { + case RespondsToZoneEnvironment.Timer(EnvironmentAttribute.Lava, _, _, _) => true case _ => false } ) - assert(pool1.attribute != pool3.attribute) } } @@ -155,22 +165,24 @@ class InteractsWithZoneEnvironmentTest extends ActorTest { obj.Zone = testZone obj.Actor = testProbe.ref - obj.Position = Vector3(1,1,-2) + obj.Position = Vector3(1,1,2) obj.zoneInteractions() val msg1 = testProbe.receiveOne(max = 250 milliseconds) assert( msg1 match { - case InteractingWithEnvironment(b, _) => (b eq pool1) + case RespondsToZoneEnvironment.Timer(EnvironmentAttribute.Water, _, _, _) => true case _ => false } ) obj.allowInteraction = false val msg2 = testProbe.receiveOne(max = 250 milliseconds) - msg2 match { - case EscapeFromEnvironment(b, _) => (b eq pool1) - case _ => assert( false) - } + assert( + msg2 match { + case RespondsToZoneEnvironment.Timer(EnvironmentAttribute.Water, _, _, _) => true + case _ => false + } + ) obj.zoneInteractions() testProbe.expectNoMessage(max = 500 milliseconds) } @@ -182,7 +194,7 @@ class InteractsWithZoneEnvironmentTest extends ActorTest { obj.Actor = testProbe.ref obj.allowInteraction = false - obj.Position = Vector3(1,1,-2) + obj.Position = Vector3(1,1,2) obj.zoneInteractions() testProbe.expectNoMessage(max = 500 milliseconds) @@ -190,7 +202,7 @@ class InteractsWithZoneEnvironmentTest extends ActorTest { val msg1 = testProbe.receiveOne(max = 250 milliseconds) assert( msg1 match { - case InteractingWithEnvironment(b, _) => (b eq pool1) + case RespondsToZoneEnvironment.Timer(EnvironmentAttribute.Water, _, _, _) => true case _ => false } ) @@ -199,15 +211,9 @@ class InteractsWithZoneEnvironmentTest extends ActorTest { object InteractsWithZoneEnvironmentTest { def testObject(): PlanetSideServerObject with InteractsWithZone = { - new PlanetSideServerObject - with InteractsWithZone { - interaction(new InteractWithEnvironment()) - def Faction: PlanetSideEmpire.Value = PlanetSideEmpire.VS - def DamageModel = null - def Definition: ObjectDefinition with VitalityDefinition = new ObjectDefinition(objectId = 0) with VitalityDefinition { - Damageable = true - DrownAtMaxDepth = true - } - } + val p = new Player(Avatar(1, "test", PlanetSideEmpire.VS, CharacterSex.Male, 1, CharacterVoice.Mute)) + p.GUID = PlanetSideGUID(1) + p.Spawn() + p } } diff --git a/src/test/scala/objects/PlayerControlTest.scala b/src/test/scala/objects/PlayerControlTest.scala index 6bac58879..c72e404e6 100644 --- a/src/test/scala/objects/PlayerControlTest.scala +++ b/src/test/scala/objects/PlayerControlTest.scala @@ -12,7 +12,7 @@ import net.psforever.objects.avatar.{Avatar, Certification, PlayerControl} import net.psforever.objects.ballistics._ import net.psforever.objects.guid.NumberPoolHub import net.psforever.objects.guid.source.MaxNumberSource -import net.psforever.objects.vital.Vitality +import net.psforever.objects.vital.{SpawningActivity, Vitality} import net.psforever.objects.zones.{Zone, ZoneMap} import net.psforever.objects._ import net.psforever.objects.serverobject.CommonMessages @@ -948,7 +948,7 @@ class PlayerControlInteractWithLavaTest extends ActorTest { } ) assert(player1.Health > 0) //still alive? - probe.receiveOne(65 seconds) //wait until player1's implants deinitialize + probe.receiveOne(65 seconds) assert(player1.Health == 0) //ded } } @@ -959,7 +959,7 @@ class PlayerControlInteractWithDeathTest extends ActorTest { Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=1 val avatarProbe = TestProbe() val guid = new NumberPoolHub(new MaxNumberSource(15)) - val pool = Pool(EnvironmentAttribute.Death, DeepSquare(-1, 10, 10, 0, 0)) + val pool = Pool(EnvironmentAttribute.Death, DeepSquare(10, 10, 10, 0, 0)) val zone = new Zone( id = "test-map", new ZoneMap(name = "test-map") { @@ -973,24 +973,23 @@ class PlayerControlInteractWithDeathTest extends ActorTest { override def AvatarEvents = avatarProbe.ref override def Activity = TestProbe().ref } - zone.blockMap.addTo(player1) - zone.blockMap.addTo(pool) + guid.register(player1, 1) + guid.register(player1.avatar.locker, 5) player1.Zone = zone player1.Spawn() - guid.register(player1.avatar.locker, 5) + player1.Position = Vector3(5,5,3) //right in the pool + zone.blockMap.addTo(player1) + zone.blockMap.addTo(pool) val (probe, avatarActor) = PlayerControlTest.DummyAvatar(system) player1.Actor = system.actorOf(Props(classOf[PlayerControl], player1, avatarActor), "player1-control") - - guid.register(player1, 1) + player1.LogActivity(SpawningActivity(PlayerSource(player1), 0, None)) "PlayerControl" should { "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 + probe.expectNoMessage(5.seconds) player1.zoneInteractions() //trigger - - probe.receiveOne(250 milliseconds) //wait until oplayer1's implants deinitialize assert(player1.Health == 0) //ded } } diff --git a/src/test/scala/objects/VehicleControlTest.scala b/src/test/scala/objects/VehicleControlTest.scala index 460618e7f..708d4c059 100644 --- a/src/test/scala/objects/VehicleControlTest.scala +++ b/src/test/scala/objects/VehicleControlTest.scala @@ -14,7 +14,7 @@ import net.psforever.objects.guid.NumberPoolHub import net.psforever.objects.guid.source.MaxNumberSource import net.psforever.objects.serverobject.CommonMessages import net.psforever.objects.serverobject.environment._ -import net.psforever.objects.serverobject.environment.interaction.{EscapeFromEnvironment, InteractingWithEnvironment} +import net.psforever.objects.serverobject.environment.interaction.{EscapeFromEnvironment, InteractingWithEnvironment, RespondsToZoneEnvironment} import net.psforever.objects.serverobject.environment.interaction.common.Watery.OxygenStateTarget import net.psforever.objects.serverobject.mount.Mountable import net.psforever.objects.vehicles.VehicleLockState @@ -634,9 +634,10 @@ class VehicleControlInteractWithWaterTest extends ActorTest { val player1 = Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=1 val avatarProbe = TestProbe() + val playerProbe = TestProbe() val vehicleProbe = TestProbe() val guid = new NumberPoolHub(new MaxNumberSource(15)) - val pool = Pool(EnvironmentAttribute.Water, DeepSquare(-1, 10, 10, 0, 0)) + val pool = Pool(EnvironmentAttribute.Water, DeepSquare(10, 10, 10, 0, 0)) val zone = new Zone( id = "test-zone", new ZoneMap(name = "test-map") { @@ -649,7 +650,7 @@ class VehicleControlInteractWithWaterTest extends ActorTest { override def LivePlayers = List(player1) override def Vehicles = List(vehicle) override def AvatarEvents = avatarProbe.ref - override def VehicleEvents = vehicleProbe.ref + override def VehicleEvents = avatarProbe.ref this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command] } @@ -666,38 +667,24 @@ class VehicleControlInteractWithWaterTest extends ActorTest { vehicle.Seats(0).mount(player1) player1.VehicleSeated = vehicle.GUID val (probe, avatarActor) = PlayerControlTest.DummyAvatar(system) - player1.Actor = system.actorOf(Props(classOf[PlayerControl], player1, avatarActor), "player1-control") - vehicle.Actor = system.actorOf(Props(classOf[VehicleControl], vehicle), "vehicle-control") + player1.Actor = playerProbe.ref + vehicle.Actor = vehicleProbe.ref "VehicleControl" should { "causes disability when the vehicle drives too deep in water" in { - vehicle.Position = Vector3(5,5,-3) //right in the pool + vehicle.Position = Vector3(5,5,3) //right in the pool vehicle.zoneInteractions() //trigger - val msg_drown = avatarProbe.receiveOne(250 milliseconds) - assert( - msg_drown match { - case AvatarServiceMessage( - "TestCharacter1", - AvatarAction.OxygenState( - OxygenStateTarget(PlanetSideGUID(1), _, OxygenState.Suffocation, 100f), - Some(OxygenStateTarget(PlanetSideGUID(2), _, OxygenState.Suffocation, 100f)) - ) - ) => true - case _ => false - } - ) - //player will die in 60s - //vehicle will disable in 5s; driver will be kicked - 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 + val msg_drown = playerProbe.receiveOne(250 milliseconds) + assert(msg_drown match { + case InteractingWithEnvironment(body, _) => body eq pool + case _ => false + }) + val msg_disable = vehicleProbe.receiveOne(10 seconds) + assert(msg_disable match { + case RespondsToZoneEnvironment.Timer(EnvironmentAttribute.Water, _, _, VehicleControl.Disable(true)) => true + case _ => false + }) } } }