mirror of
https://github.com/2revoemag/PSF-BotServer.git
synced 2026-07-08 13:04:40 +00:00
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:
parent
0001ef6ce5
commit
93a544c07c
56 changed files with 2024 additions and 1029 deletions
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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) ::
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue