mirror of
https://github.com/psforever/PSF-LoginServer.git
synced 2026-01-19 18:44:45 +00:00
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:
parent
3f07dbe8ea
commit
690d7ec948
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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)
|
|
||||||
)
|
)
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue