diff --git a/src/main/scala/net/psforever/actors/session/support/ZoningOperations.scala b/src/main/scala/net/psforever/actors/session/support/ZoningOperations.scala index 989f7f93..e473fd12 100644 --- a/src/main/scala/net/psforever/actors/session/support/ZoningOperations.scala +++ b/src/main/scala/net/psforever/actors/session/support/ZoningOperations.scala @@ -6,6 +6,7 @@ import akka.actor.typed.scaladsl.adapter._ import akka.actor.{ActorContext, ActorRef, Cancellable, typed} import akka.pattern.ask import akka.util.Timeout +import net.psforever.objects.serverobject.mount.Seat import net.psforever.objects.serverobject.tube.SpawnTube import net.psforever.objects.sourcing.{PlayerSource, SourceEntry, VehicleSource} import net.psforever.objects.vital.{InGameHistory, ReconstructionActivity, SpawningActivity} @@ -1254,6 +1255,7 @@ class ZoningOperations( log.info(msg) log.debug(s"LoadZoneInVehicleAsDriver: $msg") val manifest = vehicle.PrepareGatingManifest() + vehicle.Seats.collect { case (index: Int, seat: Seat) if index > 0 => seat.unmount(seat.occupant) } val pguid = player.GUID val toChannel = manifest.file val topLevel = interstellarFerryTopLevelGUID.getOrElse(vehicle.GUID) diff --git a/src/main/scala/net/psforever/objects/Vehicle.scala b/src/main/scala/net/psforever/objects/Vehicle.scala index 604702ca..ee0650be 100644 --- a/src/main/scala/net/psforever/objects/Vehicle.scala +++ b/src/main/scala/net/psforever/objects/Vehicle.scala @@ -511,7 +511,6 @@ class Vehicle(private val vehicleDef: VehicleDefinition) def PrepareGatingManifest(): VehicleManifest = { val manifest = VehicleManifest(this) - seats.collect { case (index: Int, seat: Seat) if index > 0 => seat.unmount(seat.occupant) } vehicleGatingManifest = Some(manifest) previousVehicleGatingManifest = None manifest diff --git a/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala b/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala index 1828fd05..c8d32b20 100644 --- a/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala +++ b/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala @@ -1029,12 +1029,10 @@ class PlayerControl(player: Player, avatarActor: typed.ActorRef[AvatarActor.Comm case out @ Some(_) => out case _ => - target.LastDamage match { - case Some(attack) if System.currentTimeMillis() - attack.interaction.hitTime < (10 seconds).toMillis => + target.LastDamage.collect { + case attack if System.currentTimeMillis() - attack.interaction.hitTime < (10 seconds).toMillis => attack.adversarial - case _ => - None - } + }.flatten }) match { case Some(adversarial) => events ! AvatarServiceMessage( diff --git a/src/main/scala/net/psforever/objects/serverobject/damage/DamageableMountable.scala b/src/main/scala/net/psforever/objects/serverobject/damage/DamageableMountable.scala index cedcc10f..37034e7c 100644 --- a/src/main/scala/net/psforever/objects/serverobject/damage/DamageableMountable.scala +++ b/src/main/scala/net/psforever/objects/serverobject/damage/DamageableMountable.scala @@ -75,16 +75,14 @@ object DamageableMountable { */ def DestructionAwareness(target: Damageable.Target with Mountable, cause: DamageResult): Unit = { val interaction = cause.interaction - target.Seats.values - .filter(seat => { - seat.isOccupied && seat.occupant.get.isAlive - }) - .foreach(seat => { - val tplayer = seat.occupant.get - //tplayer.History(cause) - tplayer.Actor ! Player.Die( - DamageInteraction(interaction.resolution, SourceEntry(tplayer), interaction.cause, interaction.hitPos) + target.Seats + .values + .flatMap { _.occupant } + .collect { case player if player.isAlive => + //player.LogActivity(cause) + player.Actor ! Player.Die( + DamageInteraction(interaction.resolution, SourceEntry(player), interaction.cause, interaction.hitPos) ) - }) + } } } diff --git a/src/main/scala/net/psforever/objects/serverobject/damage/DamageableVehicle.scala b/src/main/scala/net/psforever/objects/serverobject/damage/DamageableVehicle.scala index 2859bf90..d1c2acf4 100644 --- a/src/main/scala/net/psforever/objects/serverobject/damage/DamageableVehicle.scala +++ b/src/main/scala/net/psforever/objects/serverobject/damage/DamageableVehicle.scala @@ -194,9 +194,10 @@ trait DamageableVehicle case (None, Some(delay)) => //set a future explosion for later destructionDelayed(delay, cause) case (Some(_), _) | (None, None) => //explode now - super.DestructionAwareness(target, cause) val obj = DamageableObject val zone = target.Zone + obj.PrepareGatingManifest() + super.DestructionAwareness(target, cause) //aggravation cancel EndAllAggravation() //passengers die with us diff --git a/src/main/scala/net/psforever/objects/sourcing/PlayerSource.scala b/src/main/scala/net/psforever/objects/sourcing/PlayerSource.scala index 7f2e1506..9c6754cb 100644 --- a/src/main/scala/net/psforever/objects/sourcing/PlayerSource.scala +++ b/src/main/scala/net/psforever/objects/sourcing/PlayerSource.scala @@ -5,7 +5,7 @@ import net.psforever.objects.definition.{AvatarDefinition, ExoSuitDefinition} import net.psforever.objects.serverobject.affinity.FactionAffinity import net.psforever.objects.serverobject.mount.Mountable import net.psforever.objects.vital.resistance.ResistanceProfile -import net.psforever.objects.{GlobalDefinitions, PlanetSideGameObject, Player} +import net.psforever.objects.{GlobalDefinitions, PlanetSideGameObject, Player, Vehicle} import net.psforever.types.{CharacterSex, ExoSuitType, PlanetSideEmpire, Vector3} final case class UniquePlayer( @@ -85,8 +85,18 @@ object PlayerSource { def mountableAndSeat(player: Player): Option[(SourceEntry, Int)] = { player.Zone.GUID(player.VehicleSeated) match { + case Some(vehicle: Vehicle) => + Some(( + SourceEntry(vehicle), + vehicle.PassengerInSeat(player).orElse { + vehicle.PublishGatingManifest().orElse(vehicle.PreviousGatingManifest()).flatMap { manifest => + val playerName = player.Name + manifest.passengers.find { _.name == playerName }.collect { _.mount } + } + }.getOrElse(0) + )) case Some(thing: PlanetSideGameObject with Mountable with FactionAffinity) => - Some((SourceEntry(thing), thing.PassengerInSeat(player).get)) + Some((SourceEntry(thing), thing.PassengerInSeat(player).getOrElse(0))) case _ => None } diff --git a/src/main/scala/net/psforever/zones/Zones.scala b/src/main/scala/net/psforever/zones/Zones.scala index bce08ea0..803e9e95 100644 --- a/src/main/scala/net/psforever/zones/Zones.scala +++ b/src/main/scala/net/psforever/zones/Zones.scala @@ -25,7 +25,7 @@ import net.psforever.objects.serverobject.terminals.implant.ImplantTerminalMech import net.psforever.objects.serverobject.tube.SpawnTube import net.psforever.objects.serverobject.turret.{FacilityTurret, FacilityTurretDefinition} import net.psforever.objects.serverobject.zipline.ZipLinePath -import net.psforever.objects.sourcing.{DeployableSource, ObjectSource, PlayerSource, VehicleSource} +import net.psforever.objects.sourcing.{DeployableSource, ObjectSource, PlayerSource, TurretSource, VehicleSource} import net.psforever.objects.zones.{MapInfo, Zone, ZoneInfo, ZoneMap} import net.psforever.types.{Angular, PlanetSideEmpire, Vector3} import net.psforever.util.DefinitionUtil @@ -995,10 +995,12 @@ object Zones { 60 seconds case _: VehicleSource => 60 seconds - case t: ObjectSource if t.Definition == GlobalDefinitions.manned_turret => - 60 seconds case _: DeployableSource => 60 seconds + case _: TurretSource => + 60 seconds + case g if g.Definition == GlobalDefinitions.generator => + 90 seconds case _ => 0 seconds }