From 5337f37363ae0cab60461fb75e74be043f6dff3f Mon Sep 17 00:00:00 2001 From: Fate-JH Date: Mon, 8 May 2023 14:15:04 -0400 Subject: [PATCH] players in seats have their mounted information shortened in a more straightforward, less fault-prone way; stamina recharge command shortened --- .../psforever/actors/session/AvatarActor.scala | 18 +++--------------- .../objects/avatar/PlayerControl.scala | 18 ++++++++++-------- .../objects/sourcing/AmenitySource.scala | 4 +++- .../objects/sourcing/PlayerSource.scala | 6 +++--- .../objects/sourcing/TurretSource.scala | 4 +++- .../objects/sourcing/VehicleSource.scala | 4 ++-- 6 files changed, 24 insertions(+), 30 deletions(-) diff --git a/src/main/scala/net/psforever/actors/session/AvatarActor.scala b/src/main/scala/net/psforever/actors/session/AvatarActor.scala index d375251fc..956835bda 100644 --- a/src/main/scala/net/psforever/actors/session/AvatarActor.scala +++ b/src/main/scala/net/psforever/actors/session/AvatarActor.scala @@ -1606,11 +1606,7 @@ class AvatarActor( Behaviors.same case RestoreStamina(stamina) => - tryRestoreStaminaForSession(stamina) match { - case Some(sess) => - actuallyRestoreStamina(stamina, sess) - case _ => ; - } + tryRestoreStaminaForSession(stamina).collect { actuallyRestoreStamina(stamina, _) } Behaviors.same case RestoreStaminaPeriodically(stamina) => @@ -1871,11 +1867,7 @@ class AvatarActor( ) ) // if we need to start stamina regeneration - tryRestoreStaminaForSession(stamina = 1) match { - case Some(_) => - defaultStaminaRegen(initialDelay = 0.5f seconds) - case _ => ; - } + tryRestoreStaminaForSession(stamina = 1).collect { _ => defaultStaminaRegen(initialDelay = 0.5f seconds) } replyTo ! AvatarLoginResponse(avatar) case Failure(e) => log.error(e)("db failure") @@ -1965,11 +1957,7 @@ class AvatarActor( } def restoreStaminaPeriodically(stamina: Int): Unit = { - tryRestoreStaminaForSession(stamina) match { - case Some(sess) => - actuallyRestoreStaminaIfStationary(stamina, sess) - case _ => ; - } + tryRestoreStaminaForSession(stamina).collect { actuallyRestoreStaminaIfStationary(stamina, _) } startIfStoppedStaminaRegen(initialDelay = 0.5f seconds) } diff --git a/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala b/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala index f22a77292..3bc220335 100644 --- a/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala +++ b/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala @@ -36,7 +36,7 @@ import net.psforever.objects.sourcing.PlayerSource import net.psforever.objects.vital.collision.CollisionReason import net.psforever.objects.vital.environment.EnvironmentReason import net.psforever.objects.vital.etc.{PainboxReason, SuicideReason} -import net.psforever.objects.vital.interaction.{DamageInteraction, DamageResult} +import net.psforever.objects.vital.interaction.{Adversarial, DamageInteraction, DamageResult} import net.psforever.services.hart.ShuttleState import net.psforever.packet.PlanetSideGamePacket @@ -1033,21 +1033,23 @@ class PlayerControl(player: Player, avatarActor: typed.ActorRef[AvatarActor.Comm ) //TODO other methods of death? val pentry = PlayerSource(target) - (cause.adversarial match { - case out @ Some(_) => - out - case _ => + cause + .adversarial + .collect { case out @ Adversarial(attacker, _, _) if attacker != PlayerSource.Nobody => out } + .orElse { target.LastDamage.collect { case attack if System.currentTimeMillis() - attack.interaction.hitTime < (10 seconds).toMillis => - attack.adversarial + attack + .adversarial + .collect { case out @ Adversarial(attacker, _, _) if attacker != PlayerSource.Nobody => out } }.flatten - }) match { + } match { case Some(adversarial) => events ! AvatarServiceMessage( zoneChannel, AvatarAction.DestroyDisplay(adversarial.attacker, pentry, adversarial.implement) ) - case None => + case _ => events ! AvatarServiceMessage(zoneChannel, AvatarAction.DestroyDisplay(pentry, pentry, 0)) } } diff --git a/src/main/scala/net/psforever/objects/sourcing/AmenitySource.scala b/src/main/scala/net/psforever/objects/sourcing/AmenitySource.scala index 32b1b97ea..56e9b600f 100644 --- a/src/main/scala/net/psforever/objects/sourcing/AmenitySource.scala +++ b/src/main/scala/net/psforever/objects/sourcing/AmenitySource.scala @@ -59,7 +59,9 @@ object AmenitySource { ) amenity.copy(occupants = obj match { case o: Mountable => - o.Seats.values.flatMap { _.occupants }.map { p => PlayerSource.inSeat(p, o, amenity) }.toList + o.Seats + .collect { case (num, seat) if seat.isOccupied => (num, seat.occupants.head) } + .map { case (num, p) => PlayerSource.inSeat(p, amenity, num) }.toList case _ => Nil }) diff --git a/src/main/scala/net/psforever/objects/sourcing/PlayerSource.scala b/src/main/scala/net/psforever/objects/sourcing/PlayerSource.scala index 9c6754cbd..1e2874201 100644 --- a/src/main/scala/net/psforever/objects/sourcing/PlayerSource.scala +++ b/src/main/scala/net/psforever/objects/sourcing/PlayerSource.scala @@ -109,17 +109,17 @@ object PlayerSource { * even if this function is entirely for the purpose of establishing that the player is an occupant of the mountable entity.
* Don't think too much about it. * @param player player - * @param mount mountable entity in which the player should be seated * @param source a `SourceEntry` for the aforementioned mountable entity + * @param seatNumber the attributed seating index in which the player is mounted in `source` * @return a `PlayerSource` entity */ - def inSeat(player: Player, mount: Mountable, source: SourceEntry): PlayerSource = { + def inSeat(player: Player, source: SourceEntry, seatNumber: Int): PlayerSource = { val exosuit = player.ExoSuit val faction = player.Faction PlayerSource( player.Definition, exosuit, - Some((source, mount.PassengerInSeat(player).get)), + Some((source, seatNumber)), player.Health, player.Armor, player.Position, diff --git a/src/main/scala/net/psforever/objects/sourcing/TurretSource.scala b/src/main/scala/net/psforever/objects/sourcing/TurretSource.scala index 783e655d8..a1df7df61 100644 --- a/src/main/scala/net/psforever/objects/sourcing/TurretSource.scala +++ b/src/main/scala/net/psforever/objects/sourcing/TurretSource.scala @@ -57,7 +57,9 @@ object TurretSource { ) turret.copy(occupants = obj match { case o: Mountable => - o.Seats.values.flatMap { _.occupants }.map { p => PlayerSource.inSeat(p, o, turret) }.toList + o.Seats + .collect { case (num, seat) if seat.isOccupied => (num, seat.occupants.head) } + .map { case (num, p) => PlayerSource.inSeat(p, turret, num) }.toList case _ => Nil }) diff --git a/src/main/scala/net/psforever/objects/sourcing/VehicleSource.scala b/src/main/scala/net/psforever/objects/sourcing/VehicleSource.scala index c9d84f51e..fc02bdf1c 100644 --- a/src/main/scala/net/psforever/objects/sourcing/VehicleSource.scala +++ b/src/main/scala/net/psforever/objects/sourcing/VehicleSource.scala @@ -53,9 +53,9 @@ object VehicleSource { ) ) vehicle.copy(occupants = { - obj.Seats.values.map { seat => + obj.Seats.map { case (seatNumber, seat) => seat.occupant match { - case Some(p) => PlayerSource.inSeat(p, obj, vehicle) //shallow + case Some(p) => PlayerSource.inSeat(p, vehicle, seatNumber) //shallow case _ => PlayerSource.Nobody } }.toList