private void OnDock(DockEvent ev) { RefreshShuttleConsoles(); }
/// <summary> /// Docks 2 ports together and assumes it is valid. /// </summary> private void Dock(DockingComponent dockA, DockingComponent dockB) { Logger.DebugS("docking", $"Docking between {dockA.Owner} and {dockB.Owner}"); // https://gamedev.stackexchange.com/questions/98772/b2distancejoint-with-frequency-equal-to-0-vs-b2weldjoint // We could also potentially use a prismatic joint? Depending if we want clamps that can extend or whatever var dockAXform = EntityManager.GetComponent <TransformComponent>(dockA.Owner); var dockBXform = EntityManager.GetComponent <TransformComponent>(dockB.Owner); var gridA = _mapManager.GetGrid(dockAXform.GridID).GridEntityId; var gridB = _mapManager.GetGrid(dockBXform.GridID).GridEntityId; SharedJointSystem.LinearStiffness( 2f, 0.7f, EntityManager.GetComponent <PhysicsComponent>(gridA).Mass, EntityManager.GetComponent <PhysicsComponent>(gridB).Mass, out var stiffness, out var damping); // These need playing around with // Could also potentially have collideconnected false and stiffness 0 but it was a bit more suss??? var joint = _jointSystem.GetOrCreateWeldJoint(gridA, gridB, DockingJoint + dockA.Owner); var gridAXform = EntityManager.GetComponent <TransformComponent>(gridA); var gridBXform = EntityManager.GetComponent <TransformComponent>(gridB); var anchorA = dockAXform.LocalPosition + dockAXform.LocalRotation.ToWorldVec() / 2f; var anchorB = dockBXform.LocalPosition + dockBXform.LocalRotation.ToWorldVec() / 2f; joint.LocalAnchorA = anchorA; joint.LocalAnchorB = anchorB; joint.ReferenceAngle = (float)(gridBXform.WorldRotation - gridAXform.WorldRotation); joint.CollideConnected = true; joint.Stiffness = stiffness; joint.Damping = damping; dockA.DockedWith = dockB.Owner; dockB.DockedWith = dockA.Owner; dockA.DockJoint = joint; dockB.DockJoint = joint; if (TryComp(dockA.Owner, out ServerDoorComponent? doorA)) { doorA.ChangeAirtight = false; doorA.Open(); } if (TryComp(dockB.Owner, out ServerDoorComponent? doorB)) { doorB.ChangeAirtight = false; doorB.Open(); } var msg = new DockEvent { DockA = dockA, DockB = dockB, GridAUid = gridA, GridBUid = gridB, }; EntityManager.EventBus.RaiseLocalEvent(dockA.Owner, msg, false); EntityManager.EventBus.RaiseLocalEvent(dockB.Owner, msg, false); EntityManager.EventBus.RaiseEvent(EventSource.Local, msg); }
/// <summary> /// Docks 2 ports together and assumes it is valid. /// </summary> public void Dock(DockingComponent dockA, DockingComponent dockB) { if (dockB.Owner.GetHashCode() < dockA.Owner.GetHashCode()) { (dockA, dockB) = (dockB, dockA); } _sawmill.Debug($"Docking between {dockA.Owner} and {dockB.Owner}"); // https://gamedev.stackexchange.com/questions/98772/b2distancejoint-with-frequency-equal-to-0-vs-b2weldjoint // We could also potentially use a prismatic joint? Depending if we want clamps that can extend or whatever var dockAXform = EntityManager.GetComponent <TransformComponent>(dockA.Owner); var dockBXform = EntityManager.GetComponent <TransformComponent>(dockB.Owner); DebugTools.Assert(dockAXform.GridUid != null); DebugTools.Assert(dockBXform.GridUid != null); var gridA = dockAXform.GridUid !.Value; var gridB = dockBXform.GridUid !.Value; SharedJointSystem.LinearStiffness( 2f, 0.7f, EntityManager.GetComponent <PhysicsComponent>(gridA).Mass, EntityManager.GetComponent <PhysicsComponent>(gridB).Mass, out var stiffness, out var damping); // These need playing around with // Could also potentially have collideconnected false and stiffness 0 but it was a bit more suss??? WeldJoint joint; // Pre-existing joint so use that. if (dockA.DockJointId != null) { DebugTools.Assert(dockB.DockJointId == dockA.DockJointId); joint = _jointSystem.GetOrCreateWeldJoint(gridA, gridB, dockA.DockJointId); } else { joint = _jointSystem.GetOrCreateWeldJoint(gridA, gridB, DockingJoint + dockA.Owner); } var gridAXform = EntityManager.GetComponent <TransformComponent>(gridA); var gridBXform = EntityManager.GetComponent <TransformComponent>(gridB); var anchorA = dockAXform.LocalPosition + dockAXform.LocalRotation.ToWorldVec() / 2f; var anchorB = dockBXform.LocalPosition + dockBXform.LocalRotation.ToWorldVec() / 2f; joint.LocalAnchorA = anchorA; joint.LocalAnchorB = anchorB; joint.ReferenceAngle = (float)(gridBXform.WorldRotation - gridAXform.WorldRotation); joint.CollideConnected = true; joint.Stiffness = stiffness; joint.Damping = damping; dockA.DockedWith = dockB.Owner; dockB.DockedWith = dockA.Owner; dockA.DockJoint = joint; dockA.DockJointId = joint.ID; dockB.DockJoint = joint; dockB.DockJointId = joint.ID; if (TryComp <AirlockComponent>(dockA.Owner, out var airlockA)) { airlockA.SetBoltsWithAudio(true); } if (TryComp <AirlockComponent>(dockB.Owner, out var airlockB)) { airlockB.SetBoltsWithAudio(true); } if (TryComp(dockA.Owner, out DoorComponent? doorA)) { doorA.ChangeAirtight = false; _doorSystem.StartOpening(doorA.Owner, doorA); } if (TryComp(dockB.Owner, out DoorComponent? doorB)) { doorB.ChangeAirtight = false; _doorSystem.StartOpening(doorB.Owner, doorB); } var msg = new DockEvent { DockA = dockA, DockB = dockB, GridAUid = gridA, GridBUid = gridB, }; EntityManager.EventBus.RaiseLocalEvent(dockA.Owner, msg, false); EntityManager.EventBus.RaiseLocalEvent(dockB.Owner, msg, false); EntityManager.EventBus.RaiseEvent(EventSource.Local, msg); }