Пример #1
0
 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);
 }
Пример #2
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;
        }
    }
Пример #3
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 + ")");
     }
 }
Пример #4
0
 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);
             }
         }
     }
 }
Пример #5
0
 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();
     }
 }
Пример #6
0
    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);
                }
            }
        }
    }
Пример #7
0
 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();
     }
 }
Пример #8
0
 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.");
     }
 }
Пример #9
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.");
        }
    }
Пример #10
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";
         }
     }
 }
Пример #11
0
 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;
     }
 }
Пример #12
0
    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);
    }
Пример #13
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.");
         }
     }
 }
Пример #14
0
 public void initDockingWith(int id) {
     DockingProcedure proc = new DockingProcedure(id);
     proc.setNavHandle(this.navHandle);
     proc.initDocking();
 }