removing an active router will always clean up an active router telepad with which it is paired

This commit is contained in:
Fate-JH 2023-05-09 23:34:04 -04:00
parent 561b23d265
commit 0d02d7b556
4 changed files with 36 additions and 31 deletions

View file

@ -1,7 +1,7 @@
// Copyright (c) 2018 PSForever // Copyright (c) 2018 PSForever
package net.psforever.objects.ce package net.psforever.objects.ce
import akka.actor.{ActorContext, Cancellable} import akka.actor.ActorContext
import net.psforever.objects.{Default, TelepadDeployable, Vehicle} import net.psforever.objects.{Default, TelepadDeployable, Vehicle}
import net.psforever.objects.serverobject.PlanetSideServerObject import net.psforever.objects.serverobject.PlanetSideServerObject
import net.psforever.objects.serverobject.structures.Amenity import net.psforever.objects.serverobject.structures.Amenity
@ -147,6 +147,12 @@ object TelepadLike {
LocalAction.SendResponse(GenericObjectActionMessage(telepadGUID, 28)) LocalAction.SendResponse(GenericObjectActionMessage(telepadGUID, 28))
) )
} }
def InitializeTelepadDeployable(zone: Zone, internal: InternalTelepad, pad: TelepadDeployable): Unit = {
internal.Telepad = pad.GUID
TelepadLike.StartRouterInternalTelepad(zone, internal.Owner.GUID, internal)
pad.Actor ! TelepadLike.Activate(internal)
}
} }
/** /**
@ -157,8 +163,6 @@ object TelepadLike {
* @param obj an entity that extends `TelepadLike` * @param obj an entity that extends `TelepadLike`
*/ */
class TelepadControl(obj: InternalTelepad) extends akka.actor.Actor { class TelepadControl(obj: InternalTelepad) extends akka.actor.Actor {
var setup: Cancellable = Default.Cancellable
def receive: akka.actor.Actor.Receive = { def receive: akka.actor.Actor.Receive = {
case TelepadLike.Activate(o: InternalTelepad) if obj eq o => case TelepadLike.Activate(o: InternalTelepad) if obj eq o =>
obj.Active = true obj.Active = true
@ -166,11 +170,9 @@ class TelepadControl(obj: InternalTelepad) extends akka.actor.Actor {
case TelepadLike.Deactivate(o: InternalTelepad) if obj eq o => case TelepadLike.Deactivate(o: InternalTelepad) if obj eq o =>
obj.Active = false obj.Active = false
val zone = obj.Zone val zone = obj.Zone
zone.GUID(obj.Telepad) match { zone.GUID(obj.Telepad).collect {
case Some(oldTpad: TelepadDeployable) case oldTpad: TelepadDeployable if oldTpad.Active =>
if !obj.Active && !setup.isCancelled =>
oldTpad.Actor ! TelepadLike.SeverLink(obj) oldTpad.Actor ! TelepadLike.SeverLink(obj)
case _ => ;
} }
obj.Telepad = None obj.Telepad = None
zone.LocalEvents ! LocalServiceMessage(zone.id, LocalAction.SendResponse(ObjectDeleteMessage(obj.GUID, 0))) zone.LocalEvents ! LocalServiceMessage(zone.id, LocalAction.SendResponse(ObjectDeleteMessage(obj.GUID, 0)))
@ -178,15 +180,20 @@ class TelepadControl(obj: InternalTelepad) extends akka.actor.Actor {
case TelepadLike.RequestLink(tpad: TelepadDeployable) => case TelepadLike.RequestLink(tpad: TelepadDeployable) =>
val zone = obj.Zone val zone = obj.Zone
if (obj.Active) { if (obj.Active) {
zone.GUID(obj.Telepad) match { zone
case Some(oldTpad: TelepadDeployable) if !obj.Active && !setup.isCancelled => .GUID(obj.Telepad)
oldTpad.Actor ! TelepadLike.SeverLink(obj) .collect {
case _ => ; case oldTpad: TelepadDeployable if oldTpad eq tpad =>
} Some(oldTpad)
obj.Telepad = tpad.GUID case oldTpad: TelepadDeployable if oldTpad.Active =>
//zone.LocalEvents ! LocalServiceMessage(zone.id, LocalAction.StartRouterInternalTelepad(obj.Owner.GUID, obj.GUID, obj)) oldTpad.Actor ! TelepadLike.SeverLink(obj)
TelepadLike.StartRouterInternalTelepad(zone, obj.Owner.GUID, obj) TelepadLike.InitializeTelepadDeployable(zone, obj, tpad)
tpad.Actor ! TelepadLike.Activate(obj) Some(oldTpad)
}
.orElse {
TelepadLike.InitializeTelepadDeployable(zone, obj, tpad)
None
}
} else { } else {
val channel = obj.Owner.asInstanceOf[Vehicle].OwnerName.getOrElse("") val channel = obj.Owner.asInstanceOf[Vehicle].OwnerName.getOrElse("")
zone.LocalEvents ! LocalServiceMessage(channel, LocalAction.RouterTelepadMessage("@Teleport_NotDeployed")) zone.LocalEvents ! LocalServiceMessage(channel, LocalAction.RouterTelepadMessage("@Teleport_NotDeployed"))
@ -200,6 +207,6 @@ class TelepadControl(obj: InternalTelepad) extends akka.actor.Actor {
zone.LocalEvents ! LocalServiceMessage(zone.id, LocalAction.SendResponse(ObjectDeleteMessage(obj.GUID, 0))) zone.LocalEvents ! LocalServiceMessage(zone.id, LocalAction.SendResponse(ObjectDeleteMessage(obj.GUID, 0)))
} }
case _ => ; case _ => ()
} }
} }

View file

@ -19,7 +19,7 @@ import scala.concurrent.duration._
class AntControl(vehicle: Vehicle) class AntControl(vehicle: Vehicle)
extends DeployingVehicleControl(vehicle) extends DeployingVehicleControl(vehicle)
with AntTransferBehavior { with AntTransferBehavior {
def ChargeTransferObject = vehicle def ChargeTransferObject: Vehicle = vehicle
override def commonEnabledBehavior: Receive = super.commonEnabledBehavior.orElse(antBehavior) override def commonEnabledBehavior: Receive = super.commonEnabledBehavior.orElse(antBehavior)
@ -38,7 +38,7 @@ class AntControl(vehicle: Vehicle)
vehicle.Actor, vehicle.Actor,
TransferBehavior.Charging(Ntu.Nanites) TransferBehavior.Charging(Ntu.Nanites)
) )
case _ => ; case _ => ()
} }
} }
@ -51,7 +51,7 @@ class AntControl(vehicle: Vehicle)
state match { state match {
case DriveState.Undeploying => case DriveState.Undeploying =>
TryStopChargingEvent(vehicle) TryStopChargingEvent(vehicle)
case _ => ; case _ => ()
} }
} }
} }

