protected void ScanGrid(RadarableGrid RGrid) { //if (DetectedEntities.Any(x => x.EntityId == RGrid.Grid.EntityId)) return; float Distance = this.DistanceTo(RGrid); if (Distance <= RadarCore.GuaranteedDetectionRange) { AddEntity(RGrid.Grid, RGrid.Position); return; } Vector3D?Hit; if (!DetectorModule.IsInView(RGrid.Grid, out Hit)) { RadarCore.DebugWrite($"{RadarBlock.CustomName}.ScanGrid({RGrid.DisplayName})", "discarded: invisible by ray", true); return; } RadarCore.DebugWrite($"{RadarBlock.CustomName}.ScanGrid({RGrid.DisplayName})", $"Grid rate={RGrid.ActiveDetectionRate}, rate/dist={Math.Round(MyRadarGrid.TotalRadarPower / Position.DistanceTo(RGrid.Position), 2)}", true); float RayPower = ActiveRadar ? PowerModule.EffectiveRadarPower : 800; if (RGrid.HasMarker && RGrid.MarkerRange >= Distance) { AddEntity(RGrid.Grid, null); return; } else if (DetectorModule.CanDetectUsingActiveRadar(RGrid) || DetectorModule.CanDetectByRadar(RGrid) || DetectorModule.CanDetectByHeat(RGrid) || DetectorModule.CanDetectByGravity(RGrid)) { AddEntity(RGrid.Grid, RGrid.Position); return; } }
public bool CanDetectUsingActiveRadar(RadarableGrid Grid) { if (!Radar.ActiveRadar) { return(false); } float TotalPower = Radar.MyRadarGrid.TotalRadarPower; float Distance = Radar.Position.DistanceTo(Grid.Position); return(Distance <= (TotalPower / 1000 * Grid.ActiveDetectionRate / 40) * RadarCore.RadarEfficiency); }
public bool CanDetectByHeat(RadarableGrid Grid) { try { if (Grid.Grid.Physics == null) { return(false); } float Distance = Radar.Position.DistanceTo(Grid.Position); return(Grid.ReactorOutput / 5 >= Distance / 1000); } catch { return(false); } }
public bool CanDetectByGravity(RadarableGrid Grid) { try { if (Grid.IsInPlanetGravityWell) { return(false); } if (Grid.ClosestRoids.Any(x => new BoundingSphereD(x.WorldVolume.Center, x.WorldVolume.Radius * 3).Contains(Grid.Grid.WorldVolume) == ContainmentType.Contains)) { return(false); } return(Grid.GravityDistortion >= Radar.Position.DistanceTo(Grid.Position)); } catch { return(false); } }
public bool ShouldMarkerExist(Ingame.MyDetectedEntityInfo RadarInfo) { if (!Radar.IsWorking()) { return(false); } if (!Radar.ShowMarkers) { return(false); } if (!Radar.HasOwnerInRelay) { return(false); } IMyEntity RadarEntity = MyAPIGateway.Entities.GetEntityById(RadarInfo.EntityId); RadarableGrid rgrid = null; bool HasMarker = false; if (RadarEntity.TryGetComponent(out rgrid)) { if (Radar.ShowWorkingGridsOnly && !rgrid.IsWorkingGrid) { return(false); } HasMarker = rgrid.MarkerRange >= Radar.Position.DistanceTo(RadarInfo.Position); } if (HasMarker) { return(true); } if (RadarInfo.Relationship.IsFriendly() && Radar.ShowOnlyHostiles) { return(false); } if (RadarInfo.Type == Ingame.MyDetectedEntityType.Asteroid && !Radar.ShowRoids) { return(false); } if (RadarInfo.Type == Ingame.MyDetectedEntityType.FloatingObject && !Radar.ShowFloating) { return(false); } return(true); }
public bool CanDetectByRadar(RadarableGrid Grid) { try { if (Grid.Grid.Physics == null) { return(false); } float Distance = Radar.Position.DistanceTo(Grid.Position); return(Grid.TotalRadarPower >= Distance * 1.5f); } catch (Exception Scrap) { RadarCore.DebugWrite($"{RadarBlock.CustomName}.CanDetectByRadar()", $"Crash: {Scrap.Message}", false); return(false); } }
public static bool TryAsRadarable(this IMyCubeGrid Grid, out RadarableGrid Radarable) { Radarable = AsRadarable(Grid); return(Radarable != null); }
public static float DistanceTo(this MyRadar Radar, RadarableGrid Target) { return(Radar.Position.DistanceTo(Target.Position)); }