From 7cc1dbbc63ad645fb783a5108f228ee86235d9aa Mon Sep 17 00:00:00 2001 From: Mazo Date: Tue, 2 Feb 2021 20:56:47 +0000 Subject: [PATCH 1/2] 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 bd56e9f8..9ab353d4 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 f29757b0..98b3a5fd 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) { From 7ed2cc7af44d27b7906bcad841368412772e4a3a Mon Sep 17 00:00:00 2001 From: Mazo Date: Tue, 2 Feb 2021 21:08:01 +0000 Subject: [PATCH 2/2] Dont unload vehicle inventory when closing trunk after rearming --- .../scala/net/psforever/actors/session/SessionActor.scala | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/scala/net/psforever/actors/session/SessionActor.scala b/src/main/scala/net/psforever/actors/session/SessionActor.scala index 98b3a5fd..e64c5342 100644 --- a/src/main/scala/net/psforever/actors/session/SessionActor.scala +++ b/src/main/scala/net/psforever/actors/session/SessionActor.scala @@ -4910,7 +4910,11 @@ class SessionActor(middlewareActor: typed.ActorRef[MiddlewareActor.Command], con TryDisposeOfLootedCorpse(obj) case Some(obj: Container) => - UnaccessContainer(obj) + // Make sure we don't unload the contents of the vehicle the player is seated in + // An example scenario of this would be closing the trunk contents when rearming at a landing pad + if (player.VehicleSeated.isEmpty || player.VehicleSeated.get != obj.GUID) { + UnaccessContainer(obj) + } case _ => ; }