mirror of
https://github.com/2revoemag/PSF-BotServer.git
synced 2026-01-19 18:14:44 +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.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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
)
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue