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); }
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(); } }
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(); } }
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; } }
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; }
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); } } }
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); } }
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); }
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(); } } }