Example #1
0
        private void ActiveDetection()
        {
            PowerLevel_RadarEffective = PowerLevel_Radar * myDefinition.SignalEnhance;

            if (PowerLevel_RadarEffective <= 0f)
            {
                Log.DebugLog("no detection possible, effective power level: " + PowerLevel_RadarEffective, Logger.severity.DEBUG);
                return;
            }

            if (beingJammedBy.Count != 0)
            {
                float jamSum = 0;
                foreach (float jamStrength in beingJammedBy.Values)
                {
                    jamSum += jamStrength;
                }

                jamSum *= myDefinition.JammingEffect;

                if (jamSum > 0f)
                {
                    PowerLevel_RadarEffective -= jamSum;
                }

                Log.DebugLog("being jammed by " + beingJammedBy.Count + " jammers, power available: " + PowerLevel_Radar + ", effective power level: " + PowerLevel_RadarEffective, Logger.severity.TRACE);

                if (PowerLevel_RadarEffective <= 0f)
                {
                    Log.DebugLog("no detection possible, effective power level: " + PowerLevel_RadarEffective, Logger.severity.DEBUG);
                    PowerLevel_RadarEffective = 0f;
                    return;
                }
            }
            //else
            //	Log.DebugLog("not being jammed, power available: " + PowerLevel_Radar + ", effective power level: " + PowerLevel_RadarEffective, Logger.severity.TRACE);

            GetNearby(PowerLevel_RadarEffective);

            foreach (IMyEntity entity in m_nearbyEntities)
            {
                if (entity.MarkedForClose)
                {
                    continue;
                }

                if (m_node.Storage.VeryRecentRadarInfo(entity.EntityId))
                {
                    continue;
                }

                float volume, reflectivity;
                if (entity.IsMissile())
                {
                    GuidedMissile guided;
                    if (!Registrar.TryGetValue(entity, out guided))
                    {
                        continue;
                    }
                    if (SignalCannotReach(entity, PowerLevel_RadarEffective))
                    {
                        continue;
                    }
                    volume       = LastSeen.RadarInfo.GetVolume(entity);
                    reflectivity = guided.RadarReflectivity;
                    Log.DebugLog("missile volume: " + volume + ", reflectivity: " + reflectivity);
                }
                else if (entity is IMyCubeGrid)
                {
                    if (!entity.Save)
                    {
                        continue;
                    }
                    if (SignalCannotReach(entity, PowerLevel_RadarEffective))
                    {
                        continue;
                    }
                    volume       = LastSeen.RadarInfo.GetVolume(entity);
                    reflectivity = (volume + myDefinition.Reflect_A) / (volume + myDefinition.Reflect_B);
                }
                else if (entity is IMyCharacter)
                {
                    if (SignalCannotReach(entity, PowerLevel_RadarEffective))
                    {
                        continue;
                    }
                    volume       = LastSeen.RadarInfo.GetVolume(entity);
                    reflectivity = (volume + myDefinition.Reflect_A) / (volume + myDefinition.Reflect_B);
                }
                else
                {
                    continue;
                }

                float distance       = Vector3.Distance(Entity.GetCentre(), entity.GetCentre());
                float radarSignature = (PowerLevel_RadarEffective - distance) * reflectivity - distance;
                int   decoys         = WorkingDecoys(entity);
                radarSignature += decoySignal * decoys;

                //Log.DebugLog("name: " + entity.getBestName() + ", volume: " + volume + ", reflectivity: " + reflectivity + ", distance: " + distance
                //	+ ", radar signature: " + radarSignature + ", decoys: " + decoys, Logger.severity.TRACE);

                if (radarSignature > 0)
                {
                    DetectedInfo detFo = new DetectedInfo(entity, RelationsBlock.getRelationsTo(entity));
                    detFo.SetRadar(radarSignature, new LastSeen.RadarInfo(volume + decoyVolume * decoys));
                    detectedObjects_list.Add(detFo);
                    if (detectedObjects_hash != null)
                    {
                        detectedObjects_hash.Add(entity, detFo);
                    }
                }
            }
        }
