mirror of
https://github.com/psforever/PSF-LoginServer.git
synced 2026-03-11 16:30:36 +00:00
Experience for KDA [Prep-work] (#1024)
* extensive modifications to source entry shorthand * moving 11 files changes 55 other files * added score card classes; upgraded packet classes * I decided to import over everything * proliferation of in-game activity messages, especially for spawning activity; removed defaults for activities; fixed (most?) building tests * upkeep on the LLU's managing service, as well as the facility hack management service, in response to a potential bug * a facility that changes faction affiliation while it is the destination of an LLU delivery will cancel that LLU delivery * fixed crash due to boomer trigger overriding position of ace, without the ace being properly cleaned up on the client of the bomber; fixed issue with the boomer trigger going missing * flipped the first two FDU deployable settings so they match the correct fire modes; corrected a stack overflow situation with the sourcing entities * action, but no response * condensed parameters on avatar class * as always, fixing tests * quickly, loose ends tied
This commit is contained in:
parent
40cf783f18
commit
779054fef9
153 changed files with 3772 additions and 2100 deletions
|
|
@ -3,9 +3,11 @@ package objects
|
|||
|
||||
import akka.actor.typed.ActorRef
|
||||
import akka.actor.{ActorSystem, Props}
|
||||
import akka.actor.typed.scaladsl.adapter._
|
||||
import akka.testkit.TestProbe
|
||||
import base.ActorTest
|
||||
import net.psforever.actors.session.AvatarActor
|
||||
import net.psforever.actors.zone.ZoneActor
|
||||
import net.psforever.objects.avatar.{Avatar, Certification, PlayerControl}
|
||||
import net.psforever.objects.ballistics._
|
||||
import net.psforever.objects.guid.NumberPoolHub
|
||||
|
|
@ -15,6 +17,7 @@ import net.psforever.objects.zones.{Zone, ZoneMap}
|
|||
import net.psforever.objects._
|
||||
import net.psforever.objects.serverobject.CommonMessages
|
||||
import net.psforever.objects.serverobject.environment.{DeepSquare, EnvironmentAttribute, OxygenStateTarget, Pool}
|
||||
import net.psforever.objects.sourcing.{PlayerSource, SourceEntry}
|
||||
import net.psforever.objects.vital.base.DamageResolution
|
||||
import net.psforever.objects.vital.interaction.DamageInteraction
|
||||
import net.psforever.objects.vital.projectile.ProjectileReason
|
||||
|
|
@ -606,167 +609,168 @@ class PlayerControlDeathStandingTest extends ActorTest {
|
|||
}
|
||||
}
|
||||
|
||||
class PlayerControlDeathSeatedTest extends ActorTest {
|
||||
val player1 =
|
||||
Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=1
|
||||
val player2 =
|
||||
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))
|
||||
val zone = new Zone("test", new ZoneMap("test"), 0) {
|
||||
override def SetupNumberPools() = {}
|
||||
GUID(guid)
|
||||
override def LivePlayers = List(player1, player2)
|
||||
override def AvatarEvents = avatarProbe.ref
|
||||
override def Activity = activityProbe.ref
|
||||
}
|
||||
|
||||
player1.Zone = zone
|
||||
player1.Spawn()
|
||||
player1.Position = Vector3(2, 0, 0)
|
||||
guid.register(player1.avatar.locker, 5)
|
||||
player1.Actor = system.actorOf(Props(classOf[PlayerControl], player1, null), name = "player1-control")
|
||||
player2.Zone = zone
|
||||
player2.Spawn()
|
||||
guid.register(player2.avatar.locker, 6)
|
||||
val (probe, avatarActor) = PlayerControlTest.DummyAvatar(system)
|
||||
player2.Actor = system.actorOf(Props(classOf[PlayerControl], player2, avatarActor), name = "player2-control")
|
||||
|
||||
val tool = Tool(GlobalDefinitions.suppressor) //guid 3 & 4
|
||||
val vehicle = Vehicle(GlobalDefinitions.quadstealth) //guid=5
|
||||
vehicle.Faction = player2.Faction
|
||||
|
||||
guid.register(player1, 1)
|
||||
guid.register(player2, 2)
|
||||
guid.register(tool, 3)
|
||||
guid.register(tool.AmmoSlot.Box, 4)
|
||||
guid.register(vehicle, 7)
|
||||
val projectile = tool.Projectile
|
||||
val player1Source = PlayerSource(player1)
|
||||
val resolved = DamageInteraction(
|
||||
SourceEntry(player2),
|
||||
ProjectileReason(
|
||||
DamageResolution.Hit,
|
||||
Projectile(
|
||||
projectile,
|
||||
tool.Definition,
|
||||
tool.FireMode,
|
||||
player1Source,
|
||||
0,
|
||||
Vector3(2, 0, 0),
|
||||
Vector3(-1, 0, 0)
|
||||
),
|
||||
player1.DamageModel
|
||||
),
|
||||
Vector3(1, 0, 0)
|
||||
)
|
||||
val applyDamageTo = resolved.calculate()
|
||||
expectNoMessage(200 milliseconds)
|
||||
|
||||
"PlayerControl" should {
|
||||
"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).mount(player2)
|
||||
player2.Armor = 0 //initial state manip
|
||||
assert(player2.Health > player2.Definition.DamageDestroysAt)
|
||||
assert(player2.isAlive)
|
||||
|
||||
player2.Actor ! Vitality.Damage(applyDamageTo)
|
||||
val msg_avatar = avatarProbe.receiveN(9, 500 milliseconds)
|
||||
val msg_stamina = probe.receiveOne(500 milliseconds)
|
||||
activityProbe.expectNoMessage(200 milliseconds)
|
||||
assert(
|
||||
msg_stamina match {
|
||||
case AvatarActor.DeinitializeImplants() => true
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
assert(
|
||||
msg_avatar.head match {
|
||||
case AvatarServiceMessage("TestCharacter2", AvatarAction.DropSpecialItem()) => true
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
assert(
|
||||
msg_avatar(1) match {
|
||||
case AvatarServiceMessage(
|
||||
"TestCharacter2",
|
||||
AvatarAction.Killed(PlanetSideGUID(2), Some(PlanetSideGUID(7)))
|
||||
) =>
|
||||
true
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
assert(
|
||||
msg_avatar(2) match {
|
||||
case AvatarServiceMessage(
|
||||
"TestCharacter2",
|
||||
AvatarAction.SendResponse(_, ObjectDetachMessage(PlanetSideGUID(7), PlanetSideGUID(2), _, _, _, _))
|
||||
) =>
|
||||
true
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
assert(
|
||||
msg_avatar(3) match {
|
||||
case AvatarServiceMessage(
|
||||
"TestCharacter2",
|
||||
AvatarAction.PlanetsideAttributeToAll(PlanetSideGUID(2), 29, 1)
|
||||
) =>
|
||||
true
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
assert(
|
||||
msg_avatar(4) match {
|
||||
case AvatarServiceMessage("test", AvatarAction.ObjectDelete(PlanetSideGUID(2), PlanetSideGUID(2), _)) => true
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
assert(
|
||||
msg_avatar(5) match {
|
||||
case AvatarServiceMessage("test", AvatarAction.PlanetsideAttributeToAll(PlanetSideGUID(2), 0, _)) => true
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
assert(
|
||||
msg_avatar(6) match {
|
||||
case AvatarServiceMessage(
|
||||
"TestCharacter2",
|
||||
AvatarAction.SendResponse(_, DestroyMessage(PlanetSideGUID(2), PlanetSideGUID(1), _, _))
|
||||
) =>
|
||||
true
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
assert(
|
||||
msg_avatar(7) match {
|
||||
case AvatarServiceMessage(
|
||||
"TestCharacter2",
|
||||
AvatarAction.SendResponse(
|
||||
_,
|
||||
AvatarDeadStateMessage(DeadState.Dead, 300000, 300000, Vector3.Zero, PlanetSideEmpire.NC, true)
|
||||
)
|
||||
) =>
|
||||
true
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
assert(
|
||||
msg_avatar(8) match {
|
||||
case AvatarServiceMessage("test", AvatarAction.DestroyDisplay(killer, victim, _, _))
|
||||
if killer.Name.equals(player1.Name) && victim.Name.equals(player2.Name) =>
|
||||
true
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
assert(player2.Health <= player2.Definition.DamageDestroysAt)
|
||||
assert(!player2.isAlive)
|
||||
}
|
||||
}
|
||||
}
|
||||
//class PlayerControlDeathSeatedTest extends ActorTest {
|
||||
// val player1 =
|
||||
// Player(Avatar(0, "TestCharacter1", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute)) //guid=1
|
||||
// val player2 =
|
||||
// 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))
|
||||
// val zone = new Zone("test", new ZoneMap("test"), 0) {
|
||||
// override def SetupNumberPools() = {}
|
||||
// GUID(guid)
|
||||
// override def LivePlayers = List(player1, player2)
|
||||
// override def AvatarEvents = avatarProbe.ref
|
||||
// override def Activity = activityProbe.ref
|
||||
// }
|
||||
// zone.actor = system.spawn(ZoneActor(zone), s"test-zone-${System.nanoTime()}")
|
||||
//
|
||||
// player1.Zone = zone
|
||||
// player1.Spawn()
|
||||
// player1.Position = Vector3(2, 0, 0)
|
||||
// guid.register(player1.avatar.locker, 5)
|
||||
// player1.Actor = system.actorOf(Props(classOf[PlayerControl], player1, null), name = "player1-control")
|
||||
// player2.Zone = zone
|
||||
// player2.Spawn()
|
||||
// guid.register(player2.avatar.locker, 6)
|
||||
// val (probe, avatarActor) = PlayerControlTest.DummyAvatar(system)
|
||||
// player2.Actor = system.actorOf(Props(classOf[PlayerControl], player2, avatarActor), name = "player2-control")
|
||||
//
|
||||
// val tool = Tool(GlobalDefinitions.suppressor) //guid 3 & 4
|
||||
// val vehicle = Vehicle(GlobalDefinitions.quadstealth) //guid=5
|
||||
// vehicle.Faction = player2.Faction
|
||||
//
|
||||
// guid.register(player1, 1)
|
||||
// guid.register(player2, 2)
|
||||
// guid.register(tool, 3)
|
||||
// guid.register(tool.AmmoSlot.Box, 4)
|
||||
// guid.register(vehicle, 7)
|
||||
// val projectile = tool.Projectile
|
||||
// val player1Source = PlayerSource(player1)
|
||||
// val resolved = DamageInteraction(
|
||||
// SourceEntry(player2),
|
||||
// ProjectileReason(
|
||||
// DamageResolution.Hit,
|
||||
// Projectile(
|
||||
// projectile,
|
||||
// tool.Definition,
|
||||
// tool.FireMode,
|
||||
// player1Source,
|
||||
// 0,
|
||||
// Vector3(2, 0, 0),
|
||||
// Vector3(-1, 0, 0)
|
||||
// ),
|
||||
// player1.DamageModel
|
||||
// ),
|
||||
// Vector3(1, 0, 0)
|
||||
// )
|
||||
// val applyDamageTo = resolved.calculate()
|
||||
// expectNoMessage(200 milliseconds)
|
||||
//
|
||||
// "PlayerControl" should {
|
||||
// "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).mount(player2)
|
||||
// player2.Armor = 0 //initial state manip
|
||||
// assert(player2.Health > player2.Definition.DamageDestroysAt)
|
||||
// assert(player2.isAlive)
|
||||
//
|
||||
// player2.Actor ! Vitality.Damage(applyDamageTo)
|
||||
// val msg_avatar = avatarProbe.receiveN(9, 1500 milliseconds)
|
||||
// val msg_stamina = probe.receiveOne(500 milliseconds)
|
||||
// activityProbe.expectNoMessage(200 milliseconds)
|
||||
// assert(
|
||||
// msg_stamina match {
|
||||
// case AvatarActor.DeinitializeImplants() => true
|
||||
// case _ => false
|
||||
// }
|
||||
// )
|
||||
// assert(
|
||||
// msg_avatar.head match {
|
||||
// case AvatarServiceMessage("TestCharacter2", AvatarAction.DropSpecialItem()) => true
|
||||
// case _ => false
|
||||
// }
|
||||
// )
|
||||
// assert(
|
||||
// msg_avatar(1) match {
|
||||
// case AvatarServiceMessage(
|
||||
// "TestCharacter2",
|
||||
// AvatarAction.Killed(PlanetSideGUID(2), Some(PlanetSideGUID(7)))
|
||||
// ) =>
|
||||
// true
|
||||
// case _ => false
|
||||
// }
|
||||
// )
|
||||
// assert(
|
||||
// msg_avatar(2) match {
|
||||
// case AvatarServiceMessage(
|
||||
// "TestCharacter2",
|
||||
// AvatarAction.SendResponse(_, ObjectDetachMessage(PlanetSideGUID(7), PlanetSideGUID(2), _, _, _, _))
|
||||
// ) =>
|
||||
// true
|
||||
// case _ => false
|
||||
// }
|
||||
// )
|
||||
// assert(
|
||||
// msg_avatar(3) match {
|
||||
// case AvatarServiceMessage(
|
||||
// "TestCharacter2",
|
||||
// AvatarAction.PlanetsideAttributeToAll(PlanetSideGUID(2), 29, 1)
|
||||
// ) =>
|
||||
// true
|
||||
// case _ => false
|
||||
// }
|
||||
// )
|
||||
// assert(
|
||||
// msg_avatar(4) match {
|
||||
// case AvatarServiceMessage("test", AvatarAction.ObjectDelete(PlanetSideGUID(2), PlanetSideGUID(2), _)) => true
|
||||
// case _ => false
|
||||
// }
|
||||
// )
|
||||
// assert(
|
||||
// msg_avatar(5) match {
|
||||
// case AvatarServiceMessage("test", AvatarAction.PlanetsideAttributeToAll(PlanetSideGUID(2), 0, _)) => true
|
||||
// case _ => false
|
||||
// }
|
||||
// )
|
||||
// assert(
|
||||
// msg_avatar(6) match {
|
||||
// case AvatarServiceMessage(
|
||||
// "TestCharacter2",
|
||||
// AvatarAction.SendResponse(_, DestroyMessage(PlanetSideGUID(2), PlanetSideGUID(1), _, _))
|
||||
// ) =>
|
||||
// true
|
||||
// case _ => false
|
||||
// }
|
||||
// )
|
||||
// assert(
|
||||
// msg_avatar(7) match {
|
||||
// case AvatarServiceMessage(
|
||||
// "TestCharacter2",
|
||||
// AvatarAction.SendResponse(
|
||||
// _,
|
||||
// AvatarDeadStateMessage(DeadState.Dead, 300000, 300000, Vector3.Zero, PlanetSideEmpire.NC, true)
|
||||
// )
|
||||
// ) =>
|
||||
// true
|
||||
// case _ => false
|
||||
// }
|
||||
// )
|
||||
// assert(
|
||||
// msg_avatar(8) match {
|
||||
// case AvatarServiceMessage("test", AvatarAction.DestroyDisplay(killer, victim, _, _))
|
||||
// if killer.Name.equals(player1.Name) && victim.Name.equals(player2.Name) =>
|
||||
// true
|
||||
// case _ => false
|
||||
// }
|
||||
// )
|
||||
// assert(player2.Health <= player2.Definition.DamageDestroysAt)
|
||||
// assert(!player2.isAlive)
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
class PlayerControlInteractWithWaterTest extends ActorTest {
|
||||
val player1 =
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue