public Vector3D getDockingPosition(int step, DockingProcedure procedure) { if (Communication.masterDrone != null && Communication.masterDrone.connectorAnchorTopPosition.X != null) { Vector3D targetPos = this.getMasterPosition(step * 50); return targetPos; } return new Vector3D(0,0,0); }
public void handleHaltDocking(List <CommunicationDataStructureValue> responseData) { int id = 0; int dockingWithId = 0; string reason = "unknown-connection"; foreach (CommunicationDataStructureValue data in responseData) { if (data.getName() == "id") { id = int.Parse(data.getValue()); } else if (data.getName() == "reason") { reason = data.getValue(); } else if (data.getName() == "dockingWithId") { dockingWithId = int.Parse(data.getValue()); } } if (id != 0 && id == Communication.currentNode.id) { Display.printDebug("[Incoming] Halt docking reason " + reason); DockingProcedure procedure = Docking.getDroneDockingProcedure(dockingWithId); if (procedure != null) { procedure.haltDocking(reason, false); } Communication.currentNode.navHandle.activeDockingProcedure = null; } }
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 handleDockedStep(DockingProcedure procedure) { this.navHandle.gyroHandle.disableOverride(); this.navHandle.thrusterStatus(false); Communication.currentNode.status = "docked"; if (Communication.getTimestamp() - procedure.connectionStart > 10) { if (Communication.currentNode.battery > 25) { // Do not disengage if battery too low. if (Communication.currentNode.playerCommand != "recall") { procedure.haltDocking("docking-timeout"); this.navHandle.thrusterStatus(true); } else { this.navHandle.thrusterStatus(false); } } } }
public void handleStepTwo(DockingProcedure procedure) { this.navHandle.thrusterStatus(true); Communication.currentNode.status = "docking-step-2"; Vector3D targetPos = this.getDockingPosition(5, procedure); double distance = this.getDistanceFrom(this.navHandle.getShipPosition(), targetPos); if (distance < 3) { Display.printDebug("Next docking step."); procedure.dockingStep--; } else { this.navHandle.move(targetPos, "docking-step-2"); if (distance > 100 && Core.generateRandomId() < 7000) { this.navHandle.setCollisionStatus(false); } else { this.navHandle.setCollisionStatus(true); } this.navHandle.gyroHandle.disableOverride(); } }
public void handleDockingStep(List <CommunicationDataStructureValue> responseData) { if (Communication.currentNode.type != "mothership") { return; } int id = 0, slaveId = 0, step = 0, connectorId = 0; foreach (CommunicationDataStructureValue data in responseData) { if (data.getName() == "id") { id = int.Parse(data.getValue()); } else if (data.getName() == "slaveId") { slaveId = int.Parse(data.getValue()); } else if (data.getName() == "step") { step = int.Parse(data.getValue()); } else if (data.getName() == "connectorId") { connectorId = int.Parse(data.getValue()); } } if (id == Communication.currentNode.id) { if (slaveId != 0 && !Docking.dockingWithDrone(slaveId)) { this.sendStopDocking("out-of-order", slaveId); } else { DockingProcedure procedure = Docking.getDroneDockingProcedure(slaveId); if (procedure == null || procedure.myConnector.connectorId != connectorId) { this.sendStopDocking("out-of-order", slaveId); } } } }
public void handleStepOne(DockingProcedure procedure) { this.navHandle.thrusterStatus(true); this.navHandle.setAutopilotStatus(true); Vector3D targetPos = this.getDockingPosition(1, procedure); Communication.currentNode.status = "docking-step-1"; double distance = this.getDistanceFrom(this.navHandle.getShipPosition(), targetPos); if (distance < 3) { Display.printDebug("Next docking step."); procedure.dockingStep--; } else { this.navHandle.move(targetPos, "docking-step-1"); if (Core.generateRandomPercent(95)) { this.navHandle.setCollisionStatus(false); } else { this.navHandle.setCollisionStatus(true); } this.navHandle.gyroHandle.disableOverride(); } }
public void handleStepQueueing(DockingProcedure procedure) { this.navHandle.thrusterStatus(true); this.navHandle.gyroHandle.disableOverride(); if (this.navHandle.commHandle != null) { Communication.currentNode.status = "waiting-dock-permissions"; this.navHandle.commHandle.sendDockingRequest(); if (Communication.masterDrone.masterConnectorId == null) { Vector3D queuePos = this.getQueuePosition(); if (queuePos.X != 0) { double distance = this.getDistanceFrom(this.navHandle.getShipPosition(), queuePos); if (distance > 100) { this.navHandle.move(queuePos, "going-to-queue"); this.navHandle.setCollisionStatus(true); this.navHandle.setAutopilotStatus(true); } } Communication.currentNode.status = "waiting-for-connector"; return; } else { Vector3D queuePos = this.getQueuePosition(); double distance = this.getDistanceFrom(this.navHandle.getShipPosition(), queuePos); if (queuePos.X != 0 && distance > 50) { Communication.currentNode.status = "navigating-to-queue"; this.navHandle.move(queuePos, "going-to-queue"); this.navHandle.setCollisionStatus(true); this.navHandle.setAutopilotStatus(true); } else { if (procedure != null) { Communication.currentNode.status = "waiting-in-queue"; this.navHandle.commHandle.sendDockingStep(procedure.dockingStep + 1); this.navHandle.setCollisionStatus(false); this.navHandle.setAutopilotStatus(false); } } } } else { Communication.currentNode.status = "failed-communication"; Display.print("[Error] Communication module failure."); } }
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 handleDockingAccepted(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 masterId = int.Parse(dataSplitted[1]); int nodeIndex = this.getNodeIndexById(masterId); if (nodeIndex == -1) { Communication.connectedNodes.Add(masterId); Drone node = new Drone(masterId); node.initNavigation(this.myGrid); Communication.connectedNodesData.Add(node); nodeIndex = this.getNodeIndexById(masterId); } if (Docking.dockingWithDrone(masterId)) { DockingProcedure procedure = Docking.getDroneDockingProcedure(masterId); procedure.haltDocking("docking-already-in-progress"); } DockingProcedure dock = new DockingProcedure(masterId); dock.initDocking(); dock.approveDocking(); dock.setNavHandle(Communication.currentNode.navHandle); Docking.activeDockingProcedures.Add(dock); Communication.currentNode.navHandle.activeDockingProcedure = dock; } }
public static string generateDockingMessage(string msg) { string message = ""; message += "=== Docking info ===\n"; message += "Player command: " + Communication.currentNode.playerCommand + "\n"; message += "Anchored connectors: " + AnchoredConnector.anchoredConnectors.Count + "\n"; foreach (AnchoredConnector connector in AnchoredConnector.anchoredConnectors) { message += "--> Connector \t"; if (connector.connectorId != null) { message += "-> ID: " + connector.connectorId + "\t"; } if (connector.inUse == true) { message += "-> Docking in progress\t"; } message += "\n"; } if (Docking.activeDockingProcedures.Count > 0) { message += "=== Docking Procedures ===\n"; for (int i = 0; i < Docking.activeDockingProcedures.Count; i++) { DockingProcedure procedure = Docking.activeDockingProcedures[i]; if (procedure.myConnector != null) { message += " -> DroneID: " + procedure.dockingWithDrone + ", ConnectorID: " + procedure.myConnector.connectorId + "\n"; } } } message += "------------------\n"; message += msg + "\n"; return(message); }
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 void initDockingWith(int id) { DockingProcedure proc = new DockingProcedure(id); proc.setNavHandle(this.navHandle); proc.initDocking(); }