From 928e7fdf9ec80269919bb82f8093fef52042c534 Mon Sep 17 00:00:00 2001 From: Fate-JH Date: Mon, 10 May 2021 23:48:50 -0400 Subject: [PATCH] Driverless Vehicles (#814) * zone load accommodation for vehicles without 'drivers' expressed in the OCM packet * assurance --- .../actors/session/SessionActor.scala | 34 +++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/src/main/scala/net/psforever/actors/session/SessionActor.scala b/src/main/scala/net/psforever/actors/session/SessionActor.scala index 285237cb..5fa59aca 100644 --- a/src/main/scala/net/psforever/actors/session/SessionActor.scala +++ b/src/main/scala/net/psforever/actors/session/SessionActor.scala @@ -1900,6 +1900,7 @@ class SessionActor(middlewareActor: typed.ActorRef[MiddlewareActor.Command], con continent.GUID(mount) match { case Some(obj: Vehicle) => ConditionalDriverVehicleControl(obj) + serverVehicleControlVelocity = None UnaccessContainer(obj) case _ => ; } @@ -2806,7 +2807,6 @@ class SessionActor(middlewareActor: typed.ActorRef[MiddlewareActor.Command], con val tplayer_guid = if (player.HasGUID) player.GUID else PlanetSideGUID(0) reply match { case VehicleResponse.AttachToRails(vehicle_guid, pad_guid) => - serverVehicleControlVelocity = Some(0) sendResponse(ObjectAttachMessage(pad_guid, vehicle_guid, 3)) case VehicleResponse.ChildObjectState(object_guid, pitch, yaw) => @@ -3675,10 +3675,18 @@ class SessionActor(middlewareActor: typed.ActorRef[MiddlewareActor.Command], con sendResponse( ObjectCreateMessage(vdefinition.ObjectId, vguid, vdefinition.Packet.ConstructorData(vehicle).get) ) - //occupants other than driver + //occupants other than driver (with exceptions) vehicle.Seats - .filter({ case (index, seat) => seat.isOccupied && live.contains(seat.occupant.get) && index > 0 }) - .foreach({ + .filter { + case (index, seat) => + seat.isOccupied && + live.contains(seat.occupant.get) && + (vehicle.Definition match { + case GlobalDefinitions.orbital_shuttle | GlobalDefinitions.droppod => true + case _ => index > 0 + }) + } + .foreach { case (index, seat) => val targetPlayer = seat.occupant.get val targetDefiniton = targetPlayer.avatar.definition @@ -3690,7 +3698,7 @@ class SessionActor(middlewareActor: typed.ActorRef[MiddlewareActor.Command], con targetDefiniton.Packet.ConstructorData(targetPlayer).get ) ) - }) + } }) vehicles.collect { case vehicle if vehicle.Faction == faction => @@ -3702,11 +3710,17 @@ class SessionActor(middlewareActor: typed.ActorRef[MiddlewareActor.Command], con //depict any other passengers already in this zone val vguid = vehicle.GUID vehicle.Seats - .filter({ + .filter { case (index, seat) => - seat.isOccupied && !seat.occupant.contains(player) && live.contains(seat.occupant.get) && index > 0 - }) - .foreach({ + seat.isOccupied && + !seat.occupant.contains(player) && + live.contains(seat.occupant.get) && + (vehicle.Definition match { + case GlobalDefinitions.orbital_shuttle => true + case _ => index > 0 + }) + } + .foreach { case (index, seat) => val targetPlayer = seat.occupant.get val targetDefinition = targetPlayer.avatar.definition @@ -3718,7 +3732,7 @@ class SessionActor(middlewareActor: typed.ActorRef[MiddlewareActor.Command], con targetDefinition.Packet.ConstructorData(targetPlayer).get ) ) - }) + } //since we would have only subscribed recently, we need to reload mount access states (0 to 3).foreach { group => sendResponse(PlanetsideAttributeMessage(vguid, group + 10, vehicle.PermissionGroup(group).get.id))