From cea5d5b074aa1b5416b0ee64e47c5a44a3c2ab0a Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Sat, 10 Nov 2018 20:21:43 +0200 Subject: [PATCH] Fixed client-side docking ports creating duplicate bodies on doors, causing characters to collide with an invisible door when trying to move between docked subs (until the server forces them through it). + TODO note about bugged hull finding logic in UpdateNetPlayerPosition! --- .../Source/Characters/Animation/Ragdoll.cs | 1 + .../Source/Items/Components/DockingPort.cs | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Animation/Ragdoll.cs b/Barotrauma/BarotraumaShared/Source/Characters/Animation/Ragdoll.cs index 3023a30a2..33e405ef4 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Animation/Ragdoll.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Animation/Ragdoll.cs @@ -1497,6 +1497,7 @@ namespace Barotrauma } } + //TODO: this does not work, the positions are in sim units but FindHull uses display units Hull serverHull = Hull.FindHull(serverPos.Position, character.CurrentHull, false); Hull clientHull = Hull.FindHull(localPos.Position, serverHull, false); diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/DockingPort.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/DockingPort.cs index 506f1a5da..60f67e238 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/DockingPort.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/DockingPort.cs @@ -335,6 +335,12 @@ namespace Barotrauma.Items.Components private void CreateDoorBody() { + if (doorBody != null) + { + GameMain.World.RemoveBody(doorBody); + doorBody = null; + } + Vector2 position = ConvertUnits.ToSimUnits(item.Position + (dockingTarget.door.Item.WorldPosition - item.WorldPosition)); if (!MathUtils.IsValid(position)) { @@ -351,6 +357,8 @@ namespace Barotrauma.Items.Components position = Vector2.Zero; } + System.Diagnostics.Debug.Assert(doorBody == null); + doorBody = BodyFactory.CreateRectangle(GameMain.World, dockingTarget.door.Body.width, dockingTarget.door.Body.height,