public void haltDocking(string reason = "unknown", bool sendSignal = true) { if (Communication.currentNode.playerCommand == "recall") { Display.printDebug("Cannot halt docking, drones are recalled."); return; } Display.printDebug("[INFO] Halting docking, reason: " + reason); this.dockingInProgress = false; this.hasDockingPermission = false; this.enableLock = false; this.dockingStart = 0; this.connectionStart = 0; this.dockingStep = 2; if (this.myConnector != null) { if (this.myConnector.block != null && this.myConnector.block.Status == MyShipConnectorStatus.Connected) { this.myConnector.block.Disconnect(); } if (this.myConnector.connectorId != null) { AnchoredConnector.setConnectorState(this.myConnector.connectorId, false); if (this.myConnector.piston != null) { this.myConnector.piston.setPistonState(false); } } } if (this.dockingWithDrone != 0 && sendSignal) { // Send halt dock signal. this.navHandle.commHandle.sendStopDocking(reason, this.dockingWithDrone); this.dockingWithDrone = 0; } if (Communication.masterDrone != null && Communication.masterDrone.masterConnectorId != 0) { Communication.masterDrone.masterConnectorId = 0; } if (Communication.currentNode.navHandle.activeDockingProcedure != null) { Communication.currentNode.navHandle.activeDockingProcedure = null; } // Remove from active procedure list for (int i = 0; i < Docking.activeDockingProcedures.Count; i++) { if (Docking.activeDockingProcedures[i] == this) { Docking.activeDockingProcedures.RemoveAt(i); } } }
public void handleDockingRequest(string data) { if (Communication.currentNode.type != "mothership") { return; // Motherships handle docking requests } string[] dataSplitted = data.Split('_'); if (dataSplitted.Count() == 2) { int id = int.Parse(dataSplitted[0]); if (Communication.currentNode.id != id) { return; // If not my id } int slaveId = int.Parse(dataSplitted[1]); int nodeIndex = this.getNodeIndexById(slaveId); if (nodeIndex == -1) { Communication.connectedNodes.Add(slaveId); Drone node = new Drone(slaveId); node.initNavigation(this.myGrid); Communication.connectedNodesData.Add(node); nodeIndex = this.getNodeIndexById(slaveId); } AnchoredConnector available = AnchoredConnector.getAvailableAnchoredConnector(); if (available == null) { Display.print("Docking request denied (Connectors full)."); } else { if (Docking.dockingWithDrone(slaveId)) { Display.print("Already accepted, continue on docking."); this.sendDockingAccepted(slaveId); this.sendConnectorData(slaveId); } else { Display.print("Assigning a proper connector."); DockingProcedure dock = new DockingProcedure(slaveId); dock.setNavHandle(Communication.currentNode.navHandle); dock.myConnector = available; dock.initDocking(); Docking.activeDockingProcedures.Add(dock); this.sendDockingAccepted(slaveId); this.sendConnectorData(slaveId); } } } else { Display.print("[ERROR] Docking request invalid. (" + data + ")"); } }
public void handleProcedure() { if (this.dockingInProgress == true) { if (this.dockingWithDrone != 0) { int nodeIndex = this.navHandle.commHandle.getNodeIndexById(this.dockingWithDrone); if (nodeIndex == -1) { this.haltDocking("drone-not-found"); } } else { this.haltDocking("drone-not-found"); } if (Communication.getTimestamp() - this.dockingStart > 600 && this.connectionStart == 0) { this.haltDocking("last-resort-timeout"); } if (this.dockingStart != 0 && Communication.getTimestamp() - this.dockingStart > 10) { if (this.connectionStart != 0 && Communication.getTimestamp() - this.connectionStart > 10) { AnchoredConnector connector = this.myConnector; if (connector != null && connector.block.Status != MyShipConnectorStatus.Connected) { this.haltDocking("no-connection"); } } } } else { if (this.myConnector != null) { IMyShipConnector connector = this.myConnector.block; if (this.connectionStart > 0 && Communication.getTimestamp() - this.connectionStart > 15) { this.haltDocking("docking-not-in-progress"); } if (connector.Status == MyShipConnectorStatus.Connected) { this.haltDocking("docking-has-ended"); } } else { this.haltDocking("connector-is-missing"); } } }
public void handleIdleConnectors() { for (int i = 0; i < AnchoredConnector.anchoredConnectors.Count; i++) { if (AnchoredConnector.anchoredConnectors[i].inUse == false) { AnchoredConnector.setConnectorState(AnchoredConnector.anchoredConnectors[i].connectorId, false); if (AnchoredConnector.anchoredConnectors[i].piston != null) { AnchoredConnector.anchoredConnectors[i].piston.setPistonState(false); } } } }
public void sendConnectorData(int slaveId) { Display.printDebug("Sending connector info."); DockingProcedure procedure = Docking.getDroneDockingProcedure(slaveId); if (procedure != null) { AnchoredConnector connector = procedure.myConnector; if (connector != null && connector.isAnchored) { procedure.lastConnectorPing = Communication.getTimestamp(); Vector3D pos; this.dataStructure.newPackage(); this.dataStructure.addRawData("drone-connector-data"); this.dataStructure.addData("id", Communication.currentNode.id.ToString()); this.dataStructure.addData("slaveId", slaveId.ToString()); this.dataStructure.addData("masterConnectorId", connector.connectorId.ToString()); pos = connector.anchorTop.block.GetPosition(); this.dataStructure.addData("connectorAnchorTopX", pos.X.ToString()); this.dataStructure.addData("connectorAnchorTopY", pos.Y.ToString()); this.dataStructure.addData("connectorAnchorTopZ", pos.Z.ToString()); pos = connector.anchorBottom.block.GetPosition(); this.dataStructure.addData("connectorAnchorBottomX", pos.X.ToString()); this.dataStructure.addData("connectorAnchorBottomY", pos.Y.ToString()); this.dataStructure.addData("connectorAnchorBottomZ", pos.Z.ToString()); this.broadcastMessage(this.dataStructure.generateOutput()); procedure.approveDocking(); } else { Display.printDebug("[Error] No working connectors found. (Connectors: " + AnchoredConnector.anchoredConnectors.Count + ")"); } } else { Display.printDebug("[Error] No docking procedure found."); } }
public void handleFinalStep(DockingProcedure procedure) { Communication.currentNode.status = "docking-step-final"; this.navHandle.setAutopilotStatus(false); if (procedure.connectionStart > 0) { this.handleDockedStep(procedure); } else { AnchoredConnector connector = procedure.myConnector; if (connector != null) { if (connector.block.Status != MyShipConnectorStatus.Connected) { if (connector.block.Status == MyShipConnectorStatus.Connectable) { this.navHandle.gyroHandle.disableOverride(); connector.block.Connect(); this.navHandle.thrusterStatus(false); } else { Vector3D targetPos = this.getDockingPosition(1, procedure); double distance = this.getDistanceFrom(this.navHandle.getShipPosition(), targetPos); if (distance > 3) { this.navHandle.setAutopilotStatus(true); this.navHandle.move(targetPos, "docking-realign"); this.navHandle.setCollisionStatus(false); } else { this.navHandle.setAutopilotStatus(false); AnchoredConnector.setConnectorState(connector.connectorId, true); this.navHandle.commHandle.sendDockingLockRequest(1); this.navHandle.gyroHandle.rotateShip(2); // Rotate near connector. } } } else { this.navHandle.thrusterStatus(false); procedure.connectionStart = Communication.getTimestamp(); Communication.currentNode.status = "docking-step-connected"; } } else { Display.printDebug("No connectors found, total connectors: " + AnchoredConnector.anchoredConnectors.Count); Communication.currentNode.status = "error-connector-not-found"; } } }
public void initDocking() { this.dockingInProgress = true; this.enableLock = true; this.hasDockingPermission = false; this.dockingStep = 2; this.queuePos = 0; this.procedureId = Core.generateRandomId(); this.connectionStart = 0; this.dockingStart = Communication.getTimestamp(); if (this.myConnector == null) { this.myConnector = AnchoredConnector.getAvailableConnector(); } if (this.myConnector != null) { AnchoredConnector.setConnectorState(this.myConnector.connectorId, true); } else { Display.printDebug("[ERROR] No available connector found for docking."); } }
public void handleDockLockRequest(string data) { if (Communication.currentNode.type != "mothership") { return; // Motherships handle docking requests } string[] dataSplitted = data.Split('_'); if (dataSplitted.Count() == 3) { int id = int.Parse(dataSplitted[0]); if (Communication.currentNode.id != id) { return; // If not my id } int status = int.Parse(dataSplitted[1]); int slaveId = int.Parse(dataSplitted[2]); DockingProcedure procedure = Docking.getDroneDockingProcedure(slaveId); if (procedure != null) { if (procedure.myConnector != null) { if (procedure.myConnector.piston != null) { Display.printDebug("[INFO] Changing piston state to " + (bool)(status == 1) + ", ConnectorID: " + procedure.myConnector.connectorId + "."); procedure.myConnector.piston.setPistonState((bool)(status == 1)); } Display.printDebug("[INFO] Changing connector state to " + (bool)(status == 1) + ", ConnectorID: " + procedure.myConnector.connectorId + "."); AnchoredConnector.setConnectorState(procedure.myConnector.connectorId, (bool)(status == 1)); } } else { Display.printDebug("[WARN] Docking procedure not found."); } } }
public static void initConnectors(MyGridProgram myGrid) { List <IMyShipConnector> blocks = new List <IMyShipConnector>(); List <CustomData> customData; AnchoredConnector tmpAnchoredConnector; myGrid.GridTerminalSystem.GetBlocksOfType <IMyShipConnector>(blocks); foreach (IMyShipConnector block in blocks) { if (block.CustomName.Contains("[Drone]")) { customData = CustomData.getCustomData(block.CustomData); if (customData.Count > 0) { tmpAnchoredConnector = new AnchoredConnector(block, customData); tmpAnchoredConnector.assignAnchorsToConnector(); if (tmpAnchoredConnector.connectorId != null) { AnchoredConnector.anchoredConnectors.Add(tmpAnchoredConnector); } } } } }
public void initiate() { AnchoredConnector.setAllConnectorState(false); Piston.setAllPistonState(false); this.type = "mothership"; }