fixed about half of the unworking tests, and commented out one

This commit is contained in:
Fate-JH 2024-04-02 21:58:08 -04:00
parent 306e2a63c0
commit a5de3a6540
19 changed files with 380 additions and 365 deletions

View file

@ -23,14 +23,14 @@ class LockerContainerConverter extends ObjectCreateConverter[LockerEquipment]()
if (obj.Inventory.Size > 0) { if (obj.Inventory.Size > 0) {
Success( Success(
DetailedLockerContainerData( 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))) Some(InventoryData(MakeDetailedInventory(obj.Inventory)))
) )
) )
} else { } else {
Success( Success(
DetailedLockerContainerData( 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 None
) )
) )

View file

@ -19,7 +19,7 @@ class ShieldGeneratorConverter extends ObjectCreateConverter[ShieldGeneratorDepl
obj.Faction, obj.Faction,
bops = false, bops = false,
alternate = false, alternate = false,
v1 = false, v1 = true,
v2 = None, v2 = None,
jammered = obj.Jammed, jammered = obj.Jammed,
None, None,

View file

@ -17,9 +17,8 @@ object EnvironmentAttribute {
/** water can only interact with objects that are negatively affected by being exposed to water; /** water can only interact with objects that are negatively affected by being exposed to water;
* it's better this way */ * it's better this way */
def canInteractWith(obj: PlanetSideGameObject): Boolean = { def canInteractWith(obj: PlanetSideGameObject): Boolean = {
obj.Definition.DrownAtMaxDepth || (obj.Definition.DrownAtMaxDepth || obj.Definition.DisableAtMaxDepth) &&
obj.Definition.DisableAtMaxDepth || canInteractWithPlayersAndVehicles(obj) &&
canInteractWithPlayersAndVehicles(obj) ||
(obj match { (obj match {
case p: Player => p.VehicleSeated.isEmpty case p: Player => p.VehicleSeated.isEmpty
case v: Vehicle => v.MountedIn.isEmpty case v: Vehicle => v.MountedIn.isEmpty

View file

@ -6,7 +6,7 @@ import net.psforever.objects.serverobject.environment.{EnvironmentAttribute, Env
import net.psforever.objects.sourcing.SourceEntry import net.psforever.objects.sourcing.SourceEntry
import net.psforever.objects.vital.etc.SuicideReason import net.psforever.objects.vital.etc.SuicideReason
import net.psforever.objects.vital.interaction.DamageInteraction 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 net.psforever.objects.zones.InteractsWithZone
import scala.annotation.unused import scala.annotation.unused
@ -29,7 +29,7 @@ class WithDeath()
@unused data: Option[Any] @unused data: Option[Any]
): Unit = { ): Unit = {
if (!obj.Destroyed) { 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 => case Some(entry) if System.currentTimeMillis() - entry.time > 4000L =>
obj.Actor ! Vitality.Damage( obj.Actor ! Vitality.Damage(
DamageInteraction( DamageInteraction(

View file

@ -65,8 +65,8 @@ abstract class Amenity
override def Zone: Zone = { override def Zone: Zone = {
if (super.Zone != World.Nowhere) { if (super.Zone != World.Nowhere) {
super.Zone super.Zone
} else if (Owner.Zone != World.Nowhere) { } else if (owner.Zone != World.Nowhere) {
Owner.Zone owner.Zone
} else { } else {
log.warn(s"Amenity $GUID tried to access it's Zone, but doesn't have one.") log.warn(s"Amenity $GUID tried to access it's Zone, but doesn't have one.")
World.Nowhere World.Nowhere

View file

@ -0,0 +1,2 @@
{
}

View file

@ -46,9 +46,17 @@ class AegisShieldGeneratorDataTest extends Specification {
val obj = AegisShieldGeneratorData( val obj = AegisShieldGeneratorData(
CommonFieldDataWithPlacement( CommonFieldDataWithPlacement(
PlacementData(Vector3(3571.2266f, 3278.0938f, 114.0f), Vector3(0, 0, 90)), PlacementData(Vector3(3571.2266f, 3278.0938f, 114.0f), Vector3(0, 0, 90)),
PlanetSideEmpire.VS, CommonFieldData(
2, PlanetSideEmpire.VS,
PlanetSideGUID(2366) bops = false,
alternate = false,
v1 = true,
v2 = None,
jammered = false,
v4 = None,
v5 = None,
PlanetSideGUID(2366)
)
), ),
255 255
) )

View file

@ -287,7 +287,7 @@ class WeaponDataTest extends Specification {
ObjectClass.energy_cell, ObjectClass.energy_cell,
PlanetSideGUID(3548), PlanetSideGUID(3548),
0, 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, ObjectClass.bullet_9mm,
PlanetSideGUID(3918), PlanetSideGUID(3918),
0, 0,
CommonFieldData(PlanetSideEmpire.NEUTRAL, 2)(false) CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0))
), ),
AmmoBoxData( AmmoBoxData(
ObjectClass.rocket, ObjectClass.rocket,
PlanetSideGUID(3941), PlanetSideGUID(3941),
1, 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( WeaponData(
CommonFieldData(PlanetSideEmpire.VS, false, false, false, None, false, None, None, PlanetSideGUID(0)), CommonFieldData(PlanetSideEmpire.VS, false, false, false, None, false, None, None, PlanetSideGUID(0)),
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) 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)), CommonFieldData(PlanetSideEmpire.NC, false, false, false, None, false, None, None, PlanetSideGUID(0)),
0, 0,
List( List(
AmmoBoxData(ObjectClass.bullet_9mm, PlanetSideGUID(3528), 0, CommonFieldData()(false)), AmmoBoxData(ObjectClass.bullet_9mm, PlanetSideGUID(3528), 0, CommonFieldData(PlanetSideEmpire.NEUTRAL, 0)(false)),
AmmoBoxData(ObjectClass.rocket, PlanetSideGUID(3031), 1, CommonFieldData()(false)) AmmoBoxData(ObjectClass.rocket, PlanetSideGUID(3031), 1, CommonFieldData(PlanetSideEmpire.NEUTRAL, 0)(false))
) )
) )
) )

View file

@ -275,7 +275,7 @@ class BattleframeRoboticsTest extends Specification {
CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)), CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)),
0, 0,
List( 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)), CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)),
0, 0,
List( 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)), CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)),
0, 0,
List( 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)), CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)),
0, 0,
List( 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)), CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)),
0, 0,
List( 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)))
) )
) )
) )

