private bool IssueDockOrder(DroneContext drone) { //if (dockOrders.Count > 3) // return false; //log.Debug("Attampting Dock Order. miner? "+ (drone.Info.NumDrills > 0)); var unused = (drone.Info.NumDrills > 0) ? shipComponents.Connectors.Where(x => x.Status != MyShipConnectorStatus.Connectable && x.Status != MyShipConnectorStatus.Connected && x.CustomName.Contains("#miner#") && !x.CustomName.Contains("#trash#")) : shipComponents.Connectors.Where(x => x.Status != MyShipConnectorStatus.Connectable && x.Status != MyShipConnectorStatus.Connected && !x.CustomName.Contains("#miner#") && !x.CustomName.Contains("#trash#")); var used = drones.Where(x => x.Order != null && x.Order.Connector != null).Select(x => x.Order.Connector); var available = unused.Where(x => !used.Contains(x)); var usableConnector = available.FirstOrDefault(); //log.Debug("unused: " + unused.Count() + " used: " + used.Count() + " available: " + available.Count() + " : " + (usableConnector != null)); if (usableConnector != null) { log.Debug("Issuing Dock Order"); var order = new DroneOrder(log, OrderType.Dock, communicationSystems.GetMsgSntCount(), usableConnector.EntityId, drone.Info.EntityId, usableConnector.GetPosition(), usableConnector.WorldMatrix.Forward, usableConnector.WorldMatrix.Up); order.Connector = usableConnector; communicationSystems.TransmitOrder(order, Me.CubeGrid.EntityId); drone.Order = order; return(true); } return(false); }
private void IssueScanOrder(DroneContext droneInfo) { var existingOrder = OngoingScanOrders.Where(x => x.DroneId == droneInfo.Info.EntityId).ToList(); if (existingOrder.Any()) { droneInfo.Order = existingOrder.First(); } else { var drone = droneInfo.Info; var miningTarget = trackingSystems.GetNearestScanPoint(Me.GetPosition(), 600); if (miningTarget != null) { miningTarget.HasPendingOrder = true; var order = new DroneOrder(log, OrderType.Scan, communicationSystems.GetMsgSntCount(), 0, drone.EntityId, miningTarget.Location, navigationSystems.GetGravityDirection(), Vector3D.Zero); OngoingScanOrders.Add(order); order.PointOfIntrest = miningTarget; droneInfo.Order = order; communicationSystems.TransmitOrder(order, Me.CubeGrid.EntityId); log.Debug("scan order sent"); } else { log.Debug("failed to get scan location"); } } }
public void IntrepretMessage(String argument) { if (argument == null) { return; } var pm = communicationSystems.ParseMessage(argument); if (!registered && pm.TargetEntityId == Me.CubeGrid.EntityId && pm.MessageType == MessageCode.Confirmation) { registered = true; CommandShipEntity = pm.EntityId; log.Debug("Registered!!"); } if (ParsedMessage.MaxNumBounces < pm.NumBounces && pm.MessageType != MessageCode.PingEntity) { pm.NumBounces++; //LOG.Debug("Bounced Message"); communicationSystems.SendMessage(pm.ToString()); } if (pm.IsAwakeningSignal) { ForceStartup(); } else if (registered) { switch (pm.MessageType) { case MessageCode.Order: if (CommandShipEntity == pm.CommanderId) { //log.Debug(pm.OrderType+" order recieved"); if (pm.OrderType == OrderType.Dock && CurrentOrder != null && CurrentOrder.Ordertype == OrderType.Dock) { try { CurrentOrder.PrimaryLocation = pm.Location; CurrentOrder.UpdateDockingCoords(); } catch (Exception e) { log.Error(e.StackTrace); } } else { NextOrder = new DroneOrder(log, pm.OrderType, pm.RequestID, pm.TargetEntityId, pm.EntityId, pm.Location, pm.AlignUp, pm.AlignForward); } } break; //case MessageCode.PingEntity: // if (pm.Type.Trim().ToLower().Contains("planet")) // trackingSystems.UpdatePlanetData(pm, false); // else // trackingSystems.UpdateTrackedEntity(pm, false); // break; } } }
private void IssueStandbyOrder(DroneContext drone) { log.Debug("Attampting Standby Order"); var order = new DroneOrder(log, OrderType.Standby, communicationSystems.GetMsgSntCount(), 0, drone.Info.EntityId, Vector3D.Zero, Vector3D.Zero, Vector3D.Zero); communicationSystems.TransmitOrder(order, Me.CubeGrid.EntityId); drone.Order = order; }
internal static string CreateEncryptedOrder(DroneOrder order, long commandId) { string ordertype = ""; switch (order.Ordertype) { case OrderType.AlignTo: ordertype = ALIGNTOORDER; break; case OrderType.Dock: ordertype = DOCKORDER; break; case OrderType.Undock: ordertype = UNDOCKORDER; break; case OrderType.FlyTo: ordertype = FLYTOORDER; break; case OrderType.Mine: ordertype = MININGORDER; break; case OrderType.Scan: ordertype = SCANTOORDER; break; case OrderType.Attack: ordertype = ATTACKORDER; break; case OrderType.Standby: ordertype = STANDBYORDER; break; } var msgStr = MESSAGETYPE_FLAG + ":" + ORDER_FLAG + "," + ORDERTYPE_FLAG + ":" + ordertype + "," + TARGETID_FLAG + ":" + order.TargetEntityID + "," + ALIGNFORWARDVECTOR_FLAG + ":" + VectorToString(order.DirectionalVectorOne) + "," + ALIGNUPVECTOR_FLAG + ":" + VectorToString(order.ThirdLocation) + "," + COMMANDID_FLAG + ":" + commandId + "," + ENTITYID_FLAG + ":" + order.DroneId + "," + REQUESTID_FLAG + ":" + order.RequestId + "," + NUMBOUNCES_FLAG + ":" + 0 + "," + LOCATION_FLAG + ":" + VectorToString(order.PrimaryLocation); return("{" + msgStr + "}"); }
private void RecieveFleetMessages() { var messages = RecieveMessages(); //log.Debug("recieved Message: " + messages); foreach (var mes in messages) { var pm = communicationSystems.ParseMessage(mes); if (!registered && pm.TargetEntityId == Me.CubeGrid.EntityId && pm.MessageType == MessageCode.Confirmation) { registered = true; CommandShipEntity = pm.EntityId; //log.Debug("Registered!!"); } if (ParsedMessage.MaxNumBounces < pm.NumBounces && pm.MessageType != MessageCode.PingEntity) { pm.NumBounces++; //log.Debug("Bounced Message"); communicationSystems.SendMessage(pm.ToString()); } if (registered) { switch (pm.MessageType) { case MessageCode.Order: if (CommandShipEntity == pm.CommanderId && pm.EntityId == Me.CubeGrid.EntityId) { log.Debug(pm.OrderType + " order recieved"); if (pm.OrderType == OrderType.Dock && CurrentOrder != null && CurrentOrder.Ordertype == OrderType.Dock) { try { CurrentOrder.PrimaryLocation = pm.Location; CurrentOrder.UpdateDockingCoords(); } catch (Exception e) { log.Error(e.StackTrace); } } else { NextOrder = new DroneOrder(log, pm.OrderType, pm.RequestID, pm.TargetEntityId, pm.EntityId, pm.Location, pm.AlignForward, pm.AlignUp); } } break; } } } }
public void IssueAttackOrder(DroneContext drone) { var closestTargets = trackingSystems.getCombatTargets(Me.GetPosition()); if (closestTargets.Any()) { var biggestTarget = closestTargets.OrderByDescending(x => x.Radius).FirstOrDefault(); if (biggestTarget != null) { log.Debug("Issuing Attack Order"); var order = new DroneOrder(log, OrderType.Attack, communicationSystems.GetMsgSntCount(), biggestTarget.EntityID, drone.Info.EntityId, biggestTarget.PointsOfInterest[0].Location, navigationSystems.GetGravityDirection(), biggestTarget.Location); communicationSystems.TransmitOrder(order, Me.CubeGrid.EntityId); drone.Order = order; } } }
public void ResendOrder(DroneOrder order) { if (order != null) { var time = (DateTime.Now - order.LastUpdated).TotalSeconds; if (time >= 10) { if (order.Ordertype == OrderType.Dock) { order.PrimaryLocation = order.Connector.GetPosition(); } //send again communicationSystems.TransmitOrder(order, Me.CubeGrid.EntityId); log.Debug("Resending " + order.Ordertype + " order"); order.LastUpdated = DateTime.Now; } } }
private bool ScanDroneLogic(DroneContext droneInfo, DroneInfo drone, DroneOrder order) { var awaitingOrders = (order != null && order.Ordertype == OrderType.Standby); if (awaitingOrders) { // log.Debug("Issuing First Scan Order"); IssueScanOrder(droneInfo); } else if (order != null && order.Ordertype == OrderType.Scan) { var droneDistance = Math.Abs((order.PrimaryLocation - drone.lastKnownPosition).Length()); if (droneDistance < 250 || (DateTime.Now - order.IssuedAt).TotalMinutes >= 2) { //log.Debug("Scan Order Complete"); order.PointOfIntrest.HasPendingOrder = false; order.PointOfIntrest.Timestamp = DateTime.Now; order.PointOfIntrest.Reached = true; OngoingScanOrders.Remove(order); trackingSystems.UpdateScanPoint(order.PointOfIntrest); var nextScanPoint = trackingSystems.GetNearestScanPoint(Me.GetPosition(), 600); if (nextScanPoint != null) { //log.Debug("Issuing New Scan Order "+ nextScanPoint.Location); droneInfo.Order = new DroneOrder(log, OrderType.Scan, communicationSystems.GetMsgSntCount(), 0, drone.EntityId, nextScanPoint.Location, Vector3D.Zero, Vector3D.Zero); droneInfo.Order.PointOfIntrest = nextScanPoint; communicationSystems.TransmitOrder(droneInfo.Order, Me.CubeGrid.EntityId); } } else { return(false); } } else { return(false); } return(true); }
protected void IssueMiningOrder(DroneContext droneinfo) { var existingOrder = miningOrders.Where(x => x.DroneId == droneinfo.Info.EntityId).ToList(); if (existingOrder.Any()) { droneinfo.Order = existingOrder.First(); } else { var drone = droneinfo.Info; var miningTarget = trackingSystems.GetNextMiningSamplePoint(Me.GetPosition()); if (miningTarget != null) { miningTarget.HasPendingOrder = true; var order = new DroneOrder(log, OrderType.Mine, communicationSystems.GetMsgSntCount(), 0, drone.EntityId, miningTarget.Location, navigationSystems.GetGravityDirection(), Vector3D.Zero); order.PointOfIntrest = miningTarget; droneinfo.Order = order; miningOrders.Add(order); communicationSystems.TransmitOrder(order, Me.CubeGrid.EntityId); } } }
public void IssueSurveyOrder(DroneOrder order, DroneContext drone) { //get planets with a high scan density and few points var RegionsOfIntrest = trackingSystems.GetNearestPlanet().Regions.Where(x => (x.surfaceCenter - Me.CubeGrid.GetPosition()).Length() < 2000).Where(x => x.PointsOfInterest.Count() < 13 && x.GetScanDensity() >= 50).OrderBy(x => (x.surfaceCenter - Me.CubeGrid.GetPosition()).Length()).Take(5); if (RegionsOfIntrest.Any()) { //log.Debug(RegionsOfIntrest.Count() + " Regions of Intrest Located"); var regionsWithLowCoverage = RegionsOfIntrest.Where(x => x.GetPercentReached() < 50); if (regionsWithLowCoverage.Any()) { //log.Debug(regionsWithLowCoverage.Count() + " Regions of Intrest With low coverage Located"); var closiestRegion = regionsWithLowCoverage.First(); var closestUnscannedPointToDrone = closiestRegion.GetNearestSurveyPoint(closiestRegion.surfaceCenter); if (closestUnscannedPointToDrone != null) { log.Debug(regionsWithLowCoverage.Count() + " Point of Intrest in low coverage region Located"); order = new DroneOrder(log, OrderType.Scan, communicationSystems.GetMsgSntCount(), 0, drone.Info.EntityId, closestUnscannedPointToDrone.Location, navigationSystems.GetGravityDirection(), Vector3D.Zero); communicationSystems.TransmitOrder(order, Me.CubeGrid.EntityId); drone.Order = order; } } } }
private void RecieveFleetMessages() { var messages = RecieveMessages(); foreach (var mes in messages) { var pm = communicationSystems.ParseMessage(mes); if (!registered && pm.TargetEntityId == Me.CubeGrid.EntityId && pm.MessageType == MessageCode.Confirmation) { registered = true; CommandShipEntity = pm.EntityId; log.Debug("Registered!!"); } if (ParsedMessage.MaxNumBounces < pm.NumBounces && pm.MessageType != MessageCode.PingEntity) { pm.NumBounces++; //LOG.Debug("Bounced Message"); communicationSystems.SendMessage(pm.ToString()); } if (registered) { switch (pm.MessageType) { case MessageCode.Order: //log.Debug((CommandShipEntity == pm.CommanderId) + " command ship set | meant for me: "+ Me.CubeGrid.EntityId + " " + pm.EntityId +" "+ pm.TargetEntityId); if (CommandShipEntity == pm.CommanderId && pm.EntityId == Me.CubeGrid.EntityId) { log.Debug(pm.OrderType + " order recieved"); if (pm.OrderType == OrderType.Dock && CurrentOrder != null && CurrentOrder.Ordertype == OrderType.Dock) { try { CurrentOrder.PrimaryLocation = pm.Location; CurrentOrder.DirectionalVectorOne = pm.AlignForward; CurrentOrder.ThirdLocation = pm.AlignUp; CurrentOrder.UpdateDockingCoords(); } catch (Exception e) { log.Error(e.StackTrace); } } else if (pm.OrderType == OrderType.Mine && CurrentOrder != null && CurrentOrder.Ordertype == OrderType.Mine) { if (pm.Location != CurrentOrder.PrimaryLocation) { Disengaging = true; NextOrder = new DroneOrder(log, pm.OrderType, pm.RequestID, pm.TargetEntityId, pm.EntityId, pm.Location, pm.AlignForward, pm.AlignUp); //log.Error("Mining Order changed unexpectedly"); } } else if (pm.OrderType == OrderType.Mine && CurrentOrder == null) { NextOrder = new DroneOrder(log, pm.OrderType, pm.RequestID, pm.TargetEntityId, pm.EntityId, pm.Location, pm.AlignForward, pm.AlignUp); log.Error("New Mining Order -checking for reboot"); NextOrder.DockRouteIndex = NextOrder.dockroute.IndexOf(NextOrder.dockroute.OrderBy(x => (x - navigationSystems.RemoteControl.GetPosition()).Length()).First()); } else if (CurrentOrder == null) { CurrentOrder = new DroneOrder(log, pm.OrderType, pm.RequestID, pm.TargetEntityId, pm.EntityId, pm.Location, pm.AlignForward, pm.AlignUp); } else { if (CurrentOrder != null && CurrentOrder.Ordertype == OrderType.Mine) { Disengaging = true; } if (CurrentOrder.Ordertype == OrderType.Mine && pm.OrderType == OrderType.Dock) { Disengaging = true; } NextOrder = new DroneOrder(log, pm.OrderType, pm.RequestID, pm.TargetEntityId, pm.EntityId, pm.Location, pm.AlignForward, pm.AlignUp); } } break; } } } }
private void ProcessCurrentOrder() { maxCameraRange = 3000; maxCameraAngle = 100; //weaponSystems.Disengage(); if (NextOrder != null) { CurrentOrder = NextOrder; NextOrder = null; } //log.Debug("processing"); if (CurrentOrder != null) { //log.Debug("processing order"); if (CurrentOrder.Ordertype == OrderType.Scan) { navigationSystems.HoverApproach(CurrentOrder.Destination, Mass); } else if (CurrentOrder.Ordertype == OrderType.Dock) { try { //log.Debug("Processing Dock Order"); //log.Debug(CurrentOrder.dockroute.Count()+" Number of dock Orders"); var preDockLocation = CurrentOrder.dockroute[CurrentOrder.DockRouteIndex]; if (preDockLocation != null) { //CurrentOrder.PrimaryLocation + (CurrentOrder.DirectionalVectorOne * 20); var remoteControl = shipComponents.ControlUnits.FirstOrDefault(); var connector = shipComponents.Connectors.FirstOrDefault(); var shipDockPoint = remoteControl.GetPosition(); var connectorAdjustVector = connector.GetPosition() - remoteControl.GetPosition(); if (connector.Status != MyShipConnectorStatus.Connected) { var distanceFromCPK1 = ((shipDockPoint + connectorAdjustVector) - preDockLocation).Length(); if (distanceFromCPK1 <= 2 && CurrentOrder.DockRouteIndex > 0) { CurrentOrder.DockRouteIndex--; } var distanceFromConnector = ((shipDockPoint) - CurrentOrder.PrimaryLocation).Length(); var maxSpeed = distanceFromCPK1 > 10 ? 2 : 1; if (!navigationSystems.DockApproach(connector.GetPosition(), preDockLocation, maxSpeed)) { navigationSystems.Roll(0.15f); } else { navigationSystems.Roll(0.00f); } if (distanceFromConnector < 10) { log.Debug("Dock cp3"); connector.GetActionWithName("OnOff_On").Apply(connector); if (connector.Status == MyShipConnectorStatus.Connectable) { connector.Connect(); } } log.Debug("from dock " + distanceFromConnector + " from point: " + distanceFromCPK1 + " index: " + CurrentOrder.dockroute.Count); navigationSystems.AlignTo(Me.CubeGrid.GetPosition() + (CurrentOrder.DirectionalVectorOne * 100)); } else { navigationSystems.EnableDockedMode(); Docked = true; } } else { log.Error("No Predock Location"); navigationSystems.SlowDown(); } } catch (Exception e) { log.Error("In Dock\n" + e.Message + "\n" + e.StackTrace); } } else if (CurrentOrder.Ordertype == OrderType.Standby) { if (Docked) { navigationSystems.EnableDockedMode(); return; } } } else if (Docked) { navigationSystems.EnableDockedMode(); } else { //if no command ship //navigationSystems.AlignAcrossGravity(); navigationSystems.SlowDown(); navigationSystems.AlignAgainstGravity(); //navigationSystems.Roll(0); //navigationSystems.StopRoll(); navigationSystems.MaintainAltitude(trackingSystems.GetAltitude(), 10); } }
private bool MiningDroneLogic(DroneContext droneInfo, DroneInfo drone, DroneOrder order) { var awaitingOrders = order != null && order.Ordertype == OrderType.Standby && drone.Docked; if (awaitingOrders) { IssueMiningOrder(droneInfo); } else if (order != null && order.Ordertype == OrderType.Standby && !drone.Docked) { IssueDockOrder(droneInfo); } else if (order != null && order.Ordertype == OrderType.Mine && !drone.Docked) { var directionV = navigationSystems.GetGravityDirection(); directionV.Normalize(); var target_endpoint = order.PrimaryLocation + (directionV * 35); var target_end_point_distance = (int)(drone.lastKnownPosition - target_endpoint).Length(); var target_between_start_and_end = (int)(order.PrimaryLocation - target_endpoint).Length(); // log.Debug("target endpoint: " + target_endpoint); // log.Debug("Distance to finish mining: "+ target_end_point_distance); // log.Debug("start - end distance: " + target_between_start_and_end); if (target_end_point_distance <= 5) { miningOrders.Remove(order); order.PointOfIntrest.Mined = true; IssueDockOrder(droneInfo); } else { return(false); } } else { return(false); } //else if (order != null && order.Ordertype == OrderType.Mine) //{ // double dist = 1000000; // for (int i = 0; i < droneInfo.Order.dockroute.Count(); i++) // { // var vect = droneInfo.Order.dockroute[i]; // var distance = Math.Abs((droneInfo.Info.lastKnownPosition - vect).Length()); // if (distance < dist && i > droneInfo.Order.MiningIndex) // { // droneInfo.Order.MiningIndex = i; // dist = distance; // } // } // log.Debug(droneInfo.Order.MiningIndex+" Mining Index"); // if(droneInfo.Order.MiningIndex == (droneInfo.Order.dockroute.Count()-1)) // { // miningOrders.Remove(order); // IssueStandbyOrder(droneInfo); // } // return false; //} return(true); }
public void TransmitOrder(DroneOrder m, long commandID) { PendingMessages.Add(ParsedMessage.CreateEncryptedOrder(m, commandID)); }
private void ProcessCurrentOrder() { maxCameraRange = 3000; maxCameraAngle = 100; //weaponSystems.Disengage(); if (NextOrder != null) { CurrentOrder = NextOrder; NextOrder = null; } //log.Debug("processing"); if (CurrentOrder != null) { //log.Debug("processing order"); if (CurrentOrder.Ordertype == OrderType.Scan) { if (Docked || Undocking) { Undock(); } else { ScanLocation(); } } else if (CurrentOrder.Ordertype == OrderType.Dock) { DockToConnector(); //navigationSystems.MaintainAltitude(trackingSystems.GetAltitude(), hoverHeight); } else if (CurrentOrder.Ordertype == OrderType.Standby) { if (Docked) { navigationSystems.EnableDockedMode(); return; } else { Hover(); } } } else if (Docked) { navigationSystems.EnableDockedMode(); } else { //if no command ship //navigationSystems.AlignAcrossGravity(); //navigationSystems.Roll(0); //navigationSystems.StopRoll(); Hover(); } }
private bool CombatDroneLogic(DroneContext droneInfo, DroneInfo drone, DroneOrder order) { return(false); }
private void ProcessCurrentOrder() { maxCameraRange = 3000; maxCameraAngle = 100; //weaponSystems.Disengage(); if (NextOrder != null) { if (CurrentOrder != null && CurrentOrder.Ordertype == OrderType.Mine) { Disengaging = true; if (CurrentOrder.MiningIndex == 0) { CurrentOrder = NextOrder; NextOrder = null; Disengaging = false; } } else { CurrentOrder = NextOrder; NextOrder = null; } } //log.Debug("processing"); if (CurrentOrder != null) { //log.Debug("processing order"); if (CurrentOrder.Ordertype == OrderType.Scan) { if (Docked || Undocking) { Undock(); } else { ScanLocation(); } } else if (CurrentOrder.Ordertype == OrderType.Dock) { DockToConnector(); //Hover(); //log.Debug("Position: " + CurrentOrder.PrimaryLocation + "\nforward: " + CurrentOrder.DirectionalVectorOne + "\nup: " + CurrentOrder.ThirdLocation); //navigationSystems.MaintainAltitude(trackingSystems.GetAltitude(), hoverHeight); } else if (CurrentOrder.Ordertype == OrderType.Standby) { if (Docked) { navigationSystems.EnableDockedMode(); return; } else { Hover(); } } else if (CurrentOrder.Ordertype == OrderType.Mine) { if (Docked || Undocking) { Undock(); } else if (Disengaging) { ExitMiningPosition(); } else { MinePosition(); } } } else if (Docked) { navigationSystems.EnableDockedMode(); } else { //if no command ship //navigationSystems.AlignAcrossGravity(); //navigationSystems.Roll(0); //navigationSystems.StopRoll(); Hover(); } }