From 7cc1dbbc63ad645fb783a5108f228ee86235d9aa Mon Sep 17 00:00:00 2001 From: Mazo Date: Tue, 2 Feb 2021 20:56:47 +0000 Subject: [PATCH] Don't unload vehicle inventory contents if the player is seated in it (fixes race condition with PSUM + vehicle mounting) --- .../scala/net/psforever/actors/net/MiddlewareActor.scala | 5 +---- .../scala/net/psforever/actors/session/SessionActor.scala | 6 ++++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/scala/net/psforever/actors/net/MiddlewareActor.scala b/src/main/scala/net/psforever/actors/net/MiddlewareActor.scala index bd56e9f8f..9ab353d4c 100644 --- a/src/main/scala/net/psforever/actors/net/MiddlewareActor.scala +++ b/src/main/scala/net/psforever/actors/net/MiddlewareActor.scala @@ -119,10 +119,7 @@ object MiddlewareActor { packet.isInstanceOf[CharacterInfoMessage] } - /** - * `KeepAliveMessage` packets are bundled by themselves. - * They're special. - */ + /** `KeepAliveMessage` packets are bundled by themselves. They're special. */ def keepAliveMessageGuard(packet: PlanetSidePacket): Boolean = { packet.isInstanceOf[KeepAliveMessage] } diff --git a/src/main/scala/net/psforever/actors/session/SessionActor.scala b/src/main/scala/net/psforever/actors/session/SessionActor.scala index f29757b02..98b3a5fd1 100644 --- a/src/main/scala/net/psforever/actors/session/SessionActor.scala +++ b/src/main/scala/net/psforever/actors/session/SessionActor.scala @@ -3655,7 +3655,9 @@ class SessionActor(middlewareActor: typed.ActorRef[MiddlewareActor.Command], con } } accessedContainer match { - case Some(veh: Vehicle) => + // Ensure we don't unload the contents of the vehicle trunk for players seated in the vehicle. + // This can happen if PSUM arrives during the mounting process + case Some(veh: Vehicle) if player.VehicleSeated.isEmpty || player.VehicleSeated.get != veh.GUID => if ( isMoving || veh.isMoving(1) || Vector3.DistanceSquared( player.Position, @@ -3668,7 +3670,7 @@ class SessionActor(middlewareActor: typed.ActorRef[MiddlewareActor.Command], con UnaccessContainer(veh) } case Some(container) => //just in case - if (isMovingPlus) { + if (isMovingPlus && (player.VehicleSeated.isEmpty || player.VehicleSeated.get != container.GUID)) { // Ensure we don't close the container if the player is seated in it val guid = player.GUID // If the container is a corpse and gets removed just as this runs it can cause a client disconnect, so we'll check the container has a GUID first. if (container.HasGUID) {