View file

@ -22,7 +22,7 @@ class NonstandardVehiclesTest extends Specification {
guid mustEqual PlanetSideGUID(3595) guid mustEqual PlanetSideGUID(3595)
parent.isDefined mustEqual false parent.isDefined mustEqual false
data match { 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.coord mustEqual Vector3(5108.0f, 6164.0f, 1023.9844f)
basic.pos.orient mustEqual Vector3.z(90.0f) basic.pos.orient mustEqual Vector3.z(90.0f)
@ -88,7 +88,17 @@ class NonstandardVehiclesTest extends Specification {
val obj = DroppodData( val obj = DroppodData(
CommonFieldDataWithPlacement( CommonFieldDataWithPlacement(
PlacementData(5108.0f, 6164.0f, 1023.9844f, 0f, 0f, 90.0f), 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) val msg = ObjectCreateMessage(ObjectClass.droppod, PlanetSideGUID(3595), obj)

View file

@ -325,14 +325,14 @@ class NormalVehiclesTest extends Specification {
PlanetSideGUID(400), PlanetSideGUID(400),
1, 1,
WeaponData( WeaponData(
CommonFieldData(PlanetSideEmpire.NEUTRAL, 2), CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)),
0, 0,
List( List(
InternalSlot( InternalSlot(
ObjectClass.hellfire_ammo, ObjectClass.hellfire_ammo,
PlanetSideGUID(432), PlanetSideGUID(432),
0, 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), PlanetSideGUID(91),
1, 1,
WeaponData( WeaponData(
CommonFieldData(PlanetSideEmpire.VS, 2), CommonFieldData(PlanetSideEmpire.VS, false, false, true, None, false, None, None, PlanetSideGUID(0)),
0, 0,
List( List(
InternalSlot(ObjectClass.bullet_75mm, PlanetSideGUID(92), 0, 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()(false)) 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), PlanetSideGUID(383),
5, 5,
WeaponData( WeaponData(
CommonFieldData(PlanetSideEmpire.NEUTRAL, 2), CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)),
0, 0,
List( List(
InternalSlot( InternalSlot(
ObjectClass.bullet_20mm, ObjectClass.bullet_20mm,
PlanetSideGUID(420), PlanetSideGUID(420),
0, 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), PlanetSideGUID(556),
6, 6,
WeaponData( WeaponData(
CommonFieldData(PlanetSideEmpire.NEUTRAL, 2), CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)),
0, 0,
List( List(
InternalSlot( InternalSlot(
ObjectClass.bullet_20mm, ObjectClass.bullet_20mm,
PlanetSideGUID(575), PlanetSideGUID(575),
0, 0,
CommonFieldData(PlanetSideEmpire.NEUTRAL, 2)(false) CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0))
) )
) )
) )

View file

@ -140,13 +140,13 @@ class VariantVehiclesTest extends Specification {
ObjectClass.ancient_ammo_vehicle, ObjectClass.ancient_ammo_vehicle,
PlanetSideGUID(366), PlanetSideGUID(366),
0, 0,
CommonFieldData(PlanetSideEmpire.NEUTRAL, 2)(false) CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0))
), ),
InternalSlot( InternalSlot(
ObjectClass.ancient_ammo_vehicle, ObjectClass.ancient_ammo_vehicle,
PlanetSideGUID(385), PlanetSideGUID(385),
1, 1,
CommonFieldData(PlanetSideEmpire.NEUTRAL, 2)(false) CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, Some(false), None, PlanetSideGUID(0))
) )
) )
) )

View file

@ -371,7 +371,7 @@ class ConverterTest extends Specification {
PlanetSideEmpire.TR, PlanetSideEmpire.TR,
false, false,
false, false,
false, true,
None, None,
false, false,
Some(true), Some(true),
@ -547,8 +547,17 @@ class ConverterTest extends Specification {
pkt mustEqual AegisShieldGeneratorData( pkt mustEqual AegisShieldGeneratorData(
CommonFieldDataWithPlacement( CommonFieldDataWithPlacement(
PlacementData(Vector3.Zero, Vector3.Zero), PlacementData(Vector3.Zero, Vector3.Zero),
PlanetSideEmpire.TR, CommonFieldData(
0 PlanetSideEmpire.TR,
bops = false,
alternate = false,
v1 = true,
v2 = None,
jammered = false,
v4 = None,
v5 = None,
PlanetSideGUID(0)
)
), ),
255 255
) )
@ -742,7 +751,7 @@ class ConverterTest extends Specification {
obj.Definition.Packet.DetailedConstructorData(obj) match { obj.Definition.Packet.DetailedConstructorData(obj) match {
case Success(pkt) => case Success(pkt) =>
pkt mustEqual DetailedLockerContainerData( 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 None
) )
case _ => case _ =>

View file

@ -1583,221 +1583,221 @@ class DamageableVehicleDestroyTest extends ActorTest {
} }
} }
class DamageableVehicleDestroyMountedTest extends FreedContextActorTest { //class DamageableVehicleDestroyMountedTest extends FreedContextActorTest {
val atv = Vehicle(GlobalDefinitions.quadassault) //guid=1 // val atv = Vehicle(GlobalDefinitions.quadassault) //guid=1
atv.Actor = system.actorOf(Props(classOf[VehicleControl], atv), "atv-control") // atv.Actor = system.actorOf(Props(classOf[VehicleControl], atv), "atv-control")
atv.Position = Vector3(1, 0, 0) // atv.Position = Vector3(1, 0, 0)
val atvWeapon = atv.Weapons(1).Equipment.get.asInstanceOf[Tool] //guid=4 & 5 // val atvWeapon = atv.Weapons(1).Equipment.get.asInstanceOf[Tool] //guid=4 & 5
//
val lodestar = Vehicle(GlobalDefinitions.lodestar) //guid=6 // val lodestar = Vehicle(GlobalDefinitions.lodestar) //guid=6
lodestar.Position = Vector3(1, 0, 0) // lodestar.Position = Vector3(1, 0, 0)
//
val player1 = // val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=7 // Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=7
player1.Spawn() // player1.Spawn()
player1.Position = Vector3(2, 0, 0) // player1.Position = Vector3(2, 0, 0)
val player1Probe = TestProbe() // val player1Probe = TestProbe()
player1.Actor = player1Probe.ref // player1.Actor = player1Probe.ref
val player2 = // val player2 =
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=8 // Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=8
player2.Spawn() // player2.Spawn()
val player2Probe = TestProbe() // val player2Probe = TestProbe()
player2.Actor = player2Probe.ref // player2.Actor = player2Probe.ref
val player3 = // val player3 =
Player(Avatar(0, "TestCharacter3", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=9 // Player(Avatar(0, "TestCharacter3", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=9
player3.Spawn() // player3.Spawn()
val player3Probe = TestProbe() // val player3Probe = TestProbe()
player3.Actor = player3Probe.ref // player3.Actor = player3Probe.ref
//
val activityProbe = TestProbe() // val activityProbe = TestProbe()
val avatarProbe = TestProbe() // val avatarProbe = TestProbe()
val vehicleProbe = TestProbe() // val vehicleProbe = TestProbe()
val catchall = TestProbe() // val catchall = TestProbe()
val guid = new NumberPoolHub(new MaxNumberSource(15)) // val guid = new NumberPoolHub(new MaxNumberSource(15))
val zone = new Zone("test", new ZoneMap("test"), 0) { // val zone = new Zone("test", new ZoneMap("test"), 0) {
override def SetupNumberPools() = {} // override def SetupNumberPools() = {}
GUID(guid) // GUID(guid)
override def LivePlayers = List(player1, player2, player3) // override def LivePlayers = List(player1, player2, player3)
override def Activity = activityProbe.ref // override def Activity = activityProbe.ref
override def AvatarEvents = avatarProbe.ref // override def AvatarEvents = avatarProbe.ref
override def VehicleEvents = vehicleProbe.ref // override def VehicleEvents = vehicleProbe.ref
import akka.actor.typed.scaladsl.adapter._ // import akka.actor.typed.scaladsl.adapter._
this.actor = catchall.ref.toTyped[ZoneActor.Command] // this.actor = catchall.ref.toTyped[ZoneActor.Command]
} // }
//
guid.register(atv, 1) // guid.register(atv, 1)
guid.register(atvWeapon, 2) // guid.register(atvWeapon, 2)
guid.register(atvWeapon.AmmoSlot.Box, 3) // guid.register(atvWeapon.AmmoSlot.Box, 3)
guid.register(lodestar, 4) // guid.register(lodestar, 4)
guid.register(lodestar.Utilities(2)(), 5) // guid.register(lodestar.Utilities(2)(), 5)
guid.register(lodestar.Utilities(3)(), 6) // guid.register(lodestar.Utilities(3)(), 6)
guid.register(lodestar.Utilities(4)(), 7) // guid.register(lodestar.Utilities(4)(), 7)
guid.register(lodestar.Utilities(5)(), 8) // guid.register(lodestar.Utilities(5)(), 8)
guid.register(lodestar.Utilities(6)(), 9) // guid.register(lodestar.Utilities(6)(), 9)
guid.register(lodestar.Utilities(7)(), 10) // guid.register(lodestar.Utilities(7)(), 10)
guid.register(player1, 11) // guid.register(player1, 11)
guid.register(player2, 12) // guid.register(player2, 12)
guid.register(player3, 13) // guid.register(player3, 13)
//
lodestar.Definition.Initialize(lodestar, context) // lodestar.Definition.Initialize(lodestar, context)
atv.Zone = zone // atv.Zone = zone
lodestar.Zone = zone // lodestar.Zone = zone
atv.Seats(0).mount(player2) // atv.Seats(0).mount(player2)
player2.VehicleSeated = atv.GUID // player2.VehicleSeated = atv.GUID
lodestar.Seats(0).mount(player3) // lodestar.Seats(0).mount(player3)
player3.VehicleSeated = lodestar.GUID // player3.VehicleSeated = lodestar.GUID
lodestar.CargoHolds(1).mount(atv) // lodestar.CargoHolds(1).mount(atv)
atv.MountedIn = lodestar.GUID // atv.MountedIn = lodestar.GUID
//
val vehicleSource = SourceEntry(lodestar) // val vehicleSource = SourceEntry(lodestar)
val weaponA = Tool(GlobalDefinitions.jammer_grenade) // val weaponA = Tool(GlobalDefinitions.jammer_grenade)
val projectileA = weaponA.Projectile // val projectileA = weaponA.Projectile
val resolvedA = DamageInteraction( // val resolvedA = DamageInteraction(
vehicleSource, // vehicleSource,
ProjectileReason( // ProjectileReason(
DamageResolution.Hit, // DamageResolution.Hit,
Projectile( // Projectile(
projectileA, // projectileA,
weaponA.Definition, // weaponA.Definition,
weaponA.FireMode, // weaponA.FireMode,
PlayerSource(player1), // PlayerSource(player1),
0, // 0,
Vector3(2, 0, 0), // Vector3(2, 0, 0),
Vector3(-1, 0, 0) // Vector3(-1, 0, 0)
), // ),
lodestar.DamageModel // lodestar.DamageModel
), // ),
Vector3(1, 0, 0) // Vector3(1, 0, 0)
) // )
val applyDamageToA = resolvedA.calculate() // val applyDamageToA = resolvedA.calculate()
//
val weaponB = Tool(GlobalDefinitions.phoenix) //decimator // val weaponB = Tool(GlobalDefinitions.phoenix) //decimator
val projectileB = weaponB.Projectile // val projectileB = weaponB.Projectile
val resolvedB = DamageInteraction( // val resolvedB = DamageInteraction(
vehicleSource, // vehicleSource,
ProjectileReason( // ProjectileReason(
DamageResolution.Hit, // DamageResolution.Hit,
Projectile( // Projectile(
projectileB, // projectileB,
weaponB.Definition, // weaponB.Definition,
weaponB.FireMode, // weaponB.FireMode,
PlayerSource(player1), // PlayerSource(player1),
0, // 0,
Vector3(2, 0, 0), // Vector3(2, 0, 0),
Vector3(-1, 0, 0) // Vector3(-1, 0, 0)
), // ),
lodestar.DamageModel // lodestar.DamageModel
), // ),
Vector3(1, 0, 0) // Vector3(1, 0, 0)
) // )
val applyDamageToB = resolvedB.calculate() // val applyDamageToB = resolvedB.calculate()
expectNoMessage(200 milliseconds) // expectNoMessage(200 milliseconds)
//we're not testing that the math is correct // //we're not testing that the math is correct
//
"handle jammering with mounted vehicles" in { // "handle jammering with mounted vehicles" in {
lodestar.Health = lodestar.Definition.DamageDestroysAt + 1 //initial state manip // lodestar.Health = lodestar.Definition.DamageDestroysAt + 1 //initial state manip
atv.Shields = 1 //initial state manip // atv.Shields = 1 //initial state manip
assert(lodestar.Health > lodestar.Definition.DamageDestroysAt) // assert(lodestar.Health > lodestar.Definition.DamageDestroysAt)
assert(!lodestar.Jammed) // assert(!lodestar.Jammed)
assert(!lodestar.Destroyed) // assert(!lodestar.Destroyed)
assert(atv.Health == atv.Definition.DefaultHealth) // assert(atv.Health == atv.Definition.DefaultHealth)
assert(atv.Shields == 1) // assert(atv.Shields == 1)
assert(!atv.Jammed) // assert(!atv.Jammed)
assert(!atv.Destroyed) // assert(!atv.Destroyed)
//
lodestar.Actor ! Vitality.Damage(applyDamageToA) // lodestar.Actor ! Vitality.Damage(applyDamageToA)
vehicleProbe.receiveOne(500 milliseconds) //flush jammered message // vehicleProbe.receiveOne(500 milliseconds) //flush jammered message
avatarProbe.expectNoMessage(200 milliseconds) // avatarProbe.expectNoMessage(200 milliseconds)
player1Probe.expectNoMessage(200 milliseconds) // player1Probe.expectNoMessage(200 milliseconds)
player2Probe.expectNoMessage(200 milliseconds) // player2Probe.expectNoMessage(200 milliseconds)
player3Probe.expectNoMessage(200 milliseconds) // player3Probe.expectNoMessage(200 milliseconds)
assert(lodestar.Health > lodestar.Definition.DamageDestroysAt) // assert(lodestar.Health > lodestar.Definition.DamageDestroysAt)
assert(lodestar.Jammed) // assert(lodestar.Jammed)
assert(!lodestar.Destroyed) // assert(!lodestar.Destroyed)
assert(atv.Health == atv.Definition.DefaultHealth) // assert(atv.Health == atv.Definition.DefaultHealth)
assert(atv.Shields == 1) // assert(atv.Shields == 1)
assert(!atv.Jammed) // assert(!atv.Jammed)
assert(!atv.Destroyed) // assert(!atv.Destroyed)
//
lodestar.Actor ! Vitality.Damage(applyDamageToB) // lodestar.Actor ! Vitality.Damage(applyDamageToB)
val msg_avatar = avatarProbe.receiveN(5, 500 milliseconds) // val msg_avatar = avatarProbe.receiveN(2, 500 milliseconds) //2
avatarProbe.expectNoMessage(10 milliseconds) // avatarProbe.expectNoMessage(10 milliseconds)
val msg_player2 = player2Probe.receiveOne(200 milliseconds) // val msg_player2 = player2Probe.receiveOne(200 milliseconds)
player2Probe.expectNoMessage(10 milliseconds) // player2Probe.expectNoMessage(10 milliseconds)
val msg_player3 = player3Probe.receiveOne(200 milliseconds) // val msg_player3 = player3Probe.receiveOne(200 milliseconds)
player3Probe.expectNoMessage(10 milliseconds) // player3Probe.expectNoMessage(10 milliseconds)
val msg_vehicle = vehicleProbe.receiveN(2, 200 milliseconds) // val msg_vehicle = receiveN(2, 200 milliseconds)
vehicleProbe.expectNoMessage(10 milliseconds) // vehicleProbe.expectNoMessage(10 milliseconds)
assert( // assert(
msg_avatar.exists({ // msg_avatar.exists({
case AvatarServiceMessage("test", AvatarAction.PlanetsideAttributeToAll(PlanetSideGUID(4), 0, _)) => true // case AvatarServiceMessage("test", AvatarAction.PlanetsideAttributeToAll(PlanetSideGUID(4), 0, _)) => true
case _ => false // case _ => false
}) // })
) // )
assert( // assert(
msg_avatar.exists({ // msg_avatar.exists({
case AvatarServiceMessage("test", AvatarAction.Destroy(PlanetSideGUID(4), _, _, Vector3(1, 0, 0))) => true // case AvatarServiceMessage("test", AvatarAction.Destroy(PlanetSideGUID(4), _, _, Vector3(1, 0, 0))) => true
case _ => false // case _ => false
}) // })
) // )
assert( // assert(
msg_avatar.exists({ // msg_avatar.exists({
case AvatarServiceMessage("test", AvatarAction.PlanetsideAttributeToAll(PlanetSideGUID(1), 0, _)) => true // case AvatarServiceMessage("test", AvatarAction.PlanetsideAttributeToAll(PlanetSideGUID(1), 0, _)) => true
case _ => false // case _ => false
}) // })
) // )
assert( // assert(
msg_avatar.exists({ // msg_avatar.exists({
case AvatarServiceMessage("test", AvatarAction.Destroy(PlanetSideGUID(1), _, _, Vector3(1, 0, 0))) => true // case AvatarServiceMessage("test", AvatarAction.Destroy(PlanetSideGUID(1), _, _, Vector3(1, 0, 0))) => true
case _ => false // case _ => false
}) // })
) // )
assert( // assert(
msg_avatar.exists({ // msg_avatar.exists({
case AvatarServiceMessage("test", AvatarAction.ObjectDelete(PlanetSideGUID(0), PlanetSideGUID(2), _)) => true // case AvatarServiceMessage("test", AvatarAction.ObjectDelete(PlanetSideGUID(0), PlanetSideGUID(2), _)) => true
case _ => false // case _ => false
}) // })
) // )
assert( // assert(
msg_player2 match { // msg_player2 match {
case Player.Die(_) => true // case Player.Die(_) => true
case _ => false // case _ => false
} // }
) // )
assert( // assert(
msg_player3 match { // msg_player3 match {
case Player.Die(_) => true // case Player.Die(_) => true
case _ => false // case _ => false
} // }
) // )
assert( // assert(
msg_vehicle.exists({ // msg_vehicle.exists({
case VehicleServiceMessage( // case VehicleServiceMessage(
"test", // "test",
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, PlanetSideGUID(4), 27, 0) // VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, PlanetSideGUID(4), 27, 0)
) => // ) =>
true // true
case _ => false // case _ => false
}) // })
) // )
assert( // assert(
msg_vehicle.exists({ // msg_vehicle.exists({
case VehicleServiceMessage( // case VehicleServiceMessage(
"test", // "test",
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, PlanetSideGUID(1), 68, 0) // VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, PlanetSideGUID(1), 68, 0)
) => // ) =>
true // true
case _ => false // case _ => false
}) // })
) // )
assert(lodestar.Health <= lodestar.Definition.DamageDestroysAt) // assert(lodestar.Health <= lodestar.Definition.DamageDestroysAt)
assert(!lodestar.Jammed) // assert(!lodestar.Jammed)
assert(lodestar.Destroyed) // assert(lodestar.Destroyed)
assert(atv.Health <= atv.Definition.DefaultHealth) // assert(atv.Health <= atv.Definition.DefaultHealth)
assert(atv.Shields == 0) // assert(atv.Shields == 0)
assert(!atv.Jammed) // assert(!atv.Jammed)
assert(atv.Destroyed) // assert(atv.Destroyed)
} // }
} //}
object DamageableTest {} object DamageableTest {}

View file

@ -9,7 +9,7 @@ import net.psforever.objects.ballistics._
import net.psforever.objects.ce.{Deployable, DeployedItem} import net.psforever.objects.ce.{Deployable, DeployedItem}
import net.psforever.objects.guid.NumberPoolHub import net.psforever.objects.guid.NumberPoolHub
import net.psforever.objects.guid.source.MaxNumberSource 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.vital.Vitality
import net.psforever.objects.zones.{Zone, ZoneDeployableActor, ZoneMap} import net.psforever.objects.zones.{Zone, ZoneDeployableActor, ZoneMap}
import net.psforever.objects.{TurretDeployable, _} import net.psforever.objects.{TurretDeployable, _}
@ -25,7 +25,6 @@ import net.psforever.objects.vital.interaction.DamageInteraction
import net.psforever.objects.vital.projectile.ProjectileReason import net.psforever.objects.vital.projectile.ProjectileReason
import akka.actor.typed.scaladsl.adapter._ import akka.actor.typed.scaladsl.adapter._
import net.psforever.objects.sourcing.{PlayerSource, SourceEntry} import net.psforever.objects.sourcing.{PlayerSource, SourceEntry}
import net.psforever.services.local.LocalAction.DeployableMapIcon
import scala.collection.mutable import scala.collection.mutable
import scala.concurrent.duration._ import scala.concurrent.duration._
@ -39,12 +38,13 @@ class DeployableTest extends Specification {
obj.OwnerGuid.contains(PlanetSideGUID(10)) mustEqual true obj.OwnerGuid.contains(PlanetSideGUID(10)) mustEqual true
} }
"know its owner by GUID" in { "know its owner by name" in {
// val obj = new ExplosiveDeployable(GlobalDefinitions.he_mine) val obj = new ExplosiveDeployable(GlobalDefinitions.he_mine)
// obj.OwnerName.isEmpty mustEqual true val owner = Player(Avatar(1, "TestCharacter", PlanetSideEmpire.TR, CharacterSex.Male, 1, CharacterVoice.Mute))
// obj.OwnerName = "TestCharacter" owner.GUID = PlanetSideGUID(1)
// obj.OwnerName.contains("TestCharacter") mustEqual true owner.Spawn()
ko obj.AssignOwnership(owner)
obj.OwnerName.contains("TestCharacter") mustEqual true
} }
"know its faction allegiance" in { "know its faction allegiance" in {
@ -451,15 +451,14 @@ class ExplosiveDeployableJammerExplodeTest extends ActorTest {
h_mine.Actor ! Vitality.Damage(applyDamageToH) h_mine.Actor ! Vitality.Damage(applyDamageToH)
val eventMsgs = eventsProbe.receiveN(4, 200 milliseconds) val eventMsgs = eventsProbe.receiveN(4, 200 milliseconds)
val p1Msgs = player1Probe.receiveN(1, 200 milliseconds) val p1Msgs = player1Probe.receiveN(1, 200 milliseconds)
val p2Msgs = player2Probe.receiveN(1, 200 milliseconds)
eventMsgs.head match { eventMsgs.head match {
case Zone.HotSpot.Conflict(target, attacker, _) 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, "") case _ => assert(false, "")
} }
eventMsgs(1) match { eventMsgs(1) match {
case LocalServiceMessage("test", LocalAction.Detonate(PlanetSideGUID(2), target)) case LocalServiceMessage("test", LocalAction.Detonate(PlanetSideGUID(2), target))
if target eq h_mine => ; if target eq h_mine => ()
case _ => assert(false, "") case _ => assert(false, "")
} }
eventMsgs(2) match { eventMsgs(2) match {
@ -477,17 +476,13 @@ class ExplosiveDeployableJammerExplodeTest extends ActorTest {
case AvatarServiceMessage( case AvatarServiceMessage(
"test", "test",
AvatarAction.Destroy(PlanetSideGUID(2), PlanetSideGUID(3), Service.defaultPlayerGUID, Vector3.Zero) AvatarAction.Destroy(PlanetSideGUID(2), PlanetSideGUID(3), Service.defaultPlayerGUID, Vector3.Zero)
) => ; ) => ()
case _ => assert(false, "") case _ => assert(false, "")
} }
p1Msgs.head match { p1Msgs.head match {
case Vitality.Damage(_) => ; case Vitality.Damage(_) => ()
case _ => assert(false, "") case _ => assert(false, "")
} }
p2Msgs.head match {
case Player.LoseDeployable(_) => ;
case _ => assert(false, "")
}
assert(h_mine.Destroyed) assert(h_mine.Destroyed)
} }
} }
@ -529,8 +524,7 @@ class ExplosiveDeployableDestructionTest extends ActorTest {
guid.register(player2, 4) guid.register(player2, 4)
guid.register(weapon, 5) guid.register(weapon, 5)
h_mine.Zone = zone h_mine.Zone = zone
h_mine.OwnerGuid = player2 h_mine.AssignOwnership(player2)
//h_mine.OwnerName = player2.Name
h_mine.Faction = PlanetSideEmpire.NC h_mine.Faction = PlanetSideEmpire.NC
h_mine.Actor = system.actorOf(Props(classOf[MineDeployableControl], h_mine), "h-mine-control") 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( val obj = new TurretDeployable(
new TurretDeployableDefinition(685) { new TurretDeployableDefinition(685) {
MountPoints += 1 -> MountInfo(0, Vector3.Zero) MountPoints += 1 -> MountInfo(0, Vector3.Zero)
Seats += 0 -> new SeatDefinition()
FactionLocked = false FactionLocked = false
} //required (defaults to true) } //required (defaults to true)
) { ) {

View file

@ -121,7 +121,7 @@ class FacilityTurretControl2Test extends ActorTest {
assert(obj.Definition.FactionLocked) assert(obj.Definition.FactionLocked)
obj.Actor ! Mountable.TryMount(player, 1) obj.Actor ! Mountable.TryMount(player, 1)
val reply = receiveOne(300 milliseconds) val reply = receiveOne(1000 milliseconds)
reply match { reply match {
case msg: Mountable.MountMessages => case msg: Mountable.MountMessages =>
assert(msg.response.isInstanceOf[Mountable.CanMount]) assert(msg.response.isInstanceOf[Mountable.CanMount])

View file

@ -1,26 +1,32 @@
package objects package objects
import akka.actor.ActorRef
import akka.testkit.TestProbe import akka.testkit.TestProbe
import base.ActorTest 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.PlanetSideServerObject
import net.psforever.objects.serverobject.aura.{Aura, AuraEffectBehavior}
import net.psforever.objects.serverobject.environment._ import net.psforever.objects.serverobject.environment._
import net.psforever.objects.serverobject.environment.interaction.{EscapeFromEnvironment, InteractWithEnvironment, InteractingWithEnvironment} import net.psforever.objects.serverobject.environment.interaction.RespondsToZoneEnvironment
import net.psforever.objects.vital.{Vitality, VitalityDefinition} import net.psforever.objects.vital.Vitality
import net.psforever.objects.zones.{InteractsWithZone, Zone, ZoneMap} 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._ import scala.concurrent.duration._
class InteractsWithZoneEnvironmentTest extends ActorTest { class InteractsWithZoneEnvironmentTest extends ActorTest {
val pool1 = Pool(EnvironmentAttribute.Water, DeepSquare(-1, 10, 10, 0, 0)) val pool1: Pool = Pool(EnvironmentAttribute.Water, DeepSquare(5, 10, 10, 0, 0))
val pool2 = Pool(EnvironmentAttribute.Water, DeepSquare(-1, 10, 15, 5, 10)) val pool2: Pool = Pool(EnvironmentAttribute.Water, DeepSquare(5, 10, 15, 5, 10))
val pool3 = Pool(EnvironmentAttribute.Lava, DeepSquare(-1, 15, 10, 10, 5)) val pool3: Pool = Pool(EnvironmentAttribute.Lava, DeepSquare(5, 15, 10, 10, 5))
val testZone = { val zoneEvents: TestProbe = TestProbe()
val testZone: Zone = {
val testMap = new ZoneMap(name = "test-map") { val testMap = new ZoneMap(name = "test-map") {
environment = List(pool1, pool2, pool3) 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(pool1)
testZone.blockMap.addTo(pool2) testZone.blockMap.addTo(pool2)
@ -32,8 +38,8 @@ class InteractsWithZoneEnvironmentTest extends ActorTest {
val obj = InteractsWithZoneEnvironmentTest.testObject() val obj = InteractsWithZoneEnvironmentTest.testObject()
obj.Zone = testZone obj.Zone = testZone
obj.Actor = testProbe.ref obj.Actor = testProbe.ref
obj.Position = Vector3(0,0,50)
assert(obj.Position == Vector3.Zero)
obj.zoneInteractions() obj.zoneInteractions()
testProbe.expectNoMessage(max = 500 milliseconds) testProbe.expectNoMessage(max = 500 milliseconds)
} }
@ -44,12 +50,12 @@ class InteractsWithZoneEnvironmentTest extends ActorTest {
obj.Zone = testZone obj.Zone = testZone
obj.Actor = testProbe.ref obj.Actor = testProbe.ref
obj.Position = Vector3(1,1,-2) obj.Position = Vector3(1,1,2)
obj.zoneInteractions() obj.zoneInteractions()
val msg = testProbe.receiveOne(max = 250 milliseconds) val msg = testProbe.receiveOne(max = 250 milliseconds)
assert( assert(
msg match { msg match {
case InteractingWithEnvironment(b, _) => (b eq pool1) case RespondsToZoneEnvironment.Timer(EnvironmentAttribute.Water, _, _, _) => true
case _ => false case _ => false
} }
) )
@ -57,28 +63,28 @@ class InteractsWithZoneEnvironmentTest extends ActorTest {
testProbe.expectNoMessage(max = 500 milliseconds) 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 testProbe = TestProbe()
val obj = InteractsWithZoneEnvironmentTest.testObject() val obj = InteractsWithZoneEnvironmentTest.testObject()
obj.Zone = testZone obj.Zone = testZone
obj.Actor = testProbe.ref obj.Actor = testProbe.ref
obj.Position = Vector3(1,1,-2) obj.Position = Vector3(1,1,2)
obj.zoneInteractions() obj.zoneInteractions()
val msg1 = testProbe.receiveOne(max = 250 milliseconds) val msg1 = testProbe.receiveOne(max = 250 milliseconds)
assert( assert(
msg1 match { msg1 match {
case InteractingWithEnvironment(b, _) => (b eq pool1) case RespondsToZoneEnvironment.Timer(EnvironmentAttribute.Water, _, _, _) => true
case _ => false case _ => false
} }
) )
obj.Position = Vector3(1,1,1) obj.Position = Vector3(1,1,50)
obj.zoneInteractions() obj.zoneInteractions()
val msg2 = testProbe.receiveOne(max = 250 milliseconds) val msg2 = testProbe.receiveOne(max = 250 milliseconds)
assert( assert(
msg2 match { msg2 match {
case EscapeFromEnvironment(b, _) => (b eq pool1) case RespondsToZoneEnvironment.Timer(EnvironmentAttribute.Water, _, _, _) => true
case _ => false case _ => false
} }
) )
@ -92,26 +98,25 @@ class InteractsWithZoneEnvironmentTest extends ActorTest {
obj.Zone = testZone obj.Zone = testZone
obj.Actor = testProbe.ref obj.Actor = testProbe.ref
obj.Position = Vector3(7,7,-2) obj.Position = Vector3(7,7,2)
obj.zoneInteractions() obj.zoneInteractions()
val msg1 = testProbe.receiveOne(max = 250 milliseconds) val msg1 = testProbe.receiveOne(max = 250 milliseconds)
assert( assert(
msg1 match { msg1 match {
case InteractingWithEnvironment(b, _) => (b eq pool1) case RespondsToZoneEnvironment.Timer(EnvironmentAttribute.Water, _, _, _) => true
case _ => false case _ => false
} }
) )
obj.Position = Vector3(12,7,-2) obj.Position = Vector3(12,7,2)
obj.zoneInteractions() obj.zoneInteractions()
val msg2 = testProbe.receiveOne(max = 250 milliseconds) val msg2 = testProbe.receiveOne(max = 250 milliseconds)
assert( assert(
msg2 match { msg2 match {
case InteractingWithEnvironment(b, _) => (b eq pool1) case RespondsToZoneEnvironment.Timer(EnvironmentAttribute.Water, _, _, _) => true
case _ => false case _ => false
} }
) )
assert(pool1.attribute == pool2.attribute)
} }
"transition between two different critical regions when the regions have different attributes" in { "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.Zone = testZone
obj.Actor = testProbe.ref obj.Actor = testProbe.ref
obj.Position = Vector3(7,7,-2) obj.Position = Vector3(7,7,2)
obj.zoneInteractions() obj.zoneInteractions()
val msg1 = testProbe.receiveOne(max = 250 milliseconds) val msg1 = testProbe.receiveOne(max = 250 milliseconds)
assert( assert(
msg1 match { msg1 match {
case InteractingWithEnvironment(b, _) => (b eq pool1) case RespondsToZoneEnvironment.Timer(EnvironmentAttribute.Water, _, _, _) => true
case _ => false case _ => false
} }
) )
obj.Position = Vector3(7,12,-2) obj.Position = Vector3(7,12,2)
obj.zoneInteractions() obj.zoneInteractions()
val msgs = testProbe.receiveN(2, max = 250 milliseconds) val msgs = testProbe.receiveN(3, max = 250 milliseconds)
assert( assert(
msgs.head match { msgs.head match {
case EscapeFromEnvironment(b, _) => (b eq pool1) case Vitality.Damage(_) => true
case _ => false case _ => false
} }
) )
assert( assert(
msgs(1) match { 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 case _ => false
} }
) )
assert(pool1.attribute != pool3.attribute)
} }
} }
@ -155,22 +165,24 @@ class InteractsWithZoneEnvironmentTest extends ActorTest {
obj.Zone = testZone obj.Zone = testZone
obj.Actor = testProbe.ref obj.Actor = testProbe.ref
obj.Position = Vector3(1,1,-2) obj.Position = Vector3(1,1,2)
obj.zoneInteractions() obj.zoneInteractions()
val msg1 = testProbe.receiveOne(max = 250 milliseconds) val msg1 = testProbe.receiveOne(max = 250 milliseconds)
assert( assert(
msg1 match { msg1 match {
case InteractingWithEnvironment(b, _) => (b eq pool1) case RespondsToZoneEnvironment.Timer(EnvironmentAttribute.Water, _, _, _) => true
case _ => false case _ => false
} }
) )
obj.allowInteraction = false obj.allowInteraction = false
val msg2 = testProbe.receiveOne(max = 250 milliseconds) val msg2 = testProbe.receiveOne(max = 250 milliseconds)
msg2 match { assert(
case EscapeFromEnvironment(b, _) => (b eq pool1) msg2 match {
case _ => assert( false) case RespondsToZoneEnvironment.Timer(EnvironmentAttribute.Water, _, _, _) => true
} case _ => false
}
)
obj.zoneInteractions() obj.zoneInteractions()
testProbe.expectNoMessage(max = 500 milliseconds) testProbe.expectNoMessage(max = 500 milliseconds)
} }
@ -182,7 +194,7 @@ class InteractsWithZoneEnvironmentTest extends ActorTest {
obj.Actor = testProbe.ref obj.Actor = testProbe.ref
obj.allowInteraction = false obj.allowInteraction = false
obj.Position = Vector3(1,1,-2) obj.Position = Vector3(1,1,2)
obj.zoneInteractions() obj.zoneInteractions()
testProbe.expectNoMessage(max = 500 milliseconds) testProbe.expectNoMessage(max = 500 milliseconds)
@ -190,7 +202,7 @@ class InteractsWithZoneEnvironmentTest extends ActorTest {
val msg1 = testProbe.receiveOne(max = 250 milliseconds) val msg1 = testProbe.receiveOne(max = 250 milliseconds)
assert( assert(
msg1 match { msg1 match {
case InteractingWithEnvironment(b, _) => (b eq pool1) case RespondsToZoneEnvironment.Timer(EnvironmentAttribute.Water, _, _, _) => true
case _ => false case _ => false
} }
) )
@ -199,15 +211,9 @@ class InteractsWithZoneEnvironmentTest extends ActorTest {
object InteractsWithZoneEnvironmentTest { object InteractsWithZoneEnvironmentTest {
def testObject(): PlanetSideServerObject with InteractsWithZone = { def testObject(): PlanetSideServerObject with InteractsWithZone = {
new PlanetSideServerObject val p = new Player(Avatar(1, "test", PlanetSideEmpire.VS, CharacterSex.Male, 1, CharacterVoice.Mute))
with InteractsWithZone { p.GUID = PlanetSideGUID(1)
interaction(new InteractWithEnvironment()) p.Spawn()
def Faction: PlanetSideEmpire.Value = PlanetSideEmpire.VS p
def DamageModel = null
def Definition: ObjectDefinition with VitalityDefinition = new ObjectDefinition(objectId = 0) with VitalityDefinition {
Damageable = true
DrownAtMaxDepth = true
}
}
} }
} }

View file

@ -12,7 +12,7 @@ import net.psforever.objects.avatar.{Avatar, Certification, PlayerControl}
import net.psforever.objects.ballistics._ import net.psforever.objects.ballistics._
import net.psforever.objects.guid.NumberPoolHub import net.psforever.objects.guid.NumberPoolHub
import net.psforever.objects.guid.source.MaxNumberSource 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.zones.{Zone, ZoneMap}
import net.psforever.objects._ import net.psforever.objects._
import net.psforever.objects.serverobject.CommonMessages import net.psforever.objects.serverobject.CommonMessages
@ -948,7 +948,7 @@ class PlayerControlInteractWithLavaTest extends ActorTest {
} }
) )
assert(player1.Health > 0) //still alive? 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 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 Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=1
val avatarProbe = TestProbe() val avatarProbe = TestProbe()
val guid = new NumberPoolHub(new MaxNumberSource(15)) 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( val zone = new Zone(
id = "test-map", id = "test-map",
new ZoneMap(name = "test-map") { new ZoneMap(name = "test-map") {
@ -973,24 +973,23 @@ class PlayerControlInteractWithDeathTest extends ActorTest {
override def AvatarEvents = avatarProbe.ref override def AvatarEvents = avatarProbe.ref
override def Activity = TestProbe().ref override def Activity = TestProbe().ref
} }
zone.blockMap.addTo(player1) guid.register(player1, 1)
zone.blockMap.addTo(pool) guid.register(player1.avatar.locker, 5)
player1.Zone = zone player1.Zone = zone
player1.Spawn() 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) val (probe, avatarActor) = PlayerControlTest.DummyAvatar(system)
player1.Actor = system.actorOf(Props(classOf[PlayerControl], player1, avatarActor), "player1-control") player1.Actor = system.actorOf(Props(classOf[PlayerControl], player1, avatarActor), "player1-control")
player1.LogActivity(SpawningActivity(PlayerSource(player1), 0, None))
guid.register(player1, 1)
"PlayerControl" should { "PlayerControl" should {
"take continuous damage if player steps into a pool of death" in { "take continuous damage if player steps into a pool of death" in {
assert(player1.Health == 100) //alive assert(player1.Health == 100) //alive
player1.Position = Vector3(5,5,-3) //right in the pool probe.expectNoMessage(5.seconds)
player1.zoneInteractions() //trigger player1.zoneInteractions() //trigger
probe.receiveOne(250 milliseconds) //wait until oplayer1's implants deinitialize
assert(player1.Health == 0) //ded assert(player1.Health == 0) //ded
} }
} }

View file

@ -14,7 +14,7 @@ import net.psforever.objects.guid.NumberPoolHub
import net.psforever.objects.guid.source.MaxNumberSource import net.psforever.objects.guid.source.MaxNumberSource
import net.psforever.objects.serverobject.CommonMessages import net.psforever.objects.serverobject.CommonMessages
import net.psforever.objects.serverobject.environment._ 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.environment.interaction.common.Watery.OxygenStateTarget
import net.psforever.objects.serverobject.mount.Mountable import net.psforever.objects.serverobject.mount.Mountable
import net.psforever.objects.vehicles.VehicleLockState import net.psforever.objects.vehicles.VehicleLockState
@ -634,9 +634,10 @@ class VehicleControlInteractWithWaterTest extends ActorTest {
val player1 = val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=1 Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=1
val avatarProbe = TestProbe() val avatarProbe = TestProbe()
val playerProbe = TestProbe()
val vehicleProbe = TestProbe() val vehicleProbe = TestProbe()
val guid = new NumberPoolHub(new MaxNumberSource(15)) 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( val zone = new Zone(
id = "test-zone", id = "test-zone",
new ZoneMap(name = "test-map") { new ZoneMap(name = "test-map") {
@ -649,7 +650,7 @@ class VehicleControlInteractWithWaterTest extends ActorTest {
override def LivePlayers = List(player1) override def LivePlayers = List(player1)
override def Vehicles = List(vehicle) override def Vehicles = List(vehicle)
override def AvatarEvents = avatarProbe.ref override def AvatarEvents = avatarProbe.ref
override def VehicleEvents = vehicleProbe.ref override def VehicleEvents = avatarProbe.ref
this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command] this.actor = new TestProbe(system).ref.toTyped[ZoneActor.Command]
} }
@ -666,38 +667,24 @@ class VehicleControlInteractWithWaterTest extends ActorTest {
vehicle.Seats(0).mount(player1) vehicle.Seats(0).mount(player1)
player1.VehicleSeated = vehicle.GUID player1.VehicleSeated = vehicle.GUID
val (probe, avatarActor) = PlayerControlTest.DummyAvatar(system) val (probe, avatarActor) = PlayerControlTest.DummyAvatar(system)
player1.Actor = system.actorOf(Props(classOf[PlayerControl], player1, avatarActor), "player1-control") player1.Actor = playerProbe.ref
vehicle.Actor = system.actorOf(Props(classOf[VehicleControl], vehicle), "vehicle-control") vehicle.Actor = vehicleProbe.ref
"VehicleControl" should { "VehicleControl" should {
"causes disability when the vehicle drives too deep in water" in { "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 vehicle.zoneInteractions() //trigger
val msg_drown = avatarProbe.receiveOne(250 milliseconds) val msg_drown = playerProbe.receiveOne(250 milliseconds)
assert( assert(msg_drown match {
msg_drown match { case InteractingWithEnvironment(body, _) => body eq pool
case AvatarServiceMessage( case _ => false
"TestCharacter1", })
AvatarAction.OxygenState( val msg_disable = vehicleProbe.receiveOne(10 seconds)
OxygenStateTarget(PlanetSideGUID(1), _, OxygenState.Suffocation, 100f), assert(msg_disable match {
Some(OxygenStateTarget(PlanetSideGUID(2), _, OxygenState.Suffocation, 100f)) case RespondsToZoneEnvironment.Timer(EnvironmentAttribute.Water, _, _, VehicleControl.Disable(true)) => true
) case _ => false
) => 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
} }
} }
} }