Example #2
0
        private void PassiveDetection(bool radar)
        {
            float detectionThreshold;

            if (radar)
            {
                if (!CanPassiveDetectRadar)
                {
                    return;
                }
                detectionThreshold = myDefinition.PassiveDetect_Radar;
            }
            else
            {
                if (!CanPassiveDetectJammer)
                {
                    return;
                }
                detectionThreshold = myDefinition.PassiveDetect_Jamming;
            }

            Registrar.ForEach((RadarEquipment otherDevice) => {
                if (!otherDevice.IsWorking)
                {
                    return;
                }

                IMyEntity otherEntity = otherDevice.Entity.Hierarchy.GetTopMostParent().Entity;
                if (m_node.Storage.VeryRecentRadarInfo(otherEntity.EntityId))
                {
                    return;
                }

                float otherPowerLevel = radar ? otherDevice.PowerLevel_Radar : otherDevice.PowerLevel_Jammer;
                if (otherPowerLevel <= 0)
                {
                    return;
                }
                otherPowerLevel *= myDefinition.SignalEnhance;

                if (SignalCannotReach(otherDevice.Entity, otherPowerLevel))
                {
                    return;
                }

                float distance       = Vector3.Distance(Entity.GetCentre(), otherDevice.Entity.GetCentre());
                float signalStrength = otherPowerLevel - distance - detectionThreshold;

                signalStrength += decoySignal * WorkingDecoys(otherDevice);

                if (signalStrength > 0)
                {
                    Log.DebugLog("radar signal seen: " + otherDevice.Entity.getBestName(), Logger.severity.TRACE);

                    DetectedInfo detFo;
                    if (detectedObjects_hash == null || !detectedObjects_hash.TryGetValue(otherEntity, out detFo))
                    {
                        detFo = new DetectedInfo(otherEntity, RelationsBlock.getRelationsTo(otherDevice.RelationsBlock));
                        detectedObjects_list.Add(detFo);
                        if (detectedObjects_hash != null)
                        {
                            detectedObjects_hash.Add(otherEntity, detFo);
                        }
                    }
                    if (radar)
                    {
                        detFo.RadarSignal = signalStrength;
                    }
                    else
                    {
                        detFo.JammerSignal = signalStrength;
                    }
                }
            });
        }
Example #3
0
        private void Update_OnThread()
        {
            try
            {
                m_nearbyEntities.Clear();
                m_nearbyRange = 0f;
                myLastSeen.Clear();
                detectedObjects_list.Clear();
                if (detectedObjects_hash != null)
                {
                    detectedObjects_hash.Clear();
                }

                if (!IsWorking)
                {
                    if (PowerLevel_Current > 0)
                    {
                        PowerLevel_Current += myDefinition.PowerDecrease;
                    }
                    ClearJamming();
                    return;
                }

                UpdatePowerLevel();

                if (IsJammer)
                {
                    JamRadar();
                }

                if (IsRadar)
                {
                    ActiveDetection();
                }

                if (myDefinition.PassiveDetect_Jamming > 0)
                {
                    PassiveDetection(false);
                }

                if (myDefinition.PassiveDetect_Radar > 0)
                {
                    PassiveDetection(true);
                }

                if (detectedObjects_list.Count > 0)
                {
                    detectedObjects_list.Sort();
                    int transmit = Math.Min(detectedObjects_list.Count, myDefinition.MaxTargets_Tracking);
                    for (int i = 0; i < transmit; i++)
                    {
                        DetectedInfo detFo = detectedObjects_list[i];
                        myLastSeen.Add(new LastSeen(detFo.Entity, detFo.Times, detFo.Info));
                        //Log.DebugLog("created last seen for: " + detFo.Entity.getBestName());
                    }
                    //Log.DebugLog("sending to storage: " + myLastSeen.Count);
                    m_node.Storage.Receive(myLastSeen);
                }
            }
            catch (Exception ex)
            {
                Log.AlwaysLog("Exception: " + ex, Logger.severity.ERROR);
                CubeBlock.EnableGameThread(false);
            }
            finally
            { myLock.ReleaseExclusive(); }
        }