Пример #1
0
        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;
            }
        }
Пример #2
0
        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);
        }
Пример #3
0
        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); }
        }
Пример #4
0
 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); }
 }
Пример #5
0
        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);
        }
Пример #6
0
        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);
            }
        }
Пример #7
0
 public static bool TryAsRadarable(this IMyCubeGrid Grid, out RadarableGrid Radarable)
 {
     Radarable = AsRadarable(Grid);
     return(Radarable != null);
 }
Пример #8
0
 public static float DistanceTo(this MyRadar Radar, RadarableGrid Target)
 {
     return(Radar.Position.DistanceTo(Target.Position));
 }