예제 #1
0
    public DetectedEntity getTarget()
    {
        DetectedEntity closest = new DetectedEntity();

        string[] targetList      = { "Asteroid" };
        double   closestDistance = 999999;
        double   targetDistance;

        foreach (DetectedEntity entity in this.navHandle.nearbyEntities)
        {
            // Filter out non asteroids.
            if (!targetList.Any(entity.name.Contains))
            {
                continue;
            }
            targetDistance = this.navHandle.getDistanceFrom(this.navHandle.getShipPosition(), entity.position);
            if (targetDistance > 50000 || targetDistance < 0)
            {
                continue;                                               // Out of antenna range or irregular distance.
            }
            if (targetDistance < closestDistance)
            {
                closest         = entity;
                closestDistance = targetDistance;
            }
        }

        if (closestDistance > 25000)   // Not too far
        {
            return(new DetectedEntity());
        }
        return(closest);
    }
예제 #2
0
    public void sendNearbyEntityList()
    {
        if (this.lastEntityDataUpdate == 0 || Communication.getTimestamp() - this.lastEntityDataUpdate > 35)
        {
            this.dataStructure.newPackage();
            this.dataStructure.addRawData("drone-data-nearby");
            this.dataStructure.addData("id", Communication.currentNode.id.ToString());

            DetectedEntity entity;
            for (int i = 0; i < Communication.currentNode.navHandle.nearbyEntities.Count; i++)
            {
                entity = Communication.currentNode.navHandle.nearbyEntities[i];
                if (entity.id > 0)
                {
                    this.dataStructure.addRawData(
                        "Entity=" + entity.name + "=" +
                        DetectedEntity.getEntityTypeInteger(entity.type).ToString() + "=" +
                        entity.id.ToString() + "=" + entity.position.X.ToString() + "=" +
                        entity.position.Y.ToString() + "=" + entity.position.Z.ToString() + "=" +
                        entity.lastSeen.ToString()
                        );
                }
            }
            this.broadcastMessage(this.dataStructure.generateOutput());
            this.lastEntityDataUpdate = Communication.getTimestamp();
        }
    }
예제 #3
0
    public void execute()
    {
        if (Communication.masterDrone == null)
        {
            this.status = "waiting-for-master";
            this.commHandle.sendMasterRequest();
        }

        if (this.battery < 5)
        {
            return; // Solar cells need to recharge.
        }
        this.status = "looking-for-targets";
        DetectedEntity target = this.getTarget();

        if (target.id > 0)
        {
            // Move to closest ore.
            Vector3D targetPos = target.position;

            // Add some random movement.
            Random rnd = new Random();
            targetPos.X += (int)rnd.Next(-100, 100);
            targetPos.Y += (int)rnd.Next(-100, 100);
            targetPos.Z += (int)rnd.Next(-100, 100);

            // Execute movement
            this.navHandle.move(targetPos, "target-position");
            this.status = "target-acquired";
        }
        else
        {
            this.handleIdle();
        }
    }
예제 #4
0
    public void updateNearbyCollisionData(IMySensorBlock sensor)
    {
        if (!sensor.LastDetectedEntity.IsEmpty())
        {
            MyDetectedEntityInfo entity = sensor.LastDetectedEntity;
            if (!this.nearbyEntities.Any(val => val.id == entity.EntityId))
            {
                DetectedEntity tmp = new DetectedEntity();
                tmp.id       = entity.EntityId;
                tmp.name     = entity.Name;
                tmp.position = entity.Position;
                tmp.lastSeen = Communication.getTimestamp();
                tmp.distance = this.getDistanceFrom(entity.Position, sensor.GetPosition());
                tmp.type     = entity.Type;
                this.nearbyEntities.Add(tmp);
            }
            else
            {
                for (int i = 0; i < this.nearbyEntities.Count; i++)
                {
                    DetectedEntity nearEntity = this.nearbyEntities[i];
                    if (nearEntity.id == entity.EntityId)
                    {
                        DetectedEntity tmp = new DetectedEntity();
                        tmp.id                 = entity.EntityId;
                        tmp.name               = entity.Name;
                        tmp.position           = entity.Position;
                        tmp.entityInfo         = entity;
                        tmp.lastSeen           = Communication.getTimestamp();
                        tmp.distance           = this.getDistanceFrom(entity.Position, sensor.GetPosition());
                        tmp.type               = entity.Type;
                        this.nearbyEntities[i] = tmp;
                        break;
                    }
                }
            }
        }
        else
        {
            List <DetectedEntity> tmp = new List <DetectedEntity>();

            for (int i = 0; i < this.nearbyEntities.Count; i++)
            {
                DetectedEntity nearEntity = this.nearbyEntities[i];
                if (Communication.getTimestamp() - nearEntity.lastSeen < 7 * 24 * 60 * 60)   // Last seen in 7 days?
                {
                    tmp.Add(nearEntity);
                }
            }

            this.nearbyEntities = tmp;
        }
    }
예제 #5
0
            public void AddGPSPosition(string name, Vector3 position)
            {
                var celestialBody = CelestialBodies.Find(obj => obj.Name == name);

                if (celestialBody == null)
                {
                    celestialBody = new DetectedEntity();
                    CelestialBodies.Add(celestialBody);
                }
                celestialBody.Name     = name;
                celestialBody.Position = position;
                celestialBody.Type     = CelestialType.GPS;
            }
