diff --git a/src/main/scala/net/psforever/actors/session/normal/GeneralLogic.scala b/src/main/scala/net/psforever/actors/session/normal/GeneralLogic.scala index 7c493e365..812bf74af 100644 --- a/src/main/scala/net/psforever/actors/session/normal/GeneralLogic.scala +++ b/src/main/scala/net/psforever/actors/session/normal/GeneralLogic.scala @@ -533,7 +533,7 @@ class GeneralLogic(val ops: GeneralOperations, implicit val context: ActorContex case _ => GUIDTask.registerObject(continent.GUID, dObj) } - TaskWorkflow.execute(CallBackForTask(tasking, continent.Deployables, Zone.Deployable.BuildByOwner(dObj, player, obj))) + TaskWorkflow.execute(CallBackForTask(tasking, continent.Deployables, Zone.Deployable.BuildByOwner(dObj, player, obj), context.self)) case Some(obj) => log.warn(s"DeployObject: what is $obj, ${player.Name}? It's not a construction tool!") case None => diff --git a/src/main/scala/net/psforever/actors/session/normal/NormalMode.scala b/src/main/scala/net/psforever/actors/session/normal/NormalMode.scala index 9c49e8dd5..d6fd141e3 100644 --- a/src/main/scala/net/psforever/actors/session/normal/NormalMode.scala +++ b/src/main/scala/net/psforever/actors/session/normal/NormalMode.scala @@ -4,6 +4,7 @@ package net.psforever.actors.session.normal import akka.actor.Actor.Receive import akka.actor.ActorRef import net.psforever.actors.session.support.{ChatFunctions, GeneralFunctions, LocalHandlerFunctions, MountHandlerFunctions, SquadHandlerFunctions, TerminalHandlerFunctions, VehicleFunctions, VehicleHandlerFunctions, WeaponAndProjectileFunctions} +import net.psforever.objects.Players import net.psforever.packet.game.UplinkRequest import net.psforever.services.chat.ChatService // @@ -248,9 +249,11 @@ class NormalModeLogic(data: SessionData) extends ModeLogic { case _: Zone.Vehicle.HasDespawned => ; case Zone.Deployable.IsDismissed(obj: TurretDeployable) => //only if target deployable was never fully introduced + Players.buildCooldownReset(data.continent, data.player.Name, obj) TaskWorkflow.execute(GUIDTask.unregisterDeployableTurret(data.continent.GUID, obj)) case Zone.Deployable.IsDismissed(obj) => //only if target deployable was never fully introduced + Players.buildCooldownReset(data.continent, data.player.Name, obj) TaskWorkflow.execute(GUIDTask.unregisterObject(data.continent.GUID, obj)) case msg: Containable.ItemPutInSlot => diff --git a/src/main/scala/net/psforever/actors/session/normal/VehicleLogic.scala b/src/main/scala/net/psforever/actors/session/normal/VehicleLogic.scala index 8d39fcc6b..f6fe40c83 100644 --- a/src/main/scala/net/psforever/actors/session/normal/VehicleLogic.scala +++ b/src/main/scala/net/psforever/actors/session/normal/VehicleLogic.scala @@ -272,24 +272,29 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex def handleDeployRequest(pkt: DeployRequestMessage): Unit = { val DeployRequestMessage(_, vehicle_guid, deploy_state, _, _, _) = pkt - val vehicle = player.avatar.vehicle - if (vehicle.contains(vehicle_guid)) { - if (vehicle == player.VehicleSeated) { - continent.GUID(vehicle_guid) match { - case Some(obj: Vehicle) => + continent.GUID(vehicle_guid) + .collect { + case obj: Vehicle => + val vehicle = player.avatar.vehicle + if (!vehicle.contains(vehicle_guid)) { + log.warn(s"DeployRequest: ${player.Name} does not own the would-be-deploying ${obj.Definition.Name}") + } else if (vehicle != player.VehicleSeated) { + log.warn(s"${player.Name} must be mounted as the driver to request a deployment change") + } else { log.info(s"${player.Name} is requesting a deployment change for ${obj.Definition.Name} - $deploy_state") obj.Actor ! Deployment.TryDeploymentChange(deploy_state) - - case _ => - log.error(s"DeployRequest: ${player.Name} can not find vehicle $vehicle_guid") - avatarActor ! AvatarActor.SetVehicle(None) - } - } else { - log.warn(s"${player.Name} must be mounted to request a deployment change") + continent.Transport ! Zone.Vehicle.TryDeploymentChange(obj, deploy_state) + } + obj + case obj => + log.error(s"DeployRequest: ${player.Name} expected a vehicle, but found a ${obj.Definition.Name} instead") + obj + } + .orElse { + log.error(s"DeployRequest: ${player.Name} can not find entity $vehicle_guid") + avatarActor ! AvatarActor.SetVehicle(None) //todo is this safe + None } - } else { - log.warn(s"DeployRequest: ${player.Name} does not own the deploying $vehicle_guid object") - } } /* messages */ diff --git a/src/main/scala/net/psforever/objects/zones/ZoneVehicleActor.scala b/src/main/scala/net/psforever/objects/zones/ZoneVehicleActor.scala index 02ee833c7..c1b7780be 100644 --- a/src/main/scala/net/psforever/objects/zones/ZoneVehicleActor.scala +++ b/src/main/scala/net/psforever/objects/zones/ZoneVehicleActor.scala @@ -20,6 +20,8 @@ class ZoneVehicleActor( vehicleList: mutable.ListBuffer[Vehicle], turretToMount: mutable.HashMap[Int, Int] ) extends Actor { + private val log = org.log4s.getLogger(s"${zone.id}-vehicles") + private var temporaryInterference: Seq[(Vector3, PlanetSideEmpire.Value, VehicleDefinition)] = Seq() def receive: Receive = { @@ -81,8 +83,10 @@ class ZoneVehicleActor( case Zone.Vehicle.CanNotDespawn(_, _, _) => () - case Zone.Vehicle.CanNotDeploy(_, vehicle, _, _) => () + case Zone.Vehicle.CanNotDeploy(_, vehicle, _, reason) => () val pos = vehicle.Position + val driverMoniker = vehicle.Seats.headOption.flatMap(_._2.occupant).map(_.Name).getOrElse("Driver") + log.warn(s"$driverMoniker's ${vehicle.Definition.Name} can not deploy in ${zone.id} because $reason") temporaryInterference = temporaryInterference.filterNot(_._1 == pos) case ZoneVehicleActor.ClearInterference(pos) =>