PSF-LoginServer/src/test/scala/objects/InteractsWithZoneEnvironmentTest.scala
Fate-JH b43e7a6993
Environmental Redo (#1169)
* switched environment handling from the control agency side to the entity side to match other zone interactions

* reusing the existing sector data; better resets, negating an issue during mounting where the player does not switch back to recovery; disabling was bugged due to missed timer upgrade

* making lava no longer deadly; wait ...

* only one method of cancelling a lava interaction at a time
2024-03-02 23:43:53 -05:00

214 lines
6.8 KiB
Scala

package objects
import akka.testkit.TestProbe
import base.ActorTest
import net.psforever.objects.definition.ObjectDefinition
import net.psforever.objects.serverobject.PlanetSideServerObject
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.zones.{InteractsWithZone, Zone, ZoneMap}
import net.psforever.types.{PlanetSideEmpire, 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 testMap = new ZoneMap(name = "test-map") {
environment = List(pool1, pool2, pool3)
}
new Zone("test-zone", testMap, zoneNumber = 0)
}
testZone.blockMap.addTo(pool1)
testZone.blockMap.addTo(pool2)
testZone.blockMap.addTo(pool3)
"InteractsWithZoneEnvironment" should {
"not interact with any environment when it does not encroach any environment" in {
val testProbe = TestProbe()
val obj = InteractsWithZoneEnvironmentTest.testObject()
obj.Zone = testZone
obj.Actor = testProbe.ref
assert(obj.Position == Vector3.Zero)
obj.zoneInteractions()
testProbe.expectNoMessage(max = 500 milliseconds)
}
"acknowledge interaction when moved into the critical region of a registered environment object (just once)" in {
val testProbe = TestProbe()
val obj = InteractsWithZoneEnvironmentTest.testObject()
obj.Zone = testZone
obj.Actor = testProbe.ref
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 _ => false
}
)
obj.zoneInteractions()
testProbe.expectNoMessage(max = 500 milliseconds)
}
"acknowledge ceasation 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.zoneInteractions()
val msg1 = testProbe.receiveOne(max = 250 milliseconds)
assert(
msg1 match {
case InteractingWithEnvironment(b, _) => (b eq pool1)
case _ => false
}
)
obj.Position = Vector3(1,1,1)
obj.zoneInteractions()
val msg2 = testProbe.receiveOne(max = 250 milliseconds)
assert(
msg2 match {
case EscapeFromEnvironment(b, _) => (b eq pool1)
case _ => false
}
)
obj.zoneInteractions()
testProbe.expectNoMessage(max = 500 milliseconds)
}
"transition between two different critical regions when the regions that the same attribute" in {
val testProbe = TestProbe()
val obj = InteractsWithZoneEnvironmentTest.testObject()
obj.Zone = testZone
obj.Actor = testProbe.ref
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 _ => false
}
)
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 _ => false
}
)
assert(pool1.attribute == pool2.attribute)
}
"transition between two different critical regions when the regions have different attributes" in {
val testProbe = TestProbe()
val obj = InteractsWithZoneEnvironmentTest.testObject()
obj.Zone = testZone
obj.Actor = testProbe.ref
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 _ => false
}
)
obj.Position = Vector3(7,12,-2)
obj.zoneInteractions()
val msgs = testProbe.receiveN(2, max = 250 milliseconds)
assert(
msgs.head match {
case EscapeFromEnvironment(b, _) => (b eq pool1)
case _ => false
}
)
assert(
msgs(1) match {
case InteractingWithEnvironment(b, _) => (b eq pool1)
case _ => false
}
)
assert(pool1.attribute != pool3.attribute)
}
}
"when interactions are disallowed, end any current interaction" in {
val testProbe = TestProbe()
val obj = InteractsWithZoneEnvironmentTest.testObject()
obj.Zone = testZone
obj.Actor = testProbe.ref
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 _ => false
}
)
obj.allowInteraction = false
val msg2 = testProbe.receiveOne(max = 250 milliseconds)
msg2 match {
case EscapeFromEnvironment(b, _) => (b eq pool1)
case _ => assert( false)
}
obj.zoneInteractions()
testProbe.expectNoMessage(max = 500 milliseconds)
}
"when interactions are allowed, after having been disallowed, engage in any detected interaction" in {
val testProbe = TestProbe()
val obj = InteractsWithZoneEnvironmentTest.testObject()
obj.Zone = testZone
obj.Actor = testProbe.ref
obj.allowInteraction = false
obj.Position = Vector3(1,1,-2)
obj.zoneInteractions()
testProbe.expectNoMessage(max = 500 milliseconds)
obj.allowInteraction = true
val msg1 = testProbe.receiveOne(max = 250 milliseconds)
assert(
msg1 match {
case InteractingWithEnvironment(b, _) => (b eq pool1)
case _ => false
}
)
}
}
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
}
}
}
}