예제 #6
0
    public void handleDataNearby(List <CommunicationDataStructureValue> responseData)
    {
        int            id, entityType;
        long           entityId, lastSeen;
        Vector3D       position;
        string         entityName;
        Drone          myDrone = Communication.currentNode;
        DetectedEntity nearbyEntity;

        foreach (CommunicationDataStructureValue data in responseData)
        {
            if (data.getName() == "id")
            {
                id = int.Parse(data.getValue());
            }
            else if (data.getName() == "Entity")
            {
                entityName = data.getValue();
                entityType = int.Parse(data.getAdditional(0).getValue());
                entityId   = long.Parse(data.getAdditional(1).getValue());
                position   = new Vector3D(
                    double.Parse(data.getAdditional(2).getValue()),
                    double.Parse(data.getAdditional(3).getValue()),
                    double.Parse(data.getAdditional(4).getValue())
                    );
                lastSeen = long.Parse(data.getAdditional(5).getValue());

                nearbyEntity          = new DetectedEntity();
                nearbyEntity.id       = entityId;
                nearbyEntity.name     = entityName;
                nearbyEntity.distance = myDrone.navHandle.getDistanceFrom(myDrone.navHandle.getShipPosition(), position);
                nearbyEntity.type     = DetectedEntity.getEntityType(entityType);
                nearbyEntity.position = position;
                nearbyEntity.lastSeen = lastSeen;
                Communication.currentNode.navHandle.addNearbyEntity(nearbyEntity);
            }
        }
    }
예제 #7
0
    public void addNearbyEntity(DetectedEntity entity)
    {
        bool           found        = false;
        long           lastSeenByMe = 0;
        DetectedEntity myEnt;

        for (int i = 0; i < this.nearbyEntities.Count; i++)
        {
            myEnt = this.nearbyEntities[i];
            if (myEnt.id == entity.id)
            {
                if (myEnt.lastSeen > entity.lastSeen)
                {
                    entity.lastSeen = myEnt.lastSeen;
                }
                this.nearbyEntities[i] = entity;
                found = true;
            }
        }
        if (found == false)
        {
            this.nearbyEntities.Add(entity);
        }
    }
예제 #8
0
    public DetectedEntity getTarget()
    {
        DetectedEntity closest = new DetectedEntity();

        string[] targetList      = { "Small Grid", "Large Grid", "Character Human", "Character Other" };
        double   closestDistance = 3000;
        double   targetDistance;

        foreach (DetectedEntity entity in this.navHandle.nearbyEntities)
        {
            // Filter out non asteroids.
            if (!targetList.Any(entity.name.Contains))
            {
                continue;
            }
            targetDistance = this.navHandle.getDistanceFrom(this.navHandle.getShipPosition(), entity.position);
            if (targetDistance < closestDistance)
            {
                closest         = entity;
                closestDistance = targetDistance;
            }
        }
        return(closest);
    }
예제 #9
0
    public void mainLogic()
    {
        if (this.usedInventorySpace < 95 && this.navHandle.activeDockingProcedure == null && this.playerCommand != "recall")
        {
            this.navHandle.setCollisionStatus(false);
            this.navHandle.thrusterStatus(true);
            DetectedEntity target = this.getTarget();

            if (target.id != 0 && target.id != null && target.position.X != 0 && target.position != null)
            {
                double targetDistance = this.navHandle.getDistanceFrom(this.navHandle.getShipPosition(), target.position);
                if (targetDistance > 300)
                {
                    this.navHandle.setCollisionStatus(true);
                }
                if (targetDistance > 1)
                {
                    Vector3D targetPos = target.position;
                    if (target.entityInfo.BoundingBox.Min.X != 0 && target.entityInfo.BoundingBox.Min.Y != 0 && target.entityInfo.BoundingBox.Min.Z != 0)
                    {
                        this.status = "target-acquired-box";
                        // Add some random movement.
                        Random rnd = new Random();
                        targetPos.X = (double)rnd.Next((int)target.entityInfo.BoundingBox.Min.X, (int)target.entityInfo.BoundingBox.Max.X);
                        targetPos.Y = (double)rnd.Next((int)target.entityInfo.BoundingBox.Min.Y, (int)target.entityInfo.BoundingBox.Max.Y);
                        targetPos.Z = (double)rnd.Next((int)target.entityInfo.BoundingBox.Min.Z, (int)target.entityInfo.BoundingBox.Max.Z);
                    }
                    else
                    {
                        this.status = "target-acquired-relative";
                        Display.printDebug("Setting new drilling destination based on coordinates. (" + Math.Round(targetPos.X, 2) + ", " + Math.Round(targetPos.Y, 2) + ", " + Math.Round(targetPos.Z, 2) + ")");
                        Random rnd = new Random();
                        targetPos.X += (double)rnd.Next((int)-300, (int)300);
                        targetPos.Y += (double)rnd.Next((int)-300, (int)300);
                        targetPos.Z += (double)rnd.Next((int)-300, (int)300);
                    }
                    this.navHandle.move(targetPos, "navigate-to-ore");
                    if (targetDistance > 500)
                    {
                        this.haltDrills();
                        this.navHandle.setCollisionStatus(true);
                    }
                    else
                    {
                        this.navHandle.setCollisionStatus(false);
                        this.startDrills();
                    }

                    this.navHandle.overrideThruster("Forward", 10);
                }
                else
                {
                    Display.printDebug("Already at target destination.");
                }
            }
            else
            {
                Display.printDebug("No target found.");
                this.navHandle.overrideThruster("Forward", 10);
                this.haltDrills();
                this.handleIdle();
            }
        }
        else
        {
            if (this.navHandle.activeDockingProcedure != null && this.navHandle.activeDockingProcedure.dockingStep < 2)
            {
                Display.printDebug("Returning to master.");
                this.haltDrills();
                this.navHandle.returnToMaster();
            }
            else
            {
                this.startDrills();
                Display.printDebug("Returning to master.");
                this.navHandle.returnToMaster();
            }
        }
    }