retimed the self-reporting vehicle test for radiation cloud interaction

This commit is contained in:
Fate-JH 2026-01-04 17:01:51 -05:00
parent 01c014a59c
commit 12cbcfc6c1

View file

@ -288,11 +288,11 @@ class VehicleControl(vehicle: Vehicle)
final def Enabled: Receive = final def Enabled: Receive =
commonEnabledBehavior commonEnabledBehavior
.orElse { .orElse {
case VehicleControl.RadiationTick => case VehicleControl.RadiationTick if !passengerRadiationCloudTimer.isCancelled =>
vehicle.interaction().find { _.Type == RadiationInMountableInteraction } match { vehicle
case Some(func) => func.interaction(vehicle.getInteractionSector, vehicle) .interaction()
case _ => () .find(_.Type == RadiationInMountableInteraction)
} .foreach(_.interaction(vehicle.getInteractionSector, vehicle))
case _ => () case _ => ()
} }
@ -355,13 +355,12 @@ class VehicleControl(vehicle: Vehicle)
} }
def mountCleanup(mount_point: Int, user: Player): Unit = { def mountCleanup(mount_point: Int, user: Player): Unit = {
val obj = MountableObject vehicle.PassengerInSeat(user) match {
obj.PassengerInSeat(user) match { case Some(0) => //driver seat
case Some(seatNumber) =>
val vsrc = VehicleSource(vehicle) val vsrc = VehicleSource(vehicle)
user.LogActivity(VehicleMountActivity(vsrc, PlayerSource.inSeat(user, vsrc, seatNumber), vehicle.Zone.Number)) user.LogActivity(VehicleMountActivity(vsrc, PlayerSource.inSeat(user, vsrc, seatNumber = 0), vehicle.Zone.Number))
//if the driver mount, change ownership if that is permissible for this vehicle //if the driver mount, change ownership if that is permissible for this vehicle
if (seatNumber == 0 && !obj.OwnerName.contains(user.Name) && obj.Definition.CanBeOwned.nonEmpty) { if (!vehicle.OwnerName.contains(user.Name) && vehicle.Definition.CanBeOwned.nonEmpty) {
//whatever vehicle was previously owned //whatever vehicle was previously owned
vehicle.Zone.GUID(user.avatar.vehicle) match { vehicle.Zone.GUID(user.avatar.vehicle) match {
case Some(v: Vehicle) => case Some(v: Vehicle) =>
@ -370,13 +369,24 @@ class VehicleControl(vehicle: Vehicle)
user.avatar.vehicle = None user.avatar.vehicle = None
} }
GainOwnership(user) //gain new ownership GainOwnership(user) //gain new ownership
passengerRadiationCloudTimer.cancel()
} else { } else {
decaying = false decaying = false
decayTimer.cancel() decayTimer.cancel()
} }
passengerRadiationCloudTimer.cancel()
updateZoneInteractionProgressUI(user) updateZoneInteractionProgressUI(user)
case None => ;
case Some(seatNumber) => //literally any other seat
val vsrc = VehicleSource(vehicle)
user.LogActivity(VehicleMountActivity(vsrc, PlayerSource.inSeat(user, vsrc, seatNumber), vehicle.Zone.Number))
decaying = false
decayTimer.cancel()
if (!vehicle.Seats(0).isOccupied && passengerRadiationCloudTimer.isCancelled) {
StartRadiationSelfReporting()
}
updateZoneInteractionProgressUI(user)
case None => ()
} }
} }
@ -390,19 +400,17 @@ class VehicleControl(vehicle: Vehicle)
def dismountCleanup(seatBeingDismounted: Int, user: Player): Unit = { def dismountCleanup(seatBeingDismounted: Int, user: Player): Unit = {
val obj = MountableObject val obj = MountableObject
val allSeatsUnoccupied = !obj.Seats.values.exists(_.isOccupied)
// Reset velocity to zero when driver dismounts, to allow jacking/repair if vehicle was moving slightly before dismount // Reset velocity to zero when driver dismounts, to allow jacking/repair if vehicle was moving slightly before dismount
if (!obj.Seats(0).isOccupied) { if (!obj.Seats(0).isOccupied) {
obj.Velocity = Some(Vector3.Zero) obj.Velocity = Some(Vector3.Zero)
} }
if (seatBeingDismounted == 0) { if (allSeatsUnoccupied) {
passengerRadiationCloudTimer = context.system.scheduler.scheduleWithFixedDelay( passengerRadiationCloudTimer.cancel()
250.milliseconds, } else if (seatBeingDismounted == 0) {
250.milliseconds, StartRadiationSelfReporting()
self,
VehicleControl.RadiationTick
)
} }
if (!obj.Seats(seatBeingDismounted).isOccupied) { //seat was vacated if (!obj.Seats(seatBeingDismounted).isOccupied) { //this seat really was vacated
user.LogActivity(VehicleDismountActivity(VehicleSource(vehicle), PlayerSource(user), vehicle.Zone.Number)) user.LogActivity(VehicleDismountActivity(VehicleSource(vehicle), PlayerSource(user), vehicle.Zone.Number))
//we were only owning the vehicle while we sat in its driver seat //we were only owning the vehicle while we sat in its driver seat
val canBeOwned = obj.Definition.CanBeOwned val canBeOwned = obj.Definition.CanBeOwned
@ -411,9 +419,9 @@ class VehicleControl(vehicle: Vehicle)
} }
//are we already decaying? are we unowned? is no one seated anywhere? //are we already decaying? are we unowned? is no one seated anywhere?
if (!decaying && if (!decaying &&
obj.Definition.undergoesDecay && obj.Definition.undergoesDecay &&
obj.OwnerGuid.isEmpty && obj.OwnerGuid.isEmpty &&
obj.Seats.values.forall(!_.isOccupied)) { allSeatsUnoccupied) {
decaying = true decaying = true
decayTimer = context.system.scheduler.scheduleOnce( decayTimer = context.system.scheduler.scheduleOnce(
MountableObject.Definition.DeconstructionTime.getOrElse(5 minutes), MountableObject.Definition.DeconstructionTime.getOrElse(5 minutes),
@ -424,6 +432,16 @@ class VehicleControl(vehicle: Vehicle)
} }
} }
private def StartRadiationSelfReporting(): Unit = {
passengerRadiationCloudTimer.cancel()
passengerRadiationCloudTimer = context.system.scheduler.scheduleWithFixedDelay(
250.milliseconds,
250.milliseconds,
self,
VehicleControl.RadiationTick
)
}
def PrepareForDisabled(kickPassengers: Boolean) : Unit = { def PrepareForDisabled(kickPassengers: Boolean) : Unit = {
val guid = vehicle.GUID val guid = vehicle.GUID
val zone = vehicle.Zone val zone = vehicle.Zone
@ -492,7 +510,7 @@ class VehicleControl(vehicle: Vehicle)
case Some(_) => case Some(_) =>
decaying = false decaying = false
decayTimer.cancel() decayTimer.cancel()
case None => ; case None => ()
} }
} }
@ -507,9 +525,9 @@ class VehicleControl(vehicle: Vehicle)
self.toString, self.toString,
AvatarAction.SendResponse(Service.defaultPlayerGUID, ObjectAttachMessage(obj.GUID, item.GUID, slot)) AvatarAction.SendResponse(Service.defaultPlayerGUID, ObjectAttachMessage(obj.GUID, item.GUID, slot))
) )
case None => ; case None => ()
} }
case _ => ; case _ => ()
} }
} }