public void Dock(DockingPort target) { if (item.Submarine.DockedTo.Contains(target.item.Submarine)) { return; } forceLockTimer = 0.0f; if (DockingTarget != null) { Undock(); } if (target.item.Submarine == item.Submarine) { DebugConsole.ThrowError("Error - tried to dock a submarine to itself"); DockingTarget = null; return; } target.InitializeLinks(); if (!item.linkedTo.Contains(target.item)) { item.linkedTo.Add(target.item); } if (!target.item.linkedTo.Contains(item)) { target.item.linkedTo.Add(item); } if (!target.item.Submarine.DockedTo.Contains(item.Submarine)) { target.item.Submarine.ConnectedDockingPorts.Add(item.Submarine, target); } if (!item.Submarine.DockedTo.Contains(target.item.Submarine)) { item.Submarine.ConnectedDockingPorts.Add(target.item.Submarine, this); } DockingTarget = target; DockingTarget.DockingTarget = this; docked = true; DockingTarget.Docked = true; if (Character.Controlled != null && (Character.Controlled.Submarine == DockingTarget.item.Submarine || Character.Controlled.Submarine == item.Submarine)) { GameMain.GameScreen.Cam.Shake = Vector2.Distance(DockingTarget.item.Submarine.Velocity, item.Submarine.Velocity); } DockingDir = GetDir(DockingTarget); DockingTarget.DockingDir = -DockingDir; CreateJoint(false); #if SERVER if (GameMain.Server != null && (!item.Submarine?.Loading ?? true)) { originalDockingTargetID = DockingTarget.item.ID; item.CreateServerEvent(this); } #endif OnDocked?.Invoke(); OnDocked = null; }