PSF-LoginServer/src/test/scala/game/OrbitalShuttleTimeMsgTest.scala
Fate-JH 71ab35ecab
Hart (#723)
* initial OrbitalShuttleTimeMsg packet and tests; new objects to support HART shuttle transport system

* master was stale

* grouped scheduling for timing orbital shuttle activity

* door lock controls for HART shuttle lifecycle, and specifically for the doors that lead into the shuttle boarding hallway

* separation of the door from the door unlocking logic, which now has to be provided if performed by an outside source; a door that is locked either by bolt, HART routine, or other reason, can now be shut immediately; message when HART is not docked with a corresponding entry hallway door

* better degree of door logic control; all shuttle-related messages have been moved to LocalService; careful managing of 'original state' for the shuttle's cycle

* modification of seat mounting and cargo mounting support entities to expand functionality

* absolutely very little to do with the feature of this branch and a lot to do with yak-shaving; long story short, class inheritance is greatly modified and mountable seats can now accept multiple players if initialized properly

* a lot has changed: distribution of MountableBehavior, mount point information is more complex, vehicles convert differently, the routine of the shuttle timer is initialized differently; you can now successfully utilize the HART shuttle to drop into a zone

* swap of shutle from pad to pad control; tests and comments

* eject players from HART gantry hallway as if passengers dismounting from seat when not boarding through the use of environmental geometry; HART system uses duration from config settings to set scheduler

* rebase to curious master; repairs to vector rotation calculations; regression of mountable changes involving seats with occupancy greater than 1; orbital shuttle as a unique vehicle and amenity; corrected dismount offsets and offset calculations; weird angle of nc hart a building has been properly accommodated; hart events have prerequisite animation states

* rebase with master; looks like rebase with merged_master, which is also a commit

* lots of tests (though not nearly enough); checking the permission group of a shuttle seat no longer creates that seat

* fixing explosions

* fixed the persistence monitor service potentially using non-printable unicode in actor names

* can not use a droppod to gain access to one's own sanctuary

* removed hart facility update that causing open bay doors and beeping

* PR review changes

* fix for aggravation issues
2021-03-23 09:44:10 -04:00

222 lines
7.8 KiB
Scala

// Copyright (c) 2021 PSForever
package game
import org.specs2.mutable._
import net.psforever.packet._
import net.psforever.packet.game._
import net.psforever.types.{HartSequence, PlanetSideGUID}
import scodec.bits._
class OrbitalShuttleTimeMsgTest extends Specification {
//these are all from vs sanctuary, near HART A
val string1 = hex"5B 6E3AAE0000200F8000400000000500D9C1051303680414480DA411B0"
val string2 = hex"5B 72A00F8000200F8000400000000500D9C1141303680450480DA41140"
val string3 = hex"5B 62FFFFFFFFA00F8000400000000500D9C1141303680450480DA41140"
val string4 = hex"5B 600000000030750000400000000500D9C1141303680450480DA41140"
val string5 = hex"5B 64F3370180200F8000400000000500D9C1141303680450480DA41140"
val string6 = hex"5B 6953278180200F8000400000000500D9C1061303680464480DA41050"
val string7 = hex"5B 7DCA8D8180200F8000400000000500D9C1141303680450480DA41140"
"decode (1)" in {
PacketCoding.decodePacket(string1).require match {
case OrbitalShuttleTimeMsg(u2, u3, u4, u5, u7, u8) =>
u2 mustEqual HartSequence.Land
u3 mustEqual 4
u4 mustEqual 23669
u5 mustEqual 8000
u7 mustEqual 0
u8 mustEqual List(
PadAndShuttlePair(PlanetSideGUID(788), PlanetSideGUID(1127), 5),
PadAndShuttlePair(PlanetSideGUID(787), PlanetSideGUID(1128), 5),
PadAndShuttlePair(PlanetSideGUID(786), PlanetSideGUID(1129), 27)
)
case _ =>
ko
}
}
"decode (2)" in {
PacketCoding.decodePacket(string2).require match {
case OrbitalShuttleTimeMsg(u2, u3, u4, u5, u7, u8) =>
u2 mustEqual HartSequence.PrepareForBoarding
u3 mustEqual 5
u4 mustEqual 8000
u5 mustEqual 8000
u7 mustEqual 0
u8 mustEqual List(
PadAndShuttlePair(PlanetSideGUID(788), PlanetSideGUID(1127), 20),
PadAndShuttlePair(PlanetSideGUID(787), PlanetSideGUID(1128), 20),
PadAndShuttlePair(PlanetSideGUID(786), PlanetSideGUID(1129), 20)
)
case _ =>
ko
}
}
"decode (3)" in {
PacketCoding.decodePacket(string3).require match {
case OrbitalShuttleTimeMsg(u2, u3, u4, u5, u7, u8) =>
u2 mustEqual HartSequence.State0
u3 mustEqual 5
u4 mustEqual 4294967295L
u5 mustEqual 8000
u7 mustEqual 0
u8 mustEqual List(
PadAndShuttlePair(PlanetSideGUID(788), PlanetSideGUID(1127), 20),
PadAndShuttlePair(PlanetSideGUID(787), PlanetSideGUID(1128), 20),
PadAndShuttlePair(PlanetSideGUID(786), PlanetSideGUID(1129), 20)
)
case _ =>
ko
}
}
"decode (4)" in {
PacketCoding.decodePacket(string4).require match {
case OrbitalShuttleTimeMsg(u2, u3, u4, u5, u7, u8) =>
u2 mustEqual HartSequence.State0
u3 mustEqual 0
u4 mustEqual 0
u5 mustEqual 60000
u7 mustEqual 0
u8 mustEqual List(
PadAndShuttlePair(PlanetSideGUID(788), PlanetSideGUID(1127), 20),
PadAndShuttlePair(PlanetSideGUID(787), PlanetSideGUID(1128), 20),
PadAndShuttlePair(PlanetSideGUID(786), PlanetSideGUID(1129), 20)
)
case _ =>
ko
}
}
"decode (5)" in {
PacketCoding.decodePacket(string5).require match {
case OrbitalShuttleTimeMsg(u2, u3, u4, u5, u7, u8) =>
u2 mustEqual HartSequence.PrepareForDeparture
u3 mustEqual 1
u4 mustEqual 224998
u5 mustEqual 8000
u7 mustEqual 0
u8 mustEqual List(
PadAndShuttlePair(PlanetSideGUID(788), PlanetSideGUID(1127), 20),
PadAndShuttlePair(PlanetSideGUID(787), PlanetSideGUID(1128), 20),
PadAndShuttlePair(PlanetSideGUID(786), PlanetSideGUID(1129), 20)
)
case _ =>
ko
}
}
"decode (6)" in {
PacketCoding.decodePacket(string6).require match {
case OrbitalShuttleTimeMsg(u2, u3, u4, u5, u7, u8) =>
u2 mustEqual HartSequence.TakeOff
u3 mustEqual 2
u4 mustEqual 216998
u5 mustEqual 8000
u7 mustEqual 0
u8 mustEqual List(
PadAndShuttlePair(PlanetSideGUID(788), PlanetSideGUID(1127), 6),
PadAndShuttlePair(PlanetSideGUID(787), PlanetSideGUID(1128), 25),
PadAndShuttlePair(PlanetSideGUID(786), PlanetSideGUID(1129), 5)
)
case _ =>
ko
}
}
"decode (7)" in {
PacketCoding.decodePacket(string7).require match {
case OrbitalShuttleTimeMsg(u2, u3, u4, u5, u7, u8) =>
u2 mustEqual HartSequence.State7
u3 mustEqual 3
u4 mustEqual 203669
u5 mustEqual 8000
u7 mustEqual 0
u8 mustEqual List(
PadAndShuttlePair(PlanetSideGUID(788), PlanetSideGUID(1127), 20),
PadAndShuttlePair(PlanetSideGUID(787), PlanetSideGUID(1128), 20),
PadAndShuttlePair(PlanetSideGUID(786), PlanetSideGUID(1129), 20)
)
case _ =>
ko
}
}
"encode (1)" in {
val msg = OrbitalShuttleTimeMsg(HartSequence.Land, 4, 23669, 8000, 0, List(
PadAndShuttlePair(PlanetSideGUID(788), PlanetSideGUID(1127), 5),
PadAndShuttlePair(PlanetSideGUID(787), PlanetSideGUID(1128), 5),
PadAndShuttlePair(PlanetSideGUID(786), PlanetSideGUID(1129), 27)
))
val pkt = PacketCoding.encodePacket(msg).require.toByteVector
pkt mustEqual string1
}
"encode (2)" in {
val msg = OrbitalShuttleTimeMsg(HartSequence.PrepareForBoarding, 5, 8000, 8000, 0, List(
PadAndShuttlePair(PlanetSideGUID(788), PlanetSideGUID(1127), 20),
PadAndShuttlePair(PlanetSideGUID(787), PlanetSideGUID(1128), 20),
PadAndShuttlePair(PlanetSideGUID(786), PlanetSideGUID(1129), 20)
))
val pkt = PacketCoding.encodePacket(msg).require.toByteVector
pkt mustEqual string2
}
"encode (3)" in {
val msg = OrbitalShuttleTimeMsg(HartSequence.State0, 5, 4294967295L, 8000, 0, List(
PadAndShuttlePair(PlanetSideGUID(788), PlanetSideGUID(1127), 20),
PadAndShuttlePair(PlanetSideGUID(787), PlanetSideGUID(1128), 20),
PadAndShuttlePair(PlanetSideGUID(786), PlanetSideGUID(1129), 20)
))
val pkt = PacketCoding.encodePacket(msg).require.toByteVector
pkt mustEqual string3
}
"encode (4)" in {
val msg = OrbitalShuttleTimeMsg(HartSequence.State0, 0, 0, 60000, 0, List(
PadAndShuttlePair(PlanetSideGUID(788), PlanetSideGUID(1127), 20),
PadAndShuttlePair(PlanetSideGUID(787), PlanetSideGUID(1128), 20),
PadAndShuttlePair(PlanetSideGUID(786), PlanetSideGUID(1129), 20)
))
val pkt = PacketCoding.encodePacket(msg).require.toByteVector
pkt mustEqual string4
}
"encode (5)" in {
val msg = OrbitalShuttleTimeMsg(HartSequence.PrepareForDeparture, 1, 224998, 8000, 0, List(
PadAndShuttlePair(PlanetSideGUID(788), PlanetSideGUID(1127), 20),
PadAndShuttlePair(PlanetSideGUID(787), PlanetSideGUID(1128), 20),
PadAndShuttlePair(PlanetSideGUID(786), PlanetSideGUID(1129), 20)
))
val pkt = PacketCoding.encodePacket(msg).require.toByteVector
pkt mustEqual string5
}
"encode (6)" in {
val msg = OrbitalShuttleTimeMsg(HartSequence.TakeOff, 2, 216998, 8000, 0, List(
PadAndShuttlePair(PlanetSideGUID(788), PlanetSideGUID(1127), 6),
PadAndShuttlePair(PlanetSideGUID(787), PlanetSideGUID(1128), 25),
PadAndShuttlePair(PlanetSideGUID(786), PlanetSideGUID(1129), 5)
))
val pkt = PacketCoding.encodePacket(msg).require.toByteVector
pkt mustEqual string6
}
"encode (7)" in {
val msg = OrbitalShuttleTimeMsg(HartSequence.State7, 3, 203669, 8000, 0, List(
PadAndShuttlePair(PlanetSideGUID(788), PlanetSideGUID(1127), 20),
PadAndShuttlePair(PlanetSideGUID(787), PlanetSideGUID(1128), 20),
PadAndShuttlePair(PlanetSideGUID(786), PlanetSideGUID(1129), 20)
))
val pkt = PacketCoding.encodePacket(msg).require.toByteVector
pkt mustEqual string7
}
}