public bool CanScan(Ingame.MyDetectedEntityInfo Target) { try { if (RadarCore.AllowScanningTargets == false) { RadarCore.DebugWrite($"{RadarBlock.CustomName}.CanScan()", $"Scanning disabled in settings"); return(false); } if (!Radar.IsWorking()) { RadarCore.DebugWrite($"{RadarBlock.CustomName}.CanScan()", $"Radar is disabled"); return(false); } if (!IsScanReady) { RadarCore.DebugWrite($"{RadarBlock.CustomName}.CanScan()", $"Scan cooldown not expired"); return(false); } if (Target.IsEmpty()) { RadarCore.DebugWrite($"{RadarBlock.CustomName}.CanScan()", $"Target struct is empty"); return(false); } if (!Radar.DetectedEntities.Any(x => x.EntityId == Target.EntityId)) { RadarCore.DebugWrite($"{RadarBlock.CustomName}.CanScan()", $"Target not found"); return(false); } if (!Target.IsGrid()) { RadarCore.DebugWrite($"{RadarBlock.CustomName}.CanScan()", $"Target is not a grid"); return(false); } IMyCubeGrid Grid = MyAPIGateway.Entities.GetEntityById(Target.EntityId) as IMyCubeGrid; if (Grid == null) { RadarCore.DebugWrite($"{RadarBlock.CustomName}.CanScan()", $"Cannot resolve EntityID"); return(false); } float Distance = Radar.Position.DistanceTo(Target.Position); float MaxScanDistance = 3000 / (float)Math.Pow(RadarCore.DecoyScanDisruptionCoefficient, Grid.AsRadarable().DecoysCount); if (Distance > RadarCore.GuaranteedDetectionRange && Distance > MaxScanDistance) { RadarCore.DebugWrite($"{RadarBlock.CustomName}.CanScan()", $"Out of range: dist={Distance}; scanrange={MaxScanDistance}"); return(false); } return(true); } catch { return(false); } }
private void Flee(List <Ingame.MyDetectedEntityInfo> radarData = null) { try { if (!IsFleeing) { return; } try { if (!FleeTimersTriggered) { TriggerFleeTimers(); } try { if (radarData == null) { radarData = LookForEnemies(_freighterSetup.FleeTriggerDistance); } if (radarData.Count == 0) { return; } try { Ingame.MyDetectedEntityInfo closestEnemy = radarData.OrderBy(x => GridPosition.DistanceTo(x.Position)).FirstOrDefault(); if (closestEnemy.IsEmpty()) { Grid.DebugWrite("Flee", "Cannot find closest hostile"); return; } try { IMyEntity enemyEntity = MyAPIGateway.Entities.GetEntityById(closestEnemy.EntityId); if (enemyEntity == null) { Grid.DebugWrite("Flee", "Cannot find enemy entity from closest hostile ID"); return; } try { //Grid.DebugWrite("Flee", $"Fleeing from '{EnemyEntity.DisplayName}'. Distance: {Math.Round(GridPosition.DistanceTo(ClosestEnemy.Position))}m; FleeTriggerDistance: {FreighterSetup.FleeTriggerDistance}"); //ShowIngameMessage.ShowMessage($"Fleeing from '{enemyEntity.DisplayName}'. Distance: {Math.Round(GridPosition.DistanceTo(closestEnemy.Position))}m; FleeTriggerDistance: {_freighterSetup.FleeTriggerDistance}"); Vector3D fleePoint = GridPosition.InverseVectorTo(closestEnemy.Position, 100 * 1000); //ShowIngameMessage.ShowMessage($"Flee point: {fleePoint} which is {GridPosition.DistanceTo(fleePoint)}m from me and enemy {enemyEntity.DisplayName}"); //ShowIngameMessage.ShowMessage($"Fleeing at: {DetermineFleeSpeed()}m/s..."); Rc.AddWaypoint(fleePoint, "Flee Point"); (Rc as MyRemoteControl)?.ChangeFlightMode(Ingame.FlightMode.OneWay); (Rc as MyRemoteControl)?.SetAutoPilotSpeedLimit(DetermineFleeSpeed()); Rc.SetAutoPilotEnabled(true); } catch (Exception scrap) { Grid.LogError("Flee.AddWaypoint", scrap); } } catch (Exception scrap) { Grid.LogError("Flee.LookForEnemies.GetEntity", scrap); } } catch (Exception scrap) { Grid.LogError("Flee.LookForEnemies.Closest", scrap); } } catch (Exception scrap) { Grid.LogError("Flee.LookForEnemies", scrap); } } catch (Exception scrap) { Grid.LogError("Flee.TriggerTimers", scrap); } } catch (Exception scrap) { Grid.LogError("Flee", scrap); } }
private void Flee(List <Ingame.MyDetectedEntityInfo> RadarData = null) { try { if (!IsFleeing) { return; } try { if (!FleeTimersTriggered) { TriggerFleeTimers(); } try { if (RadarData == null) { RadarData = LookForEnemies(FreighterSetup.FleeTriggerDistance); } if (RadarData.Count == 0) { return; } try { Ingame.MyDetectedEntityInfo ClosestEnemy = RadarData.OrderBy(x => GridPosition.DistanceTo(x.Position)).FirstOrDefault(); if (ClosestEnemy.IsEmpty()) { Grid.DebugWrite("Flee", "Cannot find closest hostile"); return; } try { IMyEntity EnemyEntity = MyAPIGateway.Entities.GetEntityById(ClosestEnemy.EntityId); if (EnemyEntity == null) { Grid.DebugWrite("Flee", "Cannot find enemy entity from closest hostile ID"); return; } try { //Grid.DebugWrite("Flee", $"Fleeing from '{EnemyEntity.DisplayName}'. Distance: {Math.Round(GridPosition.DistanceTo(ClosestEnemy.Position))}m; FleeTriggerDistance: {FreighterSetup.FleeTriggerDistance}"); Vector3D FleePoint = GridPosition.InverseVectorTo(ClosestEnemy.Position, 100 * 1000); RC.AddWaypoint(FleePoint, "Flee Point"); (RC as MyRemoteControl).ChangeFlightMode(MyRemoteControl.FlightMode.OneWay); (RC as MyRemoteControl).SetAutoPilotSpeedLimit(DetermineFleeSpeed()); RC.SetAutoPilotEnabled(true); } catch (Exception Scrap) { Grid.LogError("Flee.AddWaypoint", Scrap); } } catch (Exception Scrap) { Grid.LogError("Flee.LookForEnemies.GetEntity", Scrap); } } catch (Exception Scrap) { Grid.LogError("Flee.LookForEnemies.Closest", Scrap); } } catch (Exception Scrap) { Grid.LogError("Flee.LookForEnemies", Scrap); } } catch (Exception Scrap) { Grid.LogError("Flee.TriggerTimers", Scrap); } } catch (Exception Scrap) { Grid.LogError("Flee", Scrap); } }