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); } } } }
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; } } }); }
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(); } }