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);
            }
        }
    }
Example #2
0
 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");
            }
        }
    }
Example #4
0
 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);
             }
         }
     }
 }
Example #5
0
    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.");
        }
    }
Example #6
0
 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.");
     }
 }
Example #8
0
 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.");
         }
     }
 }
Example #9
0
    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);
                    }
                }
            }
        }
    }
Example #10
0
 public void initiate()
 {
     AnchoredConnector.setAllConnectorState(false);
     Piston.setAllPistonState(false);
     this.type = "mothership";
 }