diff --git a/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs b/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs
index 2f2496998..cc859c440 100644
--- a/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs
+++ b/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs
@@ -306,10 +306,13 @@ namespace Barotrauma
Rectangle dockedBorders = Borders;
dockedBorders.Y -= dockedBorders.Height;
- foreach (Submarine dockedSub in DockedTo)
+ var connectedSubs = GetConnectedSubs();
+
+ foreach (Submarine dockedSub in connectedSubs)
{
- Vector2 diff = dockedSub.Submarine == this ? dockedSub.WorldPosition : dockedSub.WorldPosition - WorldPosition;
-
+ if (dockedSub == this) continue;
+
+ Vector2 diff = dockedSub.Submarine == this ? dockedSub.WorldPosition : dockedSub.WorldPosition - WorldPosition;
Rectangle dockedSubBorders = dockedSub.Borders;
dockedSubBorders.Y -= dockedSubBorders.Height;
@@ -322,6 +325,29 @@ namespace Barotrauma
return dockedBorders;
}
+ ///
+ /// Returns a list of all submarines that are connected to this one via docking ports.
+ ///
+ public List GetConnectedSubs()
+ {
+ List connectedSubs = new List();
+ connectedSubs.Add(this);
+ GetConnectedSubsRecursive(connectedSubs);
+
+ return connectedSubs;
+ }
+
+ private void GetConnectedSubsRecursive(List subs)
+ {
+ foreach (Submarine dockedSub in DockedTo)
+ {
+ if (subs.Contains(dockedSub)) continue;
+
+ subs.Add(dockedSub);
+ dockedSub.GetConnectedSubsRecursive(subs);
+ }
+ }
+
public Vector2 FindSpawnPos(Vector2 spawnPos)
{
Rectangle dockedBorders = GetDockedBorders();
diff --git a/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs b/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs
index 824345fa1..75b91f7dd 100644
--- a/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs
+++ b/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs
@@ -193,12 +193,11 @@ namespace Barotrauma
Body.CorrectPosition(memPos, deltaTime, out newVelocity, out newPosition);
Vector2 moveAmount = ConvertUnits.ToDisplayUnits(newPosition - Body.SimPosition);
- List subsToMove = new List() { this.submarine };
- subsToMove.AddRange(submarine.DockedTo);
-
- foreach (Submarine dockedSub in submarine.DockedTo)
+ List subsToMove = submarine.GetConnectedSubs();
+ foreach (Submarine dockedSub in subsToMove)
{
- //clear the position buffer of the docked sub to prevent unnecessary position corrections
+ if (dockedSub == submarine) continue;
+ //clear the position buffer of the docked subs to prevent unnecessary position corrections
dockedSub.SubBody.memPos.Clear();
}
@@ -213,7 +212,6 @@ namespace Barotrauma
}
bool displace = moveAmount.Length() > 100.0f;
-
foreach (Submarine sub in subsToMove)
{
sub.PhysicsBody.SetTransform(sub.PhysicsBody.SimPosition + ConvertUnits.ToSimUnits(moveAmount), 0.0f);