Merge branch 'master-upstream' into llu-2021

# Conflicts:
#	src/main/scala/net/psforever/objects/avatar/PlayerControl.scala
#	src/main/scala/net/psforever/services/galaxy/GalaxyService.scala
#	src/main/scala/net/psforever/services/local/LocalService.scala
#	src/main/scala/net/psforever/services/local/LocalServiceMessage.scala
This commit is contained in:
Mazo 2021-03-31 23:12:59 +01:00
commit 7e1466c898
208 changed files with 7345 additions and 2869 deletions

View file

@ -6,12 +6,12 @@ import net.psforever.objects._
import net.psforever.objects.avatar.{Avatar, BattleRank, Implant}
import net.psforever.objects.definition.ImplantDefinition
import net.psforever.objects.locker.LockerEquipment
import net.psforever.types.{CharacterGender, CharacterVoice, ImplantType, PlanetSideEmpire}
import net.psforever.types.{CharacterSex, CharacterVoice, ImplantType, PlanetSideEmpire}
import org.specs2.mutable._
class AvatarTest extends Specification {
def CreatePlayer(): (Player, Avatar) = {
val avatar = Avatar(0, "TestCharacter", PlanetSideEmpire.VS, CharacterGender.Female, 41, CharacterVoice.Voice1)
val avatar = Avatar(0, "TestCharacter", PlanetSideEmpire.VS, CharacterSex.Female, 41, CharacterVoice.Voice1)
val player = Player(avatar)
player.Slot(0).Equipment = Tool(beamer)
player.Slot(2).Equipment = Tool(suppressor)
@ -26,10 +26,10 @@ class AvatarTest extends Specification {
}
"construct" in {
val av = Avatar(0, "Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val av = Avatar(0, "Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
av.name mustEqual "Chord"
av.faction mustEqual PlanetSideEmpire.TR
av.sex mustEqual CharacterGender.Male
av.sex mustEqual CharacterSex.Male
av.head mustEqual 0
av.voice mustEqual CharacterVoice.Voice5
av.bep mustEqual 0
@ -39,7 +39,7 @@ class AvatarTest extends Specification {
}
"can not maintain experience point values below zero" in {
val av = Avatar(0, "Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val av = Avatar(0, "Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
av.bep mustEqual 0
av.copy(bep = -1) must throwA[AssertionError]
av.copy(cep = -1) must throwA[AssertionError]
@ -47,7 +47,7 @@ class AvatarTest extends Specification {
//refer to ImplantTest.scala for more tests
"maximum of three implant slots" in {
val obj = Avatar(0, "Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = Avatar(0, "Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
obj.implants.length mustEqual 3
obj.implants(0) must beNone
obj.implants(1) must beNone
@ -61,7 +61,7 @@ class AvatarTest extends Specification {
0,
"Chord",
PlanetSideEmpire.TR,
CharacterGender.Male,
CharacterSex.Male,
0,
CharacterVoice.Voice5,
bep = BattleRank.BR6.experience
@ -81,7 +81,7 @@ class AvatarTest extends Specification {
"can not install the same type of implant twice" in {
val testplant1 = Implant(new ImplantDefinition(ImplantType.AdvancedRegen))
val testplant2 = Implant(new ImplantDefinition(ImplantType.AdvancedRegen))
val obj = Avatar(0, "Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = Avatar(0, "Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
obj.copy(implants = obj.implants.updated(0, Some(testplant1)).updated(1, Some(testplant2))) must throwA[
AssertionError
]
@ -91,7 +91,7 @@ class AvatarTest extends Specification {
val testplant1 = Implant(new ImplantDefinition(ImplantType.AdvancedRegen))
val testplant2 = Implant(new ImplantDefinition(ImplantType.Surge))
val testplant3 = Implant(new ImplantDefinition(ImplantType.DarklightVision))
val obj = Avatar(0, "Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = Avatar(0, "Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
obj.copy(
bep = BattleRank.BR12.value,
implants = Seq(Some(testplant1), Some(testplant2), Some(testplant3))

View file

@ -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
@ -647,7 +648,7 @@ class ConverterTest extends Specification {
}
"Player" should {
var avatar = Avatar(0, "Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
var avatar = Avatar(0, "Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
val obj: Player = {
/*
Create an AmmoBoxDefinition with which to build two AmmoBoxes
@ -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

View file

@ -26,7 +26,7 @@ class DamageCalculationsTests extends Specification {
val wep_prof = wep_fmode.Add
val proj = DamageModelTests.projectile
val proj_prof = proj.asInstanceOf[DamageProfile]
val player = Player(Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
val player = Player(Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
val projectile = Projectile(proj, wep, wep_fmode, player, Vector3(2, 2, 0), Vector3.Zero)
val target = Vehicle(GlobalDefinitions.fury)
target.Position = Vector3(10, 0, 0)
@ -450,7 +450,7 @@ class DamageCalculationsTests extends Specification {
"galaxy gunship reduction (target is not a vehicle)" in {
val tplayer =
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
val resfprojectile = DamageInteraction(
SourceEntry(tplayer),
ProjectileReason(
@ -479,7 +479,7 @@ class ResistanceCalculationsTests extends Specification {
val wep = GlobalDefinitions.galaxy_gunship_cannon
val wep_fmode = Tool(wep).FireMode
val proj = DamageModelTests.projectile
val player = Player(Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
val player = Player(Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
val projectile = Projectile(proj, wep, wep_fmode, player, Vector3(2, 2, 0), Vector3.Zero)
"ResistanceCalculations" should {
@ -515,7 +515,7 @@ class ResistanceCalculationsTests extends Specification {
}
"discern mechanized infantry targets" in {
val target = Player(Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
val target = Player(Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
target.ExoSuit = ExoSuitType.MAX
val resprojectile = DamageInteraction(
SourceEntry(target),
@ -592,7 +592,7 @@ class ResolutionCalculationsTests extends Specification {
val wep = GlobalDefinitions.galaxy_gunship_cannon
val wep_fmode = Tool(wep).FireMode
val proj = DamageModelTests.projectile
val player = Player(Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
val player = Player(Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
player.Spawn()
val projectile = Projectile(proj, wep, wep_fmode, player, Vector3(2, 2, 0), Vector3.Zero)
@ -656,7 +656,7 @@ class ResolutionCalculationsTests extends Specification {
InfantryDamageAfterResist(100, 100)(50, 60) mustEqual (0, 50)
}
val player2 = Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
val player2 = Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
player2.ExoSuit = ExoSuitType.MAX
player2.Spawn()
"calculate no max damage for vehicles" in {
@ -740,7 +740,7 @@ class DamageModelTests extends Specification {
val wep_tool = Tool(wep)
val wep_fmode = wep_tool.FireMode
val proj = DamageModelTests.projectile
val player = Player(Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
val player = Player(Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
player.Spawn()
val projectile = Projectile(proj, wep, wep_fmode, player, Vector3(2, 2, 0), Vector3.Zero)
@ -767,7 +767,7 @@ class DamageModelTests extends Specification {
"resolve infantry targets" in {
val tplayer =
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
tplayer.Spawn()
tplayer.Health mustEqual 100
tplayer.Armor mustEqual 50
@ -789,7 +789,7 @@ class DamageModelTests extends Specification {
"resolve infantry targets in a specific way" in {
val tplayer =
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
tplayer.Spawn()
tplayer.Health mustEqual 100
tplayer.Armor mustEqual 50
@ -811,7 +811,7 @@ class DamageModelTests extends Specification {
"resolve infantry targets, with damage overflow" in {
val tplayer =
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
tplayer.Spawn()
tplayer.Health mustEqual 100
tplayer.Armor mustEqual 50

View file

@ -35,7 +35,7 @@ import net.psforever.objects.vital.base.DamageResolution
import net.psforever.objects.vital.projectile.ProjectileReason
class DamageableTest extends Specification {
val player1 = Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
val player1 = Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
val pSource = PlayerSource(player1)
val weaponA = Tool(GlobalDefinitions.phoenix) //decimator
val projectileA = weaponA.Projectile
@ -128,7 +128,7 @@ class DamageableTest extends Specification {
"permit damaging friendly targets, even those not designated for friendly fire, if the target is hacked" in {
val player2 =
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Mute))
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute))
player2.GUID = PlanetSideGUID(1)
val target = new Terminal(new TerminalDefinition(0) {
Damageable = true
@ -240,7 +240,7 @@ class DamageableTest extends Specification {
"permit jamming friendly targets if the target is hacked" in {
val player2 =
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Mute))
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute))
player2.GUID = PlanetSideGUID(1)
val target = new SensorDeployable(GlobalDefinitions.motionalarmsensor)
target.Faction = player1.Faction
@ -285,7 +285,7 @@ class DamageableEntityDamageTest extends ActorTest {
val building = Building("test-building", 1, 1, zone, StructureType.Facility) //guid=1
val gen = Generator(GlobalDefinitions.generator) //guid=2
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
guid.register(building, 1)
guid.register(gen, 2)
guid.register(player1, 3)
@ -355,7 +355,7 @@ class DamageableEntityDestroyedTest extends ActorTest {
mech.Position = Vector3(1, 0, 0)
mech.Actor = system.actorOf(Props(classOf[ImplantTerminalMechControl], mech), "mech-control")
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player1.Position = Vector3(14, 0, 0) //<14m from generator; dies
player1.Spawn()
val building = Building("test-building", 1, 1, zone, StructureType.Facility) //guid=1
@ -426,7 +426,7 @@ class DamageableEntityNotDestroyTwice extends ActorTest {
val building = Building("test-building", 1, 1, zone, StructureType.Facility) //guid=1
val gen = Generator(GlobalDefinitions.generator) //guid=2
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player1.Spawn()
guid.register(building, 1)
guid.register(gen, 2)
@ -499,7 +499,7 @@ class DamageableAmenityTest extends ActorTest {
val building = Building("test-building", 1, 1, zone, StructureType.Facility) //guid=1
val term = Terminal(GlobalDefinitions.order_terminal) //guid=2
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player1.Spawn()
guid.register(building, 1)
guid.register(term, 2)
@ -589,11 +589,11 @@ class DamageableMountableDamageTest extends ActorTest {
val building = Building("test-building", 1, 1, zone, StructureType.Facility) //guid=1
val mech = ImplantTerminalMech(GlobalDefinitions.implant_terminal_mech) //guid=2
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player1.Spawn()
player1.Position = Vector3(2, 2, 2)
val player2 =
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=4
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=4
player2.Spawn()
guid.register(building, 1)
guid.register(mech, 2)
@ -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
@ -683,13 +683,13 @@ class DamageableMountableDestroyTest extends ActorTest {
val building = Building("test-building", 1, 1, zone, StructureType.Facility) //guid=1
val mech = ImplantTerminalMech(GlobalDefinitions.implant_terminal_mech) //guid=2
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player1.Spawn()
player1.Position = Vector3(2, 2, 2)
val player1Probe = TestProbe()
player1.Actor = player1Probe.ref
val player2 =
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=4
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=4
player2.Spawn()
val player2Probe = TestProbe()
player2.Actor = player2Probe.ref
@ -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
@ -784,20 +784,20 @@ class DamageableWeaponTurretDamageTest extends ActorTest {
turret.Zone = zone
turret.Position = Vector3(1, 0, 0)
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player1.Spawn()
player1.Position = Vector3(2, 2, 2)
val player1Probe = TestProbe()
player1.Actor = player1Probe.ref
val player2 =
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=4
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=4
player2.Spawn()
val player2Probe = TestProbe()
player2.Actor = player2Probe.ref
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)
@ -882,13 +882,13 @@ class DamageableWeaponTurretJammerTest extends ActorTest {
val turretWeapon = turret.Weapons.values.head.Equipment.get.asInstanceOf[Tool]
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player1.Spawn()
player1.Position = Vector3(2, 2, 2)
val player1Probe = TestProbe()
player1.Actor = player1Probe.ref
val player2 =
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=4
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=4
player2.Spawn()
val player2Probe = TestProbe()
player2.Actor = player2Probe.ref
@ -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)
@ -982,13 +982,13 @@ class DamageableWeaponTurretDestructionTest extends ActorTest {
val turretWeapon = turret.Weapons.values.head.Equipment.get.asInstanceOf[Tool]
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player1.Spawn()
player1.Position = Vector3(2, 2, 2)
val player1Probe = TestProbe()
player1.Actor = player1Probe.ref
val player2 =
Player(Avatar(1, "TestCharacter2", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=4
Player(Avatar(1, "TestCharacter2", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=4
player2.Spawn()
val player2Probe = TestProbe()
player2.Actor = player2Probe.ref
@ -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)
@ -1133,13 +1133,13 @@ class DamageableVehicleDamageTest extends ActorTest {
atv.Position = Vector3(1, 0, 0)
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=2
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=2
player1.Spawn()
player1.Position = Vector3(2, 0, 0)
val player1Probe = TestProbe()
player1.Actor = player1Probe.ref
val player2 =
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player2.Spawn()
val player2Probe = TestProbe()
player2.Actor = player2Probe.ref
@ -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)
@ -1242,18 +1242,18 @@ class DamageableVehicleDamageMountedTest extends ActorTest {
atv.Actor = system.actorOf(Props(classOf[VehicleControl], atv), "atv-control")
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=2
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=2
player1.Spawn()
player1.Position = Vector3(2, 0, 0)
val player1Probe = TestProbe()
player1.Actor = player1Probe.ref
val player2 =
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player2.Spawn()
val player2Probe = TestProbe()
player2.Actor = player2Probe.ref
val player3 =
Player(Avatar(0, "TestCharacter3", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=10
Player(Avatar(0, "TestCharacter3", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=10
player3.Spawn()
val player3Probe = TestProbe()
player3.Actor = player3Probe.ref
@ -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
@ -1387,18 +1387,18 @@ class DamageableVehicleJammeringMountedTest extends ActorTest {
lodestar.Position = Vector3(1, 0, 0)
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=7
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=7
player1.Spawn()
player1.Position = Vector3(2, 0, 0)
val player1Probe = TestProbe()
player1.Actor = player1Probe.ref
val player2 =
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=8
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=8
player2.Spawn()
val player2Probe = TestProbe()
player2.Actor = player2Probe.ref
val player3 =
Player(Avatar(0, "TestCharacter3", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=9
Player(Avatar(0, "TestCharacter3", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=9
player3.Spawn()
val player3Probe = TestProbe()
player3.Actor = player3Probe.ref
@ -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)
@ -1499,13 +1499,13 @@ class DamageableVehicleDestroyTest extends ActorTest {
val atvWeapon = atv.Weapons(1).Equipment.get.asInstanceOf[Tool] //guid=4 & 5
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=2
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=2
player1.Spawn()
player1.Position = Vector3(2, 0, 0)
val player1Probe = TestProbe()
player1.Actor = player1Probe.ref
val player2 =
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player2.Spawn()
val player2Probe = TestProbe()
player2.Actor = player2Probe.ref
@ -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)
@ -1595,18 +1595,18 @@ class DamageableVehicleDestroyMountedTest extends ActorTest {
lodestar.Position = Vector3(1, 0, 0)
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=7
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=7
player1.Spawn()
player1.Position = Vector3(2, 0, 0)
val player1Probe = TestProbe()
player1.Actor = player1Probe.ref
val player2 =
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=8
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=8
player2.Spawn()
val player2Probe = TestProbe()
player2.Actor = player2Probe.ref
val player3 =
Player(Avatar(0, "TestCharacter3", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=9
Player(Avatar(0, "TestCharacter3", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=9
player3.Spawn()
val player3Probe = TestProbe()
player3.Actor = player3Probe.ref
@ -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)

View file

@ -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
}
}
}
@ -317,10 +320,10 @@ class ExplosiveDeployableJammerTest extends ActorTest {
val j_mine = Deployables.Make(DeployedItem.jammer_mine)().asInstanceOf[ExplosiveDeployable] //guid=1
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player1.Spawn()
val player2 =
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=4
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=4
player2.Spawn()
val weapon = Tool(GlobalDefinitions.jammer_grenade) //guid=5
guid.register(j_mine, 1)
@ -417,10 +420,10 @@ class ExplosiveDeployableJammerExplodeTest extends ActorTest {
val h_mine = Deployables.Make(DeployedItem.he_mine)().asInstanceOf[ExplosiveDeployable] //guid=2
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player1.Spawn()
val player2 =
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=4
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=4
player2.Spawn()
val weapon = Tool(GlobalDefinitions.jammer_grenade) //guid=5
guid.register(h_mine, 2)
@ -528,10 +531,10 @@ class ExplosiveDeployableDestructionTest extends ActorTest {
val h_mine = Deployables.Make(DeployedItem.he_mine)().asInstanceOf[ExplosiveDeployable] //guid=2
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player1.Spawn()
val player2 =
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=4
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=4
player2.Spawn()
val weapon = Tool(GlobalDefinitions.suppressor) //guid=5
guid.register(h_mine, 2)
@ -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)
val player1 = Player(Avatar(0, "test1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
obj.Actor ! Mountable.TryMount(player1, 0)
assert(obj.Seats(0).occupant.isEmpty)
val player1 = Player(Avatar(0, "test1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
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)
val player1 = Player(Avatar(0, "test1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
obj.Actor ! Mountable.TryMount(player1, 0)
assert(obj.Seats(0).occupant.isEmpty)
val player1 = Player(Avatar(0, "test1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
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)
val player2 = Player(Avatar(1, "test2", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
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)
val player = Player(Avatar(0, "test", PlanetSideEmpire.VS, CharacterGender.Male, 0, CharacterVoice.Mute))
obj.Actor ! Mountable.TryMount(player, 0)
assert(obj.Seats(0).occupant.isEmpty)
val player = Player(Avatar(0, "test", PlanetSideEmpire.VS, CharacterSex.Male, 0, CharacterVoice.Mute))
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,16 @@ 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)
val player = Player(Avatar(0, "test", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
obj.Actor ! Mountable.TryMount(player, 0)
assert(obj.Seats(0).occupant.isEmpty)
val player = Player(Avatar(0, "test", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
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 +757,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 +766,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)
val player = Player(Avatar(0, "test", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Mute))
assert(obj.Seats(0).occupant.isEmpty)
val player = Player(Avatar(0, "test", PlanetSideEmpire.NC, CharacterSex.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))
}
}
}

View file

@ -20,7 +20,7 @@ import org.specs2.mutable.Specification
import scala.concurrent.duration._
class DoorTest extends Specification {
val player = Player(Avatar(0, "test", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
val player = Player(Avatar(0, "test", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
"Door" should {
"construct" in {
@ -148,7 +148,7 @@ object DoorControlTest {
GlobalDefinitions.building
)
door.Owner.Faction = faction
val player = Player(Avatar(0, "test", faction, CharacterGender.Male, 0, CharacterVoice.Mute))
val player = Player(Avatar(0, "test", faction, CharacterSex.Male, 0, CharacterVoice.Mute))
guid.register(player, 2)
(player, door)
}

View file

@ -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, CharacterSex.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, CharacterSex.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

View file

@ -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
@ -101,7 +100,7 @@ class FacilityTurretControl1Test extends ActorTest {
}
class FacilityTurretControl2Test extends ActorTest {
val player = Player(Avatar(0, "", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
val player = Player(Avatar(0, "", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
val obj = FacilityTurret(GlobalDefinitions.manned_turret)
obj.GUID = PlanetSideGUID(1)
obj.Actor = system.actorOf(Props(classOf[FacilityTurretControl], obj), "turret-control")
@ -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 =>
@ -128,7 +127,7 @@ class FacilityTurretControl2Test extends ActorTest {
}
class FacilityTurretControl3Test extends ActorTest {
val player = Player(Avatar(0, "", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
val player = Player(Avatar(0, "", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
val obj = FacilityTurret(GlobalDefinitions.manned_turret)
obj.GUID = PlanetSideGUID(1)
obj.Actor = system.actorOf(Props(classOf[FacilityTurretControl], obj), "turret-control")
@ -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 =>
@ -154,10 +153,8 @@ 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 player = Player(Avatar(0, "", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
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 =>
@ -204,7 +201,7 @@ class FacilityTurretControlRestorationTest extends ActorTest {
val turretWeapon = turret.Weapons.values.head.Equipment.get.asInstanceOf[Tool]
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player1.Spawn()
player1.Position = Vector3(2, 2, 2)
val player1Probe = TestProbe()

View file

@ -66,7 +66,7 @@ class GeneratorControlDamageTest extends ActorTest {
gen.Actor = system.actorOf(Props(classOf[GeneratorControl], gen), "generator-control")
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player1.Position = Vector3(14, 0, 0) //<14m from generator; dies
player1.Spawn()
@ -149,7 +149,7 @@ class GeneratorControlCriticalTest extends ActorTest {
gen.Actor = system.actorOf(Props(classOf[GeneratorControl], gen), "generator-control")
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player1.Position = Vector3(14, 0, 0) //<14m from generator; dies
player1.Spawn()
@ -234,7 +234,7 @@ class GeneratorControlDestroyedTest extends ActorTest {
gen.Actor = system.actorOf(Props(classOf[GeneratorControl], gen), "generator-control")
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player1.Position = Vector3(14, 0, 0) //<14m from generator; dies
player1.Spawn()
player1.Actor = TestProbe().ref
@ -343,13 +343,13 @@ class GeneratorControlKillsTest extends ActorTest {
gen.Actor = system.actorOf(Props(classOf[GeneratorControl], gen), "generator-control")
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player1.Position = Vector3(14, 0, 0) //<14m from generator; dies
player1.Spawn()
val player1Probe = TestProbe()
player1.Actor = player1Probe.ref
val player2 =
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.TR, CharacterGender.Female, 1, CharacterVoice.Mute)) //guid=4
Player(Avatar(0, "TestCharacter2", PlanetSideEmpire.TR, CharacterSex.Female, 1, CharacterVoice.Mute)) //guid=4
player2.Position = Vector3(25, 0, 0) //>14m from generator; lives
player2.Spawn()
val player2Probe = TestProbe()
@ -481,7 +481,7 @@ class GeneratorControlNotDestroyTwice extends ActorTest {
val building = Building("test-building", 1, 1, zone, StructureType.Facility) //guid=1
val gen = Generator(GeneratorTest.generator_definition) //guid=2
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player1.Spawn()
guid.register(building, 1)
guid.register(gen, 2)
@ -572,7 +572,7 @@ class GeneratorControlNotDamageIfExplodingTest extends ActorTest {
gen.Actor = system.actorOf(Props(classOf[GeneratorControl], gen), "generator-control")
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player1.Position = Vector3(14, 0, 0) //<14m from generator; dies
player1.Spawn()
val player1Probe = TestProbe()
@ -671,7 +671,7 @@ class GeneratorControlNotRepairIfExplodingTest extends ActorTest {
gen.Actor = system.actorOf(Props(classOf[GeneratorControl], gen), "generator-control")
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player1.Position = Vector3(14, 0, 0) //<14m from generator; dies
player1.Spawn()
val player1Probe = TestProbe()
@ -774,7 +774,7 @@ class GeneratorControlRepairPastRestorePoint extends ActorTest {
gen.Actor = system.actorOf(Props(classOf[GeneratorControl], gen), "generator-control")
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player1.Position = Vector3(14, 0, 0) //<14m from generator; dies
player1.Spawn()
val player1Probe = TestProbe()

View file

@ -0,0 +1,244 @@
// Copyright (c) 2021 PSForever
package objects
import net.psforever.objects.geometry._
import net.psforever.types.Vector3
import org.specs2.mutable.Specification
class GeometryTest extends Specification {
"Point3D" should {
"construct (1)" in {
Point3D(1,2,3.5f)
ok
}
"construct (2)" in {
Point3D() mustEqual Point3D(0,0,0)
}
"construct (3)" in {
Point3D(Vector3(1,2,3)) mustEqual Point3D(1,2,3)
}
"be its own center point" in {
val obj = Point3D(1,2,3.5f)
obj.center mustEqual obj
}
"define its own exterior" in {
val obj = Point3D(1,2,3.5f)
obj.pointOnOutside(Vector3(1,0,0)) mustEqual obj
obj.pointOnOutside(Vector3(0,1,0)) mustEqual obj
obj.pointOnOutside(Vector3(0,0,1)) mustEqual obj
}
"convert to Vector3" in {
val obj = Point3D(1,2,3.5f)
obj.asVector3 mustEqual Vector3(1,2,3.5f)
}
}
"Ray3D" should {
"construct (1)" in {
Ray3D(Point3D(1,2,3.5f), Vector3(1,0,0))
ok
}
"construct (2)" in {
Ray3D(1,2,3.5f, Vector3(1,0,0)) mustEqual Ray3D(Point3D(1,2,3.5f), Vector3(1,0,0))
}
"construct (3)" in {
Ray3D(Vector3(1,2,3.5f), Vector3(1,0,0)) mustEqual Ray3D(Point3D(1,2,3.5f), Vector3(1,0,0))
}
"have a unit vector as its direction vector" in {
Ray3D(1,2,3.5f, Vector3(1,1,1)) must throwA[AssertionError]
}
"have its target point as the center point" in {
val obj = Ray3D(1,2,3.5f, Vector3(1,0,0))
obj.center mustEqual Point3D(1,2,3.5f)
}
"define its own exterior" in {
val obj1 = Ray3D(1,2,3.5f, Vector3(1,0,0))
val obj2 = Point3D(1,2,3.5f)
obj1.pointOnOutside(Vector3(1,0,0)) mustEqual obj2
obj1.pointOnOutside(Vector3(0,1,0)) mustEqual obj2
obj1.pointOnOutside(Vector3(0,0,1)) mustEqual obj2
}
}
"Line3D" should {
"construct (1)" in {
Line3D(Point3D(1,2,3.5f), Vector3(1,0,0))
ok
}
"construct (2)" in {
Line3D(1,2,3.5f, Vector3(1,0,0))
ok
}
"construct (3)" in {
Line3D(1,2,3.5f, 2,2,3.5f) mustEqual Line3D(1,2,3.5f, Vector3(1,0,0))
}
"have a unit vector as its direction vector" in {
Line3D(1,2,3.5f, Vector3(1,1,1)) must throwA[AssertionError]
}
"have its target point as the center point" in {
val obj = Line3D(1,2,3.5f, Vector3(1,0,0))
obj.center mustEqual Point3D(1,2,3.5f)
}
"define its own exterior" in {
val obj1 = Line3D(1,2,3.5f, Vector3(1,0,0))
val obj2 = Point3D(1,2,3.5f)
obj1.pointOnOutside(Vector3(1,0,0)) mustEqual obj2
obj1.pointOnOutside(Vector3(0,1,0)) mustEqual obj2
obj1.pointOnOutside(Vector3(0,0,1)) mustEqual obj2
}
}
"Segment3D" should {
"construct (1)" in {
Segment3D(Point3D(1,2,3), Point3D(3,2,3))
ok
}
"construct (2)" in {
Segment3D(1,2,3, 3,2,3) mustEqual Segment3D(Point3D(1,2,3), Point3D(3,2,3))
ok
}
"construct (3)" in {
Segment3D(Point3D(1,2,3), Vector3(1,0,0)) mustEqual Segment3D(Point3D(1,2,3), Point3D(2,2,3))
}
"construct (4)" in {
Segment3D(1,2,3, Vector3(1,0,0)) mustEqual Segment3D(Point3D(1,2,3), Point3D(2,2,3))
}
"does not need to have unit vector as its direction vector" in {
val obj1 = Segment3D(1,2,3, Vector3(5,1,1))
val obj2 = Segment3D(Point3D(1,2,3), Point3D(6,3,4))
obj1 mustEqual obj2
obj1.d mustEqual obj2.d
}
"have a midway point between its two endpoints" in {
Segment3D(Point3D(1,2,3), Point3D(3,4,5)).center mustEqual Point3D(2,3,4)
}
"report the point on the outside as its center point" in {
val obj1 = Segment3D(Point3D(1,2,3), Point3D(3,4,5))
val obj2 = obj1.center
obj1.pointOnOutside(Vector3(1,0,0)) mustEqual obj2
obj1.pointOnOutside(Vector3(0,1,0)) mustEqual obj2
obj1.pointOnOutside(Vector3(0,0,1)) mustEqual obj2
}
}
"Sphere3D" should {
"construct (1)" in {
Sphere(Point3D(1,2,3), 3)
ok
}
"construct (2)" in {
Sphere(3) mustEqual Sphere(Point3D(0,0,0), 3)
ok
}
"construct (3)" in {
Sphere(1,2,3, 3) mustEqual Sphere(Point3D(1,2,3), 3)
}
"construct (4)" in {
Sphere(Vector3(1,2,3), 3) mustEqual Sphere(Point3D(1,2,3), 3)
}
"the center point is self-evident" in {
Sphere(Point3D(1,2,3), 3).center mustEqual Point3D(1,2,3)
}
"report the point on the outside depending on the requested direction" in {
val obj1 = Sphere(1,2,3, 3)
obj1.pointOnOutside(Vector3( 1, 0, 0)) mustEqual Point3D( 4, 2,3) //east
obj1.pointOnOutside(Vector3( 0, 1, 0)) mustEqual Point3D( 1, 5,3) //north
obj1.pointOnOutside(Vector3( 0, 0, 1)) mustEqual Point3D( 1, 2,6) //up
obj1.pointOnOutside(Vector3(-1, 0, 0)) mustEqual Point3D(-2, 2,3) //west
obj1.pointOnOutside(Vector3( 0,-1, 0)) mustEqual Point3D( 1,-1,3) //south
obj1.pointOnOutside(Vector3( 0, 0,-1)) mustEqual Point3D( 1, 2,0) //down
}
}
"Cylinder (normal)" should {
"construct (1)" in {
Cylinder(Point3D(1,2,3), Vector3(0,0,1), 2, 3)
ok
}
"construct (2)" in {
Cylinder(Point3D(1,2,3), 2, 3) mustEqual Cylinder(Point3D(1,2,3), Vector3(0,0,1), 2, 3)
}
"construct (3)" in {
Cylinder(Vector3(1,2,3), 2, 3) mustEqual Cylinder(Point3D(1,2,3), Vector3(0,0,1), 2, 3)
}
"construct (4)" in {
Cylinder(Vector3(1,2,3), Vector3(0,0,1), 2, 3) mustEqual Cylinder(Point3D(1,2,3), Vector3(0,0,1), 2, 3)
}
"report the center point as the center of the cylinder" in {
Cylinder(Point3D(1,2,3), 2, 3).center mustEqual Point3D(1,2,4.5f)
}
"the point on the outside is different depending on the requested direction" in {
val obj1 = Cylinder(Point3D(1,2,3), 2, 3)
obj1.pointOnOutside(Vector3( 1, 0, 0)) mustEqual Point3D( 3, 2, 4.5f) //east
obj1.pointOnOutside(Vector3( 0, 1, 0)) mustEqual Point3D( 1, 4, 4.5f) //north
obj1.pointOnOutside(Vector3( 0, 0, 1)) mustEqual Point3D( 1, 2, 6f) //up
obj1.pointOnOutside(Vector3(-1, 0, 0)) mustEqual Point3D(-1, 2, 4.5f) //west
obj1.pointOnOutside(Vector3( 0,-1, 0)) mustEqual Point3D( 1, 0, 4.5f) //south
obj1.pointOnOutside(Vector3( 0, 0,-1)) mustEqual Point3D( 1, 2, 3f) //down
}
}
"Cylinder (side tilt)" should {
"not require a specific direction to be relative up" in {
Cylinder(Point3D(1,2,3), Vector3(1,0,0), 2, 3)
ok
}
"require its specific relative up direction to be expressed as a unit vector" in {
Cylinder(Point3D(1,2,3), Vector3(4,0,0), 2, 3) must throwA[AssertionError]
}
"report the center point as the center of the cylinder, as if rotated about its base" in {
Cylinder(Point3D(1,2,3), Vector3(1,0,0), 2, 3).center mustEqual Point3D(2.5f, 2, 3)
}
"report the point on the outside as different depending on the requested direction and the relative up direction" in {
val obj1 = Cylinder(Point3D(1,2,3), Vector3(1,0,0), 2, 3)
obj1.pointOnOutside(Vector3( 1, 0, 0)) mustEqual Point3D(4, 2, 3) //east
obj1.pointOnOutside(Vector3( 0, 1, 0)) mustEqual Point3D(2.5f, 4, 3) //north
obj1.pointOnOutside(Vector3( 0, 0, 1)) mustEqual Point3D(2.5f, 2, 5) //up
obj1.pointOnOutside(Vector3(-1, 0, 0)) mustEqual Point3D(1, 2, 3) //west
obj1.pointOnOutside(Vector3( 0,-1, 0)) mustEqual Point3D(2.5f, 0, 3) //south
obj1.pointOnOutside(Vector3( 0, 0,-1)) mustEqual Point3D(2.5f, 2, 1) //down
val obj2 = Cylinder(Point3D(1,2,3), Vector3(0,0,1), 2, 3)
obj1.pointOnOutside(Vector3( 1, 0, 0)) mustNotEqual obj2.pointOnOutside(Vector3( 1, 0, 0))
obj1.pointOnOutside(Vector3( 0, 1, 0)) mustNotEqual obj2.pointOnOutside(Vector3( 1, 1, 0))
obj1.pointOnOutside(Vector3( 0, 0, 1)) mustNotEqual obj2.pointOnOutside(Vector3( 1, 0, 1))
obj1.pointOnOutside(Vector3(-1, 0, 0)) mustNotEqual obj2.pointOnOutside(Vector3(-1, 0, 0))
obj1.pointOnOutside(Vector3( 0,-1, 0)) mustNotEqual obj2.pointOnOutside(Vector3( 0,-1, 0))
obj1.pointOnOutside(Vector3( 0, 0,-1)) mustNotEqual obj2.pointOnOutside(Vector3( 0, 0,-1))
}
}
}

View file

@ -98,6 +98,6 @@ object IFFLockControlTest {
GlobalDefinitions.building
)
lock.Owner.Faction = faction
(Player(Avatar(0, "test", faction, CharacterGender.Male, 0, CharacterVoice.Mute)), lock)
(Player(Avatar(0, "test", faction, CharacterSex.Male, 0, CharacterVoice.Mute)), lock)
}
}

View file

@ -3,13 +3,13 @@ package objects
import net.psforever.objects._
import net.psforever.objects.loadouts._
import net.psforever.types.{CharacterGender, CharacterVoice, ExoSuitType, PlanetSideEmpire}
import net.psforever.types.{CharacterSex, CharacterVoice, ExoSuitType, PlanetSideEmpire}
import net.psforever.objects.GlobalDefinitions._
import net.psforever.objects.avatar.Avatar
import org.specs2.mutable._
class LoadoutTest extends Specification {
val avatar = Avatar(0, "TestCharacter", PlanetSideEmpire.VS, CharacterGender.Female, 41, CharacterVoice.Voice1)
val avatar = Avatar(0, "TestCharacter", PlanetSideEmpire.VS, CharacterSex.Female, 41, CharacterVoice.Voice1)
def CreatePlayer(): Player = {
new Player(avatar) {

View file

@ -5,11 +5,10 @@ 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 net.psforever.types.{CharacterSex, CharacterVoice, PlanetSideEmpire, PlanetSideGUID}
import scala.concurrent.duration.Duration
@ -26,7 +25,7 @@ class MountableControl1Test extends ActorTest {
class MountableControl2Test extends ActorTest {
"MountableControl" should {
"let a player mount" in {
val player = Player(Avatar(0, "test", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
val player = Player(Avatar(0, "test", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
val obj = new MountableTest.MountableTestObject
obj.Actor = system.actorOf(Props(classOf[MountableTest.MountableTestControl], obj), "mountable")
val msg = Mountable.TryMount(player, 0)
@ -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)
}
}
}
@ -47,8 +46,8 @@ class MountableControl2Test extends ActorTest {
class MountableControl3Test extends ActorTest {
"MountableControl" should {
"block a player from mounting" in {
val player1 = Player(Avatar(0, "test1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
val player2 = Player(Avatar(1, "test2", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
val player1 = Player(Avatar(0, "test1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
val player2 = Player(Avatar(1, "test2", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
val obj = new MountableTest.MountableTestObject
obj.Actor = system.actorOf(Props(classOf[MountableTest.MountableTestControl], obj), "mountable")
obj.Actor ! Mountable.TryMount(player1, 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)

View 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 */ }

View 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.{CharacterSex, CharacterVoice, PlanetSideEmpire}
import org.specs2.mutable.Specification
class OrbitalShuttleTest extends Specification {
val testAvatar1 = Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)
val testAvatar2 = Avatar(1, "TestCharacter2", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)
val testAvatar3 = Avatar(2, "TestCharacter3", PlanetSideEmpire.TR, CharacterSex.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
}
}
}

View file

@ -26,9 +26,9 @@ import scala.concurrent.duration._
class PlayerControlHealTest extends ActorTest {
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=1
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=1
val player2 =
Player(Avatar(1, "TestCharacter2", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=2
Player(Avatar(1, "TestCharacter2", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=2
val avatarProbe = TestProbe()
val guid = new NumberPoolHub(new MaxNumberSource(15))
val zone = new Zone("test", new ZoneMap("test"), 0) {
@ -111,7 +111,7 @@ class PlayerControlHealTest extends ActorTest {
}
class PlayerControlHealSelfTest extends ActorTest {
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=1
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=1
val avatarProbe = TestProbe()
val guid = new NumberPoolHub(new MaxNumberSource(15))
val zone = new Zone("test", new ZoneMap("test"), 0) {
@ -186,9 +186,9 @@ class PlayerControlHealSelfTest extends ActorTest {
class PlayerControlRepairTest extends ActorTest {
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=1
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=1
val player2 =
Player(Avatar(1, "TestCharacter2", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=2
Player(Avatar(1, "TestCharacter2", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=2
val avatarProbe = TestProbe()
val guid = new NumberPoolHub(new MaxNumberSource(15))
val zone = new Zone("test", new ZoneMap("test"), 0) {
@ -282,7 +282,7 @@ class PlayerControlRepairTest extends ActorTest {
class PlayerControlRepairSelfTest extends ActorTest {
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=1
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=1
val avatarProbe = TestProbe()
val guid = new NumberPoolHub(new MaxNumberSource(15))
val zone = new Zone("test", new ZoneMap("test"), 0) {
@ -357,9 +357,9 @@ class PlayerControlRepairSelfTest extends ActorTest {
class PlayerControlDamageTest extends ActorTest {
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=1
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=1
val player2 =
Player(Avatar(1, "TestCharacter2", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=2
Player(Avatar(1, "TestCharacter2", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=2
val avatarProbe = TestProbe()
val activityProbe = TestProbe()
val guid = new NumberPoolHub(new MaxNumberSource(15))
@ -462,9 +462,9 @@ class PlayerControlDamageTest extends ActorTest {
class PlayerControlDeathStandingTest extends ActorTest {
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=1
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=1
val player2 =
Player(Avatar(1, "TestCharacter2", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=2
Player(Avatar(1, "TestCharacter2", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=2
val avatarProbe = TestProbe()
val activityProbe = TestProbe()
val guid = new NumberPoolHub(new MaxNumberSource(15))
@ -606,9 +606,9 @@ class PlayerControlDeathStandingTest extends ActorTest {
class PlayerControlDeathSeatedTest extends ActorTest {
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=1
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=1
val player2 =
Player(Avatar(1, "TestCharacter2", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=2
Player(Avatar(1, "TestCharacter2", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=2
val avatarProbe = TestProbe()
val activityProbe = TestProbe()
val guid = new NumberPoolHub(new MaxNumberSource(15))
@ -666,7 +666,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)
@ -768,7 +768,7 @@ class PlayerControlDeathSeatedTest extends ActorTest {
class PlayerControlInteractWithWaterTest extends ActorTest {
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=1
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=1
val avatarProbe = TestProbe()
val guid = new NumberPoolHub(new MaxNumberSource(15))
val pool = Pool(EnvironmentAttribute.Water, DeepSquare(-1, 10, 10, 0, 0))
@ -820,7 +820,7 @@ class PlayerControlInteractWithWaterTest extends ActorTest {
class PlayerControlStopInteractWithWaterTest extends ActorTest {
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=1
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=1
val avatarProbe = TestProbe()
val guid = new NumberPoolHub(new MaxNumberSource(15))
val pool = Pool(EnvironmentAttribute.Water, DeepSquare(-1, 10, 10, 0, 0))
@ -883,7 +883,7 @@ class PlayerControlStopInteractWithWaterTest extends ActorTest {
class PlayerControlInteractWithLavaTest extends ActorTest {
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=1
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=1
val avatarProbe = TestProbe()
val guid = new NumberPoolHub(new MaxNumberSource(15))
val pool = Pool(EnvironmentAttribute.Lava, DeepSquare(-1, 10, 10, 0, 0))
@ -943,7 +943,7 @@ class PlayerControlInteractWithLavaTest extends ActorTest {
class PlayerControlInteractWithDeathTest extends ActorTest {
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=1
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=1
val avatarProbe = TestProbe()
val guid = new NumberPoolHub(new MaxNumberSource(15))
val pool = Pool(EnvironmentAttribute.Death, DeepSquare(-1, 10, 10, 0, 0))

View file

@ -6,6 +6,7 @@ import net.psforever.objects._
import net.psforever.objects.avatar.Avatar
import net.psforever.objects.definition.{SimpleItemDefinition, SpecialExoSuitDefinition}
import net.psforever.objects.equipment.EquipmentSize
import net.psforever.objects.inventory.InventoryItem
import net.psforever.objects.locker.LockerEquipment
import net.psforever.types.{PlanetSideGUID, _}
import org.specs2.mutable._
@ -16,7 +17,7 @@ class PlayerTest extends Specification {
def TestPlayer(
name: String,
faction: PlanetSideEmpire.Value,
sex: CharacterGender.Value,
sex: CharacterSex,
head: Int,
voice: CharacterVoice.Value
): Player = {
@ -25,7 +26,7 @@ class PlayerTest extends Specification {
"Player" should {
"construct" in {
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
obj.isAlive mustEqual false
obj.FacingYawUpper mustEqual 0
obj.Jumping mustEqual false
@ -43,7 +44,7 @@ class PlayerTest extends Specification {
}
"(re)spawn" in {
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
obj.isAlive mustEqual false
obj.Health mustEqual 0
obj.Armor mustEqual 0
@ -56,7 +57,7 @@ class PlayerTest extends Specification {
}
"will not (re)spawn if not dead" in {
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
obj.Spawn()
obj.Health mustEqual 100
obj.Armor mustEqual 50
@ -72,7 +73,7 @@ class PlayerTest extends Specification {
}
"can die" in {
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
obj.Spawn()
obj.Armor = 35 //50 -> 35
obj.isAlive mustEqual true
@ -85,7 +86,7 @@ class PlayerTest extends Specification {
}
"can not become a backpack if alive" in {
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
obj.Spawn()
obj.isAlive mustEqual true
obj.isBackpack mustEqual false
@ -95,7 +96,7 @@ class PlayerTest extends Specification {
}
"can become a backpack" in {
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
obj.isAlive mustEqual false
obj.isBackpack mustEqual false
obj.Release
@ -104,7 +105,7 @@ class PlayerTest extends Specification {
}
"set new maximum values (health, stamina)" in {
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
obj.MaxHealth mustEqual 100
obj.MaxHealth = 123
obj.MaxHealth mustEqual 123
@ -114,7 +115,7 @@ class PlayerTest extends Specification {
}
// "set new values (health, armor, stamina) but only when alive" in {
// val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
// val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
// obj.Health = 23
// obj.Armor = 34
// obj.Stamina = 45
@ -135,7 +136,7 @@ class PlayerTest extends Specification {
// }
"has visible slots" in {
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
obj.VisibleSlots mustEqual Set(0, 2, 4) //Standard
obj.ExoSuit = ExoSuitType.Agile
obj.VisibleSlots mustEqual Set(0, 1, 2, 4)
@ -148,7 +149,7 @@ class PlayerTest extends Specification {
}
"init (Standard Exo-Suit)" in {
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
obj.ExoSuit mustEqual ExoSuitType.Standard
obj.Slot(0).Size mustEqual EquipmentSize.Pistol
obj.Slot(1).Size mustEqual EquipmentSize.Blocked
@ -162,7 +163,7 @@ class PlayerTest extends Specification {
"draw equipped holsters only" in {
val wep = SimpleItem(SimpleItemDefinition(149))
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
obj.Slot(1).Size = EquipmentSize.Pistol
obj.Slot(1).Equipment = wep
obj.DrawnSlot mustEqual Player.HandsDownSlot
@ -175,7 +176,7 @@ class PlayerTest extends Specification {
"remember the last drawn holster" in {
val wep1 = SimpleItem(SimpleItemDefinition(149))
val wep2 = SimpleItem(SimpleItemDefinition(149))
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
obj.Slot(0).Size = EquipmentSize.Pistol
obj.Slot(0).Equipment = wep1
obj.Slot(1).Size = EquipmentSize.Pistol
@ -214,7 +215,7 @@ class PlayerTest extends Specification {
"hold something in their free hand" in {
val wep = SimpleItem(SimpleItemDefinition(149))
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
obj.Slot(Player.FreeHandSlot).Equipment = wep
obj.Slot(Player.FreeHandSlot).Equipment.get.Definition.ObjectId mustEqual 149
@ -222,14 +223,14 @@ class PlayerTest extends Specification {
"provide an invalid hand that can not hold anything" in {
val wep = SimpleItem(SimpleItemDefinition(149))
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
obj.Slot(-1).Equipment = wep
obj.Slot(-1).Equipment.isEmpty mustEqual true
}
"search for the smallest available slot in which to store equipment" in {
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
obj.Inventory.Resize(3, 3) //fits one item
obj.Fit(Tool(GlobalDefinitions.beamer)).contains(0) mustEqual true
@ -247,7 +248,7 @@ class PlayerTest extends Specification {
}
"can use their free hand to hold things" in {
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
val ammo = AmmoBox(GlobalDefinitions.bullet_9mm)
obj.FreeHand.Equipment.isEmpty mustEqual true
@ -256,12 +257,12 @@ class PlayerTest extends Specification {
}
"can access the player's locker-space" in {
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
obj.Slot(5).Equipment.get.isInstanceOf[LockerEquipment] mustEqual true
}
"can find equipment" in {
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
obj.Slot(0).Equipment = {
val item = Tool(beamer)
item.GUID = PlanetSideGUID(1)
@ -297,7 +298,7 @@ class PlayerTest extends Specification {
}
"does equipment collision checking (are we already holding something there?)" in {
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
val item1 = Tool(beamer)
val item2 = Kit(medkit)
val item3 = AmmoBox(GlobalDefinitions.bullet_9mm)
@ -306,7 +307,7 @@ class PlayerTest extends Specification {
obj.FreeHand.Equipment = item3
obj.Collisions(0, 1, 1) match {
case Success(List(item)) =>
case Success(List(item: InventoryItem)) =>
item.obj mustEqual item1
item.start mustEqual 0
case _ =>
@ -320,7 +321,7 @@ class PlayerTest extends Specification {
} //holsters, nothing
obj.Collisions(6, 1, 1) match {
case Success(List(item)) =>
case Success(List(item: InventoryItem)) =>
item.obj mustEqual item2
item.start mustEqual 6
case _ =>
@ -328,16 +329,17 @@ class PlayerTest extends Specification {
} //inventory
obj.Collisions(Player.FreeHandSlot, 1, 1) match {
case Success(List(item)) =>
case Success(List(item: InventoryItem)) =>
item.obj mustEqual item3
item.start mustEqual Player.FreeHandSlot
case _ =>
ko
} //free hand
ok
}
"seat in a vehicle" in {
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
"mount in a vehicle" in {
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
obj.VehicleSeated.isEmpty mustEqual true
obj.VehicleSeated = PlanetSideGUID(65)
obj.VehicleSeated.contains(PlanetSideGUID(65)) mustEqual true
@ -346,7 +348,7 @@ class PlayerTest extends Specification {
}
"own in a vehicle" in {
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
obj.avatar.vehicle.isEmpty mustEqual true
obj.avatar.vehicle = Some(PlanetSideGUID(65))
obj.avatar.vehicle.contains(PlanetSideGUID(65)) mustEqual true
@ -355,21 +357,21 @@ class PlayerTest extends Specification {
}
"remember what zone he is in" in {
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
obj.Continent mustEqual "home2"
obj.Continent = "ugd01"
obj.Continent mustEqual "ugd01"
}
"special is typically normal and can not be changed from normal" in {
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
obj.UsingSpecial mustEqual SpecialExoSuitDefinition.Mode.Normal
obj.UsingSpecial = SpecialExoSuitDefinition.Mode.Shielded
obj.UsingSpecial mustEqual SpecialExoSuitDefinition.Mode.Normal
}
"a TR MAX can change its special to Overdrive or Anchored" in {
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
obj.ExoSuit = ExoSuitType.MAX
obj.UsingSpecial mustEqual SpecialExoSuitDefinition.Mode.Normal
obj.UsingSpecial = SpecialExoSuitDefinition.Mode.Anchored
@ -384,7 +386,7 @@ class PlayerTest extends Specification {
}
"an NC MAX can change its special to Shielded" in {
val obj = TestPlayer("Chord", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = TestPlayer("Chord", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Voice5)
obj.ExoSuit = ExoSuitType.MAX
obj.UsingSpecial mustEqual SpecialExoSuitDefinition.Mode.Normal
obj.UsingSpecial = SpecialExoSuitDefinition.Mode.Shielded
@ -394,13 +396,13 @@ class PlayerTest extends Specification {
}
"one faction can not use the other's specials" in {
val objtr = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val objtr = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
objtr.ExoSuit = ExoSuitType.MAX
objtr.UsingSpecial mustEqual SpecialExoSuitDefinition.Mode.Normal
objtr.UsingSpecial = SpecialExoSuitDefinition.Mode.Shielded
objtr.UsingSpecial mustEqual SpecialExoSuitDefinition.Mode.Normal
val objnc = TestPlayer("Chord", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Voice5)
val objnc = TestPlayer("Chord", PlanetSideEmpire.NC, CharacterSex.Male, 0, CharacterVoice.Voice5)
objnc.ExoSuit = ExoSuitType.MAX
objnc.UsingSpecial mustEqual SpecialExoSuitDefinition.Mode.Normal
objnc.UsingSpecial = SpecialExoSuitDefinition.Mode.Overdrive
@ -410,7 +412,7 @@ class PlayerTest extends Specification {
}
"changing exo-suit type resets the special to Normal (and changing back does not revert it again)" in {
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
obj.ExoSuit = ExoSuitType.MAX
obj.UsingSpecial mustEqual SpecialExoSuitDefinition.Mode.Normal
obj.UsingSpecial = SpecialExoSuitDefinition.Mode.Anchored

View file

@ -13,7 +13,7 @@ import net.psforever.types.{PlanetSideGUID, _}
import org.specs2.mutable.Specification
class ProjectileTest extends Specification {
val player = Player(Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
val player = Player(Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
val fury = Vehicle(GlobalDefinitions.fury)
"Range" should {
@ -209,7 +209,7 @@ class ProjectileTest extends Specification {
"contain timely information" in {
val obj =
Player(Avatar(0, "TestCharacter-alt", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
Player(Avatar(0, "TestCharacter-alt", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
obj.VehicleSeated = Some(PlanetSideGUID(1))
obj.Position = Vector3(1.2f, 3.4f, 5.6f)
obj.Orientation = Vector3(2.1f, 4.3f, 6.5f)
@ -333,7 +333,7 @@ class ProjectileTest extends Specification {
"Projectile DamageInteraction" should { //TODO wrong place for this test?
val beamer_wep = Tool(GlobalDefinitions.beamer)
val p_source = PlayerSource(player)
val player2 = Player(Avatar(0, "TestTarget", PlanetSideEmpire.NC, CharacterGender.Female, 1, CharacterVoice.Mute))
val player2 = Player(Avatar(0, "TestTarget", PlanetSideEmpire.NC, CharacterSex.Female, 1, CharacterVoice.Mute))
val p2_source = PlayerSource(player2)
val projectile = Projectile(
beamer_wep.Projectile,

View file

@ -37,7 +37,7 @@ class RepairableEntityRepairTest extends ActorTest {
val building = Building("test-building", 1, 1, zone, StructureType.Facility) //guid=1
val gen = Generator(GlobalDefinitions.generator) //guid=2
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player1.Spawn()
guid.register(building, 1)
guid.register(gen, 2)
@ -109,7 +109,7 @@ class RepairableEntityNotRepairTest extends ActorTest {
val building = Building("test-building", 1, 1, zone, StructureType.Facility) //guid=1
val gen = Generator(GlobalDefinitions.generator) //guid=2
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player1.Spawn()
guid.register(building, 1)
guid.register(gen, 2)
@ -150,7 +150,7 @@ class RepairableAmenityTest extends ActorTest {
val building = Building("test-building", 1, 1, zone, StructureType.Facility) //guid=1
val term = Terminal(GlobalDefinitions.order_terminal) //guid=2
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player1.Spawn()
guid.register(building, 1)
guid.register(term, 2)
@ -251,7 +251,7 @@ class RepairableTurretWeapon extends ActorTest {
val turretWeapon = turret.Weapons.values.head.Equipment.get.asInstanceOf[Tool]
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=3
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=3
player1.Spawn()
player1.Position = Vector3(2, 2, 2)
val player1Probe = TestProbe()
@ -337,7 +337,7 @@ class RepairableVehicleRepair extends ActorTest {
val atvWeapon = atv.Weapons(1).Equipment.get.asInstanceOf[Tool]
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=4
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=4
player1.Spawn()
player1.Position = Vector3(2, 2, 2)
val player1Probe = TestProbe()
@ -410,7 +410,7 @@ class RepairableVehicleRestoration extends ActorTest {
val atvWeapon = atv.Weapons(1).Equipment.get.asInstanceOf[Tool]
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=4
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=4
player1.Spawn()
player1.Position = Vector3(2, 2, 2)
val player1Probe = TestProbe()

View file

@ -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, CharacterSex.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 {
@ -416,7 +427,7 @@ class ResourceSiloControlNoUpdateTest extends ActorTest {
object ResourceSiloTest {
val player = Player(
new Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)
new Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)
)
class ProbedAvatarService(probe: TestProbe) extends Actor {

View file

@ -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 = {

View file

@ -60,7 +60,7 @@ class UtilityTest extends Specification {
val veh = Vehicle(GlobalDefinitions.quadstealth)
veh.Faction = PlanetSideEmpire.TR
val obj = Utility(UtilityType.teleportpad_terminal, UtilityTest.vehicle)
val player = Player(Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
val player = Player(Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
veh.GUID = PlanetSideGUID(101)
obj().Owner = veh //hack
obj().GUID = PlanetSideGUID(1)

View file

@ -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,87 +321,73 @@ class VehicleControlPrepareForDeletionMountedCargoTest extends FreedContextActor
}
class VehicleControlMountingBlockedExosuitTest 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 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
}
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" in {
//disallow
vehicle.Actor.tell(Mountable.TryMount(player1, 0), probe.ref) //Reinforced in non-MAX 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()
"block players from sitting if their exo-suit is not allowed by the mount - apc_tr" in {
val probe = new TestProbe(system)
// disallow
vehicle.Actor.tell(Mountable.TryMount(player2, 1), probe.ref) //MAX in non-Max mount
VehicleControlTest.checkCanNotMount(probe, "MAX in non-Max mount 1")
vehicle.Actor.tell(Mountable.TryMount(player2, 2), probe.ref) //MAX in non-MAX mount
VehicleControlTest.checkCanNotMount(probe, "MAX in non-MAX mount 2")
vehicle.Actor.tell(Mountable.TryMount(player1, 11), probe.ref) //Reinforced in MAX-only mount
VehicleControlTest.checkCanNotMount(probe, "Reinforced in MAX-only mount")
vehicle.Actor.tell(Mountable.TryMount(player3, 11), probe.ref) //Agile in MAX-only mount
VehicleControlTest.checkCanNotMount(probe, "Agile in MAX-only mount")
//allow
vehicle.Actor.tell(Mountable.TryMount(player1, 1), probe.ref)
checkCanMount()
vehicle.Actor.tell(Mountable.TryMount(player2, 9), probe.ref)
checkCanMount()
vehicle.Actor.tell(Mountable.TryMount(player3, 0), probe.ref)
checkCanMount()
vehicle.Actor.tell(Mountable.TryMount(player1, 1), probe.ref) // Reinforced in driver mount allowing all except MAX
VehicleControlTest.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
VehicleControlTest.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
VehicleControlTest.checkCanMount(probe, "Reinforced in passenger mount allowing all except MAX")
vehicle.Actor.tell(Mountable.TryMount(player2, 11), probe.ref) // MAX in MAX-only mount
VehicleControlTest.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)
@ -416,29 +400,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)
@ -447,38 +422,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)
@ -489,36 +445,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)
@ -529,22 +476,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)
}
}
}
@ -655,7 +602,7 @@ class VehicleControlShieldsNotChargingTooEarlyTest extends ActorTest {
// }
// //
// val beamer_wep = Tool(GlobalDefinitions.beamer)
// val p_source = PlayerSource( Player(Avatar(0, "TestTarget", PlanetSideEmpire.NC, CharacterGender.Female, 1, CharacterVoice.Mute)) )
// val p_source = PlayerSource( Player(Avatar(0, "TestTarget", PlanetSideEmpire.NC, CharacterSex.Female, 1, CharacterVoice.Mute)) )
// val projectile = Projectile(beamer_wep.Projectile, GlobalDefinitions.beamer, beamer_wep.FireMode, p_source, GlobalDefinitions.beamer.ObjectId, Vector3.Zero, Vector3.Zero)
// val fury_dm = Vehicle(GlobalDefinitions.fury).DamageModel
// val obj = DamageInteraction(p_source, ProjectileReason(DamageResolution.Hit, projectile, fury_dm), Vector3(1.2f, 3.4f, 5.6f))
@ -677,7 +624,7 @@ class VehicleControlShieldsNotChargingTooEarlyTest extends ActorTest {
class VehicleControlInteractWithWaterPartialTest extends ActorTest {
val vehicle = Vehicle(GlobalDefinitions.fury) //guid=2
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=1
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=1
val playerProbe = TestProbe()
val guid = new NumberPoolHub(new MaxNumberSource(15))
val pool = Pool(EnvironmentAttribute.Water, DeepSquare(-1, 10, 10, 0, 0))
@ -700,7 +647,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")
@ -728,7 +675,7 @@ class VehicleControlInteractWithWaterPartialTest extends ActorTest {
class VehicleControlInteractWithWaterTest extends ActorTest {
val vehicle = Vehicle(GlobalDefinitions.fury) //guid=2
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=1
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=1
val avatarProbe = TestProbe()
val vehicleProbe = TestProbe()
val guid = new NumberPoolHub(new MaxNumberSource(15))
@ -755,7 +702,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")
@ -799,7 +746,7 @@ class VehicleControlInteractWithWaterTest extends ActorTest {
class VehicleControlStopInteractWithWaterTest extends ActorTest {
val vehicle = Vehicle(GlobalDefinitions.fury) //guid=2
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=1
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=1
val playerProbe = TestProbe()
val guid = new NumberPoolHub(new MaxNumberSource(15))
val pool = Pool(EnvironmentAttribute.Water, DeepSquare(-1, 10, 10, 0, 0))
@ -822,7 +769,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")
@ -863,7 +810,7 @@ class VehicleControlStopInteractWithWaterTest extends ActorTest {
class VehicleControlInteractWithLavaTest extends ActorTest {
val vehicle = Vehicle(GlobalDefinitions.fury) //guid=2
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=1
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=1
val avatarProbe = TestProbe()
val vehicleProbe = TestProbe()
val guid = new NumberPoolHub(new MaxNumberSource(15))
@ -891,7 +838,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")
@ -924,7 +871,7 @@ class VehicleControlInteractWithLavaTest extends ActorTest {
class VehicleControlInteractWithDeathTest extends ActorTest {
val vehicle = Vehicle(GlobalDefinitions.fury) //guid=2
val player1 =
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=1
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=1
val guid = new NumberPoolHub(new MaxNumberSource(15))
val pool = Pool(EnvironmentAttribute.Death, DeepSquare(-1, 10, 10, 0, 0))
val zone = new Zone(
@ -949,7 +896,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")
@ -971,8 +918,28 @@ class VehicleControlInteractWithDeathTest extends ActorTest {
object VehicleControlTest {
import net.psforever.objects.avatar.Avatar
import net.psforever.types.{CharacterGender, PlanetSideEmpire}
import net.psforever.types.{CharacterSex, PlanetSideEmpire}
val avatar1 = Avatar(0, "test1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)
val avatar2 = Avatar(1, "test2", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)
val avatar1 = Avatar(0, "test1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)
val avatar2 = Avatar(1, "test2", PlanetSideEmpire.TR, CharacterSex.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")
}
}
}

View file

@ -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
@ -313,8 +307,8 @@ class VehicleTest extends Specification {
object VehicleTest {
import net.psforever.objects.avatar.Avatar
import net.psforever.types.{CharacterGender, PlanetSideEmpire}
import net.psforever.types.{CharacterSex, PlanetSideEmpire}
val avatar1 = Avatar(0, "test1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)
val avatar2 = Avatar(1, "test2", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)
val avatar1 = Avatar(0, "test1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)
val avatar2 = Avatar(1, "test2", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)
}

View file

@ -20,7 +20,7 @@ class VitalityTest extends Specification {
val vSource = VehicleSource(vehicle)
"accept a variety of events" in {
val player = Player(Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
val player = Player(Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
val pSource = PlayerSource(player)
val projectile = Projectile(proj, wep, wep_fmode, player, Vector3(2, 2, 0), Vector3.Zero)
val resprojectile = DamageInteraction(
@ -47,7 +47,7 @@ class VitalityTest extends Specification {
}
"return and clear the former list of vital activities" in {
val player = Player(Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
val player = Player(Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
val pSource = PlayerSource(player)
player.History(HealFromKit(pSource, 10, GlobalDefinitions.medkit))
@ -71,7 +71,7 @@ class VitalityTest extends Specification {
}
"get exactly one entry that was caused by projectile damage" in {
val player = Player(Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
val player = Player(Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
val pSource = PlayerSource(player)
val projectile = Projectile(proj, wep, wep_fmode, player, Vector3(2, 2, 0), Vector3.Zero)
val resprojectile = DamageInteraction(

View file

@ -217,7 +217,7 @@ class ZonePopulationTest extends ActorTest {
val zone = new Zone("test", new ZoneMap(""), 0) {
override def SetupNumberPools() = {}
}
val avatar = Avatar(0, "Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val avatar = Avatar(0, "Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
val player = Player(avatar)
player.GUID = PlanetSideGUID(1)
zone.actor = system.spawn(ZoneActor(zone), ZoneTest.TestName)
@ -237,7 +237,7 @@ class ZonePopulationTest extends ActorTest {
val zone = new Zone("test", new ZoneMap(""), 0) {
override def SetupNumberPools() = {}
}
val avatar = Avatar(1, "Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val avatar = Avatar(1, "Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
val player = Player(avatar)
player.GUID = PlanetSideGUID(1)
zone.actor = system.spawn(ZoneActor(zone), ZoneTest.TestName)
@ -257,7 +257,7 @@ class ZonePopulationTest extends ActorTest {
/* TODO they need AvatarActor, which has further dependencies
"associate user with a character" in {
val zone = new Zone("test", new ZoneMap(""), 0) { override def SetupNumberPools() = {} }
val avatar = Avatar(0, "Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val avatar = Avatar(0, "Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
val player = Player(avatar)
player.GUID = PlanetSideGUID(1)
zone.actor = system.spawn(ZoneActor(zone), ZoneTest.TestName)
@ -278,7 +278,7 @@ class ZonePopulationTest extends ActorTest {
"disassociate character from a user" in {
val zone = new Zone("test", new ZoneMap(""), 0) { override def SetupNumberPools() = {} }
val avatar = Avatar(0, "Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val avatar = Avatar(0, "Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
val player = Player(avatar)
player.GUID = PlanetSideGUID(1)
zone.actor = system.spawn(ZoneActor(zone), ZoneTest.TestName)
@ -301,7 +301,7 @@ class ZonePopulationTest extends ActorTest {
"user tries to Leave, but still has an associated character" in {
val zone = new Zone("test", new ZoneMap(""), 0) { override def SetupNumberPools() = {} }
val avatar = Avatar(0, "Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val avatar = Avatar(0, "Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
val player = Player(avatar)
player.GUID = PlanetSideGUID(1)
zone.actor = system.spawn(ZoneActor(zone), ZoneTest.TestName)
@ -326,7 +326,7 @@ class ZonePopulationTest extends ActorTest {
"user tries to Spawn a character, but an associated character already exists" in {
val zone = new Zone("test", new ZoneMap(""), 0) { override def SetupNumberPools() = {} }
val avatar = Avatar(0, "Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val avatar = Avatar(0, "Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
val player1 = Player(avatar)
player1.GUID = PlanetSideGUID(1)
val player2 = Player(avatar)
@ -354,7 +354,7 @@ class ZonePopulationTest extends ActorTest {
"user tries to Spawn a character, but did not Join first" in {
val zone = new Zone("test", new ZoneMap(""), 0) { override def SetupNumberPools() = {} }
val avatar = Avatar(0, "Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val avatar = Avatar(0, "Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
val player = Player(avatar)
player.GUID = PlanetSideGUID(1)
zone.actor = system.spawn(ZoneActor(zone), ZoneTest.TestName)
@ -376,7 +376,7 @@ class ZonePopulationTest extends ActorTest {
val zone = new Zone("test", new ZoneMap(""), 0) {
override def SetupNumberPools() = {}
}
val avatar = Avatar(2, "Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
val avatar = Avatar(2, "Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5)
val player = Player(avatar)
player.GUID = PlanetSideGUID(1)
zone.actor = system.spawn(ZoneActor(zone), ZoneTest.TestName)
@ -402,7 +402,7 @@ class ZonePopulationTest extends ActorTest {
val zone = new Zone("test", new ZoneMap(""), 0) {
override def SetupNumberPools() = {}
}
val player = Player(Avatar(3, "Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5))
val player = Player(Avatar(3, "Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5))
player.GUID = PlanetSideGUID(1)
player.Release
zone.actor = system.spawn(ZoneActor(zone), ZoneTest.TestName)
@ -419,7 +419,7 @@ class ZonePopulationTest extends ActorTest {
val zone = new Zone("test", new ZoneMap(""), 0) {
override def SetupNumberPools() = {}
}
val player = Player(Avatar(4, "Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5))
val player = Player(Avatar(4, "Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5))
player.GUID = PlanetSideGUID(1)
player.Release
zone.actor = system.spawn(ZoneActor(zone), ZoneTest.TestName)
@ -438,13 +438,13 @@ class ZonePopulationTest extends ActorTest {
val zone = new Zone("test", new ZoneMap(""), 0) {
override def SetupNumberPools() = {}
}
val player1 = Player(Avatar(5, "Chord1", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5))
val player1 = Player(Avatar(5, "Chord1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5))
player1.GUID = PlanetSideGUID(1)
player1.Release
val player2 = Player(Avatar(6, "Chord2", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5))
val player2 = Player(Avatar(6, "Chord2", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5))
player2.GUID = PlanetSideGUID(2)
player2.Release
val player3 = Player(Avatar(7, "Chord3", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5))
val player3 = Player(Avatar(7, "Chord3", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5))
player3.GUID = PlanetSideGUID(3)
player3.Release
zone.actor = system.spawn(ZoneActor(zone), ZoneTest.TestName)
@ -469,7 +469,7 @@ class ZonePopulationTest extends ActorTest {
val zone = new Zone("test", new ZoneMap(""), 0) {
override def SetupNumberPools() = {}
}
val player = Player(Avatar(8, "Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5))
val player = Player(Avatar(8, "Chord", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Voice5))
player.GUID = PlanetSideGUID(1)
//player.Release !!important
zone.actor = system.spawn(ZoneActor(zone), ZoneTest.TestName)

View file

@ -6,12 +6,12 @@ import net.psforever.objects._
import net.psforever.objects.avatar.Avatar
import net.psforever.objects.guid.{GUIDTask, TaskResolver}
import net.psforever.objects.locker.LockerEquipment
import net.psforever.types.{CharacterGender, CharacterVoice, PlanetSideEmpire}
import net.psforever.types.{CharacterSex, CharacterVoice, PlanetSideEmpire}
class GUIDTaskRegisterAvatarTest extends ActorTest {
"RegisterAvatar" in {
val (_, uns, taskResolver, probe) = GUIDTaskTest.CommonTestSetup
val obj = Player(Avatar(0, "test", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
val obj = Player(Avatar(0, "test", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
val obj_wep = Tool(GlobalDefinitions.beamer)
obj.Slot(0).Equipment = obj_wep
val obj_wep_ammo = AmmoBox(GlobalDefinitions.energy_cell)

View file

@ -6,12 +6,12 @@ import net.psforever.objects._
import net.psforever.objects.avatar.Avatar
import net.psforever.objects.guid.{GUIDTask, TaskResolver}
import net.psforever.objects.locker.LockerEquipment
import net.psforever.types.{CharacterGender, CharacterVoice, PlanetSideEmpire}
import net.psforever.types.{CharacterSex, CharacterVoice, PlanetSideEmpire}
class GUIDTaskRegisterPlayerTest extends ActorTest {
"RegisterPlayer" in {
val (_, uns, taskResolver, probe) = GUIDTaskTest.CommonTestSetup
val obj = Player(Avatar(0, "test", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
val obj = Player(Avatar(0, "test", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
val obj_wep = Tool(GlobalDefinitions.beamer)
obj.Slot(0).Equipment = obj_wep
val obj_wep_ammo = AmmoBox(GlobalDefinitions.energy_cell)

View file

@ -6,12 +6,12 @@ import net.psforever.objects._
import net.psforever.objects.avatar.Avatar
import net.psforever.objects.guid.{GUIDTask, TaskResolver}
import net.psforever.objects.locker.LockerEquipment
import net.psforever.types.{CharacterGender, CharacterVoice, PlanetSideEmpire}
import net.psforever.types.{CharacterSex, CharacterVoice, PlanetSideEmpire}
class GUIDTaskUnregisterAvatarTest extends ActorTest {
"UnregisterAvatar" in {
val (guid, uns, taskResolver, probe) = GUIDTaskTest.CommonTestSetup
val obj = Player(Avatar(0, "test", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
val obj = Player(Avatar(0, "test", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
val obj_wep = Tool(GlobalDefinitions.beamer)
obj.Slot(0).Equipment = obj_wep
val obj_wep_ammo = AmmoBox(GlobalDefinitions.energy_cell)

View file

@ -6,12 +6,12 @@ import net.psforever.objects._
import net.psforever.objects.avatar.Avatar
import net.psforever.objects.guid.{GUIDTask, TaskResolver}
import net.psforever.objects.locker.LockerEquipment
import net.psforever.types.{CharacterGender, CharacterVoice, PlanetSideEmpire}
import net.psforever.types.{CharacterSex, CharacterVoice, PlanetSideEmpire}
class GUIDTaskUnregisterPlayerTest extends ActorTest {
"UnregisterPlayer" in {
val (guid, uns, taskResolver, probe) = GUIDTaskTest.CommonTestSetup
val obj = Player(Avatar(0, "test", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
val obj = Player(Avatar(0, "test", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
val obj_wep = Tool(GlobalDefinitions.beamer)
obj.Slot(0).Equipment = obj_wep
val obj_wep_ammo = AmmoBox(GlobalDefinitions.energy_cell)

View file

@ -5,16 +5,14 @@ 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 net.psforever.types.{CharacterSex, CharacterVoice, PlanetSideEmpire, Vector3}
import org.specs2.mutable.Specification
import scala.concurrent.duration.Duration
@ -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 {
val player = Player(Avatar(0, "test", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
"get passenger in a mount" in {
val player = Player(Avatar(0, "test", PlanetSideEmpire.TR, CharacterSex.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,22 +81,22 @@ 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)
}
}
}
class ImplantTerminalMechControl3Test extends ActorTest {
import net.psforever.types.CharacterGender
import net.psforever.types.CharacterSex
"ImplantTerminalMechControl" should {
"block a player from mounting" in {
val (player1, mech) = ImplantTerminalMechTest.SetUpAgents(PlanetSideEmpire.TR)
val player2 = Player(Avatar(1, "test2", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
val player2 = Player(Avatar(1, "test2", PlanetSideEmpire.TR, CharacterSex.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])
@ -189,6 +183,6 @@ object ImplantTerminalMechTest {
map.linkTerminalToInterface(1, 2)
terminal.Actor = system.actorOf(Props(classOf[ImplantTerminalMechControl], terminal), "terminal-control")
(Player(Avatar(0, "test", faction, CharacterGender.Male, 0, CharacterVoice.Mute)), terminal)
(Player(Avatar(0, "test", faction, CharacterSex.Male, 0, CharacterVoice.Mute)), terminal)
}
}

View file

@ -21,7 +21,7 @@ class MatrixTerminalTest extends Specification {
}
"invalid message" in {
val player = Player(Avatar(0, "test", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
val player = Player(Avatar(0, "test", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
val msg = ItemTransactionMessage(PlanetSideGUID(1), TransactionType.Buy, 1, "lite_armor", 0, PlanetSideGUID(0))
val terminal = Terminal(new MatrixTerminalDefinition(519))
terminal.Owner = Vehicle(GlobalDefinitions.quadstealth)

View file

@ -11,7 +11,7 @@ import net.psforever.types._
import org.specs2.mutable.Specification
class OrderTerminalTest extends Specification {
val avatar = Avatar(0, "test", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)
val avatar = Avatar(0, "test", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)
val player = Player(avatar)
val building = new Building(

View file

@ -17,7 +17,7 @@ import net.psforever.objects.serverobject.terminals.{
}
import net.psforever.objects.zones.{Zone, ZoneMap}
import net.psforever.objects.{GlobalDefinitions, Player}
import net.psforever.types.{CharacterGender, CharacterVoice, PlanetSideEmpire, PlanetSideGUID}
import net.psforever.types.{CharacterSex, CharacterVoice, PlanetSideEmpire, PlanetSideGUID}
import org.specs2.mutable.Specification
import net.psforever.services.Service
import net.psforever.services.local.LocalService
@ -41,7 +41,7 @@ class ProximityTest extends Specification {
ProximityTest.avatarId.getAndIncrement(),
"TestCharacter1",
PlanetSideEmpire.VS,
CharacterGender.Female,
CharacterSex.Female,
1,
CharacterVoice.Voice1
)
@ -54,7 +54,7 @@ class ProximityTest extends Specification {
ProximityTest.avatarId.getAndIncrement(),
"TestCharacter2",
PlanetSideEmpire.VS,
CharacterGender.Female,
CharacterSex.Female,
1,
CharacterVoice.Voice1
)
@ -77,7 +77,7 @@ class ProximityTest extends Specification {
ProximityTest.avatarId.getAndIncrement(),
"TestCharacter1",
PlanetSideEmpire.VS,
CharacterGender.Female,
CharacterSex.Female,
1,
CharacterVoice.Voice1
)
@ -90,7 +90,7 @@ class ProximityTest extends Specification {
ProximityTest.avatarId.getAndIncrement(),
"TestCharacter2",
PlanetSideEmpire.VS,
CharacterGender.Female,
CharacterSex.Female,
1,
CharacterVoice.Voice1
)
@ -118,7 +118,7 @@ class ProximityTest extends Specification {
ProximityTest.avatarId.getAndIncrement(),
"TestCharacter1",
PlanetSideEmpire.VS,
CharacterGender.Female,
CharacterSex.Female,
1,
CharacterVoice.Voice1
)
@ -140,7 +140,7 @@ class ProximityTest extends Specification {
ProximityTest.avatarId.getAndIncrement(),
"TestCharacter1",
PlanetSideEmpire.VS,
CharacterGender.Female,
CharacterSex.Female,
1,
CharacterVoice.Voice1
)
@ -184,7 +184,7 @@ class ProximityTerminalControlStartTest extends ActorTest {
ProximityTest.avatarId.getAndIncrement(),
"TestCharacter1",
PlanetSideEmpire.VS,
CharacterGender.Female,
CharacterSex.Female,
1,
CharacterVoice.Voice1
)
@ -235,7 +235,7 @@ class ProximityTerminalControlTwoUsersTest extends ActorTest {
ProximityTest.avatarId.getAndIncrement(),
"TestCharacter1",
PlanetSideEmpire.VS,
CharacterGender.Female,
CharacterSex.Female,
1,
CharacterVoice.Voice1
)
@ -249,7 +249,7 @@ class ProximityTerminalControlTwoUsersTest extends ActorTest {
ProximityTest.avatarId.getAndIncrement(),
"TestCharacter2",
PlanetSideEmpire.VS,
CharacterGender.Female,
CharacterSex.Female,
1,
CharacterVoice.Voice1
)
@ -307,7 +307,7 @@ class ProximityTerminalControlStopTest extends ActorTest {
ProximityTest.avatarId.getAndIncrement(),
"TestCharacter1",
PlanetSideEmpire.VS,
CharacterGender.Female,
CharacterSex.Female,
1,
CharacterVoice.Voice1
)
@ -361,7 +361,7 @@ class ProximityTerminalControlNotStopTest extends ActorTest {
ProximityTest.avatarId.getAndIncrement(),
"TestCharacter1",
PlanetSideEmpire.VS,
CharacterGender.Female,
CharacterSex.Female,
1,
CharacterVoice.Voice1
)
@ -375,7 +375,7 @@ class ProximityTerminalControlNotStopTest extends ActorTest {
ProximityTest.avatarId.getAndIncrement(),
"TestCharacter2",
PlanetSideEmpire.VS,
CharacterGender.Female,
CharacterSex.Female,
1,
CharacterVoice.Voice1
)

View file

@ -143,6 +143,6 @@ object TerminalControlTest {
GlobalDefinitions.building
)
terminal.Owner.Faction = faction
(Player(Avatar(0, "test", faction, CharacterGender.Male, 0, CharacterVoice.Mute)), terminal)
(Player(Avatar(0, "test", faction, CharacterSex.Male, 0, CharacterVoice.Mute)), terminal)
}
}