View file

@ -20,7 +20,7 @@ import net.psforever.types._
class DeployingVehicleControl(vehicle: Vehicle) class DeployingVehicleControl(vehicle: Vehicle)
extends VehicleControl(vehicle) extends VehicleControl(vehicle)
with DeploymentBehavior { with DeploymentBehavior {
def DeploymentObject = vehicle def DeploymentObject: Vehicle = vehicle
override def commonEnabledBehavior : Receive = super.commonEnabledBehavior.orElse(deployBehavior) override def commonEnabledBehavior : Receive = super.commonEnabledBehavior.orElse(deployBehavior)
@ -45,7 +45,7 @@ class DeployingVehicleControl(vehicle: Vehicle)
override def commonDeleteBehavior : Receive = override def commonDeleteBehavior : Receive =
super.commonDeleteBehavior super.commonDeleteBehavior
.orElse { .orElse {
case msg : Deployment.TryUndeploy => case msg: Deployment.TryUndeploy =>
deployBehavior.apply(msg) deployBehavior.apply(msg)
} }
@ -53,7 +53,7 @@ class DeployingVehicleControl(vehicle: Vehicle)
* Even when disabled, the vehicle can be made to undeploy. * Even when disabled, the vehicle can be made to undeploy.
*/ */
override def PrepareForDisabled(kickPassengers: Boolean) : Unit = { override def PrepareForDisabled(kickPassengers: Boolean) : Unit = {
vehicle.Actor ! Deployment.TryUndeploy(DriveState.Undeploying) TryUndeployStateChange(DriveState.Undeploying)
super.PrepareForDisabled(kickPassengers) super.PrepareForDisabled(kickPassengers)
} }

View file

@ -24,11 +24,10 @@ class RouterControl(vehicle: Vehicle)
override def specificResponseToDeployment(state: DriveState.Value): Unit = { override def specificResponseToDeployment(state: DriveState.Value): Unit = {
state match { state match {
case DriveState.Deployed => case DriveState.Deployed =>
vehicle.Utility(UtilityType.internal_router_telepad_deployable) match { vehicle.Utility(UtilityType.internal_router_telepad_deployable).collect {
case Some(util: Utility.InternalTelepad) => util.Actor ! TelepadLike.Activate(util) case util: Utility.InternalTelepad => util.Actor ! TelepadLike.Activate(util)
case _ => ;
} }
case _ => ; case _ => ()
} }
} }
@ -40,11 +39,10 @@ class RouterControl(vehicle: Vehicle)
override def specificResponseToUndeployment(state: DriveState.Value): Unit = { override def specificResponseToUndeployment(state: DriveState.Value): Unit = {
state match { state match {
case DriveState.Undeploying => case DriveState.Undeploying =>
vehicle.Utility(UtilityType.internal_router_telepad_deployable) match { vehicle.Utility(UtilityType.internal_router_telepad_deployable).collect {
case Some(util: Utility.InternalTelepad) => util.Actor ! TelepadLike.Deactivate(util) case util: Utility.InternalTelepad => util.Actor ! TelepadLike.Deactivate(util)
case _ => ;
} }
case _ => ; case _ => ()
} }
} }
} }