mirror of
https://github.com/2revoemag/PSF-BotServer.git
synced 2026-03-19 20:10:39 +00:00
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
This commit is contained in:
parent
e3de497be3
commit
71ab35ecab
127 changed files with 4672 additions and 1870 deletions
|
|
@ -8,6 +8,7 @@ import net.psforever.objects.definition._
|
|||
import net.psforever.objects.equipment._
|
||||
import net.psforever.objects.inventory.InventoryTile
|
||||
import net.psforever.objects.locker.{LockerContainer, LockerEquipment}
|
||||
import net.psforever.objects.serverobject.mount.{MountInfo, SeatDefinition}
|
||||
import net.psforever.objects.serverobject.terminals.Terminal
|
||||
import net.psforever.objects.serverobject.tube.SpawnTube
|
||||
import net.psforever.objects.vehicles.UtilityType
|
||||
|
|
@ -872,10 +873,10 @@ class ConverterTest extends Specification {
|
|||
|
||||
val fury_def = VehicleDefinition(ObjectClass.fury)
|
||||
fury_def.Seats += 0 -> new SeatDefinition()
|
||||
fury_def.Seats(0).Bailable = true
|
||||
fury_def.Seats(0).ControlledWeapon = Some(1)
|
||||
fury_def.MountPoints += 0 -> 0
|
||||
fury_def.MountPoints += 2 -> 0
|
||||
fury_def.Seats(0).bailable = true
|
||||
fury_def.controlledWeapons += 0 -> 1
|
||||
fury_def.MountPoints += 0 -> MountInfo(0)
|
||||
fury_def.MountPoints += 2 -> MountInfo(0)
|
||||
fury_def.Weapons += 1 -> fury_weapon_systema_def
|
||||
fury_def.TrunkSize = InventoryTile(11, 11)
|
||||
fury_def.TrunkOffset = 30
|
||||
|
|
|
|||
|
|
@ -631,8 +631,8 @@ class DamageableMountableDamageTest extends ActorTest {
|
|||
Vector3(1, 0, 0)
|
||||
)
|
||||
val applyDamageTo = resolved.calculate()
|
||||
mech.Seats(0).Occupant = player2 //seat the player
|
||||
player2.VehicleSeated = Some(mech.GUID) //seat the player
|
||||
mech.Seats(0).mount(player2) //mount the player
|
||||
player2.VehicleSeated = Some(mech.GUID) //mount the player
|
||||
expectNoMessage(200 milliseconds)
|
||||
//we're not testing that the math is correct
|
||||
|
||||
|
|
@ -728,8 +728,8 @@ class DamageableMountableDestroyTest extends ActorTest {
|
|||
Vector3(1, 0, 0)
|
||||
)
|
||||
val applyDamageTo = resolved.calculate()
|
||||
mech.Seats(0).Occupant = player2 //seat the player
|
||||
player2.VehicleSeated = Some(mech.GUID) //seat the player
|
||||
mech.Seats(0).mount(player2) //mount the player
|
||||
player2.VehicleSeated = Some(mech.GUID) //mount the player
|
||||
expectNoMessage(200 milliseconds)
|
||||
//we're not testing that the math is correct
|
||||
|
||||
|
|
@ -797,7 +797,7 @@ class DamageableWeaponTurretDamageTest extends ActorTest {
|
|||
guid.register(turret, 2)
|
||||
guid.register(player1, 3)
|
||||
guid.register(player2, 4)
|
||||
turret.Seats(0).Occupant = player2
|
||||
turret.Seats(0).mount(player2)
|
||||
player2.VehicleSeated = turret.GUID
|
||||
|
||||
val weapon = Tool(GlobalDefinitions.suppressor)
|
||||
|
|
@ -898,7 +898,7 @@ class DamageableWeaponTurretJammerTest extends ActorTest {
|
|||
guid.register(player2, 4)
|
||||
guid.register(turretWeapon, 5)
|
||||
guid.register(turretWeapon.AmmoSlot.Box, 6)
|
||||
turret.Seats(0).Occupant = player2
|
||||
turret.Seats(0).mount(player2)
|
||||
player2.VehicleSeated = turret.GUID
|
||||
|
||||
val weapon = Tool(GlobalDefinitions.jammer_grenade)
|
||||
|
|
@ -999,7 +999,7 @@ class DamageableWeaponTurretDestructionTest extends ActorTest {
|
|||
guid.register(player2, 4)
|
||||
guid.register(turretWeapon, 5)
|
||||
guid.register(turretWeapon.AmmoSlot.Box, 6)
|
||||
turret.Seats(0).Occupant = player2
|
||||
turret.Seats(0).mount(player2)
|
||||
player2.VehicleSeated = turret.GUID
|
||||
building.Position = Vector3(1, 0, 0)
|
||||
building.Zone = zone
|
||||
|
|
@ -1060,7 +1060,7 @@ class DamageableWeaponTurretDestructionTest extends ActorTest {
|
|||
assert(!turret.Destroyed)
|
||||
|
||||
turret.Actor ! Vitality.Damage(applyDamageToA) //also test destruction while jammered
|
||||
vehicleProbe.receiveN(2, 500 milliseconds) //flush jammered messages (see above)
|
||||
vehicleProbe.receiveN(2, 1000 milliseconds) //flush jammered messages (see above)
|
||||
assert(turret.Health > turret.Definition.DamageDestroysAt)
|
||||
assert(turret.Jammed)
|
||||
assert(!turret.Destroyed)
|
||||
|
|
@ -1148,7 +1148,7 @@ class DamageableVehicleDamageTest extends ActorTest {
|
|||
guid.register(player1, 2)
|
||||
guid.register(player2, 3)
|
||||
atv.Zone = zone
|
||||
atv.Seats(0).Occupant = player2
|
||||
atv.Seats(0).mount(player2)
|
||||
player2.VehicleSeated = atv.GUID
|
||||
|
||||
val weapon = Tool(GlobalDefinitions.suppressor)
|
||||
|
|
@ -1273,12 +1273,12 @@ class DamageableVehicleDamageMountedTest extends ActorTest {
|
|||
//the lodestar control actor needs to load after the utilities have guid's assigned
|
||||
lodestar.Actor = system.actorOf(Props(classOf[VehicleControl], lodestar), "lodestar-control")
|
||||
lodestar.Zone = zone
|
||||
lodestar.Seats(0).Occupant = player2
|
||||
lodestar.Seats(0).mount(player2)
|
||||
player2.VehicleSeated = lodestar.GUID
|
||||
atv.Zone = zone
|
||||
atv.Seats(0).Occupant = player3
|
||||
atv.Seats(0).mount(player3)
|
||||
player3.VehicleSeated = atv.GUID
|
||||
lodestar.CargoHolds(1).Occupant = atv
|
||||
lodestar.CargoHolds(1).mount(atv)
|
||||
atv.MountedIn = lodestar.GUID
|
||||
|
||||
val weapon = Tool(GlobalDefinitions.phoenix) //decimator
|
||||
|
|
@ -1420,11 +1420,11 @@ class DamageableVehicleJammeringMountedTest extends ActorTest {
|
|||
lodestar.Actor = system.actorOf(Props(classOf[VehicleControl], lodestar), "lodestar-control")
|
||||
atv.Zone = zone
|
||||
lodestar.Zone = zone
|
||||
atv.Seats(0).Occupant = player2
|
||||
atv.Seats(0).mount(player2)
|
||||
player2.VehicleSeated = atv.GUID
|
||||
lodestar.Seats(0).Occupant = player3
|
||||
lodestar.Seats(0).mount(player3)
|
||||
player3.VehicleSeated = lodestar.GUID
|
||||
lodestar.CargoHolds(1).Occupant = atv
|
||||
lodestar.CargoHolds(1).mount(atv)
|
||||
atv.MountedIn = lodestar.GUID
|
||||
|
||||
val vehicleSource = SourceEntry(lodestar)
|
||||
|
|
@ -1516,7 +1516,7 @@ class DamageableVehicleDestroyTest extends ActorTest {
|
|||
guid.register(atvWeapon, 4)
|
||||
guid.register(atvWeapon.AmmoSlot.Box, 5)
|
||||
atv.Zone = zone
|
||||
atv.Seats(0).Occupant = player2
|
||||
atv.Seats(0).mount(player2)
|
||||
player2.VehicleSeated = atv.GUID
|
||||
|
||||
val weapon = Tool(GlobalDefinitions.suppressor)
|
||||
|
|
@ -1642,11 +1642,11 @@ class DamageableVehicleDestroyMountedTest extends ActorTest {
|
|||
lodestar.Actor = system.actorOf(Props(classOf[VehicleControl], lodestar), "lodestar-control")
|
||||
atv.Zone = zone
|
||||
lodestar.Zone = zone
|
||||
atv.Seats(0).Occupant = player2
|
||||
atv.Seats(0).mount(player2)
|
||||
player2.VehicleSeated = atv.GUID
|
||||
lodestar.Seats(0).Occupant = player3
|
||||
lodestar.Seats(0).mount(player3)
|
||||
player3.VehicleSeated = lodestar.GUID
|
||||
lodestar.CargoHolds(1).Occupant = atv
|
||||
lodestar.CargoHolds(1).mount(atv)
|
||||
atv.MountedIn = lodestar.GUID
|
||||
|
||||
val vehicleSource = SourceEntry(lodestar)
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import net.psforever.objects.ballistics._
|
|||
import net.psforever.objects.ce.DeployedItem
|
||||
import net.psforever.objects.guid.NumberPoolHub
|
||||
import net.psforever.objects.guid.source.MaxNumberSource
|
||||
import net.psforever.objects.serverobject.mount.Mountable
|
||||
import net.psforever.objects.serverobject.mount.{MountInfo, Mountable}
|
||||
import net.psforever.objects.vital.Vitality
|
||||
import net.psforever.objects.zones.{Zone, ZoneMap}
|
||||
import net.psforever.objects.{TurretDeployable, _}
|
||||
|
|
@ -156,8 +156,11 @@ class TurretDeployableTest extends Specification {
|
|||
}
|
||||
|
||||
"may have mount point" in {
|
||||
new TurretDeployable(GlobalDefinitions.spitfire_turret).MountPoints mustEqual Map()
|
||||
new TurretDeployable(GlobalDefinitions.portable_manned_turret_vs).MountPoints mustEqual Map(1 -> 0, 2 -> 0)
|
||||
new TurretDeployable(GlobalDefinitions.spitfire_turret).MountPoints.isEmpty mustEqual true
|
||||
|
||||
val pmt = new TurretDeployable(GlobalDefinitions.portable_manned_turret_vs)
|
||||
pmt.MountPoints.get(1).contains(MountInfo(0, Vector3(0, 0, 0))) mustEqual true
|
||||
pmt.MountPoints.get(2).contains(MountInfo(0, Vector3(0, 0, 0))) mustEqual true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -669,15 +672,15 @@ class TurretControlMountTest extends ActorTest {
|
|||
obj.Faction = PlanetSideEmpire.TR
|
||||
obj.Actor = system.actorOf(Props(classOf[TurretControl], obj), s"${obj.Definition.Name}_test")
|
||||
|
||||
assert(obj.Seats(0).Occupant.isEmpty)
|
||||
assert(obj.Seats(0).occupant.isEmpty)
|
||||
val player1 = Player(Avatar(0, "test1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
|
||||
obj.Actor ! Mountable.TryMount(player1, 0)
|
||||
obj.Actor ! Mountable.TryMount(player1, 1)
|
||||
val reply1a = receiveOne(200 milliseconds)
|
||||
assert(reply1a.isInstanceOf[Mountable.MountMessages])
|
||||
val reply1b = reply1a.asInstanceOf[Mountable.MountMessages]
|
||||
assert(reply1b.player == player1)
|
||||
assert(reply1b.response.isInstanceOf[Mountable.CanMount])
|
||||
assert(obj.Seats(0).Occupant.contains(player1))
|
||||
assert(obj.Seats(0).occupant.contains(player1))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -689,18 +692,18 @@ class TurretControlBlockMountTest extends ActorTest {
|
|||
obj.Faction = PlanetSideEmpire.TR
|
||||
obj.Actor = system.actorOf(Props(classOf[TurretControl], obj), s"${obj.Definition.Name}_test")
|
||||
|
||||
assert(obj.Seats(0).Occupant.isEmpty)
|
||||
assert(obj.Seats(0).occupant.isEmpty)
|
||||
val player1 = Player(Avatar(0, "test1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
|
||||
obj.Actor ! Mountable.TryMount(player1, 0)
|
||||
obj.Actor ! Mountable.TryMount(player1, 1)
|
||||
val reply1a = receiveOne(200 milliseconds)
|
||||
assert(reply1a.isInstanceOf[Mountable.MountMessages])
|
||||
val reply1b = reply1a.asInstanceOf[Mountable.MountMessages]
|
||||
assert(reply1b.player == player1)
|
||||
assert(reply1b.response.isInstanceOf[Mountable.CanMount])
|
||||
assert(obj.Seats(0).Occupant.contains(player1))
|
||||
assert(obj.Seats(0).occupant.contains(player1))
|
||||
|
||||
val player2 = Player(Avatar(1, "test2", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
|
||||
obj.Actor ! Mountable.TryMount(player2, 0)
|
||||
obj.Actor ! Mountable.TryMount(player2, 1)
|
||||
val reply2a = receiveOne(200 milliseconds)
|
||||
assert(reply2a.isInstanceOf[Mountable.MountMessages])
|
||||
val reply2b = reply2a.asInstanceOf[Mountable.MountMessages]
|
||||
|
|
@ -717,15 +720,15 @@ class TurretControlBlockBetrayalMountTest extends ActorTest {
|
|||
obj.Faction = PlanetSideEmpire.TR
|
||||
obj.Actor = system.actorOf(Props(classOf[TurretControl], obj), s"${obj.Definition.Name}_test")
|
||||
|
||||
assert(obj.Seats(0).Occupant.isEmpty)
|
||||
assert(obj.Seats(0).occupant.isEmpty)
|
||||
val player = Player(Avatar(0, "test", PlanetSideEmpire.VS, CharacterGender.Male, 0, CharacterVoice.Mute))
|
||||
obj.Actor ! Mountable.TryMount(player, 0)
|
||||
obj.Actor ! Mountable.TryMount(player, 1)
|
||||
val reply1a = receiveOne(200 milliseconds)
|
||||
assert(reply1a.isInstanceOf[Mountable.MountMessages])
|
||||
val reply1b = reply1a.asInstanceOf[Mountable.MountMessages]
|
||||
assert(reply1b.player == player)
|
||||
assert(reply1b.response.isInstanceOf[Mountable.CanNotMount])
|
||||
assert(obj.Seats(0).Occupant.isEmpty)
|
||||
assert(obj.Seats(0).occupant.isEmpty)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -737,15 +740,15 @@ class TurretControlDismountTest extends ActorTest {
|
|||
obj.Faction = PlanetSideEmpire.TR
|
||||
obj.Actor = system.actorOf(Props(classOf[TurretControl], obj), s"${obj.Definition.Name}_test")
|
||||
|
||||
assert(obj.Seats(0).Occupant.isEmpty)
|
||||
assert(obj.Seats(0).occupant.isEmpty)
|
||||
val player = Player(Avatar(0, "test", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
|
||||
obj.Actor ! Mountable.TryMount(player, 0)
|
||||
obj.Actor ! Mountable.TryMount(player, 1)
|
||||
val reply1a = receiveOne(200 milliseconds)
|
||||
assert(reply1a.isInstanceOf[Mountable.MountMessages])
|
||||
val reply1b = reply1a.asInstanceOf[Mountable.MountMessages]
|
||||
assert(reply1b.player == player)
|
||||
assert(reply1b.response.isInstanceOf[Mountable.CanMount])
|
||||
assert(obj.Seats(0).Occupant.contains(player))
|
||||
assert(obj.Seats(0).occupant.contains(player))
|
||||
|
||||
obj.Actor ! Mountable.TryDismount(player, 0)
|
||||
val reply2a = receiveOne(200 milliseconds)
|
||||
|
|
@ -753,7 +756,7 @@ class TurretControlDismountTest extends ActorTest {
|
|||
val reply2b = reply2a.asInstanceOf[Mountable.MountMessages]
|
||||
assert(reply2b.player == player)
|
||||
assert(reply2b.response.isInstanceOf[Mountable.CanDismount])
|
||||
assert(obj.Seats(0).Occupant.isEmpty)
|
||||
assert(obj.Seats(0).occupant.isEmpty)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -762,21 +765,25 @@ class TurretControlBetrayalMountTest extends ActorTest {
|
|||
"TurretControl" should {
|
||||
"allow all allegiances" in {
|
||||
val obj = new TurretDeployable(
|
||||
new TurretDeployableDefinition(685) { FactionLocked = false } //required (defaults to true)
|
||||
new TurretDeployableDefinition(685) {
|
||||
MountPoints += 1 -> MountInfo(0, Vector3.Zero)
|
||||
FactionLocked = false
|
||||
} //required (defaults to true)
|
||||
) { GUID = PlanetSideGUID(1) }
|
||||
obj.Faction = PlanetSideEmpire.TR
|
||||
obj.Actor = system.actorOf(Props(classOf[TurretControl], obj), s"${obj.Definition.Name}_test")
|
||||
val probe = new TestProbe(system)
|
||||
|
||||
assert(obj.Seats(0).Occupant.isEmpty)
|
||||
assert(obj.Seats(0).occupant.isEmpty)
|
||||
val player = Player(Avatar(0, "test", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Mute))
|
||||
assert(player.Faction != obj.Faction)
|
||||
obj.Actor ! Mountable.TryMount(player, 0)
|
||||
val reply1a = receiveOne(200 milliseconds)
|
||||
obj.Actor.tell(Mountable.TryMount(player, 1), probe.ref)
|
||||
val reply1a = probe.receiveOne(200 milliseconds)
|
||||
assert(reply1a.isInstanceOf[Mountable.MountMessages])
|
||||
val reply1b = reply1a.asInstanceOf[Mountable.MountMessages]
|
||||
assert(reply1b.player == player)
|
||||
assert(reply1b.response.isInstanceOf[Mountable.CanMount])
|
||||
assert(obj.Seats(0).Occupant.contains(player))
|
||||
assert(obj.Seats(0).occupant.contains(player))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
// Copyright (c) 2020 PSForever
|
||||
package objects
|
||||
|
||||
import net.psforever.objects.avatar.Avatar
|
||||
import net.psforever.objects.{GlobalDefinitions, Player, Tool, Vehicle}
|
||||
import net.psforever.objects.definition.VehicleDefinition
|
||||
import net.psforever.objects.serverobject.environment._
|
||||
import net.psforever.objects.serverobject.terminals.{Terminal, TerminalDefinition}
|
||||
import net.psforever.objects.vital.Vitality
|
||||
import net.psforever.packet.game.objectcreate.ObjectClass
|
||||
import net.psforever.types.Vector3
|
||||
import net.psforever.types._
|
||||
import org.specs2.mutable.Specification
|
||||
|
||||
class EnvironmentCollisionTest extends Specification {
|
||||
|
|
@ -203,6 +204,26 @@ class EnvironmentAttributeTest extends Specification {
|
|||
EnvironmentAttribute.Death.canInteractWith(obj) mustEqual false
|
||||
}
|
||||
}
|
||||
|
||||
"GantryDenialField" should {
|
||||
"interact with players" in {
|
||||
val obj = Player(Avatar(0, "test", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
|
||||
obj.Spawn()
|
||||
EnvironmentAttribute.GantryDenialField.canInteractWith(obj) mustEqual true
|
||||
}
|
||||
|
||||
"not interact with dead players" in {
|
||||
val obj = Player(Avatar(0, "test", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
|
||||
obj.isAlive mustEqual false
|
||||
EnvironmentAttribute.GantryDenialField.canInteractWith(obj) mustEqual false
|
||||
}
|
||||
|
||||
"not interact with an object that is not a player" in {
|
||||
val obj = Tool(GlobalDefinitions.suppressor)
|
||||
obj.isInstanceOf[Vitality] mustEqual false
|
||||
EnvironmentAttribute.GantryDenialField.canInteractWith(obj) mustEqual false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class SeaLevelTest extends Specification {
|
||||
|
|
@ -281,6 +302,17 @@ class PoolTest extends Specification {
|
|||
}
|
||||
}
|
||||
|
||||
class GantryDenialField extends Specification {
|
||||
val square = DeepSquare(0, 1, 10, 10, 1)
|
||||
|
||||
"GantryDenialField" should {
|
||||
"always has the environmental attribute of 'GantryDenialField'" in {
|
||||
val obj = GantryDenialField(PlanetSideGUID(0), 0, square)
|
||||
obj.attribute mustEqual EnvironmentAttribute.GantryDenialField
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class PieceOfEnvironmentTest extends Specification {
|
||||
"PieceOfEnvironment" should {
|
||||
import PieceOfEnvironment.testStepIntoInteraction
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ import net.psforever.objects.definition.ToolDefinition
|
|||
import net.psforever.objects.guid.NumberPoolHub
|
||||
import net.psforever.objects.guid.source.MaxNumberSource
|
||||
import net.psforever.objects.serverobject.CommonMessages
|
||||
import net.psforever.objects.serverobject.mount.Mountable
|
||||
import net.psforever.objects.serverobject.mount.{MountInfo, Mountable}
|
||||
import net.psforever.objects.serverobject.structures.{Building, StructureType}
|
||||
import net.psforever.objects.serverobject.turret._
|
||||
import net.psforever.objects.zones.{Zone, ZoneMap}
|
||||
|
|
@ -31,7 +31,7 @@ class FacilityTurretTest extends Specification {
|
|||
obj.ReserveAmmunition mustEqual false
|
||||
obj.FactionLocked mustEqual true
|
||||
obj.MaxHealth mustEqual 0
|
||||
obj.MountPoints mustEqual mutable.HashMap.empty[Int, Int]
|
||||
obj.MountPoints.isEmpty mustEqual true
|
||||
}
|
||||
|
||||
"construct" in {
|
||||
|
|
@ -44,9 +44,8 @@ class FacilityTurretTest extends Specification {
|
|||
ko
|
||||
}
|
||||
obj.Seats.size mustEqual 1
|
||||
obj.Seats(0).ControlledWeapon.contains(1) mustEqual true
|
||||
obj.MountPoints.size mustEqual 1
|
||||
obj.MountPoints(1) mustEqual 0
|
||||
obj.MountPoints.get(1).contains(MountInfo(0, Vector3.Zero)) mustEqual true
|
||||
obj.Health mustEqual 3600
|
||||
obj.Upgrade mustEqual TurretUpgrade.None
|
||||
obj.Health = 360
|
||||
|
|
@ -110,12 +109,12 @@ class FacilityTurretControl2Test extends ActorTest {
|
|||
bldg.Faction = PlanetSideEmpire.TR
|
||||
|
||||
"FacilityTurretControl" should {
|
||||
"seat on faction affiliation when FactionLock is true" in {
|
||||
"mount on faction affiliation when FactionLock is true" in {
|
||||
assert(player.Faction == PlanetSideEmpire.TR)
|
||||
assert(obj.Faction == PlanetSideEmpire.TR)
|
||||
assert(obj.Definition.FactionLocked)
|
||||
|
||||
obj.Actor ! Mountable.TryMount(player, 0)
|
||||
obj.Actor ! Mountable.TryMount(player, 1)
|
||||
val reply = receiveOne(300 milliseconds)
|
||||
reply match {
|
||||
case msg: Mountable.MountMessages =>
|
||||
|
|
@ -141,7 +140,7 @@ class FacilityTurretControl3Test extends ActorTest {
|
|||
assert(obj.Faction == PlanetSideEmpire.NEUTRAL)
|
||||
assert(obj.Definition.FactionLocked)
|
||||
|
||||
obj.Actor ! Mountable.TryMount(player, 0)
|
||||
obj.Actor ! Mountable.TryMount(player, 1)
|
||||
val reply = receiveOne(300 milliseconds)
|
||||
reply match {
|
||||
case msg: Mountable.MountMessages =>
|
||||
|
|
@ -155,9 +154,7 @@ class FacilityTurretControl3Test extends ActorTest {
|
|||
|
||||
class FacilityTurretControl4Test extends ActorTest {
|
||||
val player = Player(Avatar(0, "", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
|
||||
val objDef = new FacilityTurretDefinition(480)
|
||||
objDef.FactionLocked = false
|
||||
val obj = FacilityTurret(objDef)
|
||||
val obj = FacilityTurret(GlobalDefinitions.vanu_sentry_turret)
|
||||
obj.GUID = PlanetSideGUID(1)
|
||||
obj.Actor = system.actorOf(Props(classOf[FacilityTurretControl], obj), "turret-control")
|
||||
val bldg = Building("Building", guid = 0, map_id = 0, Zone.Nowhere, StructureType.Building)
|
||||
|
|
@ -169,7 +166,7 @@ class FacilityTurretControl4Test extends ActorTest {
|
|||
assert(obj.Faction == PlanetSideEmpire.NEUTRAL)
|
||||
assert(!obj.Definition.FactionLocked)
|
||||
|
||||
obj.Actor ! Mountable.TryMount(player, 0)
|
||||
obj.Actor ! Mountable.TryMount(player, 1)
|
||||
val reply = receiveOne(300 milliseconds)
|
||||
reply match {
|
||||
case msg: Mountable.MountMessages =>
|
||||
|
|
|
|||
|
|
@ -5,10 +5,9 @@ import akka.actor.{Actor, ActorRef, Props}
|
|||
import base.ActorTest
|
||||
import net.psforever.objects.Player
|
||||
import net.psforever.objects.avatar.Avatar
|
||||
import net.psforever.objects.definition.{ObjectDefinition, SeatDefinition}
|
||||
import net.psforever.objects.serverobject.mount.{Mountable, MountableBehavior}
|
||||
import net.psforever.objects.definition.ObjectDefinition
|
||||
import net.psforever.objects.serverobject.mount._
|
||||
import net.psforever.objects.serverobject.PlanetSideServerObject
|
||||
import net.psforever.objects.vehicles.Seat
|
||||
import net.psforever.types.{CharacterGender, CharacterVoice, PlanetSideEmpire, PlanetSideGUID}
|
||||
|
||||
import scala.concurrent.duration.Duration
|
||||
|
|
@ -39,7 +38,7 @@ class MountableControl2Test extends ActorTest {
|
|||
assert(reply2.response.isInstanceOf[Mountable.CanMount])
|
||||
val reply3 = reply2.response.asInstanceOf[Mountable.CanMount]
|
||||
assert(reply3.obj == obj)
|
||||
assert(reply3.seat_num == 0)
|
||||
assert(reply3.seat_number == 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -62,35 +61,25 @@ class MountableControl3Test extends ActorTest {
|
|||
assert(reply2.response.isInstanceOf[Mountable.CanNotMount])
|
||||
val reply3 = reply2.response.asInstanceOf[Mountable.CanNotMount]
|
||||
assert(reply3.obj == obj)
|
||||
assert(reply3.seat_num == 0)
|
||||
assert(reply3.mount_point == 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
object MountableTest {
|
||||
class MountableTestObject extends PlanetSideServerObject with Mountable {
|
||||
private val seats: Map[Int, Seat] = Map(0 -> new Seat(new SeatDefinition()))
|
||||
def Seats: Map[Int, Seat] = seats
|
||||
def Seat(seatNum: Int): Option[Seat] = seats.get(seatNum)
|
||||
def MountPoints: Map[Int, Int] = Map(1 -> 0)
|
||||
def GetSeatFromMountPoint(mount: Int): Option[Int] = MountPoints.get(mount)
|
||||
def PassengerInSeat(user: Player): Option[Int] = {
|
||||
if (seats(0).Occupant.contains(user)) {
|
||||
Some(0)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
seats += 0 -> new Seat(new SeatDefinition())
|
||||
GUID = PlanetSideGUID(1)
|
||||
//eh whatever
|
||||
def Faction = PlanetSideEmpire.TR
|
||||
def Definition: ObjectDefinition = null
|
||||
def Definition = new ObjectDefinition(1) with MountableDefinition {
|
||||
MountPoints += 0 -> MountInfo(0)
|
||||
}
|
||||
}
|
||||
|
||||
class MountableTestControl(obj: PlanetSideServerObject with Mountable)
|
||||
extends Actor
|
||||
with MountableBehavior.Mount
|
||||
with MountableBehavior.Dismount {
|
||||
with MountableBehavior {
|
||||
override def MountableObject = obj
|
||||
|
||||
def receive: Receive = mountBehavior.orElse(dismountBehavior)
|
||||
|
|
|
|||
100
src/test/scala/objects/OrbitalShuttlePadTest.scala
Normal file
100
src/test/scala/objects/OrbitalShuttlePadTest.scala
Normal file
|
|
@ -0,0 +1,100 @@
|
|||
// Copyright (c) 2021 PSForever
|
||||
package objects
|
||||
|
||||
import akka.actor.{ActorRef, Props}
|
||||
import akka.routing.RandomPool
|
||||
import akka.testkit.TestProbe
|
||||
import base.FreedContextActorTest
|
||||
import net.psforever.actors.zone.BuildingActor
|
||||
import net.psforever.objects.guid.actor.UniqueNumberSystem
|
||||
import net.psforever.objects.{GlobalDefinitions, Vehicle}
|
||||
import net.psforever.objects.guid.{NumberPoolHub, TaskResolver}
|
||||
import net.psforever.objects.guid.source.MaxNumberSource
|
||||
import net.psforever.objects.serverobject.doors.Door
|
||||
import net.psforever.objects.serverobject.shuttle.{OrbitalShuttle, OrbitalShuttlePad, OrbitalShuttlePadControl, ShuttleAmenity}
|
||||
import net.psforever.objects.serverobject.structures.{Building, StructureType}
|
||||
import net.psforever.objects.zones.{Zone, ZoneMap, ZoneVehicleActor}
|
||||
import net.psforever.services.{InterstellarClusterService, Service, ServiceManager}
|
||||
import net.psforever.services.galaxy.GalaxyService
|
||||
import net.psforever.services.hart.HartService
|
||||
import net.psforever.types.PlanetSideEmpire
|
||||
|
||||
import scala.collection.concurrent.TrieMap
|
||||
import scala.collection.mutable.ListBuffer
|
||||
import scala.concurrent.duration._
|
||||
|
||||
class OrbitalShuttlePadControltest extends FreedContextActorTest {
|
||||
import akka.actor.typed.scaladsl.adapter._
|
||||
system.spawn(InterstellarClusterService(Nil), InterstellarClusterService.InterstellarClusterServiceKey.id)
|
||||
val services = ServiceManager.boot(system)
|
||||
services ! ServiceManager.Register(Props[GalaxyService](), "galaxy")
|
||||
services ! ServiceManager.Register(Props[HartService](), "hart")
|
||||
expectNoMessage(1000 milliseconds)
|
||||
var buildingMap = new TrieMap[Int, Building]()
|
||||
val vehicles = ListBuffer[Vehicle]()
|
||||
val guid = new NumberPoolHub(new MaxNumberSource(max = 15))
|
||||
guid.AddPool("dynamic", (11 to 15).toList)
|
||||
val catchall = new TestProbe(system).ref
|
||||
val resolver = context.actorOf(RandomPool(1).props(Props[TaskResolver]()), s"test-taskResolver")
|
||||
val uns = context.actorOf(
|
||||
RandomPool(1).props(
|
||||
Props(classOf[UniqueNumberSystem], guid, UniqueNumberSystem.AllocateNumberPoolActors(this.guid))
|
||||
),
|
||||
s"test-uns"
|
||||
)
|
||||
val zone = new Zone("test", new ZoneMap("test-map"), 0) {
|
||||
val transport: ActorRef = context.actorOf(Props(classOf[ZoneVehicleActor], this, vehicles), s"zone-test-vehicles")
|
||||
|
||||
override def SetupNumberPools() = {}
|
||||
GUID(guid)
|
||||
override def GUID = { uns }
|
||||
override def AvatarEvents = catchall
|
||||
override def LocalEvents = catchall
|
||||
override def VehicleEvents = catchall
|
||||
override def Activity = catchall
|
||||
override def Transport = { transport }
|
||||
override def Vehicles = { vehicles.toList }
|
||||
override def Buildings = { buildingMap.toMap }
|
||||
override def tasks = { resolver }
|
||||
}
|
||||
val building = new Building(
|
||||
name = "test-orbital-building-tr",
|
||||
building_guid = 1,
|
||||
map_id = 0,
|
||||
zone,
|
||||
StructureType.Building,
|
||||
GlobalDefinitions.orbital_building_tr
|
||||
)
|
||||
building.Faction = PlanetSideEmpire.TR
|
||||
buildingMap += 1 -> building
|
||||
building.Actor = context.spawn(BuildingActor(zone, building), "test-orbital-building-tr-control").toClassic
|
||||
building.Invalidate()
|
||||
guid.register(building, number = 1)
|
||||
|
||||
(3 to 10).foreach { index =>
|
||||
val door = Door(GlobalDefinitions.gr_door_mb_orb)
|
||||
building.Amenities = door
|
||||
door.Actor = catchall
|
||||
guid.register(door, index)
|
||||
}
|
||||
|
||||
val pad = new OrbitalShuttlePad(GlobalDefinitions.obbasemesh)
|
||||
guid.register(pad, number = 2)
|
||||
pad.Actor = system.actorOf(Props(classOf[OrbitalShuttlePadControl], pad), "test-shuttle-pad")
|
||||
building.Amenities = pad
|
||||
|
||||
"OrbitalShuttlePad" should {
|
||||
"startup and create the shuttle" in {
|
||||
assert(building.Amenities.size == 9)
|
||||
assert(vehicles.isEmpty)
|
||||
pad.Actor ! Service.Startup()
|
||||
expectNoMessage(max = 5 seconds)
|
||||
assert(building.Amenities.size == 10)
|
||||
assert(vehicles.size == 1)
|
||||
assert(building.Amenities(9).isInstanceOf[ShuttleAmenity]) //the shuttle is an amenity of the building now
|
||||
assert(vehicles.head.isInstanceOf[OrbitalShuttle]) //here is the shuttle
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
object OrbitalShuttlePadTest { /* intentionally blank */ }
|
||||
274
src/test/scala/objects/OrbitalShuttleTest.scala
Normal file
274
src/test/scala/objects/OrbitalShuttleTest.scala
Normal file
|
|
@ -0,0 +1,274 @@
|
|||
// Copyright (c) 2021 PSForever
|
||||
package objects
|
||||
|
||||
import net.psforever.objects.{GlobalDefinitions, Player, Vehicle}
|
||||
import net.psforever.objects.avatar.Avatar
|
||||
import net.psforever.objects.serverobject.shuttle.OrbitalShuttle
|
||||
import net.psforever.objects.vehicles.AccessPermissionGroup
|
||||
import net.psforever.types.{CharacterGender, CharacterVoice, PlanetSideEmpire}
|
||||
import org.specs2.mutable.Specification
|
||||
|
||||
class OrbitalShuttleTest extends Specification {
|
||||
val testAvatar1 = Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)
|
||||
val testAvatar2 = Avatar(1, "TestCharacter2", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)
|
||||
val testAvatar3 = Avatar(2, "TestCharacter3", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)
|
||||
|
||||
"OrbitalShuttle" should {
|
||||
"construct (proper definition)" in {
|
||||
new OrbitalShuttle(GlobalDefinitions.orbital_shuttle)
|
||||
ok
|
||||
}
|
||||
|
||||
"construct (any type of vehicle)" in {
|
||||
new OrbitalShuttle(GlobalDefinitions.fury)
|
||||
ok
|
||||
}
|
||||
|
||||
"only use known mount points" in {
|
||||
val fury = new OrbitalShuttle(GlobalDefinitions.fury)
|
||||
fury.MountPoints.get(0).isEmpty mustEqual true
|
||||
fury.MountPoints.get(1).nonEmpty mustEqual true
|
||||
fury.MountPoints.get(2).nonEmpty mustEqual true
|
||||
fury.MountPoints.get(3).isEmpty mustEqual true
|
||||
|
||||
val shuttle = new OrbitalShuttle(GlobalDefinitions.orbital_shuttle)
|
||||
shuttle.MountPoints.get(0).isEmpty mustEqual true
|
||||
shuttle.MountPoints.get(1).nonEmpty mustEqual true
|
||||
shuttle.MountPoints.get(2).nonEmpty mustEqual true
|
||||
shuttle.MountPoints.get(3).nonEmpty mustEqual true
|
||||
shuttle.MountPoints.get(4).nonEmpty mustEqual true
|
||||
shuttle.MountPoints.get(5).nonEmpty mustEqual true
|
||||
shuttle.MountPoints.get(6).nonEmpty mustEqual true
|
||||
shuttle.MountPoints.get(7).nonEmpty mustEqual true
|
||||
shuttle.MountPoints.get(8).nonEmpty mustEqual true
|
||||
shuttle.MountPoints.get(9).isEmpty mustEqual true
|
||||
}
|
||||
|
||||
"will only discover unoccupied seats" in {
|
||||
val fury1 = new OrbitalShuttle(GlobalDefinitions.fury)
|
||||
val player1 = Player(testAvatar1)
|
||||
fury1.GetSeatFromMountPoint(mountPoint = 1) match {
|
||||
case Some(seatNumber) => fury1.Seat(seatNumber) match {
|
||||
case Some(seat) => seat.mount(player1).contains(player1) mustEqual true
|
||||
case _ => ko
|
||||
}
|
||||
case _ => ko
|
||||
}
|
||||
fury1.GetSeatFromMountPoint(mountPoint = 1).isEmpty mustEqual true //seat is occupied
|
||||
|
||||
//comparison with normal Vehicle
|
||||
val fury2 = new Vehicle(GlobalDefinitions.fury)
|
||||
val player2 = Player(testAvatar2)
|
||||
fury2.GetSeatFromMountPoint(mountPoint = 1) match {
|
||||
case Some(seatNumber) => fury2.Seat(seatNumber) match {
|
||||
case Some(seat) => seat.mount(player2).contains(player2) mustEqual true
|
||||
case _ => ko
|
||||
}
|
||||
case _ => ko
|
||||
}
|
||||
fury2.GetSeatFromMountPoint(mountPoint = 1).contains(0) mustEqual true //even though seat is occupied
|
||||
}
|
||||
|
||||
"have a fixed number of normal seats (using normal definition)" in {
|
||||
val fury1 = new OrbitalShuttle(GlobalDefinitions.fury)
|
||||
fury1.Seats.size mustEqual 1
|
||||
fury1.MountPoints.size mustEqual 2
|
||||
val player1 = Player(testAvatar1)
|
||||
fury1.GetSeatFromMountPoint(mountPoint = 1) match {
|
||||
case Some(seatNumber) => fury1.Seat(seatNumber) match {
|
||||
case Some(seat) => seat.mount(player1).contains(player1) mustEqual true
|
||||
case _ => ko
|
||||
}
|
||||
case _ => ko
|
||||
}
|
||||
fury1.Seats.size mustEqual 1
|
||||
fury1.MountPoints.size mustEqual 2
|
||||
val player2 = Player(testAvatar2)
|
||||
fury1.GetSeatFromMountPoint(mountPoint = 1).isEmpty mustEqual true
|
||||
fury1.Seats.size mustEqual 1
|
||||
fury1.MountPoints.size mustEqual 2
|
||||
|
||||
//congruent with normal Vehicle
|
||||
val fury2 = new Vehicle(GlobalDefinitions.fury)
|
||||
fury2.Seats.size mustEqual 1
|
||||
fury2.MountPoints.size mustEqual 2
|
||||
val player3 = Player(testAvatar3)
|
||||
fury2.GetSeatFromMountPoint(mountPoint = 1) match {
|
||||
case Some(seatNumber) => fury2.Seat(seatNumber) match {
|
||||
case Some(seat) => seat.mount(player3).contains(player3) mustEqual true
|
||||
case _ => ko
|
||||
}
|
||||
case _ => ko
|
||||
}
|
||||
fury2.Seats.size mustEqual 1
|
||||
fury2.MountPoints.size mustEqual 2
|
||||
fury2.GetSeatFromMountPoint(mountPoint = 1) match {
|
||||
case Some(seatNumber) => fury2.Seat(seatNumber) match {
|
||||
case Some(seat) => seat.mount(player2).contains(player2) mustEqual false
|
||||
case _ => ko
|
||||
}
|
||||
case _ => ko
|
||||
}
|
||||
fury2.Seats.size mustEqual 1
|
||||
fury2.MountPoints.size mustEqual 2
|
||||
}
|
||||
|
||||
"create seats as needed (with appropriate definition)" in {
|
||||
GlobalDefinitions.fury
|
||||
.Seats(0).occupancy == 1 mustEqual true
|
||||
GlobalDefinitions.orbital_shuttle
|
||||
.Seats(0).occupancy > 1 mustEqual true
|
||||
|
||||
val shuttle1 = new OrbitalShuttle(GlobalDefinitions.orbital_shuttle)
|
||||
shuttle1.Seats.size mustEqual 1
|
||||
shuttle1.MountPoints.size mustEqual 8
|
||||
val player1 = Player(testAvatar1)
|
||||
shuttle1.GetSeatFromMountPoint(mountPoint = 1) match {
|
||||
case Some(seatNumber) => shuttle1.Seat(seatNumber) match {
|
||||
case Some(seat) => seat.mount(player1).contains(player1) mustEqual true
|
||||
case _ => ko
|
||||
}
|
||||
case _ => ko
|
||||
}
|
||||
shuttle1.Seats.size mustEqual 1
|
||||
shuttle1.MountPoints.size mustEqual 8
|
||||
val player2 = Player(testAvatar2)
|
||||
shuttle1.GetSeatFromMountPoint(mountPoint = 1) match {
|
||||
case Some(seatNumber) => shuttle1.Seat(seatNumber) match {
|
||||
case Some(seat) => seat.mount(player2).contains(player2) mustEqual true
|
||||
case _ => ko
|
||||
}
|
||||
case _ => ko
|
||||
}
|
||||
shuttle1.Seats.size mustEqual 2
|
||||
shuttle1.MountPoints.size mustEqual 8
|
||||
|
||||
//comparison with normal Vehicle
|
||||
val shuttle2 = new Vehicle(GlobalDefinitions.orbital_shuttle)
|
||||
shuttle2.Seats.size mustEqual 1
|
||||
shuttle2.MountPoints.size mustEqual 8
|
||||
val player3 = Player(testAvatar3)
|
||||
shuttle2.GetSeatFromMountPoint(mountPoint = 1) match {
|
||||
case Some(seatNumber) => shuttle2.Seat(seatNumber) match {
|
||||
case Some(seat) => seat.mount(player3).contains(player3) mustEqual true
|
||||
case _ => ko
|
||||
}
|
||||
case _ => ko
|
||||
}
|
||||
shuttle2.Seats.size mustEqual 1
|
||||
shuttle2.MountPoints.size mustEqual 8
|
||||
shuttle2.GetSeatFromMountPoint(mountPoint = 1) match {
|
||||
case Some(seatNumber) => shuttle2.Seat(seatNumber) match {
|
||||
case Some(seat) => seat.mount(player2).contains(player2) mustEqual false
|
||||
case _ => ko
|
||||
}
|
||||
case _ => ko
|
||||
}
|
||||
shuttle2.Seats.size mustEqual 1
|
||||
shuttle2.MountPoints.size mustEqual 8
|
||||
}
|
||||
|
||||
"not create new seats out of order" in {
|
||||
val shuttle = new OrbitalShuttle(GlobalDefinitions.orbital_shuttle)
|
||||
val player1 = Player(testAvatar1)
|
||||
shuttle.Seat(seatNumber = 0) match {
|
||||
case Some(seat) => seat.mount(player1).contains(player1) mustEqual true
|
||||
case _ => ko
|
||||
}
|
||||
val player2 = Player(testAvatar2)
|
||||
shuttle.Seat(seatNumber = 2).isEmpty mustEqual true
|
||||
}
|
||||
|
||||
"recognize proper seating arrangements" in {
|
||||
val shuttle = new OrbitalShuttle(GlobalDefinitions.orbital_shuttle)
|
||||
val player1 = Player(testAvatar1)
|
||||
shuttle.Seat(seatNumber = 0) match {
|
||||
case Some(seat) => seat.mount(player1).contains(player1) mustEqual true
|
||||
case _ => ko
|
||||
}
|
||||
val player2 = Player(testAvatar2)
|
||||
shuttle.Seat(seatNumber = 1) match {
|
||||
case Some(seat) => seat.mount(player2).contains(player2) mustEqual true
|
||||
case _ => ko
|
||||
}
|
||||
val player3 = Player(testAvatar3)
|
||||
shuttle.Seat(seatNumber = 2) match {
|
||||
case Some(seat) => seat.mount(player3).contains(player3) mustEqual true
|
||||
case _ => ko
|
||||
}
|
||||
shuttle.PassengerInSeat(player1).contains(0) mustEqual true
|
||||
shuttle.PassengerInSeat(player2).contains(1) mustEqual true
|
||||
shuttle.PassengerInSeat(player3).contains(2) mustEqual true
|
||||
}
|
||||
|
||||
"retain created seats after dismount" in {
|
||||
val shuttle = new OrbitalShuttle(GlobalDefinitions.orbital_shuttle)
|
||||
val player1 = Player(testAvatar1)
|
||||
shuttle.Seat(seatNumber = 0) match {
|
||||
case Some(seat) => seat.mount(player1).contains(player1) mustEqual true
|
||||
case _ => ko
|
||||
}
|
||||
val player2 = Player(testAvatar2)
|
||||
shuttle.Seat(seatNumber = 1) match {
|
||||
case Some(seat) => seat.mount(player2).contains(player2) mustEqual true
|
||||
case _ => ko
|
||||
}
|
||||
val player3 = Player(testAvatar3)
|
||||
shuttle.Seat(seatNumber = 2) match {
|
||||
case Some(seat) => seat.mount(player3).contains(player3) mustEqual true
|
||||
case _ => ko
|
||||
}
|
||||
|
||||
shuttle.Seats(0).isOccupied mustEqual true
|
||||
shuttle.Seats(1).isOccupied mustEqual true
|
||||
shuttle.Seats(2).isOccupied mustEqual true
|
||||
shuttle.Seats.size mustEqual 3
|
||||
//IMPORTANT TO NOTE
|
||||
shuttle.GetSeatFromMountPoint(mountPoint = 1).contains(3) mustEqual true //new seat
|
||||
|
||||
shuttle.Seat(seatNumber = 1) match {
|
||||
case Some(seat) => seat.unmount(player2).isEmpty mustEqual true
|
||||
case _ => ko
|
||||
}
|
||||
shuttle.Seats(0).isOccupied mustEqual true
|
||||
shuttle.Seats(1).isOccupied mustEqual false
|
||||
shuttle.Seats(2).isOccupied mustEqual true
|
||||
shuttle.Seats.size mustEqual 3
|
||||
//IMPORTANT TO NOTE
|
||||
shuttle.GetSeatFromMountPoint(mountPoint = 1).contains(1) mustEqual true //reuse newly unoccupied seat
|
||||
}
|
||||
|
||||
"consider all seats as passenger seats" in {
|
||||
val fury1 = Vehicle(GlobalDefinitions.fury)
|
||||
fury1.SeatPermissionGroup(seatNumber = 0).contains(AccessPermissionGroup.Driver)
|
||||
fury1.SeatPermissionGroup(seatNumber = 1).isEmpty mustEqual true
|
||||
|
||||
val fury2 = Vehicle(GlobalDefinitions.orbital_shuttle)
|
||||
fury2.SeatPermissionGroup(seatNumber = 0).contains(AccessPermissionGroup.Driver)
|
||||
fury2.SeatPermissionGroup(seatNumber = 1).isEmpty mustEqual true
|
||||
|
||||
val shuttle1 = new OrbitalShuttle(GlobalDefinitions.fury)
|
||||
shuttle1.SeatPermissionGroup(seatNumber = 0).contains(AccessPermissionGroup.Passenger)
|
||||
shuttle1.SeatPermissionGroup(seatNumber = 1).isEmpty mustEqual true
|
||||
|
||||
val shuttle2 = new OrbitalShuttle(GlobalDefinitions.orbital_shuttle)
|
||||
shuttle2.SeatPermissionGroup(seatNumber = 0).contains(AccessPermissionGroup.Passenger)
|
||||
shuttle2.SeatPermissionGroup(seatNumber = 1).contains(AccessPermissionGroup.Passenger) //seat does not exist yet
|
||||
shuttle2.SeatPermissionGroup(seatNumber = 2).isEmpty mustEqual true
|
||||
val player1 = Player(testAvatar1)
|
||||
shuttle2.Seat(seatNumber = 0) match {
|
||||
case Some(seat) => seat.mount(player1).contains(player1) mustEqual true
|
||||
case _ => ko
|
||||
}
|
||||
val player2 = Player(testAvatar2)
|
||||
shuttle2.Seat(seatNumber = 1) match {
|
||||
case Some(seat) => seat.mount(player2).contains(player2) mustEqual true
|
||||
case _ => ko
|
||||
}
|
||||
shuttle2.SeatPermissionGroup(seatNumber = 0).contains(AccessPermissionGroup.Passenger)
|
||||
shuttle2.SeatPermissionGroup(seatNumber = 1).contains(AccessPermissionGroup.Passenger)
|
||||
shuttle2.SeatPermissionGroup(seatNumber = 2).contains(AccessPermissionGroup.Passenger) //seat does not exist yet
|
||||
shuttle2.SeatPermissionGroup(seatNumber = 3).isEmpty mustEqual true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -660,7 +660,7 @@ class PlayerControlDeathSeatedTest extends ActorTest {
|
|||
"handle death when seated (in something)" in {
|
||||
player2.Health = player2.Definition.DamageDestroysAt + 1 //initial state manip
|
||||
player2.VehicleSeated = vehicle.GUID //initial state manip, anything
|
||||
vehicle.Seats(0).Occupant = player2
|
||||
vehicle.Seats(0).mount(player2)
|
||||
player2.Armor = 0 //initial state manip
|
||||
assert(player2.Health > player2.Definition.DamageDestroysAt)
|
||||
assert(player2.isAlive)
|
||||
|
|
|
|||
|
|
@ -336,7 +336,7 @@ class PlayerTest extends Specification {
|
|||
} //free hand
|
||||
}
|
||||
|
||||
"seat in a vehicle" in {
|
||||
"mount in a vehicle" in {
|
||||
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
|
||||
obj.VehicleSeated.isEmpty mustEqual true
|
||||
obj.VehicleSeated = PlanetSideGUID(65)
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@ package objects
|
|||
|
||||
import akka.actor.{Actor, Props}
|
||||
import akka.testkit.TestProbe
|
||||
import base.ActorTest
|
||||
import net.psforever.actors.zone.{BuildingActor, ZoneActor}
|
||||
import base.{ActorTest, FreedContextActorTest}
|
||||
import net.psforever.actors.zone.BuildingActor
|
||||
import net.psforever.objects.guid.NumberPoolHub
|
||||
import net.psforever.objects.guid.source.MaxNumberSource
|
||||
import net.psforever.objects.serverobject.CommonMessages
|
||||
|
|
@ -17,9 +17,11 @@ import net.psforever.packet.game.UseItemMessage
|
|||
import net.psforever.types._
|
||||
import org.specs2.mutable.Specification
|
||||
import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage}
|
||||
import akka.actor.typed.scaladsl.adapter._
|
||||
import net.psforever.objects.avatar.Avatar
|
||||
import net.psforever.services.{InterstellarClusterService, ServiceManager}
|
||||
import net.psforever.services.galaxy.GalaxyService
|
||||
|
||||
import scala.collection.concurrent.TrieMap
|
||||
import scala.concurrent.duration._
|
||||
|
||||
class ResourceSiloTest extends Specification {
|
||||
|
|
@ -145,51 +147,60 @@ class ResourceSiloControlStartupMessageSomeTest extends ActorTest {
|
|||
}
|
||||
}
|
||||
|
||||
class ResourceSiloControlUseTest extends ActorTest {
|
||||
val guid = new NumberPoolHub(new MaxNumberSource(10))
|
||||
val map = new ZoneMap("test")
|
||||
val zone = new Zone("test", map, 0) {
|
||||
class ResourceSiloControlUseTest extends FreedContextActorTest {
|
||||
import akka.actor.typed.scaladsl.adapter._
|
||||
system.spawn(InterstellarClusterService(Nil), InterstellarClusterService.InterstellarClusterServiceKey.id)
|
||||
ServiceManager.boot(system) ! ServiceManager.Register(Props[GalaxyService](), "galaxy")
|
||||
expectNoMessage(1000 milliseconds)
|
||||
var buildingMap = new TrieMap[Int, Building]()
|
||||
val guid = new NumberPoolHub(new MaxNumberSource(max = 10))
|
||||
val player = Player(Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
|
||||
val ant = Vehicle(GlobalDefinitions.ant)
|
||||
val silo = new ResourceSilo()
|
||||
val catchall = new TestProbe(system).ref
|
||||
val zone = new Zone("test", new ZoneMap("test-map"), 0) {
|
||||
override def SetupNumberPools() = {}
|
||||
GUID(guid)
|
||||
override def AvatarEvents = catchall
|
||||
override def LocalEvents = catchall
|
||||
override def VehicleEvents = catchall
|
||||
override def Activity = catchall
|
||||
override def Vehicles = List(ant)
|
||||
override def Buildings = { buildingMap.toMap }
|
||||
}
|
||||
zone.actor = system.spawnAnonymous(ZoneActor(zone))
|
||||
val building = new Building(
|
||||
"Building",
|
||||
building_guid = 0,
|
||||
name = "integ-fac-test-building",
|
||||
building_guid = 6,
|
||||
map_id = 0,
|
||||
zone,
|
||||
StructureType.Building,
|
||||
GlobalDefinitions.building
|
||||
) //guid=1
|
||||
building.Actor = TestProbe("building-actor").ref
|
||||
StructureType.Facility,
|
||||
GlobalDefinitions.cryo_facility
|
||||
)
|
||||
buildingMap += 6 -> building
|
||||
building.Actor = context.spawn(BuildingActor(zone, building), "integ-fac-test-building-control").toClassic
|
||||
building.Invalidate()
|
||||
|
||||
val obj = ResourceSilo() //guid=2
|
||||
obj.Actor = system.actorOf(Props(classOf[ResourceSiloControl], obj), "test-silo")
|
||||
obj.Owner = building
|
||||
obj.Actor ! "startup"
|
||||
guid.register(player, number = 1)
|
||||
guid.register(ant, number = 2)
|
||||
guid.register(silo, number = 5)
|
||||
guid.register(building, number = 6)
|
||||
|
||||
val player = Player(
|
||||
new Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)
|
||||
) //guid=3
|
||||
val vehicle = Vehicle(GlobalDefinitions.ant) //guid=4
|
||||
val probe = new TestProbe(system)
|
||||
|
||||
guid.register(building, 1)
|
||||
guid.register(obj, 2)
|
||||
guid.register(player, 3)
|
||||
guid.register(vehicle, 4)
|
||||
expectNoMessage(200 milliseconds)
|
||||
zone.Transport ! Zone.Vehicle.Spawn(vehicle)
|
||||
vehicle.Seats(0).Occupant = player
|
||||
player.VehicleSeated = vehicle.GUID
|
||||
expectNoMessage(200 milliseconds)
|
||||
system.stop(vehicle.Actor)
|
||||
vehicle.Actor = probe.ref
|
||||
val maxNtuCap = ant.Definition.MaxNtuCapacitor
|
||||
player.Spawn()
|
||||
ant.NtuCapacitor = maxNtuCap
|
||||
val probe = new TestProbe(system)
|
||||
ant.Actor = probe.ref
|
||||
ant.Zone = zone
|
||||
ant.Seats(0).mount(player)
|
||||
ant.DeploymentState = DriveState.Deployed
|
||||
building.Amenities = silo
|
||||
silo.Actor = system.actorOf(Props(classOf[ResourceSiloControl], silo), "test-silo")
|
||||
silo.Actor ! "startup"
|
||||
|
||||
"Resource silo" should {
|
||||
"respond when being used" in {
|
||||
expectNoMessage(1 seconds)
|
||||
obj.Actor ! CommonMessages.Use(ResourceSiloTest.player)
|
||||
silo.Actor ! CommonMessages.Use(ResourceSiloTest.player)
|
||||
|
||||
val reply = probe.receiveOne(2000 milliseconds)
|
||||
assert(reply match {
|
||||
|
|
|
|||
|
|
@ -226,6 +226,21 @@ class FacilityTurretObjectBuilderTest extends FreedContextActorTest {
|
|||
}
|
||||
}
|
||||
|
||||
class OrbitalShuttlePadObjectBuilderTest extends FreedContextActorTest {
|
||||
import net.psforever.objects.GlobalDefinitions.obbasemesh
|
||||
import net.psforever.objects.serverobject.shuttle.OrbitalShuttlePad
|
||||
"OrbitalShuttlePadObjectBuilder" should {
|
||||
"build" in {
|
||||
val hub = ServerObjectBuilderTest.NumberPoolHub
|
||||
val obj = ServerObjectBuilder(1, OrbitalShuttlePad.Constructor(Vector3.Zero, obbasemesh, Vector3.Zero)).Build(context, hub)
|
||||
assert(obj.isInstanceOf[OrbitalShuttlePad])
|
||||
assert(obj.HasGUID)
|
||||
assert(obj.GUID == PlanetSideGUID(1))
|
||||
assert(obj == hub(1).get)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
object ServerObjectBuilderTest {
|
||||
import net.psforever.objects.guid.source.MaxNumberSource
|
||||
def NumberPoolHub: NumberPoolHub = {
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
// Copyright (c) 2020 PSForever
|
||||
package objects
|
||||
|
||||
import akka.actor.Props
|
||||
import akka.actor.{ActorRef, Props}
|
||||
import akka.actor.typed.scaladsl.adapter._
|
||||
import akka.testkit.TestProbe
|
||||
import base.{ActorTest, FreedContextActorTest}
|
||||
|
|
@ -55,7 +55,7 @@ class VehicleControlPrepareForDeletionPassengerTest extends ActorTest {
|
|||
|
||||
vehicle.GUID = PlanetSideGUID(1)
|
||||
player1.GUID = PlanetSideGUID(2)
|
||||
vehicle.Seats(1).Occupant = player1 //passenger seat
|
||||
vehicle.Seats(1).mount(player1) //passenger mount
|
||||
player1.VehicleSeated = vehicle.GUID
|
||||
expectNoMessage(200 milliseconds)
|
||||
|
||||
|
|
@ -75,7 +75,7 @@ class VehicleControlPrepareForDeletionPassengerTest extends ActorTest {
|
|||
}
|
||||
)
|
||||
assert(player1.VehicleSeated.isEmpty)
|
||||
assert(vehicle.Seats(1).Occupant.isEmpty)
|
||||
assert(vehicle.Seats(1).occupant.isEmpty)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -109,17 +109,16 @@ class VehicleControlPrepareForDeletionMountedInTest extends FreedContextActorTes
|
|||
util().GUID = PlanetSideGUID(utilityId)
|
||||
utilityId += 1
|
||||
}
|
||||
vehicle.Seats(1).Occupant = player1 //passenger seat
|
||||
vehicle.Seats(1).mount(player1) //passenger mount
|
||||
player1.VehicleSeated = vehicle.GUID
|
||||
lodestar.Seats(0).Occupant = player2
|
||||
lodestar.Seats(0).mount(player2)
|
||||
player2.VehicleSeated = lodestar.GUID
|
||||
lodestar.CargoHolds(1).Occupant = vehicle
|
||||
lodestar.CargoHolds(1).mount(vehicle)
|
||||
vehicle.MountedIn = lodestar.GUID
|
||||
|
||||
val vehicleProbe = new TestProbe(system)
|
||||
zone.VehicleEvents = vehicleProbe.ref
|
||||
zone.Transport ! Zone.Vehicle.Spawn(lodestar) //can not fake this
|
||||
expectNoMessage(200 milliseconds)
|
||||
|
||||
"VehicleControl" should {
|
||||
"if mounted as cargo, self-eject when marked for deconstruction" in {
|
||||
|
|
@ -196,7 +195,7 @@ class VehicleControlPrepareForDeletionMountedInTest extends FreedContextActorTes
|
|||
}
|
||||
)
|
||||
assert(player1.VehicleSeated.isEmpty)
|
||||
assert(vehicle.Seats(1).Occupant.isEmpty)
|
||||
assert(vehicle.Seats(1).occupant.isEmpty)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -232,17 +231,16 @@ class VehicleControlPrepareForDeletionMountedCargoTest extends FreedContextActor
|
|||
util().GUID = PlanetSideGUID(utilityId)
|
||||
utilityId += 1
|
||||
}
|
||||
vehicle.Seats(1).Occupant = player1 //passenger seat
|
||||
vehicle.Seats(1).mount(player1) //passenger mount
|
||||
player1.VehicleSeated = vehicle.GUID
|
||||
lodestar.Seats(0).Occupant = player2
|
||||
lodestar.Seats(0).mount(player2)
|
||||
player2.VehicleSeated = lodestar.GUID
|
||||
lodestar.CargoHolds(1).Occupant = vehicle
|
||||
lodestar.CargoHolds(1).mount(vehicle)
|
||||
vehicle.MountedIn = lodestar.GUID
|
||||
|
||||
val vehicleProbe = new TestProbe(system)
|
||||
zone.VehicleEvents = vehicleProbe.ref
|
||||
zone.Transport ! Zone.Vehicle.Spawn(lodestar) //can not fake this
|
||||
expectNoMessage(200 milliseconds)
|
||||
|
||||
"VehicleControl" should {
|
||||
"if with mounted cargo, eject it when marked for deconstruction" in {
|
||||
|
|
@ -260,7 +258,7 @@ class VehicleControlPrepareForDeletionMountedCargoTest extends FreedContextActor
|
|||
}
|
||||
)
|
||||
assert(player2.VehicleSeated.isEmpty)
|
||||
assert(lodestar.Seats(0).Occupant.isEmpty)
|
||||
assert(lodestar.Seats(0).occupant.isEmpty)
|
||||
//cargo dismounting messages
|
||||
assert(
|
||||
vehicle_msg(1) match {
|
||||
|
|
@ -323,95 +321,92 @@ class VehicleControlPrepareForDeletionMountedCargoTest extends FreedContextActor
|
|||
}
|
||||
|
||||
class VehicleControlMountingBlockedExosuitTest extends ActorTest {
|
||||
val probe = new TestProbe(system)
|
||||
def checkCanNotMount(): Unit = {
|
||||
val reply = probe.receiveOne(Duration.create(100, "ms"))
|
||||
val catchallProbe = new TestProbe(system)
|
||||
val catchall = catchallProbe.ref
|
||||
val zone = new Zone("test", new ZoneMap("test-map"), 0) {
|
||||
override def SetupNumberPools(): Unit = {}
|
||||
override def AvatarEvents: ActorRef = catchall
|
||||
override def LocalEvents: ActorRef = catchall
|
||||
override def VehicleEvents: ActorRef = catchall
|
||||
override def Activity: ActorRef = catchall
|
||||
}
|
||||
def checkCanNotMount(probe: TestProbe, id: String): Unit = {
|
||||
val reply = probe.receiveOne(Duration.create(250, "ms"))
|
||||
reply match {
|
||||
case msg: Mountable.MountMessages =>
|
||||
assert(msg.response.isInstanceOf[Mountable.CanNotMount])
|
||||
assert(msg.response.isInstanceOf[Mountable.CanNotMount], s"test $id")
|
||||
case _ =>
|
||||
assert(false)
|
||||
assert(false, s"test $id-b")
|
||||
}
|
||||
}
|
||||
|
||||
def checkCanMount(): Unit = {
|
||||
val reply = probe.receiveOne(Duration.create(100, "ms"))
|
||||
def checkCanMount(probe: TestProbe, id: String): Unit = {
|
||||
val reply = probe.receiveOne(Duration.create(250, "ms"))
|
||||
reply match {
|
||||
case msg: Mountable.MountMessages =>
|
||||
assert(msg.response.isInstanceOf[Mountable.CanMount])
|
||||
assert(msg.response.isInstanceOf[Mountable.CanMount], s" - test: $id")
|
||||
case _ =>
|
||||
assert(false)
|
||||
assert(false, s" - test: $id-b")
|
||||
}
|
||||
}
|
||||
val vehicle = Vehicle(GlobalDefinitions.apc_tr)
|
||||
vehicle.Faction = PlanetSideEmpire.TR
|
||||
vehicle.GUID = PlanetSideGUID(10)
|
||||
vehicle.Zone = zone
|
||||
vehicle.Actor = system.actorOf(Props(classOf[VehicleControl], vehicle), "vehicle-test")
|
||||
|
||||
val vehicle2 = Vehicle(GlobalDefinitions.lightning)
|
||||
vehicle2.Faction = PlanetSideEmpire.TR
|
||||
vehicle2.GUID = PlanetSideGUID(11)
|
||||
vehicle2.Zone = zone
|
||||
vehicle2.Actor = system.actorOf(Props(classOf[VehicleControl], vehicle2), "vehicle2-test")
|
||||
|
||||
val player1 = Player(VehicleTest.avatar1)
|
||||
player1.ExoSuit = ExoSuitType.Reinforced
|
||||
player1.GUID = PlanetSideGUID(1)
|
||||
player1.Zone = zone
|
||||
val player2 = Player(VehicleTest.avatar1)
|
||||
player2.ExoSuit = ExoSuitType.MAX
|
||||
player2.GUID = PlanetSideGUID(2)
|
||||
player2.Zone = zone
|
||||
val player3 = Player(VehicleTest.avatar1)
|
||||
player3.ExoSuit = ExoSuitType.Agile
|
||||
player3.GUID = PlanetSideGUID(3)
|
||||
player3.Zone = zone
|
||||
|
||||
"Vehicle Control" should {
|
||||
"block players from sitting if their exo-suit is not allowed by the seat - apc_tr" in {
|
||||
"block players from sitting if their exo-suit is not allowed by the mount - apc_tr" in {
|
||||
val probe = new TestProbe(system)
|
||||
// disallow
|
||||
vehicle2.Actor.tell(Mountable.TryMount(player1, 0), probe.ref) // Reinforced in non-reinforced seat
|
||||
checkCanNotMount()
|
||||
vehicle.Actor.tell(Mountable.TryMount(player2, 0), probe.ref) //MAX in non-Reinforced seat
|
||||
checkCanNotMount()
|
||||
vehicle.Actor.tell(Mountable.TryMount(player2, 1), probe.ref) //MAX in non-MAX seat
|
||||
checkCanNotMount()
|
||||
vehicle.Actor.tell(Mountable.TryMount(player1, 9), probe.ref) //Reinforced in MAX-only seat
|
||||
checkCanNotMount()
|
||||
vehicle.Actor.tell(Mountable.TryMount(player3, 9), probe.ref) //Agile in MAX-only seat
|
||||
checkCanNotMount()
|
||||
vehicle.Actor.tell(Mountable.TryMount(player2, 1), probe.ref) //MAX in non-Max mount
|
||||
checkCanNotMount(probe, "MAX in non-Max mount 1")
|
||||
vehicle.Actor.tell(Mountable.TryMount(player2, 2), probe.ref) //MAX in non-MAX mount
|
||||
checkCanNotMount(probe, "MAX in non-MAX mount 2")
|
||||
vehicle.Actor.tell(Mountable.TryMount(player1, 11), probe.ref) //Reinforced in MAX-only mount
|
||||
checkCanNotMount(probe, "Reinforced in MAX-only mount")
|
||||
vehicle.Actor.tell(Mountable.TryMount(player3, 11), probe.ref) //Agile in MAX-only mount
|
||||
checkCanNotMount(probe, "Agile in MAX-only mount")
|
||||
|
||||
//allow
|
||||
vehicle.Actor.tell(Mountable.TryMount(player1, 0), probe.ref) // Reinforced in driver seat allowing all except MAX
|
||||
checkCanMount()
|
||||
vehicle.Actor.tell(VehicleControl.AssignOwnership(None), probe.ref) // Reset ownership to allow further driver seat mounting tests
|
||||
vehicle.Actor.tell(Mountable.TryMount(player1, 1), probe.ref) // Reinforced in passenger seat allowing all except MAX
|
||||
checkCanMount()
|
||||
vehicle.Actor.tell(Mountable.TryMount(player2, 9), probe.ref) // MAX in MAX-only seat
|
||||
checkCanMount()
|
||||
vehicle.Actor.tell(Mountable.TryMount(player3, 0), probe.ref) // Agile in driver seat allowing all except MAX
|
||||
checkCanMount()
|
||||
vehicle.Actor.tell(Mountable.TryMount(player1, 1), probe.ref) // Reinforced in driver mount allowing all except MAX
|
||||
checkCanMount(probe, "Reinforced in driver mount allowing all except MAX")
|
||||
// Reset to allow further driver mount mounting tests
|
||||
vehicle.Actor.tell(Mountable.TryDismount(player1, 0), probe.ref)
|
||||
probe.receiveOne(500 milliseconds) //discard
|
||||
vehicle.Owner = None //ensure
|
||||
vehicle.OwnerName = None //ensure
|
||||
vehicle.Actor.tell(Mountable.TryMount(player3, 1), probe.ref) // Agile in driver mount allowing all except MAX
|
||||
checkCanMount(probe, "Agile in driver mount allowing all except MAX")
|
||||
vehicle.Actor.tell(Mountable.TryMount(player1, 3), probe.ref) // Reinforced in passenger mount allowing all except MAX
|
||||
checkCanMount(probe, "Reinforced in passenger mount allowing all except MAX")
|
||||
vehicle.Actor.tell(Mountable.TryMount(player2, 11), probe.ref) // MAX in MAX-only mount
|
||||
checkCanMount(probe, "MAX in MAX-only mount")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class VehicleControlMountingBlockedSeatPermissionTest extends ActorTest {
|
||||
val probe = new TestProbe(system)
|
||||
def checkCanNotMount(): Unit = {
|
||||
val reply = probe.receiveOne(Duration.create(100, "ms"))
|
||||
reply match {
|
||||
case msg: Mountable.MountMessages =>
|
||||
assert(msg.response.isInstanceOf[Mountable.CanNotMount])
|
||||
case _ =>
|
||||
assert(false)
|
||||
}
|
||||
}
|
||||
|
||||
def checkCanMount(): Unit = {
|
||||
val reply = probe.receiveOne(Duration.create(100, "ms"))
|
||||
reply match {
|
||||
case msg: Mountable.MountMessages =>
|
||||
assert(msg.response.isInstanceOf[Mountable.CanMount])
|
||||
case _ =>
|
||||
assert(false)
|
||||
}
|
||||
}
|
||||
val vehicle = Vehicle(GlobalDefinitions.apc_tr)
|
||||
vehicle.Faction = PlanetSideEmpire.TR
|
||||
vehicle.GUID = PlanetSideGUID(10)
|
||||
|
|
@ -424,29 +419,20 @@ class VehicleControlMountingBlockedSeatPermissionTest extends ActorTest {
|
|||
|
||||
"Vehicle Control" should {
|
||||
//11 June 2018: Group is not supported yet so do not bother testing it
|
||||
"block players from sitting if the seat does not allow it" in {
|
||||
"block players from sitting if the mount does not allow it" in {
|
||||
|
||||
vehicle.PermissionGroup(2, 3) //passenger group -> empire
|
||||
vehicle.Actor.tell(Mountable.TryMount(player1, 3), probe.ref) //passenger seat
|
||||
checkCanMount()
|
||||
vehicle.PermissionGroup(2, 0) //passenger group -> locked
|
||||
vehicle.Actor.tell(Mountable.TryMount(player2, 4), probe.ref) //passenger seat
|
||||
checkCanNotMount()
|
||||
vehicle.PermissionGroup(2, 3) //passenger group -> empire
|
||||
vehicle.Actor.tell(Mountable.TryMount(player1, 4), probe.ref) //passenger mount
|
||||
VehicleControlTest.checkCanMount(probe, "")
|
||||
vehicle.PermissionGroup(2, 0) //passenger group -> locked
|
||||
vehicle.Actor.tell(Mountable.TryMount(player2, 5), probe.ref) //passenger mount
|
||||
VehicleControlTest.checkCanNotMount(probe, "")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class VehicleControlMountingDriverSeatTest extends ActorTest {
|
||||
val probe = new TestProbe(system)
|
||||
def checkCanMount(): Unit = {
|
||||
val reply = probe.receiveOne(Duration.create(100, "ms"))
|
||||
reply match {
|
||||
case msg: Mountable.MountMessages =>
|
||||
assert(msg.response.isInstanceOf[Mountable.CanMount])
|
||||
case _ =>
|
||||
assert(false)
|
||||
}
|
||||
}
|
||||
val vehicle = Vehicle(GlobalDefinitions.apc_tr)
|
||||
vehicle.Faction = PlanetSideEmpire.TR
|
||||
vehicle.GUID = PlanetSideGUID(10)
|
||||
|
|
@ -455,38 +441,19 @@ class VehicleControlMountingDriverSeatTest extends ActorTest {
|
|||
player1.GUID = PlanetSideGUID(1)
|
||||
|
||||
"Vehicle Control" should {
|
||||
"allow players to sit in the driver seat, even if it is locked, if the vehicle is unowned" in {
|
||||
"allow players to sit in the driver mount, even if it is locked, if the vehicle is unowned" in {
|
||||
assert(vehicle.PermissionGroup(0).contains(VehicleLockState.Locked)) //driver group -> locked
|
||||
assert(vehicle.Seats(0).Occupant.isEmpty)
|
||||
assert(vehicle.Seats(0).occupant.isEmpty)
|
||||
assert(vehicle.Owner.isEmpty)
|
||||
vehicle.Actor.tell(Mountable.TryMount(player1, 0), probe.ref)
|
||||
checkCanMount()
|
||||
assert(vehicle.Seats(0).Occupant.nonEmpty)
|
||||
vehicle.Actor.tell(Mountable.TryMount(player1, 1), probe.ref)
|
||||
VehicleControlTest.checkCanMount(probe, "")
|
||||
assert(vehicle.Seats(0).occupant.nonEmpty)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class VehicleControlMountingOwnedLockedDriverSeatTest extends ActorTest {
|
||||
val probe = new TestProbe(system)
|
||||
def checkCanNotMount(): Unit = {
|
||||
val reply = probe.receiveOne(Duration.create(100, "ms"))
|
||||
reply match {
|
||||
case msg: Mountable.MountMessages =>
|
||||
assert(msg.response.isInstanceOf[Mountable.CanNotMount])
|
||||
case _ =>
|
||||
assert(false)
|
||||
}
|
||||
}
|
||||
|
||||
def checkCanMount(): Unit = {
|
||||
val reply = probe.receiveOne(Duration.create(100, "ms"))
|
||||
reply match {
|
||||
case msg: Mountable.MountMessages =>
|
||||
assert(msg.response.isInstanceOf[Mountable.CanMount])
|
||||
case _ =>
|
||||
assert(false)
|
||||
}
|
||||
}
|
||||
val vehicle = Vehicle(GlobalDefinitions.apc_tr)
|
||||
vehicle.Faction = PlanetSideEmpire.TR
|
||||
vehicle.GUID = PlanetSideGUID(10)
|
||||
|
|
@ -497,36 +464,27 @@ class VehicleControlMountingOwnedLockedDriverSeatTest extends ActorTest {
|
|||
player2.GUID = PlanetSideGUID(2)
|
||||
|
||||
"Vehicle Control" should {
|
||||
"block players that are not the current owner from sitting in the driver seat (locked)" in {
|
||||
"block players that are not the current owner from sitting in the driver mount (locked)" in {
|
||||
assert(vehicle.PermissionGroup(0).contains(VehicleLockState.Locked)) //driver group -> locked
|
||||
assert(vehicle.Seats(0).Occupant.isEmpty)
|
||||
assert(vehicle.Seats(0).occupant.isEmpty)
|
||||
vehicle.Owner = player1.GUID
|
||||
|
||||
vehicle.Actor.tell(Mountable.TryMount(player1, 0), probe.ref)
|
||||
checkCanMount()
|
||||
assert(vehicle.Seats(0).Occupant.nonEmpty)
|
||||
vehicle.Actor.tell(Mountable.TryMount(player1, 1), probe.ref)
|
||||
VehicleControlTest.checkCanMount(probe, "")
|
||||
assert(vehicle.Seats(0).occupant.nonEmpty)
|
||||
vehicle.Actor.tell(Mountable.TryDismount(player1, 0), probe.ref)
|
||||
probe.receiveOne(Duration.create(100, "ms")) //discard
|
||||
assert(vehicle.Seats(0).Occupant.isEmpty)
|
||||
assert(vehicle.Seats(0).occupant.isEmpty)
|
||||
|
||||
vehicle.Actor.tell(Mountable.TryMount(player2, 0), probe.ref)
|
||||
checkCanNotMount()
|
||||
assert(vehicle.Seats(0).Occupant.isEmpty)
|
||||
vehicle.Actor.tell(Mountable.TryMount(player2, 1), probe.ref)
|
||||
VehicleControlTest.checkCanNotMount(probe, "")
|
||||
assert(vehicle.Seats(0).occupant.isEmpty)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class VehicleControlMountingOwnedUnlockedDriverSeatTest extends ActorTest {
|
||||
val probe = new TestProbe(system)
|
||||
def checkCanMount(): Unit = {
|
||||
val reply = probe.receiveOne(Duration.create(100, "ms"))
|
||||
reply match {
|
||||
case msg: Mountable.MountMessages =>
|
||||
assert(msg.response.isInstanceOf[Mountable.CanMount])
|
||||
case _ =>
|
||||
assert(false)
|
||||
}
|
||||
}
|
||||
val vehicle = Vehicle(GlobalDefinitions.apc_tr)
|
||||
vehicle.Faction = PlanetSideEmpire.TR
|
||||
vehicle.GUID = PlanetSideGUID(10)
|
||||
|
|
@ -537,22 +495,22 @@ class VehicleControlMountingOwnedUnlockedDriverSeatTest extends ActorTest {
|
|||
player2.GUID = PlanetSideGUID(2)
|
||||
|
||||
"Vehicle Control" should {
|
||||
"allow players that are not the current owner to sit in the driver seat (empire)" in {
|
||||
"allow players that are not the current owner to sit in the driver mount (empire)" in {
|
||||
vehicle.PermissionGroup(0, 3) //passenger group -> empire
|
||||
assert(vehicle.PermissionGroup(0).contains(VehicleLockState.Empire)) //driver group -> empire
|
||||
assert(vehicle.Seats(0).Occupant.isEmpty)
|
||||
assert(vehicle.Seats(0).occupant.isEmpty)
|
||||
vehicle.Owner = player1.GUID //owner set
|
||||
|
||||
vehicle.Actor.tell(Mountable.TryMount(player1, 0), probe.ref)
|
||||
checkCanMount()
|
||||
assert(vehicle.Seats(0).Occupant.nonEmpty)
|
||||
vehicle.Actor.tell(Mountable.TryMount(player1, 1), probe.ref)
|
||||
VehicleControlTest.checkCanMount(probe, "")
|
||||
assert(vehicle.Seats(0).occupant.nonEmpty)
|
||||
vehicle.Actor.tell(Mountable.TryDismount(player1, 0), probe.ref)
|
||||
probe.receiveOne(Duration.create(100, "ms")) //discard
|
||||
assert(vehicle.Seats(0).Occupant.isEmpty)
|
||||
assert(vehicle.Seats(0).occupant.isEmpty)
|
||||
|
||||
vehicle.Actor.tell(Mountable.TryMount(player2, 0), probe.ref)
|
||||
checkCanMount()
|
||||
assert(vehicle.Seats(0).Occupant.nonEmpty)
|
||||
vehicle.Actor.tell(Mountable.TryMount(player2, 1), probe.ref)
|
||||
VehicleControlTest.checkCanMount(probe, "")
|
||||
assert(vehicle.Seats(0).occupant.nonEmpty)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -708,7 +666,7 @@ class VehicleControlInteractWithWaterPartialTest extends ActorTest {
|
|||
player1.Spawn()
|
||||
vehicle.Zone = zone
|
||||
vehicle.Faction = PlanetSideEmpire.TR
|
||||
vehicle.Seats(0).Occupant = player1
|
||||
vehicle.Seats(0).mount(player1)
|
||||
player1.VehicleSeated = vehicle.GUID
|
||||
player1.Actor = playerProbe.ref
|
||||
vehicle.Actor = system.actorOf(Props(classOf[VehicleControl], vehicle), "vehicle-control")
|
||||
|
|
@ -763,7 +721,7 @@ class VehicleControlInteractWithWaterTest extends ActorTest {
|
|||
player1.Spawn()
|
||||
vehicle.Zone = zone
|
||||
vehicle.Faction = PlanetSideEmpire.TR
|
||||
vehicle.Seats(0).Occupant = player1
|
||||
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")
|
||||
|
|
@ -830,7 +788,7 @@ class VehicleControlStopInteractWithWaterTest extends ActorTest {
|
|||
player1.Spawn()
|
||||
vehicle.Zone = zone
|
||||
vehicle.Faction = PlanetSideEmpire.TR
|
||||
vehicle.Seats(0).Occupant = player1
|
||||
vehicle.Seats(0).mount(player1)
|
||||
player1.VehicleSeated = vehicle.GUID
|
||||
player1.Actor = playerProbe.ref
|
||||
vehicle.Actor = system.actorOf(Props(classOf[VehicleControl], vehicle), "vehicle-control")
|
||||
|
|
@ -899,7 +857,7 @@ class VehicleControlInteractWithLavaTest extends ActorTest {
|
|||
player1.Spawn()
|
||||
vehicle.Zone = zone
|
||||
vehicle.Faction = PlanetSideEmpire.TR
|
||||
vehicle.Seats(0).Occupant = player1
|
||||
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")
|
||||
|
|
@ -957,7 +915,7 @@ class VehicleControlInteractWithDeathTest extends ActorTest {
|
|||
player1.Spawn()
|
||||
vehicle.Zone = zone
|
||||
vehicle.Faction = PlanetSideEmpire.TR
|
||||
vehicle.Seats(0).Occupant = player1
|
||||
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")
|
||||
|
|
@ -983,4 +941,25 @@ object VehicleControlTest {
|
|||
|
||||
val avatar1 = Avatar(0, "test1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)
|
||||
val avatar2 = Avatar(1, "test2", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)
|
||||
|
||||
|
||||
def checkCanNotMount(probe: TestProbe, id: String): Unit = {
|
||||
val reply = probe.receiveOne(Duration.create(250, "ms"))
|
||||
reply match {
|
||||
case msg: Mountable.MountMessages =>
|
||||
assert(msg.response.isInstanceOf[Mountable.CanNotMount], s"test $id")
|
||||
case _ =>
|
||||
assert(false, s"test $id-b")
|
||||
}
|
||||
}
|
||||
|
||||
def checkCanMount(probe: TestProbe, id: String): Unit = {
|
||||
val reply = probe.receiveOne(Duration.create(250, "ms"))
|
||||
reply match {
|
||||
case msg: Mountable.MountMessages =>
|
||||
assert(msg.response.isInstanceOf[Mountable.CanMount], s" - test: $id")
|
||||
case _ =>
|
||||
assert(false, s" - test: $id-b")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,8 @@
|
|||
package objects
|
||||
|
||||
import net.psforever.objects._
|
||||
import net.psforever.objects.definition.{SeatDefinition, VehicleDefinition}
|
||||
import net.psforever.objects.definition.VehicleDefinition
|
||||
import net.psforever.objects.serverobject.mount._
|
||||
import net.psforever.objects.vehicles._
|
||||
import net.psforever.types.{PlanetSideGUID, _}
|
||||
import org.specs2.mutable._
|
||||
|
|
@ -12,35 +13,31 @@ class VehicleTest extends Specification {
|
|||
|
||||
"SeatDefinition" should {
|
||||
val seat = new SeatDefinition
|
||||
seat.ArmorRestriction = SeatArmorRestriction.MaxOnly
|
||||
seat.Bailable = true
|
||||
seat.ControlledWeapon = 5
|
||||
seat.restriction = MaxOnly
|
||||
seat.bailable = true
|
||||
|
||||
"define (default)" in {
|
||||
val t_seat = new SeatDefinition
|
||||
t_seat.ArmorRestriction mustEqual SeatArmorRestriction.NoMax
|
||||
t_seat.Bailable mustEqual false
|
||||
t_seat.ControlledWeapon.isEmpty mustEqual true
|
||||
t_seat.restriction mustEqual NoMax
|
||||
t_seat.bailable mustEqual false
|
||||
}
|
||||
|
||||
"define (custom)" in {
|
||||
seat.ArmorRestriction mustEqual SeatArmorRestriction.MaxOnly
|
||||
seat.Bailable mustEqual true
|
||||
seat.ControlledWeapon.contains(5)
|
||||
seat.restriction mustEqual MaxOnly
|
||||
seat.bailable mustEqual true
|
||||
}
|
||||
}
|
||||
|
||||
"VehicleDefinition" should {
|
||||
"define" in {
|
||||
val fury = GlobalDefinitions.fury
|
||||
fury.CanBeOwned mustEqual true
|
||||
fury.CanBeOwned.contains(true) mustEqual true
|
||||
fury.CanCloak mustEqual false
|
||||
fury.Seats.size mustEqual 1
|
||||
fury.Seats(0).Bailable mustEqual true
|
||||
fury.Seats(0).ControlledWeapon.contains(1)
|
||||
fury.Seats(0).bailable mustEqual true
|
||||
fury.MountPoints.size mustEqual 2
|
||||
fury.MountPoints.get(1).contains(0)
|
||||
fury.MountPoints.get(2).contains(0)
|
||||
fury.MountPoints.get(1).contains(MountInfo(0, Vector3(0,0,0))) mustEqual true
|
||||
fury.MountPoints.get(2).contains(MountInfo(0, Vector3(0,0,0))) mustEqual true
|
||||
fury.Weapons.size mustEqual 1
|
||||
fury.Weapons.get(0).isEmpty mustEqual true
|
||||
fury.Weapons.get(1).contains(GlobalDefinitions.fury_weapon_systema)
|
||||
|
|
@ -52,69 +49,67 @@ class VehicleTest extends Specification {
|
|||
|
||||
"Seat" should {
|
||||
val seat_def = new SeatDefinition
|
||||
seat_def.ArmorRestriction = SeatArmorRestriction.MaxOnly
|
||||
seat_def.Bailable = true
|
||||
seat_def.ControlledWeapon = 5
|
||||
seat_def.restriction = MaxOnly
|
||||
seat_def.bailable = true
|
||||
|
||||
"construct" in {
|
||||
val seat = new Seat(seat_def)
|
||||
seat.ArmorRestriction mustEqual SeatArmorRestriction.MaxOnly
|
||||
seat.Bailable mustEqual true
|
||||
seat.ControlledWeapon.contains(5)
|
||||
seat.definition.restriction mustEqual MaxOnly
|
||||
seat.bailable mustEqual true
|
||||
seat.isOccupied mustEqual false
|
||||
seat.Occupant.isEmpty mustEqual true
|
||||
seat.occupant.isEmpty mustEqual true
|
||||
}
|
||||
|
||||
"player can sit" in {
|
||||
val seat = new Seat(seat_def)
|
||||
seat.Occupant.isDefined mustEqual false
|
||||
seat.isOccupied mustEqual false
|
||||
|
||||
val player1 = Player(avatar1)
|
||||
player1.ExoSuit = ExoSuitType.MAX
|
||||
seat.Occupant = player1
|
||||
seat.Occupant.isDefined mustEqual true
|
||||
seat.Occupant.contains(player1) mustEqual true
|
||||
seat.mount(player1)
|
||||
seat.isOccupied mustEqual true
|
||||
seat.occupant.contains(player1) mustEqual true
|
||||
}
|
||||
|
||||
"one occupant at a time" in {
|
||||
val seat = new Seat(seat_def)
|
||||
seat.Occupant.isDefined mustEqual false
|
||||
seat.isOccupied mustEqual false
|
||||
|
||||
val player1 = Player(avatar1)
|
||||
player1.ExoSuit = ExoSuitType.MAX
|
||||
seat.Occupant = player1
|
||||
seat.Occupant.isDefined mustEqual true
|
||||
seat.Occupant.contains(player1) mustEqual true
|
||||
seat.mount(player1)
|
||||
seat.isOccupied mustEqual true
|
||||
seat.occupant.contains(player1) mustEqual true
|
||||
|
||||
val player2 = Player(avatar1)
|
||||
player2.ExoSuit = ExoSuitType.MAX
|
||||
seat.Occupant = player2
|
||||
seat.Occupant.isDefined mustEqual true
|
||||
seat.Occupant.contains(player1) mustEqual true
|
||||
seat.mount(player2)
|
||||
seat.isOccupied mustEqual true
|
||||
seat.occupant.contains(player1) mustEqual true
|
||||
}
|
||||
|
||||
"one player must get out of seat before other can get in" in {
|
||||
"one player must get out of mount before other can get in" in {
|
||||
val seat = new Seat(seat_def)
|
||||
seat.Occupant.isDefined mustEqual false
|
||||
seat.isOccupied mustEqual false
|
||||
|
||||
val player1 = Player(avatar1)
|
||||
player1.ExoSuit = ExoSuitType.MAX
|
||||
seat.Occupant = player1
|
||||
seat.Occupant.isDefined mustEqual true
|
||||
seat.Occupant.contains(player1) mustEqual true
|
||||
seat.mount(player1)
|
||||
seat.isOccupied mustEqual true
|
||||
seat.occupant.contains(player1) mustEqual true
|
||||
|
||||
val player2 = Player(avatar2)
|
||||
player2.ExoSuit = ExoSuitType.MAX
|
||||
seat.Occupant = player2
|
||||
seat.Occupant.isDefined mustEqual true
|
||||
seat.Occupant.contains(player2) mustEqual false
|
||||
seat.Occupant.contains(player1) mustEqual true
|
||||
seat.mount(player2)
|
||||
seat.isOccupied mustEqual true
|
||||
seat.occupant.contains(player2) mustEqual false
|
||||
seat.occupants.contains(player1) mustEqual true
|
||||
|
||||
seat.Occupant = None
|
||||
seat.Occupant.isDefined mustEqual false
|
||||
seat.Occupant = player2
|
||||
seat.Occupant.isDefined mustEqual true
|
||||
seat.Occupant.contains(player2) mustEqual true
|
||||
seat.unmount(player1)
|
||||
seat.isOccupied mustEqual false
|
||||
seat.mount(player2)
|
||||
seat.isOccupied mustEqual true
|
||||
seat.occupants.contains(player2) mustEqual true
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -128,11 +123,10 @@ class VehicleTest extends Specification {
|
|||
val fury_vehicle = Vehicle(GlobalDefinitions.fury)
|
||||
fury_vehicle.Owner.isEmpty mustEqual true
|
||||
fury_vehicle.Seats.size mustEqual 1
|
||||
fury_vehicle.Seats(0).ArmorRestriction mustEqual SeatArmorRestriction.NoMax
|
||||
fury_vehicle.Seats(0).definition.restriction mustEqual NoMax
|
||||
fury_vehicle.Seats(0).isOccupied mustEqual false
|
||||
fury_vehicle.Seats(0).Occupant.isEmpty mustEqual true
|
||||
fury_vehicle.Seats(0).Bailable mustEqual true
|
||||
fury_vehicle.Seats(0).ControlledWeapon.contains(1)
|
||||
fury_vehicle.Seats(0).occupants.isEmpty mustEqual true
|
||||
fury_vehicle.Seats(0).bailable mustEqual true
|
||||
fury_vehicle.PermissionGroup(0).contains(VehicleLockState.Locked) //driver
|
||||
fury_vehicle.PermissionGroup(1).contains(VehicleLockState.Empire) //gunner
|
||||
fury_vehicle.PermissionGroup(2).contains(VehicleLockState.Empire) //passenger
|
||||
|
|
@ -180,7 +174,7 @@ class VehicleTest extends Specification {
|
|||
fury_vehicle.Owner.contains(PlanetSideGUID(2)) mustEqual true
|
||||
}
|
||||
|
||||
"can use mount point to get seat number" in {
|
||||
"can use mount point to get mount number" in {
|
||||
val fury_vehicle = Vehicle(GlobalDefinitions.fury)
|
||||
fury_vehicle.GetSeatFromMountPoint(0).isEmpty mustEqual true
|
||||
fury_vehicle.GetSeatFromMountPoint(1).contains(0)
|
||||
|
|
@ -224,7 +218,7 @@ class VehicleTest extends Specification {
|
|||
fury_vehicle.PermissionGroup(AccessPermissionGroup.Driver.id) mustEqual fury_vehicle.PermissionGroup(10)
|
||||
}
|
||||
|
||||
"can determine permission group from seat" in {
|
||||
"can determine permission group from mount" in {
|
||||
val harasser_vehicle = Vehicle(GlobalDefinitions.two_man_assault_buggy)
|
||||
harasser_vehicle.SeatPermissionGroup(0).contains(AccessPermissionGroup.Driver)
|
||||
harasser_vehicle.SeatPermissionGroup(1).contains(AccessPermissionGroup.Gunner)
|
||||
|
|
@ -232,23 +226,23 @@ class VehicleTest extends Specification {
|
|||
//TODO test for AccessPermissionGroup.Passenger later
|
||||
}
|
||||
|
||||
"can find a passenger in a seat" in {
|
||||
"can find a passenger in a mount" in {
|
||||
val harasser_vehicle = Vehicle(GlobalDefinitions.two_man_assault_buggy)
|
||||
val player1 = Player(avatar1)
|
||||
player1.GUID = PlanetSideGUID(1)
|
||||
val player2 = Player(avatar2)
|
||||
player2.GUID = PlanetSideGUID(2)
|
||||
harasser_vehicle.Seat(0).get.Occupant = player1 //don't worry about ownership for now
|
||||
harasser_vehicle.Seat(1).get.Occupant = player2
|
||||
harasser_vehicle.Seat(0).get.mount(player1) //don't worry about ownership for now
|
||||
harasser_vehicle.Seat(1).get.mount(player2)
|
||||
|
||||
harasser_vehicle.PassengerInSeat(player1).contains(0)
|
||||
harasser_vehicle.PassengerInSeat(player2).contains(1)
|
||||
harasser_vehicle.Seat(0).get.Occupant = None
|
||||
harasser_vehicle.Seat(0).get.unmount(player1)
|
||||
harasser_vehicle.PassengerInSeat(player1).isEmpty mustEqual true
|
||||
harasser_vehicle.PassengerInSeat(player2).contains(1)
|
||||
}
|
||||
|
||||
"can find a weapon controlled from seat" in {
|
||||
"can find a weapon controlled from mount" in {
|
||||
val harasser_vehicle = Vehicle(GlobalDefinitions.two_man_assault_buggy)
|
||||
val chaingun_p = harasser_vehicle.Weapons(2).Equipment
|
||||
chaingun_p.isDefined mustEqual true
|
||||
|
|
|
|||
|
|
@ -5,14 +5,12 @@ import akka.actor.{ActorSystem, Props}
|
|||
import base.ActorTest
|
||||
import net.psforever.objects.avatar.Avatar
|
||||
import net.psforever.objects.{Default, GlobalDefinitions, Player}
|
||||
import net.psforever.objects.definition.SeatDefinition
|
||||
import net.psforever.objects.guid.NumberPoolHub
|
||||
import net.psforever.objects.guid.source.MaxNumberSource
|
||||
import net.psforever.objects.serverobject.mount.Mountable
|
||||
import net.psforever.objects.serverobject.terminals.implant.{ImplantTerminalMech, ImplantTerminalMechControl}
|
||||
import net.psforever.objects.serverobject.mount.{MountInfo, Mountable, Seat, SeatDefinition}
|
||||
import net.psforever.objects.serverobject.structures.{Building, StructureType}
|
||||
import net.psforever.objects.serverobject.terminals.Terminal
|
||||
import net.psforever.objects.serverobject.terminals.implant.{ImplantTerminalMech, ImplantTerminalMechControl}
|
||||
import net.psforever.objects.vehicles.Seat
|
||||
import net.psforever.objects.zones.{Zone, ZoneMap}
|
||||
import net.psforever.types.{CharacterGender, CharacterVoice, PlanetSideEmpire, Vector3}
|
||||
import org.specs2.mutable.Specification
|
||||
|
|
@ -24,14 +22,10 @@ class ImplantTerminalMechTest extends Specification {
|
|||
"define" in {
|
||||
val implant_terminal_mech = GlobalDefinitions.implant_terminal_mech
|
||||
implant_terminal_mech.ObjectId mustEqual 410
|
||||
implant_terminal_mech.MountPoints mustEqual Map(1 -> 0)
|
||||
implant_terminal_mech.MountPoints.get(1).contains(MountInfo(0, Vector3.Zero)) mustEqual true
|
||||
implant_terminal_mech.Seats.keySet mustEqual Set(0)
|
||||
implant_terminal_mech.Seats(0).isInstanceOf[SeatDefinition] mustEqual true
|
||||
implant_terminal_mech
|
||||
.Seats(0)
|
||||
.ArmorRestriction mustEqual net.psforever.objects.vehicles.SeatArmorRestriction.NoMax
|
||||
implant_terminal_mech.Seats(0).Bailable mustEqual false
|
||||
implant_terminal_mech.Seats(0).ControlledWeapon.isEmpty mustEqual true
|
||||
implant_terminal_mech.Seats(0).bailable mustEqual false
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -44,20 +38,20 @@ class ImplantTerminalMechTest extends Specification {
|
|||
obj.Seats(0).isInstanceOf[Seat] mustEqual true
|
||||
}
|
||||
|
||||
"get seat from mount points" in {
|
||||
"get mount from mount points" in {
|
||||
val obj = ImplantTerminalMech(GlobalDefinitions.implant_terminal_mech)
|
||||
obj.GetSeatFromMountPoint(0).isEmpty mustEqual true
|
||||
obj.GetSeatFromMountPoint(1).contains(0) mustEqual true
|
||||
obj.GetSeatFromMountPoint(2).isEmpty mustEqual true
|
||||
}
|
||||
|
||||
"get passenger in a seat" in {
|
||||
"get passenger in a mount" in {
|
||||
val player = Player(Avatar(0, "test", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
|
||||
val obj = ImplantTerminalMech(GlobalDefinitions.implant_terminal_mech)
|
||||
obj.PassengerInSeat(player).isEmpty mustEqual true
|
||||
obj.Seats(0).Occupant = player
|
||||
obj.Seats(0).mount(player)
|
||||
obj.PassengerInSeat(player).contains(0) mustEqual true
|
||||
obj.Seats(0).Occupant = None
|
||||
obj.Seats(0).unmount(player)
|
||||
obj.PassengerInSeat(player).isEmpty mustEqual true
|
||||
}
|
||||
}
|
||||
|
|
@ -77,7 +71,7 @@ class ImplantTerminalMechControl2Test extends ActorTest {
|
|||
"ImplantTerminalMechControl" should {
|
||||
"let a player mount" in {
|
||||
val (player, mech) = ImplantTerminalMechTest.SetUpAgents(PlanetSideEmpire.TR)
|
||||
val msg = Mountable.TryMount(player, 0)
|
||||
val msg = Mountable.TryMount(player, 1)
|
||||
|
||||
mech.Actor ! msg
|
||||
val reply = receiveOne(Duration.create(200, "ms"))
|
||||
|
|
@ -87,7 +81,7 @@ class ImplantTerminalMechControl2Test extends ActorTest {
|
|||
assert(reply2.response.isInstanceOf[Mountable.CanMount])
|
||||
val reply3 = reply2.response.asInstanceOf[Mountable.CanMount]
|
||||
assert(reply3.obj == mech)
|
||||
assert(reply3.seat_num == 0)
|
||||
assert(reply3.seat_number == 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -99,10 +93,10 @@ class ImplantTerminalMechControl3Test extends ActorTest {
|
|||
val (player1, mech) = ImplantTerminalMechTest.SetUpAgents(PlanetSideEmpire.TR)
|
||||
val player2 = Player(Avatar(1, "test2", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
|
||||
|
||||
mech.Actor ! Mountable.TryMount(player1, 0)
|
||||
mech.Actor ! Mountable.TryMount(player1, 1)
|
||||
receiveOne(Duration.create(100, "ms")) //consume reply
|
||||
|
||||
mech.Actor ! Mountable.TryMount(player2, 0)
|
||||
mech.Actor ! Mountable.TryMount(player2, 1)
|
||||
val reply = receiveOne(Duration.create(100, "ms"))
|
||||
assert(reply.isInstanceOf[Mountable.MountMessages])
|
||||
val reply2 = reply.asInstanceOf[Mountable.MountMessages]
|
||||
|
|
@ -110,7 +104,7 @@ class ImplantTerminalMechControl3Test extends ActorTest {
|
|||
assert(reply2.response.isInstanceOf[Mountable.CanNotMount])
|
||||
val reply3 = reply2.response.asInstanceOf[Mountable.CanNotMount]
|
||||
assert(reply3.obj == mech)
|
||||
assert(reply3.seat_num == 0)
|
||||
assert(reply3.mount_point == 1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -119,7 +113,7 @@ class ImplantTerminalMechControl4Test extends ActorTest {
|
|||
"ImplantTerminalMechControl" should {
|
||||
"dismount player after mounting" in {
|
||||
val (player, mech) = ImplantTerminalMechTest.SetUpAgents(PlanetSideEmpire.TR)
|
||||
mech.Actor ! Mountable.TryMount(player, 0)
|
||||
mech.Actor ! Mountable.TryMount(player, 1)
|
||||
receiveOne(Duration.create(200, "ms")) //consume reply
|
||||
assert(mech.Seat(0).get.isOccupied)
|
||||
|
||||
|
|
@ -141,11 +135,11 @@ class ImplantTerminalMechControl5Test extends ActorTest {
|
|||
"ImplantTerminalMechControl" should {
|
||||
"block a player from dismounting" in {
|
||||
val (player, mech) = ImplantTerminalMechTest.SetUpAgents(PlanetSideEmpire.TR)
|
||||
mech.Actor ! Mountable.TryMount(player, 0)
|
||||
mech.Actor ! Mountable.TryMount(player, 1)
|
||||
receiveOne(Duration.create(100, "ms")) //consume reply
|
||||
assert(mech.Seat(0).get.isOccupied)
|
||||
|
||||
mech.Velocity = Vector3(1, 0, 0) //makes no sense, but it works as the "seat" is not bailable
|
||||
mech.Velocity = Vector3(1, 0, 0) //makes no sense, but it works as the "mount" is not bailable
|
||||
mech.Actor ! Mountable.TryDismount(player, 0)
|
||||
val reply = receiveOne(Duration.create(100, "ms"))
|
||||
assert(reply.isInstanceOf[Mountable.MountMessages])
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue