Collisions (#932)

* pattern for applying damage to player avatar and player-controlled vehicle collisions

* pattern for applying damage to targets due to collisions, falling damage and crashing damage individually; fields to support these calculations are provided

* modifiers to translate 'small step velocity' to real game velocity, as reported by the HUD; corrections for velocity; corrections for velocity in other packets

* fall damage calculations moved to function

* basic two-body collisions between GUID-identified game entities and a ward against too many collisions in a short amount of time

* bailing mechanics

* vssm for non-driven vehicles

* comment about vehicle state message field

* comments and minor refactoring for current collision damage calc; tank_traps modifier; potential fix for blockmap indexing issue

* fixed cargo/carrier vehicle ops

* corrections to initialization of ce construction items; adjustments to handling of modifiers for collision damage

* modifier change, protection against flight speed and spectator crashes; submerged status is once again known only to the actor

* appeasing the automated tests

* hopefully paced collisions better; re-did how Infantry collisions are calculated, incorporating mass and exo-suit data; kill feed reporting should be better

* adjusted damage values again, focusing on the lesser of or middling results; collision killfeed attribution attempt

* kicking offers bail protection; lowered the artificial modifier for one kind of collision damage calculation

* correction to the local reference map functions

* fixed tests; attempt to zero fall damage distance based on velocity; attempt to block mine damage when spectating
This commit is contained in:
Fate-JH 2021-10-05 09:59:49 -04:00 committed by GitHub
parent 0001ef6ce5
commit 93a544c07c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
56 changed files with 2024 additions and 1029 deletions

View file

@ -50,11 +50,11 @@ class CodecTest extends Specification {
val string_vel = hex"857D4E0FFFC0"
"decode" in {
Vector3.codec_vel.decode(string_vel.bits).require.value mustEqual Vector3(-3.84375f, 2.59375f, 255.96875f)
Vector3.codec_vel.decode(string_vel.bits).require.value mustEqual Vector3(-13.8375f, 9.3375f, 921.4875f)
}
"encode" in {
Vector3.codec_vel.encode(Vector3(-3.84375f, 2.59375f, 255.96875f)).require.bytes mustEqual string_vel
Vector3.codec_vel.encode(Vector3(-13.8375f, 9.3375f, 921.4875f)).require.bytes mustEqual string_vel
}
}
}

View file

@ -20,7 +20,7 @@ class FireHintMessageTest extends Specification {
u2 mustEqual 65399
u3 mustEqual 7581
u4 mustEqual 0
u5 mustEqual None
u5.isEmpty mustEqual true
case _ =>
ko
}
@ -34,7 +34,7 @@ class FireHintMessageTest extends Specification {
u2 mustEqual 65231
u3 mustEqual 64736
u4 mustEqual 3
u5 mustEqual Some(Vector3(21.5f, -6.8125f, 2.65625f))
u5.contains(Vector3(77.4f, -24.525f, 9.5625f)) mustEqual true
case _ =>
ko
}
@ -46,7 +46,7 @@ class FireHintMessageTest extends Specification {
pkt mustEqual string
}
"encode string2" in {
"encode (string2)" in {
val msg = FireHintMessage(
PlanetSideGUID(3592),
Vector3(2910.789f, 3744.875f, 69.0625f),
@ -54,7 +54,7 @@ class FireHintMessageTest extends Specification {
65231,
64736,
3,
Some(Vector3(21.5f, -6.8125f, 2.65625f))
Some(Vector3(77.4f, -24.525f, 9.5625f))
)
val pkt = PacketCoding.encodePacket(msg).require.toByteVector

View file

@ -11,17 +11,18 @@ class GenericCollisionMsgTest extends Specification {
//TODO find a better test later
val string =
hex"3C 92C00000190000001B2A8010932CEF505C70946F00000000000000000000000017725EBC6D6A058000000000000000000000000000003F8FF45140"
"decode" in {
PacketCoding.decodePacket(string).require match {
case GenericCollisionMsg(unk1, p, t, php, thp, pv, tv, ppos, tpos, unk2, unk3, unk4) =>
unk1 mustEqual 2
case GenericCollisionMsg(ct, p, php, ppos, pv, t, thp, tpos, tv, unk2, unk3, unk4) =>
ct mustEqual CollisionIs.OfInfantry
p mustEqual PlanetSideGUID(75)
t mustEqual PlanetSideGUID(0)
php mustEqual 100
thp mustEqual 0
pv.x mustEqual 32.166428f
pv.y mustEqual 23.712547f
pv.z mustEqual -0.012802706f
pv.x mustEqual 115.79913f
pv.y mustEqual 85.365166f
pv.z mustEqual -0.046089742f
tv.x mustEqual 0.0f
tv.z mustEqual 0.0f
tv.x mustEqual 0.0f
@ -38,22 +39,48 @@ class GenericCollisionMsgTest extends Specification {
ko
}
}
"encode" in {
val msg = GenericCollisionMsg(
2,
CollisionIs.OfInfantry,
PlanetSideGUID(75),
PlanetSideGUID(0),
100,
0,
Vector3(32.166428f, 23.712547f, -0.012802706f),
Vector3(0.0f, 0.0f, 0.0f),
Vector3(3986.7266f, 2615.3672f, 90.625f),
Vector3(115.79913f, 85.365166f, -0.046089742f),
PlanetSideGUID(0),
0,
Vector3(0.0f, 0.0f, 0.0f),
Vector3(0.0f, 0.0f, 0.0f),
0L,
0L,
1171341310L
)
val pkt = PacketCoding.encodePacket(msg).require.toByteVector
pkt mustEqual string
//pkt mustEqual string
PacketCoding.decodePacket(pkt).require match {
case GenericCollisionMsg(ct, p, php, ppos, pv, t, thp, tpos, tv, unk2, unk3, unk4) =>
ct mustEqual CollisionIs.OfInfantry
p mustEqual PlanetSideGUID(75)
t mustEqual PlanetSideGUID(0)
php mustEqual 100
thp mustEqual 0
pv.x mustEqual 115.79913f
pv.y mustEqual 85.365166f
pv.z mustEqual -0.046089742f
tv.x mustEqual 0.0f
tv.z mustEqual 0.0f
tv.x mustEqual 0.0f
ppos.x mustEqual 3986.7266f
ppos.y mustEqual 2615.3672f
ppos.z mustEqual 90.625f
tpos.x mustEqual 0.0f
tpos.y mustEqual 0.0f
tpos.z mustEqual 0.0f
unk2 mustEqual 0L
unk3 mustEqual 0L
unk4 mustEqual 1171341310L
case _ =>
ko
}
}
}

View file

@ -15,7 +15,7 @@ class LongRangeProjectileInfoMessageTest extends Specification {
case LongRangeProjectileInfoMessage(guid, pos, vel) =>
guid mustEqual PlanetSideGUID(5330)
pos mustEqual Vector3(2264, 5115.039f, 31.046875f)
vel.contains(Vector3(-57.1875f, 9.875f, 47.5f)) mustEqual true
vel.contains(Vector3(-205.875f, 35.55f, 171.0f)) mustEqual true
case _ =>
ko
}
@ -25,7 +25,7 @@ class LongRangeProjectileInfoMessageTest extends Specification {
val msg = LongRangeProjectileInfoMessage(
PlanetSideGUID(5330),
Vector3(2264, 5115.039f, 31.046875f),
Vector3(-57.1875f, 9.875f, 47.5f)
Vector3(-205.875f, 35.55f, 171.0f)
)
val pkt = PacketCoding.encodePacket(msg).require.toByteVector
pkt mustEqual string

View file

@ -99,8 +99,8 @@ class PlayerStateMessageTest extends Specification {
pos.y mustEqual 5987.6016f
pos.z mustEqual 44.1875f
vel.isDefined mustEqual true
vel.get.x mustEqual 2.53125f
vel.get.y mustEqual 6.5625f
vel.get.x mustEqual 9.1125f
vel.get.y mustEqual 23.625f
vel.get.z mustEqual 0.0f
facingYaw mustEqual 22.5f
facingPitch mustEqual -11.25f
@ -155,7 +155,7 @@ class PlayerStateMessageTest extends Specification {
val msg = PlayerStateMessage(
PlanetSideGUID(1696),
Vector3(4008.6016f, 5987.6016f, 44.1875f),
Some(Vector3(2.53125f, 6.5625f, 0f)),
Some(Vector3(9.1125f, 23.625f, 0f)),
22.5f,
-11.25f,
0f,

View file

@ -30,7 +30,7 @@ class PlayerStateMessageUpstreamTest extends Specification {
) =>
avatar_guid mustEqual PlanetSideGUID(75)
pos mustEqual Vector3(3694.1094f, 2735.4531f, 90.84375f)
vel.contains(Vector3(4.375f, 2.59375f, 0.0f)) mustEqual true
vel.contains(Vector3(15.75f, 9.3375f, 0.0f)) mustEqual true
facingYaw mustEqual 61.875f
facingPitch mustEqual -8.4375f
facingYawUpper mustEqual 0.0f
@ -51,7 +51,7 @@ class PlayerStateMessageUpstreamTest extends Specification {
val msg = PlayerStateMessageUpstream(
PlanetSideGUID(75),
Vector3(3694.1094f, 2735.4531f, 90.84375f),
Some(Vector3(4.375f, 2.59375f, 0.0f)),
Some(Vector3(15.75f, 9.3375f, 0.0f)),
61.875f,
-8.4375f,
0.0f,

View file

@ -49,9 +49,9 @@ class PlayerStateShiftMessageTest extends Specification {
state.get.pos.z mustEqual 50.3125f
state.get.viewYawLim mustEqual 50.625f
state.get.vel.isDefined mustEqual true
state.get.vel.get.x mustEqual 2.8125f
state.get.vel.get.y mustEqual -8.0f
state.get.vel.get.z mustEqual 0.375f
state.get.vel.get.x mustEqual 10.125f
state.get.vel.get.y mustEqual -28.8f
state.get.vel.get.z mustEqual 1.3499999f
unk.isDefined mustEqual false
case _ =>
ko
@ -74,7 +74,7 @@ class PlayerStateShiftMessageTest extends Specification {
"encode (pos and vel)" in {
val msg = PlayerStateShiftMessage(
ShiftState(2, Vector3(4645.75f, 5811.6016f, 50.3125f), 50.625f, Vector3(2.8125f, -8.0f, 0.375f))
ShiftState(2, Vector3(4645.75f, 5811.6016f, 50.3125f), 50.625f, Vector3(10.125f, -28.8f, 1.3499999f))
)
val pkt = PacketCoding.encodePacket(msg).require.toByteVector

View file

@ -21,10 +21,7 @@ class SplashHitMessageTest extends Specification {
projectile_pos.z mustEqual 90.921875f
unk2 mustEqual 0
unk3 mustEqual 0
projectile_vel.isDefined mustEqual true
projectile_vel.get.x mustEqual 2.21875f
projectile_vel.get.y mustEqual 0.90625f
projectile_vel.get.z mustEqual -1.125f
projectile_vel.contains(Vector3(7.9874997f, 3.2624998f, -4.0499997f)) mustEqual true
unk4.isDefined mustEqual false
targets.size mustEqual 2
//0
@ -53,7 +50,7 @@ class SplashHitMessageTest extends Specification {
Vector3(3681.3438f, 2728.9062f, 90.921875f),
0,
0,
Some(Vector3(2.21875f, 0.90625f, -1.125f)),
Some(Vector3(7.9874997f, 3.2624998f, -4.0499997f)),
None,
SplashedTarget(PlanetSideGUID(75), Vector3(3674.8438f, 2726.789f, 91.15625f), 286326784L, None) ::
SplashedTarget(PlanetSideGUID(372), Vector3(3679.1328f, 2722.6016f, 92.765625f), 268435456L, None) ::

View file

@ -24,7 +24,7 @@ class VehicleStateMessageTest extends Specification {
vel.isDefined mustEqual true
vel.get.x mustEqual 0.0f
vel.get.y mustEqual 0.0f
vel.get.z mustEqual 0.03125f
vel.get.z mustEqual 0.1125f
unk2.isDefined mustEqual false
unk3 mustEqual 0
unk4 mustEqual 0
@ -42,7 +42,7 @@ class VehicleStateMessageTest extends Specification {
0,
Vector3(3674.8438f, 2726.789f, 91.09375f),
Vector3(359.29688f, 1.0546875f, 90.35156f),
Some(Vector3(0.0f, 0.0f, 0.03125f)),
Some(Vector3(0.0f, 0.0f, 0.1125f)),
None,
0,
0,

View file

@ -18,7 +18,7 @@ class VehicleSubStateMessageTest extends Specification {
vehicle_pos mustEqual Vector3(3465.9575f, 2873.3635f, 91.05253f)
vehicle_ang mustEqual Vector3(11.6015625f, 0.0f, 3.515625f)
vel.isDefined mustEqual true
vel.get mustEqual Vector3(-0.40625f, 0.03125f, -0.8125f)
vel.contains(Vector3(-1.4625f, 0.1125f, -2.925f)) mustEqual true
unk1 mustEqual false
unk2.isDefined mustEqual false
case _ =>
@ -32,7 +32,7 @@ class VehicleSubStateMessageTest extends Specification {
PlanetSideGUID(3376),
Vector3(3465.9575f, 2873.3635f, 91.05253f),
Vector3(11.6015625f, 0.0f, 3.515625f),
Some(Vector3(-0.40625f, 0.03125f, -0.8125f)),
Some(Vector3(-1.4625f, 0.1125f, -2.925f)),
false,
None
)

View file

@ -34,7 +34,7 @@ class CharacterDataTest extends Specification {
pos.coord mustEqual Vector3(3674.8438f, 2726.789f, 91.15625f)
pos.orient mustEqual Vector3(0f, 0f, 64.6875f)
pos.vel.isDefined mustEqual true
pos.vel.get mustEqual Vector3(1.4375f, -0.4375f, 0f)
pos.vel.get mustEqual Vector3(5.1749997f, -1.5749999f, 0.0f)
basic match {
case CharacterAppearanceData(a, b, ribbons) =>
@ -294,7 +294,7 @@ class CharacterDataTest extends Specification {
val pos: PlacementData = PlacementData(
Vector3(3674.8438f, 2726.789f, 91.15625f),
Vector3(0f, 0f, 64.6875f),
Some(Vector3(1.4375f, -0.4375f, 0f))
Some(Vector3(5.1749997f, -1.5749999f, 0.0f))
)
val a: Int => CharacterAppearanceA = CharacterAppearanceA(
BasicCharacterData(

View file

@ -28,7 +28,7 @@ class MountedVehiclesTest extends Specification {
case vdata: VehicleData =>
vdata.pos.coord mustEqual Vector3(4571.6875f, 5602.1875f, 93)
vdata.pos.orient mustEqual Vector3(11.25f, 2.8125f, 92.8125f)
vdata.pos.vel.contains(Vector3(31.71875f, 8.875f, -0.03125f)) mustEqual true
vdata.pos.vel.contains(Vector3(114.1875f, 31.949999f, -0.1125f)) mustEqual true
vdata.data.faction mustEqual PlanetSideEmpire.TR
vdata.data.bops mustEqual false
vdata.data.alternate mustEqual false
@ -264,7 +264,7 @@ class MountedVehiclesTest extends Specification {
PlacementData(
Vector3(4571.6875f, 5602.1875f, 93),
Vector3(11.25f, 2.8125f, 92.8125f),
Some(Vector3(31.71875f, 8.875f, -0.03125f))
Some(Vector3(114.1875f, 31.949999f, -0.1125f))
),
CommonFieldData(PlanetSideEmpire.TR, false, false, false, None, false, Some(false), None, PlanetSideGUID(3776)),
false,

View file

@ -1061,7 +1061,7 @@ class DamageableWeaponTurretDestructionTest extends ActorTest {
assert(!turret.Destroyed)
turret.Actor ! Vitality.Damage(applyDamageToA) //also test destruction while jammered
vehicleProbe.receiveN(2, 1000 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)
@ -1071,44 +1071,37 @@ class DamageableWeaponTurretDestructionTest extends ActorTest {
player1Probe.expectNoMessage(500 milliseconds)
val msg3 = player2Probe.receiveOne(200 milliseconds)
val msg56 = vehicleProbe.receiveN(2, 200 milliseconds)
assert(
msg12_4.head match {
case AvatarServiceMessage("test", AvatarAction.PlanetsideAttributeToAll(PlanetSideGUID(2), 0, _)) => true
case _ => false
}
)
assert(
msg12_4(1) match {
case AvatarServiceMessage("test", AvatarAction.Destroy(PlanetSideGUID(2), _, _, Vector3(1, 0, 0))) => true
case _ => false
}
)
assert(
msg3 match {
case Player.Die(_) => true
case _ => false
}
)
assert(
msg12_4(2) match {
case AvatarServiceMessage("test", AvatarAction.ObjectDelete(PlanetSideGUID(0), PlanetSideGUID(5), _)) => true
case _ => false
}
)
assert(
msg56.head match {
case VehicleServiceMessage.TurretUpgrade(SupportActor.ClearSpecific(List(t), _)) if turret eq t => true
case _ => false
}
)
assert(
msg56(1) match {
case VehicleServiceMessage.TurretUpgrade(TurretUpgrader.AddTask(t, _, TurretUpgrade.None, _))
if t eq turret =>
true
case _ => false
}
)
msg12_4.head match {
case AvatarServiceMessage("test", AvatarAction.PlanetsideAttributeToAll(PlanetSideGUID(2), 0, _)) => ;
case _ =>
assert(false, s"DamageableWeaponTurretDestructionTest-1: ${msg12_4.head}")
}
msg12_4(1) match {
case AvatarServiceMessage("test", AvatarAction.Destroy(PlanetSideGUID(2), _, _, Vector3(1, 0, 0))) => ;
case _ =>
assert(false, s"DamageableWeaponTurretDestructionTest-2: ${msg12_4(1)}")
}
msg3 match {
case Player.Die(_) => true
case _ =>
assert(false, s"DamageableWeaponTurretDestructionTest-3: player not dead - $msg3")
}
msg12_4(2) match {
case AvatarServiceMessage("test", AvatarAction.ObjectDelete(PlanetSideGUID(0), PlanetSideGUID(5), _)) => ;
case _ =>
assert(false, s"DamageableWeaponTurretDestructionTest-4: ${msg12_4(2)}")
}
msg56.head match {
case VehicleServiceMessage.TurretUpgrade(SupportActor.ClearSpecific(List(t), _)) if turret eq t => ;
case _ =>
assert(false, s"DamageableWeaponTurretDestructionTest-5: ${msg56.head}")
}
msg56(1) match {
case VehicleServiceMessage.TurretUpgrade(TurretUpgrader.AddTask(t, _, TurretUpgrade.None, _)) if t eq turret => ;
true
case _ =>
assert(false, s"DamageableWeaponTurretDestructionTest-6: ${msg56(1)}")
}
assert(turret.Health <= turret.Definition.DamageDestroysAt)
assert(!turret.Jammed)
assert(turret.Destroyed)

View file

@ -14,7 +14,7 @@ import net.psforever.objects.guid.source.MaxNumberSource
import net.psforever.objects.serverobject.environment._
import net.psforever.objects.serverobject.mount.Mountable
import net.psforever.objects.vehicles.VehicleLockState
import net.psforever.objects.vehicles.control.VehicleControl
import net.psforever.objects.vehicles.control.{CargoCarrierControl, VehicleControl}
import net.psforever.objects.vital.{VehicleShieldCharge, Vitality}
import net.psforever.objects.zones.{Zone, ZoneMap}
import net.psforever.packet.game._
@ -66,16 +66,11 @@ class VehicleControlPrepareForDeletionPassengerTest extends ActorTest {
vehicle.Actor ! Vehicle.Deconstruct()
val vehicle_msg = vehicleProbe.receiveN(1, 500 milliseconds)
assert(
vehicle_msg.head match {
case VehicleServiceMessage(
"test",
VehicleAction.KickPassenger(PlanetSideGUID(2), 4, false, PlanetSideGUID(1))
) =>
true
case _ => false
}
)
vehicle_msg.head match {
case VehicleServiceMessage("test", VehicleAction.KickPassenger(PlanetSideGUID(2), 4, true, PlanetSideGUID(1))) => ;
case _ =>
assert(false, s"VehicleControlPrepareForDeletionPassengerTest: ${vehicle_msg.head}")
}
assert(player1.VehicleSeated.isEmpty)
assert(vehicle.Seats(1).occupant.isEmpty)
}
@ -96,19 +91,22 @@ class VehicleControlPrepareForDeletionMountedInTest extends FreedContextActorTes
val vehicle = Vehicle(GlobalDefinitions.two_man_assault_buggy)
vehicle.Faction = PlanetSideEmpire.TR
vehicle.Actor = system.actorOf(Props(classOf[VehicleControl], vehicle), "vehicle-test-cargo")
vehicle.Zone = zone
val lodestar = Vehicle(GlobalDefinitions.lodestar)
lodestar.Faction = PlanetSideEmpire.TR
lodestar.Zone = zone
val player1 = Player(VehicleTest.avatar1) //name="test1"
val player2 = Player(VehicleTest.avatar2) //name="test2"
guid.register(vehicle, 1)
guid.register(lodestar, 2)
player1.GUID = PlanetSideGUID(3)
var utilityId = 10
guid.register(player1, 3)
guid.register(player2, 4)
vehicle.Actor = system.actorOf(Props(classOf[VehicleControl], vehicle), "vehicle-test-cargo")
lodestar.Actor = system.actorOf(Props(classOf[CargoCarrierControl], lodestar), "vehicle-test-carrier")
var utilityId = 5
lodestar.Utilities.values.foreach { util =>
util().GUID = PlanetSideGUID(utilityId)
guid.register(util(), utilityId)
utilityId += 1
}
vehicle.Seats(1).mount(player1) //passenger mount
@ -123,81 +121,49 @@ class VehicleControlPrepareForDeletionMountedInTest extends FreedContextActorTes
zone.Transport ! Zone.Vehicle.Spawn(lodestar) //can not fake this
"VehicleControl" should {
"if mounted as cargo, self-eject when marked for deconstruction" in {
"self-eject when marked for deconstruction if mounted as cargo" in {
assert(player1.VehicleSeated.nonEmpty)
assert(vehicle.Seats(1).occupant.nonEmpty)
assert(vehicle.MountedIn.nonEmpty)
assert(lodestar.CargoHolds(1).isOccupied)
vehicle.Actor ! Vehicle.Deconstruct()
val vehicle_msg = vehicleProbe.receiveN(6, 500 milliseconds)
val vehicle_msg = vehicleProbe.receiveN(6, 1 minute)
//dismounting as cargo messages
assert(
vehicle_msg.head match {
case VehicleServiceMessage(
_,
VehicleAction.SendResponse(_, PlanetsideAttributeMessage(PlanetSideGUID(1), 0, _))
) =>
true
case _ => false
}
)
assert(
vehicle_msg(1) match {
case VehicleServiceMessage(
_,
VehicleAction.SendResponse(_, PlanetsideAttributeMessage(PlanetSideGUID(1), 68, _))
) =>
true
case _ => false
}
)
assert(
vehicle_msg(2) match {
case VehicleServiceMessage(
"test",
VehicleAction.SendResponse(
_,
CargoMountPointStatusMessage(PlanetSideGUID(2), _, PlanetSideGUID(1), _, 1, CargoStatus.InProgress, 0)
)
) =>
true
case _ => false
}
)
assert(
vehicle_msg(3) match {
case VehicleServiceMessage(
"test",
VehicleAction.SendResponse(_, ObjectDetachMessage(PlanetSideGUID(2), PlanetSideGUID(1), _, _, _, _))
) =>
true
case _ => false
}
)
assert(
vehicle_msg(4) match {
case VehicleServiceMessage(
"test",
VehicleAction.SendResponse(
_,
CargoMountPointStatusMessage(PlanetSideGUID(2), _, _, PlanetSideGUID(1), 1, CargoStatus.Empty, 0)
)
) =>
true
case _ => false
}
)
//dismounting as cargo messages
//TODO: does not actually kick out the cargo, but instigates the process
assert(
vehicle_msg(5) match {
case VehicleServiceMessage(
"test",
VehicleAction.KickPassenger(PlanetSideGUID(3), 4, false, PlanetSideGUID(1))
) =>
true
case _ => false
}
)
vehicle_msg.head match {
case VehicleServiceMessage("test", VehicleAction.KickPassenger(PlanetSideGUID(3), 4, true, PlanetSideGUID(1))) => ;
case _ =>
assert(false, s"VehicleControlPrepareForDeletionMountedInTest-1: ${vehicle_msg.head}")
}
vehicle_msg(1) match {
case VehicleServiceMessage(_, VehicleAction.SendResponse(_, PlanetsideAttributeMessage(PlanetSideGUID(1), 0, _))) => ;
case _ =>
assert(false, s"VehicleControlPrepareForDeletionMountedInTest-2: ${vehicle_msg(1)}")
}
vehicle_msg(2) match {
case VehicleServiceMessage(_, VehicleAction.SendResponse(_, PlanetsideAttributeMessage(PlanetSideGUID(1), 68, _))) => ;
case _ =>
assert(false, s"VehicleControlPrepareForDeletionMountedInTest-3: ${vehicle_msg(2)}")
}
vehicle_msg(3) match {
case VehicleServiceMessage("test", VehicleAction.SendResponse(_, CargoMountPointStatusMessage(PlanetSideGUID(2), _, PlanetSideGUID(1), _, 1, CargoStatus.InProgress, 0))) => ;
case _ =>
assert(false, s"VehicleControlPrepareForDeletionMountedInTest-4: ${vehicle_msg(3)}")
}
vehicle_msg(4) match {
case VehicleServiceMessage("test", VehicleAction.SendResponse(_, ObjectDetachMessage(PlanetSideGUID(2), PlanetSideGUID(1), _, _, _, _))) => ;
case _ =>
assert(false, s"VehicleControlPrepareForDeletionMountedInTest-5: ${vehicle_msg(4)}")
}
vehicle_msg(5) match {
case VehicleServiceMessage("test", VehicleAction.SendResponse(_, CargoMountPointStatusMessage(PlanetSideGUID(2), _, _, PlanetSideGUID(1), 1, CargoStatus.Empty, 0))) => ;
case _ =>
assert(false, s"VehicleControlPrepareForDeletionMountedInTest-6: ${vehicle_msg(5)}")
}
assert(player1.VehicleSeated.isEmpty)
assert(vehicle.Seats(1).occupant.isEmpty)
assert(vehicle.MountedIn.isEmpty)
assert(!lodestar.CargoHolds(1).isOccupied)
}
}
}
@ -251,55 +217,37 @@ class VehicleControlPrepareForDeletionMountedCargoTest extends FreedContextActor
val vehicle_msg = vehicleProbe.receiveN(6, 500 milliseconds)
vehicle_msg(5) match {
case VehicleServiceMessage(
"test",
VehicleAction.KickPassenger(PlanetSideGUID(4), 4, false, PlanetSideGUID(2))
) => ;
case _ => assert(false)
case VehicleServiceMessage("test", VehicleAction.KickPassenger(PlanetSideGUID(4), 4, true, PlanetSideGUID(2))) => ;
case _ =>
assert(false, s"VehicleControlPrepareForDeletionMountedCargoTest-1: ${vehicle_msg(5)}")
}
assert(player2.VehicleSeated.isEmpty)
assert(lodestar.Seats(0).occupant.isEmpty)
//cargo dismounting messages
vehicle_msg.head match {
case VehicleServiceMessage(
_,
VehicleAction.SendResponse(_, PlanetsideAttributeMessage(PlanetSideGUID(1), 0, _))
) => ;
case _ => assert(false)
case VehicleServiceMessage(_, VehicleAction.SendResponse(_, PlanetsideAttributeMessage(PlanetSideGUID(1), 0, _))) => ;
case _ =>
assert(false, s"VehicleControlPrepareForDeletionMountedCargoTest-2: ${vehicle_msg.head}")
}
vehicle_msg(1) match {
case VehicleServiceMessage(
_,
VehicleAction.SendResponse(_, PlanetsideAttributeMessage(PlanetSideGUID(1), 68, _))
) => ;
case _ => assert(false)
case VehicleServiceMessage(_, VehicleAction.SendResponse(_, PlanetsideAttributeMessage(PlanetSideGUID(1), 68, _))) => ;
case _ =>
assert(false, s"VehicleControlPrepareForDeletionMountedCargoTest-3: ${vehicle_msg(1)}")
}
vehicle_msg(2) match {
case VehicleServiceMessage(
"test",
VehicleAction.SendResponse(
_,
CargoMountPointStatusMessage(PlanetSideGUID(2), _, PlanetSideGUID(1), _, 1, CargoStatus.InProgress, 0)
)
) => ;
case _ => assert(false)
case VehicleServiceMessage("test", VehicleAction.SendResponse(_, CargoMountPointStatusMessage(PlanetSideGUID(2), _, PlanetSideGUID(1), _, 1, CargoStatus.InProgress, 0))) => ;
case _ =>
assert(false, s"VehicleControlPrepareForDeletionMountedCargoTest-4: ${vehicle_msg(2)}")
}
vehicle_msg(3) match {
case VehicleServiceMessage(
"test",
VehicleAction.SendResponse(_, ObjectDetachMessage(PlanetSideGUID(2), PlanetSideGUID(1), _, _, _, _))
) => ;
case _ => assert(false)
case VehicleServiceMessage("test", VehicleAction.SendResponse(_, ObjectDetachMessage(PlanetSideGUID(2), PlanetSideGUID(1), _, _, _, _))) => ;
case _ =>
assert(false, s"VehicleControlPrepareForDeletionMountedCargoTest-5: ${vehicle_msg(3)}")
}
vehicle_msg(4) match {
case VehicleServiceMessage(
"test",
VehicleAction.SendResponse(
_,
CargoMountPointStatusMessage(PlanetSideGUID(2), _, _, PlanetSideGUID(1), 1, CargoStatus.Empty, 0)
)
) => ;
case _ => assert(false)
case VehicleServiceMessage("test", VehicleAction.SendResponse(_, CargoMountPointStatusMessage(PlanetSideGUID(2), _, _, PlanetSideGUID(1), 1, CargoStatus.Empty, 0))) => ;
case _ =>
assert(false, s"VehicleControlPrepareForDeletionMountedCargoTest-6: ${vehicle_msg(4)}")
}
}
}