Players Properly Assigned Blame for Killing Vehicle Occupants (#1027)

* players will properly be blamed for being killed in vehicles

* vehicle occupants should stay in their seats until told to die

* wall turrets are now recognized as something else
This commit is contained in:
Fate-JH 2023-02-18 08:59:17 -05:00 committed by GitHub
parent 3f07dbe8ea
commit 690d7ec948
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 32 additions and 22 deletions

View file

@ -6,6 +6,7 @@ import akka.actor.typed.scaladsl.adapter._
import akka.actor.{ActorContext, ActorRef, Cancellable, typed} import akka.actor.{ActorContext, ActorRef, Cancellable, typed}
import akka.pattern.ask import akka.pattern.ask
import akka.util.Timeout import akka.util.Timeout
import net.psforever.objects.serverobject.mount.Seat
import net.psforever.objects.serverobject.tube.SpawnTube import net.psforever.objects.serverobject.tube.SpawnTube
import net.psforever.objects.sourcing.{PlayerSource, SourceEntry, VehicleSource} import net.psforever.objects.sourcing.{PlayerSource, SourceEntry, VehicleSource}
import net.psforever.objects.vital.{InGameHistory, ReconstructionActivity, SpawningActivity} import net.psforever.objects.vital.{InGameHistory, ReconstructionActivity, SpawningActivity}
@ -1254,6 +1255,7 @@ class ZoningOperations(
log.info(msg) log.info(msg)
log.debug(s"LoadZoneInVehicleAsDriver: $msg") log.debug(s"LoadZoneInVehicleAsDriver: $msg")
val manifest = vehicle.PrepareGatingManifest() val manifest = vehicle.PrepareGatingManifest()
vehicle.Seats.collect { case (index: Int, seat: Seat) if index > 0 => seat.unmount(seat.occupant) }
val pguid = player.GUID val pguid = player.GUID
val toChannel = manifest.file val toChannel = manifest.file
val topLevel = interstellarFerryTopLevelGUID.getOrElse(vehicle.GUID) val topLevel = interstellarFerryTopLevelGUID.getOrElse(vehicle.GUID)

View file

@ -511,7 +511,6 @@ class Vehicle(private val vehicleDef: VehicleDefinition)
def PrepareGatingManifest(): VehicleManifest = { def PrepareGatingManifest(): VehicleManifest = {
val manifest = VehicleManifest(this) val manifest = VehicleManifest(this)
seats.collect { case (index: Int, seat: Seat) if index > 0 => seat.unmount(seat.occupant) }
vehicleGatingManifest = Some(manifest) vehicleGatingManifest = Some(manifest)
previousVehicleGatingManifest = None previousVehicleGatingManifest = None
manifest manifest

View file

@ -1029,12 +1029,10 @@ class PlayerControl(player: Player, avatarActor: typed.ActorRef[AvatarActor.Comm
case out @ Some(_) => case out @ Some(_) =>
out out
case _ => case _ =>
target.LastDamage match { target.LastDamage.collect {
case Some(attack) if System.currentTimeMillis() - attack.interaction.hitTime < (10 seconds).toMillis => case attack if System.currentTimeMillis() - attack.interaction.hitTime < (10 seconds).toMillis =>
attack.adversarial attack.adversarial
case _ => }.flatten
None
}
}) match { }) match {
case Some(adversarial) => case Some(adversarial) =>
events ! AvatarServiceMessage( events ! AvatarServiceMessage(

View file

@ -75,16 +75,14 @@ object DamageableMountable {
*/ */
def DestructionAwareness(target: Damageable.Target with Mountable, cause: DamageResult): Unit = { def DestructionAwareness(target: Damageable.Target with Mountable, cause: DamageResult): Unit = {
val interaction = cause.interaction val interaction = cause.interaction
target.Seats.values target.Seats
.filter(seat => { .values
seat.isOccupied && seat.occupant.get.isAlive .flatMap { _.occupant }
}) .collect { case player if player.isAlive =>
.foreach(seat => { //player.LogActivity(cause)
val tplayer = seat.occupant.get player.Actor ! Player.Die(
//tplayer.History(cause) DamageInteraction(interaction.resolution, SourceEntry(player), interaction.cause, interaction.hitPos)
tplayer.Actor ! Player.Die(
DamageInteraction(interaction.resolution, SourceEntry(tplayer), interaction.cause, interaction.hitPos)
) )
}) }
} }
} }

View file

@ -194,9 +194,10 @@ trait DamageableVehicle
case (None, Some(delay)) => //set a future explosion for later case (None, Some(delay)) => //set a future explosion for later
destructionDelayed(delay, cause) destructionDelayed(delay, cause)
case (Some(_), _) | (None, None) => //explode now case (Some(_), _) | (None, None) => //explode now
super.DestructionAwareness(target, cause)
val obj = DamageableObject val obj = DamageableObject
val zone = target.Zone val zone = target.Zone
obj.PrepareGatingManifest()
super.DestructionAwareness(target, cause)
//aggravation cancel //aggravation cancel
EndAllAggravation() EndAllAggravation()
//passengers die with us //passengers die with us

View file

@ -5,7 +5,7 @@ import net.psforever.objects.definition.{AvatarDefinition, ExoSuitDefinition}
import net.psforever.objects.serverobject.affinity.FactionAffinity import net.psforever.objects.serverobject.affinity.FactionAffinity
import net.psforever.objects.serverobject.mount.Mountable import net.psforever.objects.serverobject.mount.Mountable
import net.psforever.objects.vital.resistance.ResistanceProfile 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} import net.psforever.types.{CharacterSex, ExoSuitType, PlanetSideEmpire, Vector3}
final case class UniquePlayer( final case class UniquePlayer(
@ -85,8 +85,18 @@ object PlayerSource {
def mountableAndSeat(player: Player): Option[(SourceEntry, Int)] = { def mountableAndSeat(player: Player): Option[(SourceEntry, Int)] = {
player.Zone.GUID(player.VehicleSeated) match { 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) => case Some(thing: PlanetSideGameObject with Mountable with FactionAffinity) =>
Some((SourceEntry(thing), thing.PassengerInSeat(player).get)) Some((SourceEntry(thing), thing.PassengerInSeat(player).getOrElse(0)))
case _ => case _ =>
None None
} }

View file

@ -25,7 +25,7 @@ import net.psforever.objects.serverobject.terminals.implant.ImplantTerminalMech
import net.psforever.objects.serverobject.tube.SpawnTube import net.psforever.objects.serverobject.tube.SpawnTube
import net.psforever.objects.serverobject.turret.{FacilityTurret, FacilityTurretDefinition} import net.psforever.objects.serverobject.turret.{FacilityTurret, FacilityTurretDefinition}
import net.psforever.objects.serverobject.zipline.ZipLinePath 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.objects.zones.{MapInfo, Zone, ZoneInfo, ZoneMap}
import net.psforever.types.{Angular, PlanetSideEmpire, Vector3} import net.psforever.types.{Angular, PlanetSideEmpire, Vector3}
import net.psforever.util.DefinitionUtil import net.psforever.util.DefinitionUtil
@ -995,10 +995,12 @@ object Zones {
60 seconds 60 seconds
case _: VehicleSource => case _: VehicleSource =>
60 seconds 60 seconds
case t: ObjectSource if t.Definition == GlobalDefinitions.manned_turret =>
60 seconds
case _: DeployableSource => case _: DeployableSource =>
60 seconds 60 seconds
case _: TurretSource =>
60 seconds
case g if g.Definition == GlobalDefinitions.generator =>
90 seconds
case _ => case _ =>
0 seconds 0 seconds
} }