From 5e61f357b40e42c04a4867ed35e507f331096ed7 Mon Sep 17 00:00:00 2001 From: Tian jianyong <11429339@qq.com> Date: Fri, 25 Apr 2025 17:12:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=BA=86=E5=B9=B2=E6=89=B0?= =?UTF-8?q?=E4=BD=93=E7=B3=BB=EF=BC=8C=E5=AE=8C=E5=96=84=E4=BA=86=E9=9B=86?= =?UTF-8?q?=E6=88=90=E6=B5=8B=E8=AF=95=E7=A8=8B=E5=BA=8F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Indicator/LaserDesignatorTests.cs | 2 +- .../Jamming/InfraredDetectorJammingTests.cs | 14 +- .../InfraredImagingGuidanceJammingTests.cs | 14 +- .../Jamming/InfraredTrackerJammingTests.cs | 18 +- .../LaserBeamRiderGuidanceJammingTests.cs | 14 +- .../src/Jamming/LaserBeamRiderJammingTests.cs | 14 +- .../src/Jamming/LaserDecoyTests.cs | 6 +- .../Jamming/LaserDesignatorJammingTests.cs | 22 +- .../Jamming/LaserRangefinderJammingTests.cs | 14 +- .../LaserSemiActiveGuidanceJammingTests.cs | 14 +- .../MillimeterWaveAltimeterJammingTests.cs | 16 +- .../MillimeterWaveGuidanceJammingTests.cs | 14 +- .../MillimeterWaveRadiometerJammingTests.cs | 16 +- ...erminalSensitiveSubmunitionJammingTests.cs | 12 +- .../jammers/decoy_jammers/laser_decoy.json | 14 - .../jammers/ir_jammers/infrared_blocking.json | 14 + .../ir_jammers/infrared_deception.json | 14 + .../jammers/ir_jammers/infrared_standard.json | 14 + .../jammers/laser_jammers/laser_blocking.json | 14 + .../laser_jammers/laser_deception.json | 14 + .../jammers/laser_jammers/laser_decoy.json | 16 + .../jammers/laser_jammers/laser_standard.json | 14 + .../jammers/mmw_jammers/mmw_blocking.json | 14 + .../jammers/mmw_jammers/mmw_deception.json | 14 + .../jammers/mmw_jammers/mmw_standard.json | 14 + ThreatSource/src/Data/DataModels.cs | 24 + .../src/Data/ThreatSourceDataManager.cs | 12 +- ThreatSource/src/Data/ThreatSourceFactory.cs | 22 +- .../src/Guidance/BaseGuidanceSystem.cs | 54 +- .../Guidance/InfraredCommandGuidanceSystem.cs | 38 +- .../Guidance/InfraredImagingGuidanceSystem.cs | 17 +- .../Guidance/LaserBeamRiderGuidanceSystem.cs | 10 +- .../Guidance/LaserSemiActiveGuidanceSystem.cs | 77 +- .../Guidance/MillimeterWaveGuidanceSystem.cs | 47 +- ThreatSource/src/Indicator/BaseIndicator.cs | 14 +- ThreatSource/src/Indicator/InfraredTracker.cs | 8 +- ThreatSource/src/Indicator/LaserBeamRider.cs | 8 +- ThreatSource/src/Indicator/LaserDesignator.cs | 15 +- ThreatSource/src/Jammable/IJammable.cs | 4 +- .../src/Jammable/JammableComponent.cs | 10 +- ThreatSource/src/Jammable/JammingHandler.cs | 4 +- ThreatSource/src/Jammer/BaseJammer.cs | 21 +- ThreatSource/src/Jammer/IJammer.cs | 5 - ThreatSource/src/Jammer/InfraredJammer.cs | 22 +- ThreatSource/src/Jammer/JammingParameters.cs | 28 +- ThreatSource/src/Jammer/LaserDecoy.cs | 31 +- ThreatSource/src/Jammer/LaserJammer.cs | 22 +- .../src/Jammer/MillimeterWaveJammer.cs | 22 +- ThreatSource/src/Jammer/SmokeGrenade.cs | 35 +- ThreatSource/src/Sensor/InfraredDetector.cs | 6 +- ThreatSource/src/Sensor/LaserRangefinder.cs | 6 +- .../src/Sensor/MillimeterWaveAltimeter.cs | 6 +- .../src/Sensor/MillimeterWaveRadiometer.cs | 6 +- ThreatSource/src/Sensor/Sensor.cs | 45 +- .../src/Simulation/SimulationConfig.cs | 26 +- .../src/Simulation/SimulationEvents.cs | 45 -- docs/project/missiles_jamming_methods.md | 33 + tools/ComprehensiveMissileSimulator.cs | 759 +++++++++++++++--- tools/Program.cs | 34 +- 59 files changed, 1272 insertions(+), 590 deletions(-) delete mode 100644 ThreatSource/data/jammers/decoy_jammers/laser_decoy.json create mode 100644 ThreatSource/data/jammers/ir_jammers/infrared_blocking.json create mode 100644 ThreatSource/data/jammers/ir_jammers/infrared_deception.json create mode 100644 ThreatSource/data/jammers/ir_jammers/infrared_standard.json create mode 100644 ThreatSource/data/jammers/laser_jammers/laser_blocking.json create mode 100644 ThreatSource/data/jammers/laser_jammers/laser_deception.json create mode 100644 ThreatSource/data/jammers/laser_jammers/laser_decoy.json create mode 100644 ThreatSource/data/jammers/laser_jammers/laser_standard.json create mode 100644 ThreatSource/data/jammers/mmw_jammers/mmw_blocking.json create mode 100644 ThreatSource/data/jammers/mmw_jammers/mmw_deception.json create mode 100644 ThreatSource/data/jammers/mmw_jammers/mmw_standard.json create mode 100644 docs/project/missiles_jamming_methods.md diff --git a/ThreatSource.Tests/src/Indicator/LaserDesignatorTests.cs b/ThreatSource.Tests/src/Indicator/LaserDesignatorTests.cs index 4b088a5..b01f6c7 100644 --- a/ThreatSource.Tests/src/Indicator/LaserDesignatorTests.cs +++ b/ThreatSource.Tests/src/Indicator/LaserDesignatorTests.cs @@ -120,7 +120,7 @@ namespace ThreatSource.Tests.Indicator SourcePosition = new Vector3D(0, 10, 0), Direction = new Vector3D(0, 1, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.Laser, Duration = null } diff --git a/ThreatSource.Tests/src/Jamming/InfraredDetectorJammingTests.cs b/ThreatSource.Tests/src/Jamming/InfraredDetectorJammingTests.cs index 61f2b16..482e25c 100644 --- a/ThreatSource.Tests/src/Jamming/InfraredDetectorJammingTests.cs +++ b/ThreatSource.Tests/src/Jamming/InfraredDetectorJammingTests.cs @@ -80,7 +80,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(10, 10, 0), // 更靠近探测器,且角度更小 Direction = new Vector3D(0, 1, 0), // 45度角指向探测器 AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null, Type = JammingType.Infrared } @@ -108,7 +108,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(0, 150, 0), // 位于上方 Direction = new Vector3D(0, 0, 1), // 指向前方,不是指向探测器 AngleRange = 0.1, // 很小的角度范围 - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.Infrared } }; @@ -135,7 +135,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 100, 0), Direction = new Vector3D(-1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.Infrared } }; @@ -162,7 +162,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(10, 10, 0), Direction = new Vector3D(0, 1, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = 0.5, Type = JammingType.Infrared } @@ -199,7 +199,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(10, 10, 0), Direction = new Vector3D(0, 1, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null, Type = JammingType.Infrared } @@ -213,7 +213,7 @@ namespace ThreatSource.Tests.Jamming Assert.IsTrue(_infraredDetector.IsJammed, "红外探测器应该处于被干扰状态"); // Act - 手动清除干扰 - _infraredDetector.ClearJamming(JammingType.Infrared); + _infraredDetector.ClearJamming(jammingEvent.Parameters); _infraredDetector.Update(0.1); // Assert - 确认干扰已清除 @@ -255,7 +255,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 100, 0), Direction = new Vector3D(-1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.Infrared } }; diff --git a/ThreatSource.Tests/src/Jamming/InfraredImagingGuidanceJammingTests.cs b/ThreatSource.Tests/src/Jamming/InfraredImagingGuidanceJammingTests.cs index 2c37cc4..6a24ff5 100644 --- a/ThreatSource.Tests/src/Jamming/InfraredImagingGuidanceJammingTests.cs +++ b/ThreatSource.Tests/src/Jamming/InfraredImagingGuidanceJammingTests.cs @@ -107,7 +107,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), // 修改为50米,与激光指示器一致 Direction = new Vector3D(1, 0, 0), // 修改为(1,0,0),指向设备的方向 AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null, Type = JammingType.Infrared } @@ -148,7 +148,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(0, 50, 0), Direction = new Vector3D(1, 0, 0), AngleRange = 0.1, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.Infrared } }; @@ -184,7 +184,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.Infrared } }; @@ -220,7 +220,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), // 修改为50米,与激光指示器一致 Direction = new Vector3D(1, 0, 0), // 修改为(1,0,0),指向设备的方向 AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = 0.5, Type = JammingType.Infrared } @@ -267,7 +267,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), // 修改为50米,与激光指示器一致 Direction = new Vector3D(1, 0, 0), // 修改为(1,0,0),指向设备的方向 AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null, Type = JammingType.Infrared } @@ -281,7 +281,7 @@ namespace ThreatSource.Tests.Jamming Assert.IsTrue(_guidanceSystem.IsJammed, "红外引导系统应该处于被干扰状态"); // Act - 手动清除干扰 - _guidanceSystem.ClearJamming(JammingType.Infrared); + _guidanceSystem.ClearJamming(jammingEvent.Parameters); _guidanceSystem.Update(0.1, initialPosition, initialVelocity); // Assert - 确认干扰已清除 @@ -311,7 +311,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), // 修改为50米,与激光指示器一致 Direction = new Vector3D(1, 0, 0), // 修改为(1,0,0),指向设备的方向 AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null, Type = JammingType.Infrared } diff --git a/ThreatSource.Tests/src/Jamming/InfraredTrackerJammingTests.cs b/ThreatSource.Tests/src/Jamming/InfraredTrackerJammingTests.cs index 1abcc64..bd6430d 100644 --- a/ThreatSource.Tests/src/Jamming/InfraredTrackerJammingTests.cs +++ b/ThreatSource.Tests/src/Jamming/InfraredTrackerJammingTests.cs @@ -70,7 +70,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(-1, 0, 0), // 指向跟踪器 AngleRange = Math.PI / 4, // 45度角 - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null // 持续干扰 } }; @@ -101,7 +101,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(0, 50, 0), // 位于上方 Direction = new Vector3D(0, 0, 1), // 指向前方,不是指向跟踪器 AngleRange = 0.1, // 很小的角度范围 - Mode = JammingMode.Noise + Mode = JammingMode.Blocking } }; @@ -131,7 +131,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(-1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise + Mode = JammingMode.Blocking } }; @@ -159,7 +159,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(-1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise + Mode = JammingMode.Blocking } }; @@ -187,7 +187,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(-1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise + Mode = JammingMode.Blocking } }; @@ -215,7 +215,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(-1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = 0.5 // 0.5秒后过期 } }; @@ -256,7 +256,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(-1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null // 持续干扰 } }; @@ -269,7 +269,7 @@ namespace ThreatSource.Tests.Jamming Assert.IsTrue(_infraredTracker.IsJammed, "红外测角仪应该处于被干扰状态"); // Act - 手动清除干扰 - _infraredTracker.ClearJamming(JammingType.Infrared); + _infraredTracker.ClearJamming(jammingEvent.Parameters); _infraredTracker.Update(0.1); // Assert - 确认干扰已清除 @@ -295,7 +295,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(-1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise + Mode = JammingMode.Blocking } }; diff --git a/ThreatSource.Tests/src/Jamming/LaserBeamRiderGuidanceJammingTests.cs b/ThreatSource.Tests/src/Jamming/LaserBeamRiderGuidanceJammingTests.cs index 5a340cd..de6660d 100644 --- a/ThreatSource.Tests/src/Jamming/LaserBeamRiderGuidanceJammingTests.cs +++ b/ThreatSource.Tests/src/Jamming/LaserBeamRiderGuidanceJammingTests.cs @@ -125,7 +125,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), // 50米 Direction = new Vector3D(1, 0, 0), // 指向设备的方向 AngleRange = Math.PI / 4, // 45度 - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null, Wavelength = 1.06, Type = JammingType.Laser @@ -174,7 +174,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(0, 50, 0), // 从Y轴方向 Direction = new Vector3D(1, 0, 0), // 指向X轴方向 AngleRange = 0.1, // 约5.7度 - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.Laser } }; @@ -217,7 +217,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(1, 0, 0), AngleRange = Math.PI / 4, // 45度 - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.Laser } }; @@ -260,7 +260,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(1, 0, 0), AngleRange = Math.PI / 4, // 45度 - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = 0.5, // 0.5秒 Wavelength = 1.06, Type = JammingType.Laser @@ -315,7 +315,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(1, 0, 0), AngleRange = Math.PI / 4, // 45度 - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null, Wavelength = 1.06, Type = JammingType.Laser @@ -330,7 +330,7 @@ namespace ThreatSource.Tests.Jamming Assert.IsTrue(_guidanceSystem.IsJammed, "激光驾束引导系统应该处于被干扰状态"); // Act - 手动清除干扰 - _guidanceSystem.ClearJamming(JammingType.Laser); + _guidanceSystem.ClearJamming(jammingEvent.Parameters); _guidanceSystem.Update(0.1, initialPosition, initialVelocity); // Assert - 确认干扰已清除 @@ -367,7 +367,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(1, 0, 0), AngleRange = Math.PI / 4, // 45度 - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null, Wavelength = 1.06, Type = JammingType.Laser diff --git a/ThreatSource.Tests/src/Jamming/LaserBeamRiderJammingTests.cs b/ThreatSource.Tests/src/Jamming/LaserBeamRiderJammingTests.cs index 18d711e..a7d1ba5 100644 --- a/ThreatSource.Tests/src/Jamming/LaserBeamRiderJammingTests.cs +++ b/ThreatSource.Tests/src/Jamming/LaserBeamRiderJammingTests.cs @@ -88,7 +88,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(-1, 0, 0), // 指向激光驾束仪 AngleRange = Math.PI / 4, // 45度角 - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.Laser } }; @@ -123,7 +123,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(-1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null, Type = JammingType.Laser } @@ -146,7 +146,7 @@ namespace ThreatSource.Tests.Jamming publishedEvents.Clear(); // Act - 手动清除干扰 - _laserBeamRider.ClearJamming(JammingType.Laser); + _laserBeamRider.ClearJamming(jammingEvent.Parameters); _laserBeamRider.Update(0.1); // Assert - 干扰清除后激光束应该恢复 @@ -171,7 +171,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(-1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = 0.5, // 0.5秒后过期 Type = JammingType.Laser } @@ -213,7 +213,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(-1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null, // 持续干扰 Type = JammingType.Laser } @@ -227,7 +227,7 @@ namespace ThreatSource.Tests.Jamming Assert.IsTrue(_laserBeamRider.IsJammed, "激光驾束仪应该处于被干扰状态"); // Act - 手动清除干扰 - _laserBeamRider.ClearJamming(JammingType.Laser); + _laserBeamRider.ClearJamming(jammingEvent.Parameters); _laserBeamRider.Update(0.1); // Assert - 确认干扰已清除 @@ -253,7 +253,7 @@ namespace ThreatSource.Tests.Jamming Direction = new Vector3D(-1, 0, 0), AngleRange = Math.PI / 4, Duration = null, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.Laser } }; diff --git a/ThreatSource.Tests/src/Jamming/LaserDecoyTests.cs b/ThreatSource.Tests/src/Jamming/LaserDecoyTests.cs index 2ee0ad7..e8d7149 100644 --- a/ThreatSource.Tests/src/Jamming/LaserDecoyTests.cs +++ b/ThreatSource.Tests/src/Jamming/LaserDecoyTests.cs @@ -170,11 +170,11 @@ namespace ThreatSource.Tests.Jamming // 创建诱偏目标配置 var decoyConfig = new LaserDecoyConfig { - DecoyPower = decoyPower, - DecoyLaserDivergenceAngle = DefaultDecoyLaserDivergenceAngle, + Power = decoyPower, + DivergenceAngle = DefaultDecoyLaserDivergenceAngle, ReflectiveArea = DefaultReflectiveArea, ReflectionCoefficient = DefaultReflectionCoefficient, - LifeTime = lifeTime + Duration = lifeTime }; // 创建诱偏目标运动参数 diff --git a/ThreatSource.Tests/src/Jamming/LaserDesignatorJammingTests.cs b/ThreatSource.Tests/src/Jamming/LaserDesignatorJammingTests.cs index e4969c9..dde62e3 100644 --- a/ThreatSource.Tests/src/Jamming/LaserDesignatorJammingTests.cs +++ b/ThreatSource.Tests/src/Jamming/LaserDesignatorJammingTests.cs @@ -87,7 +87,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(5, 0, 0), Direction = new Vector3D(-1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null, Type = JammingType.Laser } @@ -119,7 +119,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(0, 50, 0), // 位于上方 Direction = new Vector3D(0, 0, 1), // 指向前方,不是指向指示器 AngleRange = 0.1, // 很小的角度范围 - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null, Type = JammingType.Laser } @@ -151,7 +151,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(-1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null, Type = JammingType.Laser } @@ -181,7 +181,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(-1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null, Type = JammingType.Laser } @@ -211,7 +211,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(5, 0, 0), Direction = new Vector3D(-1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = 0.5, Type = JammingType.Laser } @@ -251,7 +251,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(5, 0, 0), Direction = new Vector3D(-1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null, Type = JammingType.Laser } @@ -265,7 +265,7 @@ namespace ThreatSource.Tests.Jamming Assert.IsTrue(_laserDesignator.IsJammed, "激光指示器应该处于被干扰状态"); // Act - 手动清除干扰 - _laserDesignator.ClearJamming(JammingType.Laser); + _laserDesignator.ClearJamming(jammingEvent.Parameters); _laserDesignator.Update(0.1); // Assert - 确认干扰已清除 @@ -291,7 +291,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(5, 0, 0), Direction = new Vector3D(-1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null, Type = JammingType.Laser } @@ -327,7 +327,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(-1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null, Type = JammingType.Laser } @@ -339,7 +339,7 @@ namespace ThreatSource.Tests.Jamming Assert.IsTrue(_laserDesignator.IsJammed, "波长匹配时应该被干扰"); // 清除干扰状态,准备下一个测试 - _laserDesignator.ClearJamming(JammingType.Laser); + _laserDesignator.ClearJamming(matchingJammingEvent.Parameters); _laserDesignator.Update(0.1); // 测试2:波长不匹配的情况 @@ -352,7 +352,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(-1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null, Type = JammingType.Laser } diff --git a/ThreatSource.Tests/src/Jamming/LaserRangefinderJammingTests.cs b/ThreatSource.Tests/src/Jamming/LaserRangefinderJammingTests.cs index 7bf982b..420fe00 100644 --- a/ThreatSource.Tests/src/Jamming/LaserRangefinderJammingTests.cs +++ b/ThreatSource.Tests/src/Jamming/LaserRangefinderJammingTests.cs @@ -80,7 +80,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(0, 10, 0), Direction = new Vector3D(0, 1, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.Laser } }; @@ -107,7 +107,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(0, 150, 0), // 位于上方 Direction = new Vector3D(0, 0, 1), // 指向前方,不是指向测距仪 AngleRange = 0.1, // 很小的角度范围 - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.Laser } }; @@ -134,7 +134,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(0, 10, 0), Direction = new Vector3D(0, 1, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.Laser } }; @@ -161,7 +161,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(0, 10, 0), Direction = new Vector3D(0, 1, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = 0.5, Type = JammingType.Laser } @@ -198,7 +198,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(0, 10, 0), Direction = new Vector3D(0, 1, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.Laser } }; @@ -211,7 +211,7 @@ namespace ThreatSource.Tests.Jamming Assert.IsTrue(_laserRangefinder.IsJammed, "激光测距仪应该处于被干扰状态"); // Act - 手动清除干扰 - _laserRangefinder.ClearJamming(JammingType.Laser); + _laserRangefinder.ClearJamming(jammingEvent.Parameters); _laserRangefinder.Update(0.1); // Assert - 确认干扰已清除 @@ -237,7 +237,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(0, 10, 0), Direction = new Vector3D(0, 1, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.Laser } }; diff --git a/ThreatSource.Tests/src/Jamming/LaserSemiActiveGuidanceJammingTests.cs b/ThreatSource.Tests/src/Jamming/LaserSemiActiveGuidanceJammingTests.cs index 95b7817..3608ebf 100644 --- a/ThreatSource.Tests/src/Jamming/LaserSemiActiveGuidanceJammingTests.cs +++ b/ThreatSource.Tests/src/Jamming/LaserSemiActiveGuidanceJammingTests.cs @@ -115,7 +115,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null, Wavelength = 1.06, Type = JammingType.Laser @@ -157,7 +157,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(0, 50, 0), Direction = new Vector3D(1, 0, 0), AngleRange = 0.1, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.Laser, Wavelength = 1.06, Duration = null @@ -195,7 +195,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.Laser, Wavelength = 1.06, Duration = null @@ -233,7 +233,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = 0.5, Type = JammingType.Laser, Wavelength = 1.06 @@ -281,7 +281,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null, Wavelength = 1.06, Type = JammingType.Laser @@ -296,7 +296,7 @@ namespace ThreatSource.Tests.Jamming Assert.IsTrue(_guidanceSystem.IsJammed, "激光半主动制导系统应该处于被干扰状态"); // Act - 手动清除干扰 - _guidanceSystem.ClearJamming(JammingType.Laser); + _guidanceSystem.ClearJamming(jammingEvent.Parameters); _guidanceSystem.Update(0.1, initialPosition, initialVelocity); // Assert - 确认干扰已清除 @@ -326,7 +326,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null, Type = JammingType.Laser, Wavelength = 1.06 diff --git a/ThreatSource.Tests/src/Jamming/MillimeterWaveAltimeterJammingTests.cs b/ThreatSource.Tests/src/Jamming/MillimeterWaveAltimeterJammingTests.cs index 551019e..82b5af3 100644 --- a/ThreatSource.Tests/src/Jamming/MillimeterWaveAltimeterJammingTests.cs +++ b/ThreatSource.Tests/src/Jamming/MillimeterWaveAltimeterJammingTests.cs @@ -80,7 +80,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(0, 10, 0), Direction = new Vector3D(0, 1, 0), AngleRange = Math.PI / 6, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.MillimeterWave } }; @@ -107,7 +107,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(0, 150, 0), // 位于上方 Direction = new Vector3D(0, 0, 1), // 指向前方,不是指向测高雷达 AngleRange = 0.1, // 很小的角度范围 - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.MillimeterWave } }; @@ -134,7 +134,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 100, 0), Direction = new Vector3D(-1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.MillimeterWave } }; @@ -161,7 +161,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(0, 10, 0), Direction = new Vector3D(0, 1, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.MillimeterWave } }; @@ -188,7 +188,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(0, 120, 0), Direction = new Vector3D(0, -1, 0), AngleRange = Math.PI / 6, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = 0.5, // 0.5秒后过期 Type = JammingType.MillimeterWave } @@ -225,7 +225,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(0, 10, 0), Direction = new Vector3D(0, 1, 0), AngleRange = Math.PI / 6, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.MillimeterWave } }; @@ -238,7 +238,7 @@ namespace ThreatSource.Tests.Jamming Assert.IsTrue(_altimeter.IsJammed, "毫米波测高雷达应该处于被干扰状态"); // Act - 手动清除干扰 - _altimeter.ClearJamming(JammingType.MillimeterWave); + _altimeter.ClearJamming(jammingEvent.Parameters); _altimeter.Update(0.1); // Assert - 确认干扰已清除 @@ -264,7 +264,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(0, 10, 0), Direction = new Vector3D(0, 1, 0), AngleRange = Math.PI / 6, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.MillimeterWave } }; diff --git a/ThreatSource.Tests/src/Jamming/MillimeterWaveGuidanceJammingTests.cs b/ThreatSource.Tests/src/Jamming/MillimeterWaveGuidanceJammingTests.cs index 7ee563f..84696f9 100644 --- a/ThreatSource.Tests/src/Jamming/MillimeterWaveGuidanceJammingTests.cs +++ b/ThreatSource.Tests/src/Jamming/MillimeterWaveGuidanceJammingTests.cs @@ -113,7 +113,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null, Wavelength = 3.19, Type = JammingType.MillimeterWave @@ -155,7 +155,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(0, 50, 0), Direction = new Vector3D(1, 0, 0), AngleRange = 0.1, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.MillimeterWave, Wavelength = 3.19 } @@ -192,7 +192,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise + Mode = JammingMode.Blocking } }; @@ -227,7 +227,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = 0.5, Type = JammingType.MillimeterWave, Wavelength = 3.19 @@ -275,7 +275,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null, Wavelength = 3.19, Type = JammingType.MillimeterWave @@ -290,7 +290,7 @@ namespace ThreatSource.Tests.Jamming Assert.IsTrue(_guidanceSystem.IsJammed, "毫米波制导系统应该处于被干扰状态"); // Act - 手动清除干扰 - _guidanceSystem.ClearJamming(JammingType.MillimeterWave); + _guidanceSystem.ClearJamming(jammingEvent.Parameters); _guidanceSystem.Update(0.1, initialPosition, initialVelocity); // Assert - 确认干扰已清除 @@ -320,7 +320,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(50, 0, 0), Direction = new Vector3D(1, 0, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null, Wavelength = 3.19, Type = JammingType.MillimeterWave diff --git a/ThreatSource.Tests/src/Jamming/MillimeterWaveRadiometerJammingTests.cs b/ThreatSource.Tests/src/Jamming/MillimeterWaveRadiometerJammingTests.cs index 133f2e1..ec58745 100644 --- a/ThreatSource.Tests/src/Jamming/MillimeterWaveRadiometerJammingTests.cs +++ b/ThreatSource.Tests/src/Jamming/MillimeterWaveRadiometerJammingTests.cs @@ -79,7 +79,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(10, 10, 0), Direction = new Vector3D(0, 1, 0), AngleRange = Math.PI / 4, // 45度角 - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = null, // 持续干扰 Type = JammingType.MillimeterWave } @@ -107,7 +107,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(0, 150, 0), // 位于上方 Direction = new Vector3D(0, 1, 0), // 指向上方,与辐射计方向完全相反 AngleRange = 0.01, // 极小的角度范围 - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.MillimeterWave } }; @@ -134,7 +134,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(10, 10, 0), Direction = new Vector3D(0, 1, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.MillimeterWave } }; @@ -161,7 +161,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(0, 10, 0), Direction = new Vector3D(0, 1, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.MillimeterWave } }; @@ -188,7 +188,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(10, 10, 0), Direction = new Vector3D(0, 1, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = 0.5, Type = JammingType.MillimeterWave } @@ -225,7 +225,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(10, 10, 0), Direction = new Vector3D(0, 1, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.MillimeterWave } }; @@ -238,7 +238,7 @@ namespace ThreatSource.Tests.Jamming Assert.IsTrue(_radiometer.IsJammed, "毫米波辐射计应该处于被干扰状态"); // Act - 手动清除干扰 - _radiometer.ClearJamming(JammingType.MillimeterWave); + _radiometer.ClearJamming(jammingEvent.Parameters); _radiometer.Update(0.1); // Assert - 确认干扰已清除 @@ -280,7 +280,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(0, 10, 0), Direction = new Vector3D(0, 1, 0), AngleRange = Math.PI / 4, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Type = JammingType.MillimeterWave } }; diff --git a/ThreatSource.Tests/src/Jamming/TerminalSensitiveSubmunitionJammingTests.cs b/ThreatSource.Tests/src/Jamming/TerminalSensitiveSubmunitionJammingTests.cs index 775ffbf..31cf124 100644 --- a/ThreatSource.Tests/src/Jamming/TerminalSensitiveSubmunitionJammingTests.cs +++ b/ThreatSource.Tests/src/Jamming/TerminalSensitiveSubmunitionJammingTests.cs @@ -163,7 +163,7 @@ namespace ThreatSource.Tests.Jamming Assert.IsTrue(_infraredDetector.IsJammed, "红外探测器应该被干扰"); // 清除干扰 - _infraredDetector.ClearJamming(JammingType.Infrared); + _infraredDetector.ClearJamming(jammingParams); Assert.IsFalse(_infraredDetector.IsJammed, "红外探测器应该在干扰清除后恢复正常"); Assert.IsTrue(_infraredDetector.IsActive, "红外探测器应该在干扰清除后仍处于激活状态"); } @@ -190,7 +190,7 @@ namespace ThreatSource.Tests.Jamming Assert.IsTrue(_radiometer.IsJammed, "毫米波辐射计应该被干扰"); // 清除干扰 - _radiometer.ClearJamming(JammingType.MillimeterWave); + _radiometer.ClearJamming(jammingParams); Assert.IsFalse(_radiometer.IsJammed, "毫米波辐射计应该在干扰清除后恢复正常"); Assert.IsTrue(_radiometer.IsActive, "毫米波辐射计应该在干扰清除后仍处于激活状态"); } @@ -217,7 +217,7 @@ namespace ThreatSource.Tests.Jamming Assert.IsTrue(_rangefinder.IsJammed, "激光测距仪应该被干扰"); // 清除干扰 - _rangefinder.ClearJamming(JammingType.Laser); + _rangefinder.ClearJamming(jammingParams); Assert.IsFalse(_rangefinder.IsJammed, "激光测距仪应该在干扰清除后恢复正常"); Assert.IsTrue(_rangefinder.IsActive, "激光测距仪应该在干扰清除后仍处于激活状态"); } @@ -399,7 +399,7 @@ namespace ThreatSource.Tests.Jamming SourcePosition = new Vector3D(0, 10, 0), Direction = new Vector3D(0, 1, 0), AngleRange = Math.PI/2, - Mode = JammingMode.Noise, + Mode = JammingMode.Blocking, Duration = 10, Type = JammingType.MillimeterWave } @@ -421,7 +421,7 @@ namespace ThreatSource.Tests.Jamming Assert.IsTrue(status.Contains("传感器受到干扰"), "子弹状态应该反映传感器受到干扰"); // 清除干扰 - altimeter.ClearJamming(JammingType.MillimeterWave); + altimeter.ClearJamming(millimeterWaveJamming.Parameters); submunition.Update(0.1); // 验证恢复效果 @@ -547,7 +547,7 @@ namespace ThreatSource.Tests.Jamming Console.WriteLine($"干扰期间位置变化:从 {jammedPosition} 到 {currentPosition}"); // 清除干扰 - altimeter.ClearJamming(JammingType.MillimeterWave); + altimeter.ClearJamming(millimeterWaveJamming); submunition.Update(0.1); // 验证恢复效果 diff --git a/ThreatSource/data/jammers/decoy_jammers/laser_decoy.json b/ThreatSource/data/jammers/decoy_jammers/laser_decoy.json deleted file mode 100644 index 9dad44c..0000000 --- a/ThreatSource/data/jammers/decoy_jammers/laser_decoy.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": { - "zh": "激光诱偏目标", - "en": "Laser Decoy" - }, - "type": "LaserDecoy", - "LaserDecoyConfig": { - "decoyPower": 25.0, - "decoyLaserDivergenceAngle": 0.001, - "reflectiveArea": 1.2, - "reflectionCoefficient": 0.8, - "lifeTime": 60.0 - } -} \ No newline at end of file diff --git a/ThreatSource/data/jammers/ir_jammers/infrared_blocking.json b/ThreatSource/data/jammers/ir_jammers/infrared_blocking.json new file mode 100644 index 0000000..0ae783f --- /dev/null +++ b/ThreatSource/data/jammers/ir_jammers/infrared_blocking.json @@ -0,0 +1,14 @@ +{ + "name": { + "zh": "红外阻塞干扰器", + "en": "Infrared Blocking Jammer" + }, + "type": "Infrared", + "InfraredJammerConfig": { + "Power": 1000, + "Wavelength": 5, + "AngleRange": 10, + "Mode": "Blocking", + "Duration": 60 + } +} \ No newline at end of file diff --git a/ThreatSource/data/jammers/ir_jammers/infrared_deception.json b/ThreatSource/data/jammers/ir_jammers/infrared_deception.json new file mode 100644 index 0000000..d201f5f --- /dev/null +++ b/ThreatSource/data/jammers/ir_jammers/infrared_deception.json @@ -0,0 +1,14 @@ +{ + "name": { + "zh": "红外欺骗干扰器", + "en": "Infrared Deception Jammer" + }, + "type": "Infrared", + "InfraredJammerConfig": { + "Power": 800, + "Wavelength": 5, + "AngleRange": 15, + "Mode": "Deception", + "Duration": 60 + } +} \ No newline at end of file diff --git a/ThreatSource/data/jammers/ir_jammers/infrared_standard.json b/ThreatSource/data/jammers/ir_jammers/infrared_standard.json new file mode 100644 index 0000000..0ae783f --- /dev/null +++ b/ThreatSource/data/jammers/ir_jammers/infrared_standard.json @@ -0,0 +1,14 @@ +{ + "name": { + "zh": "红外阻塞干扰器", + "en": "Infrared Blocking Jammer" + }, + "type": "Infrared", + "InfraredJammerConfig": { + "Power": 1000, + "Wavelength": 5, + "AngleRange": 10, + "Mode": "Blocking", + "Duration": 60 + } +} \ No newline at end of file diff --git a/ThreatSource/data/jammers/laser_jammers/laser_blocking.json b/ThreatSource/data/jammers/laser_jammers/laser_blocking.json new file mode 100644 index 0000000..fc81913 --- /dev/null +++ b/ThreatSource/data/jammers/laser_jammers/laser_blocking.json @@ -0,0 +1,14 @@ +{ + "name": { + "zh": "激光阻塞干扰器", + "en": "Laser Blocking Jammer" + }, + "type": "Laser", + "LaserJammerConfig": { + "Power": 1000, + "Wavelength": 1.06, + "AngleRange": 10, + "Mode": "Blocking", + "Duration": 60 + } +} \ No newline at end of file diff --git a/ThreatSource/data/jammers/laser_jammers/laser_deception.json b/ThreatSource/data/jammers/laser_jammers/laser_deception.json new file mode 100644 index 0000000..ee11f89 --- /dev/null +++ b/ThreatSource/data/jammers/laser_jammers/laser_deception.json @@ -0,0 +1,14 @@ +{ + "name": { + "zh": "激光欺骗干扰器", + "en": "Laser Deception Jammer" + }, + "type": "Laser", + "LaserJammerConfig": { + "Power": 800, + "Wavelength": 1.06, + "AngleRange": 15, + "Mode": "Deception", + "Duration": 60 + } +} \ No newline at end of file diff --git a/ThreatSource/data/jammers/laser_jammers/laser_decoy.json b/ThreatSource/data/jammers/laser_jammers/laser_decoy.json new file mode 100644 index 0000000..3a8e3db --- /dev/null +++ b/ThreatSource/data/jammers/laser_jammers/laser_decoy.json @@ -0,0 +1,16 @@ +{ + "name": { + "zh": "激光诱偏目标", + "en": "Laser Decoy" + }, + "type": "LaserDecoy", + "LaserDecoyConfig": { + "Mode": "Deception", + "Power": 25.0, + "Wavelength": 1.06, + "DivergenceAngle": 0.001, + "ReflectiveArea": 1.2, + "ReflectionCoefficient": 0.8, + "Duration": 60.0 + } +} \ No newline at end of file diff --git a/ThreatSource/data/jammers/laser_jammers/laser_standard.json b/ThreatSource/data/jammers/laser_jammers/laser_standard.json new file mode 100644 index 0000000..fc81913 --- /dev/null +++ b/ThreatSource/data/jammers/laser_jammers/laser_standard.json @@ -0,0 +1,14 @@ +{ + "name": { + "zh": "激光阻塞干扰器", + "en": "Laser Blocking Jammer" + }, + "type": "Laser", + "LaserJammerConfig": { + "Power": 1000, + "Wavelength": 1.06, + "AngleRange": 10, + "Mode": "Blocking", + "Duration": 60 + } +} \ No newline at end of file diff --git a/ThreatSource/data/jammers/mmw_jammers/mmw_blocking.json b/ThreatSource/data/jammers/mmw_jammers/mmw_blocking.json new file mode 100644 index 0000000..ddab7ed --- /dev/null +++ b/ThreatSource/data/jammers/mmw_jammers/mmw_blocking.json @@ -0,0 +1,14 @@ +{ + "name": { + "zh": "毫米波阻塞干扰器", + "en": "Millimeter Wave Blocking Jammer" + }, + "type": "MillimeterWave", + "MillimeterWaveJammerConfig": { + "Power": 1000, + "Wavelength": 3.16, + "AngleRange": 10, + "Mode": "Blocking", + "Duration": 60 + } +} \ No newline at end of file diff --git a/ThreatSource/data/jammers/mmw_jammers/mmw_deception.json b/ThreatSource/data/jammers/mmw_jammers/mmw_deception.json new file mode 100644 index 0000000..0a6771c --- /dev/null +++ b/ThreatSource/data/jammers/mmw_jammers/mmw_deception.json @@ -0,0 +1,14 @@ +{ + "name": { + "zh": "毫米波欺骗干扰器", + "en": "Millimeter Wave Deception Jammer" + }, + "type": "MillimeterWave", + "MillimeterWaveJammerConfig": { + "Power": 800, + "Wavelength": 3.16, + "AngleRange": 15, + "Mode": "Deception", + "Duration": 60 + } +} \ No newline at end of file diff --git a/ThreatSource/data/jammers/mmw_jammers/mmw_standard.json b/ThreatSource/data/jammers/mmw_jammers/mmw_standard.json new file mode 100644 index 0000000..ddab7ed --- /dev/null +++ b/ThreatSource/data/jammers/mmw_jammers/mmw_standard.json @@ -0,0 +1,14 @@ +{ + "name": { + "zh": "毫米波阻塞干扰器", + "en": "Millimeter Wave Blocking Jammer" + }, + "type": "MillimeterWave", + "MillimeterWaveJammerConfig": { + "Power": 1000, + "Wavelength": 3.16, + "AngleRange": 10, + "Mode": "Blocking", + "Duration": 60 + } +} \ No newline at end of file diff --git a/ThreatSource/src/Data/DataModels.cs b/ThreatSource/src/Data/DataModels.cs index 00b9313..23e6a99 100644 --- a/ThreatSource/src/Data/DataModels.cs +++ b/ThreatSource/src/Data/DataModels.cs @@ -384,6 +384,30 @@ namespace ThreatSource.Data /// 包含激光诱偏目标的配置信息 /// public LaserDecoyConfig LaserDecoyConfig { get; set; } = new(); + + /// + /// 获取或设置激光干扰机的配置 + /// + /// + /// 包含激光干扰机的配置信息 + /// + public LaserJammerConfig LaserJammerConfig { get; set; } = new(); + + /// + /// 获取或设置红外干扰机的配置 + /// + /// + /// 包含红外干扰机的配置信息 + /// + public InfraredJammerConfig InfraredJammerConfig { get; set; } = new(); + + /// + /// 获取或设置毫米波干扰机的配置 + /// + /// + /// 包含毫米波干扰机的配置信息 + /// + public MillimeterWaveJammerConfig MillimeterWaveJammerConfig { get; set; } = new(); } } \ No newline at end of file diff --git a/ThreatSource/src/Data/ThreatSourceDataManager.cs b/ThreatSource/src/Data/ThreatSourceDataManager.cs index fc218a5..e2ba121 100644 --- a/ThreatSource/src/Data/ThreatSourceDataManager.cs +++ b/ThreatSource/src/Data/ThreatSourceDataManager.cs @@ -264,7 +264,7 @@ namespace ThreatSource.Data { if (_missiles.TryGetValue(model, out var data)) return data; - throw new KeyNotFoundException($"Missile {model} not found"); + throw new KeyNotFoundException($"导弹 {model} 不存在"); } /// @@ -276,7 +276,7 @@ namespace ThreatSource.Data { if (_indicators.TryGetValue(model, out var data)) return data; - throw new KeyNotFoundException($"Indicator {model} not found"); + throw new KeyNotFoundException($"指示器 {model} 不存在"); } /// @@ -288,7 +288,7 @@ namespace ThreatSource.Data { if (_sensors.TryGetValue(model, out var data)) return data; - throw new KeyNotFoundException($"Sensor {model} not found"); + throw new KeyNotFoundException($"传感器 {model} 不存在"); } /// @@ -300,7 +300,7 @@ namespace ThreatSource.Data { if (_targets.TryGetValue(model, out var data)) return data; - throw new KeyNotFoundException($"Target {model} not found"); + throw new KeyNotFoundException($"目标 {model} 不存在"); } /// @@ -312,7 +312,7 @@ namespace ThreatSource.Data { if (_weathers.TryGetValue(weatherType, out var data)) return data; - throw new KeyNotFoundException($"Weather {weatherType} not found"); + throw new KeyNotFoundException($"天气 {weatherType} 不存在"); } /// @@ -324,7 +324,7 @@ namespace ThreatSource.Data { if (_jammers.TryGetValue(model, out var data)) return data; - throw new KeyNotFoundException($"Jammer {model} not found"); + throw new KeyNotFoundException($"干扰机 {model} 不存在"); } diff --git a/ThreatSource/src/Data/ThreatSourceFactory.cs b/ThreatSource/src/Data/ThreatSourceFactory.cs index 487445c..4fb3738 100644 --- a/ThreatSource/src/Data/ThreatSourceFactory.cs +++ b/ThreatSource/src/Data/ThreatSourceFactory.cs @@ -136,9 +136,7 @@ namespace ThreatSource.Data public IIndicator CreateIndicator(string indicatorId, string indicatorModel, string targetId, string missileId, MotionParameters motionParameters) { var data = _dataManager.GetIndicator(indicatorModel); - - Console.WriteLine($"dataType: {data.Type}, indicatorModel: {indicatorModel}, indicatorId: {indicatorId}, targetId: {targetId}, missileId: {missileId}"); - + return data.Type switch { IndicatorType.LaserDesignator when data.DesignatorConfig != null => new LaserDesignator( @@ -247,6 +245,24 @@ namespace ThreatSource.Data sourceId, _simulationManager ), + JammerType.Laser => new LaserJammer( + jammerId, + data.LaserJammerConfig, + motionParameters, + _simulationManager + ), + JammerType.Infrared => new InfraredJammer( + jammerId, + data.InfraredJammerConfig, + motionParameters, + _simulationManager + ), + JammerType.MillimeterWave => new MillimeterWaveJammer( + jammerId, + data.MillimeterWaveJammerConfig, + motionParameters, + _simulationManager + ), _ => throw new ArgumentException($"不支持的干扰机类型: {data.Type}"), }; } diff --git a/ThreatSource/src/Guidance/BaseGuidanceSystem.cs b/ThreatSource/src/Guidance/BaseGuidanceSystem.cs index 91fd80e..ec2c044 100644 --- a/ThreatSource/src/Guidance/BaseGuidanceSystem.cs +++ b/ThreatSource/src/Guidance/BaseGuidanceSystem.cs @@ -134,6 +134,7 @@ namespace ThreatSource.Guidance IsActive = true; // 统一订阅 JammingEvent SimulationManager.SubscribeToEvent(HandleJammingEvent); + SimulationManager.SubscribeToEvent(HandleJammingStoppedEvent); // 子类应在此方法中调用 base.Activate() 并订阅其他需要的事件 } // 调用 SimulationElement 的基类 Activate (如果存在) @@ -148,9 +149,10 @@ namespace ThreatSource.Guidance if (IsActive) { IsActive = false; - // 统一取消订阅 JammingEvent + // 统一取消订阅 JammingEvent和JammingStoppedEvent SimulationManager.UnsubscribeFromEvent(HandleJammingEvent); - // 子类应在此方法中调用 base.Deactivate() 并取消订阅其他事件 + SimulationManager.UnsubscribeFromEvent(HandleJammingStoppedEvent); + // 子类应在此方法中调用 base.Deactivate() 并取消订阅其他事件 } HasGuidance = false; // 停用时失去制导 GuidanceAcceleration = Vector3D.Zero; @@ -238,12 +240,22 @@ namespace ThreatSource.Guidance if (evt != null) { // 在应用干扰前检查是否应该处理此干扰 - if (!ShouldHandleJamming(evt.Parameters)) + if (ShouldHandleJamming(evt.Parameters)) { - // Debug.WriteLine($"[BaseGuidanceSystem] {Id} 忽略干扰事件,类型: {evt.Parameters.Type}"); - return; + ApplyJamming(evt.Parameters); } - ApplyJamming(evt.Parameters); + } + } + + /// + /// 处理干扰事件 + /// + /// 干扰事件 + protected virtual void HandleJammingStoppedEvent(JammingStoppedEvent evt) + { + if (evt != null) + { + ClearJamming(evt.Parameters); } } @@ -293,10 +305,10 @@ namespace ThreatSource.Guidance /// /// 清除干扰 /// - /// 要清除的干扰类型 - public virtual void ClearJamming(JammingType type) + /// 干扰参数 + public virtual void ClearJamming(JammingParameters parameters) { - _jammingComponent.ClearJamming(type); + _jammingComponent.ClearJamming(parameters); } /// @@ -306,8 +318,8 @@ namespace ThreatSource.Guidance protected virtual void HandleJammingApplied(JammingParameters parameters) { // 子类可以重写此方法以实现特定的干扰响应 - // 默认:非烟幕干扰是硬干扰 - if (parameters.Type != JammingType.SmokeScreen) + // 阻塞干扰是硬干扰 + if (parameters.Mode == JammingMode.Blocking) { IsHardJammed = true; HasGuidance = false; // 硬干扰立即停止制导 @@ -318,29 +330,23 @@ namespace ThreatSource.Guidance /// /// 处理制导系统干扰被清除的事件 /// - /// 被清除的干扰类型 - protected virtual void HandleJammingCleared(JammingType type) + /// 干扰参数 + protected virtual void HandleJammingCleared(JammingParameters parameters) { // 子类可以重写此方法以实现干扰清除后的特定行为 - if (type != JammingType.SmokeScreen) + if (parameters.Mode == JammingMode.Blocking) { - // 尝试清除硬干扰标志。如果还有其他硬干扰,组件状态可能仍反映, - // 或者后续 ApplyJamming 会再次设置 IsHardJammed。 - // 简化处理:清除任何硬干扰时都清除标志。 IsHardJammed = false; - Trace.WriteLine($"[{this.GetType().Name}] 硬干扰已清除: {type}"); + Trace.WriteLine($"[{GetType().Name}] 硬干扰已清除: {parameters.Type}"); } - // 子类需要重写此方法来处理 SmokeScreen 清除。 // 检查整体干扰状态 if (!_jammingComponent.IsJammed) { - IsHardJammed = false; // 确保清除 - HasGuidance = true; // 恢复制导 - Trace.WriteLine($"[{this.GetType().Name}] 所有干扰已清除。"); + IsHardJammed = false; + HasGuidance = true; + Trace.WriteLine($"[{GetType().Name}] 所有干扰已清除。"); } - // 如果 _jammingComponent 仍然 IsJammed (因为可能有烟幕), - // HasGuidance 的最终状态由 Update 决定。 } /// diff --git a/ThreatSource/src/Guidance/InfraredCommandGuidanceSystem.cs b/ThreatSource/src/Guidance/InfraredCommandGuidanceSystem.cs index b84a588..62e1e26 100644 --- a/ThreatSource/src/Guidance/InfraredCommandGuidanceSystem.cs +++ b/ThreatSource/src/Guidance/InfraredCommandGuidanceSystem.cs @@ -24,7 +24,7 @@ namespace ThreatSource.Guidance /// 记录上一次接收到的跟踪器指向导弹的方向 /// 用于计算导弹的相对位置 /// - private Vector3D? lastTrackerToMissileVector { get; set; } + private Vector3D? LastTrackerToMissileVector { get; set; } /// /// 跟踪器到目标的方向向量 (使用可空类型) @@ -33,7 +33,7 @@ namespace ThreatSource.Guidance /// 记录上一次接收到的跟踪器指向目标的方向 /// 用于计算目标的相对位置 /// - private Vector3D? lastTrackerToTargetVector { get; set; } + private Vector3D? LastTrackerToTargetVector { get; set; } /// /// 上一次的期望飞行方向 (使用可空类型) @@ -42,7 +42,7 @@ namespace ThreatSource.Guidance /// 记录上一次计算的期望飞行方向 /// 用于计算转向速率 /// - private Vector3D? lastDesiredDirection { get; set; } + private Vector3D? LastDesiredDirection { get; set; } /// /// 当前转向速率,单位:弧度/秒 @@ -108,7 +108,7 @@ namespace ThreatSource.Guidance public override void Update(double deltaTime, Vector3D missilePosition, Vector3D missileVelocity) { base.Update(deltaTime, missilePosition, missileVelocity); - if (!IsJammed) + if (!IsHardJammed) { if (HasGuidance) { @@ -117,9 +117,9 @@ namespace ThreatSource.Guidance else { GuidanceAcceleration = Vector3D.Zero; - lastTrackerToMissileVector = null; - lastTrackerToTargetVector = null; - lastDesiredDirection = null; + LastTrackerToMissileVector = null; + LastTrackerToTargetVector = null; + LastDesiredDirection = null; turnRate = 0; } } @@ -127,9 +127,9 @@ namespace ThreatSource.Guidance { HasGuidance = false; GuidanceAcceleration = Vector3D.Zero; - lastTrackerToMissileVector = null; - lastTrackerToTargetVector = null; - lastDesiredDirection = null; + LastTrackerToMissileVector = null; + LastTrackerToTargetVector = null; + LastDesiredDirection = null; turnRate = 0; } } @@ -148,8 +148,8 @@ namespace ThreatSource.Guidance public void ReceiveGuidanceCommand(Vector3D trackerToMissileVector, Vector3D trackerToTargetVector) { HasGuidance = true; - lastTrackerToMissileVector = trackerToMissileVector; - lastTrackerToTargetVector = trackerToTargetVector; + LastTrackerToMissileVector = trackerToMissileVector; + LastTrackerToTargetVector = trackerToTargetVector; } /// @@ -166,20 +166,20 @@ namespace ThreatSource.Guidance /// protected void CalculateGuidanceAcceleration(double deltaTime) { - if (lastTrackerToMissileVector == null || lastTrackerToTargetVector == null) + if (LastTrackerToMissileVector == null || LastTrackerToTargetVector == null) { GuidanceAcceleration = Vector3D.Zero; HasGuidance = false; return; } - Vector3D currentDesiredDirection = (lastTrackerToTargetVector - lastTrackerToMissileVector).Normalize(); + Vector3D currentDesiredDirection = (LastTrackerToTargetVector - LastTrackerToMissileVector).Normalize(); Vector3D currentDirection = Velocity.Normalize(); - if (lastDesiredDirection != null && deltaTime > 0) + if (LastDesiredDirection != null && deltaTime > 0) { - double instantTurnRate = Vector3D.CrossProduct(lastDesiredDirection, currentDesiredDirection).Magnitude() / deltaTime; + double instantTurnRate = Vector3D.CrossProduct(LastDesiredDirection, currentDesiredDirection).Magnitude() / deltaTime; turnRate = turnRate * (1 - TurnRateSmoothingFactor) + instantTurnRate * TurnRateSmoothingFactor; } else @@ -198,7 +198,7 @@ namespace ThreatSource.Guidance { GuidanceAcceleration = GuidanceAcceleration.Normalize() * MaxAcceleration; } - lastDesiredDirection = currentDesiredDirection; + LastDesiredDirection = currentDesiredDirection; } /// @@ -216,9 +216,9 @@ namespace ThreatSource.Guidance public override string GetStatus() { string angleStr = "null"; - if (lastTrackerToTargetVector != null && lastTrackerToMissileVector != null) + if (LastTrackerToTargetVector != null && LastTrackerToMissileVector != null) { - angleStr = Vector3D.AngleBetween(lastTrackerToTargetVector, lastTrackerToMissileVector).ToString("F3"); + angleStr = Vector3D.AngleBetween(LastTrackerToTargetVector, LastTrackerToMissileVector).ToString("F3"); } return base.GetStatus() + diff --git a/ThreatSource/src/Guidance/InfraredImagingGuidanceSystem.cs b/ThreatSource/src/Guidance/InfraredImagingGuidanceSystem.cs index dd6b121..28c1561 100644 --- a/ThreatSource/src/Guidance/InfraredImagingGuidanceSystem.cs +++ b/ThreatSource/src/Guidance/InfraredImagingGuidanceSystem.cs @@ -188,25 +188,20 @@ namespace ThreatSource.Guidance /// /// 处理系统干扰被清除的事件 /// - /// 被清除的干扰类型 - protected override void HandleJammingCleared(JammingType type) + /// 干扰参数 + protected override void HandleJammingCleared(JammingParameters parameters) { - if (type == JammingType.Infrared) + base.HandleJammingCleared(parameters); + + if (parameters.Type == JammingType.Infrared) { Debug.WriteLine("红外引导系统干扰已清除"); - // 确保基类的处理逻辑被调用 - base.HandleJammingCleared(type); // 干扰清除后的恢复逻辑 } - else if (type == JammingType.SmokeScreen) + else if (parameters.Type == JammingType.SmokeScreen) { SmokeAttenuation = 1.0; // Reset smoke attenuation Debug.WriteLine("[烟幕干扰清除 IR]"); - base.HandleJammingCleared(type); - } - else - { - base.HandleJammingCleared(type); } } diff --git a/ThreatSource/src/Guidance/LaserBeamRiderGuidanceSystem.cs b/ThreatSource/src/Guidance/LaserBeamRiderGuidanceSystem.cs index b44690b..a005240 100644 --- a/ThreatSource/src/Guidance/LaserBeamRiderGuidanceSystem.cs +++ b/ThreatSource/src/Guidance/LaserBeamRiderGuidanceSystem.cs @@ -520,9 +520,9 @@ namespace ThreatSource.Guidance /// 干扰参数 protected override void HandleJammingApplied(JammingParameters parameters) { + base.HandleJammingApplied(parameters); if (parameters.Type == JammingType.Laser) { - base.HandleJammingApplied(parameters); Debug.WriteLine("激光驾束制导系统受到激光干扰"); } } @@ -530,12 +530,12 @@ namespace ThreatSource.Guidance /// /// 处理系统干扰被清除的事件 /// - /// 被清除的干扰类型 - protected override void HandleJammingCleared(JammingType type) + /// 干扰参数 + protected override void HandleJammingCleared(JammingParameters parameters) { - if (type == JammingType.Laser) + base.HandleJammingCleared(parameters); + if (parameters.Type == JammingType.Laser) { - base.HandleJammingCleared(type); Debug.WriteLine("激光驾束制导系统干扰已清除"); } } diff --git a/ThreatSource/src/Guidance/LaserSemiActiveGuidanceSystem.cs b/ThreatSource/src/Guidance/LaserSemiActiveGuidanceSystem.cs index f3bacfd..fdb2cd4 100644 --- a/ThreatSource/src/Guidance/LaserSemiActiveGuidanceSystem.cs +++ b/ThreatSource/src/Guidance/LaserSemiActiveGuidanceSystem.cs @@ -5,6 +5,7 @@ using ThreatSource.Indicator; using ThreatSource.Jammer; using System.Diagnostics; using AirTransmission; +using System.Transactions; namespace ThreatSource.Guidance { @@ -165,7 +166,7 @@ namespace ThreatSource.Guidance // 初始化加速度平滑处理 PreviousGuidanceAcceleration = Vector3D.Zero; - InitializeJamming(guidanceConfig.JammingResistanceThreshold, [JammingType.Laser, JammingType.SmokeScreen]); + InitializeJamming(guidanceConfig.JammingResistanceThreshold, [JammingType.Laser, JammingType.SmokeScreen, JammingType.Decoy]); } /// @@ -183,12 +184,6 @@ namespace ThreatSource.Guidance // 订阅激光照射事件 SimulationManager.SubscribeToEvent(OnLaserIlluminationUpdate); SimulationManager.SubscribeToEvent(OnLaserIlluminationStop); - // 订阅激光干扰事件 - SimulationManager.SubscribeToEvent(HandleJammingEvent); - - // 订阅诱偏目标照射事件 - SimulationManager.SubscribeToEvent(OnLaserDecoy); - SimulationManager.SubscribeToEvent(OnLaserDecoyStop); } /// @@ -206,12 +201,6 @@ namespace ThreatSource.Guidance SimulationManager.UnsubscribeFromEvent(OnLaserIlluminationUpdate); SimulationManager.UnsubscribeFromEvent(OnLaserIlluminationStop); - // 取消订阅激光干扰事件 - SimulationManager.UnsubscribeFromEvent(HandleJammingEvent); - - // 取消订阅诱偏目标照射事件 - SimulationManager.UnsubscribeFromEvent(OnLaserDecoy); - SimulationManager.UnsubscribeFromEvent(OnLaserDecoyStop); TargetPosition = null; } @@ -287,36 +276,6 @@ namespace ThreatSource.Guidance } } - /// - /// 处理诱偏目标照射事件 - /// - /// 诱偏目标照射事件 - private void OnLaserDecoy(LaserDecoyEvent evt) - { - if (evt.LaserDecoyId != null && evt.SourceId != null) - { - LaserDecoy decoyTarget = SimulationManager.GetEntityById(evt.LaserDecoyId) as LaserDecoy ?? throw new Exception("诱偏目标不存在"); - SimulationElement decoySource = SimulationManager.GetEntityById(evt.SourceId) as SimulationElement ?? throw new Exception("诱偏源不存在"); - // 添加激光目标 - if (!laserTargets.Any(t => t.Target.Id == decoyTarget.Id)) - { - laserTargets.Add((decoyTarget, decoyTarget.Position, decoySource)); - } - } - } - - /// - /// 处理诱偏目标照射停止事件 - /// - /// 诱偏目标照射停止事件 - private void OnLaserDecoyStop(LaserDecoyStopEvent evt) - { - if (evt?.LaserDecoyId != null) - { - laserTargets.RemoveAll(t => t.Target.Id == evt.LaserDecoyId); - } - } - /// /// 处理系统被干扰的事件 /// @@ -339,27 +298,47 @@ namespace ThreatSource.Guidance SmokeAttenuation = CalculateSmokeAttenuation(parameters); Debug.WriteLine($"[LASER_SEMI_ACTIVE] 烟幕干扰应用,衰减因子: {SmokeAttenuation:P2}", "Jamming"); } + else if (parameters.Type == JammingType.Decoy) + { + if (parameters.JammerId != null && parameters.SourceId != null) + { + LaserDecoy decoyTarget = SimulationManager.GetEntityById(parameters.JammerId) as LaserDecoy ?? throw new Exception("诱偏目标不存在"); + SimulationElement decoySource = SimulationManager.GetEntityById(parameters.SourceId) as SimulationElement ?? throw new Exception("诱偏源不存在"); + // 添加激光目标 + if (!laserTargets.Any(t => t.Target.Id == decoyTarget.Id)) + { + laserTargets.Add((decoyTarget, decoyTarget.Position, decoySource)); + } + } + } } /// /// 处理系统干扰被清除的事件 /// - /// 被清除的干扰类型 - protected override void HandleJammingCleared(JammingType type) + /// 干扰参数 + protected override void HandleJammingCleared(JammingParameters parameters) { - base.HandleJammingCleared(type); // Calls base logic (IsHardJammed, maybe HasGuidance = true) + base.HandleJammingCleared(parameters); // Calls base logic (IsHardJammed, maybe HasGuidance = true) - if (type == JammingType.Laser) + if (parameters.Type == JammingType.Laser) { Debug.WriteLine($"[LASER_SEMI_ACTIVE] 激光干扰已清除。", "Jamming"); // 不需要设置 HasGuidance = true, 基类可能已处理 // 激光照射状态 LaserIlluminationOn 会在收到下一个有效 Update 事件时恢复 } - else if (type == JammingType.SmokeScreen) + else if (parameters.Type == JammingType.SmokeScreen) { SmokeAttenuation = 1.0; // 重置烟幕衰减 Debug.WriteLine($"[LASER_SEMI_ACTIVE] 烟幕干扰已清除。", "Jamming"); } + else if (parameters.Type == JammingType.Decoy) + { + if (parameters.JammerId != null) + { + laserTargets.RemoveAll(t => t.Target.Id == parameters.JammerId); + } + } } /// @@ -466,7 +445,7 @@ namespace ThreatSource.Guidance if (target.Target is LaserDecoy decoy) { // 计算接收功率 - receivedPower = CalculateReceivedPower(target.Source.Position, target.SpotPosition, decoy.config.DecoyPower, decoy.config.DecoyLaserDivergenceAngle); + receivedPower = CalculateReceivedPower(target.Source.Position, target.SpotPosition, decoy.config.Power, decoy.config.DivergenceAngle); Console.WriteLine($"处理激光信号: 诱偏目标接收功率={receivedPower:E}W, 诱偏目标ID: {target.Target.Id}, 诱偏目标位置: {target.SpotPosition}"); } else if (target.Source is LaserDesignator laserDesignator) diff --git a/ThreatSource/src/Guidance/MillimeterWaveGuidanceSystem.cs b/ThreatSource/src/Guidance/MillimeterWaveGuidanceSystem.cs index 7c3bbcb..eea499a 100644 --- a/ThreatSource/src/Guidance/MillimeterWaveGuidanceSystem.cs +++ b/ThreatSource/src/Guidance/MillimeterWaveGuidanceSystem.cs @@ -90,24 +90,6 @@ namespace ThreatSource.Guidance /// private WorkMode currentMode = WorkMode.Search; - /// - /// 是否受到干扰 - /// - /// - /// 指示当前是否受到电子干扰 - /// 影响系统的工作状态 - /// - private bool isJammed = false; - - /// - /// 干扰功率,单位:瓦特 - /// - /// - /// 记录接收到的干扰信号功率 - /// 用于评估干扰效果 - /// - private double jammingPower = 0; - /// /// 是否有目标 /// @@ -245,50 +227,40 @@ namespace ThreatSource.Guidance /// 干扰参数 protected override void HandleJammingApplied(JammingParameters parameters) { - // 1. 让基类处理通用硬干扰逻辑 (如果不是SmokeScreen, 会设置 IsHardJammed 和 HasGuidance = false) base.HandleJammingApplied(parameters); - // 2. 处理毫米波干扰特定逻辑 if (parameters.Type == JammingType.MillimeterWave) { - isJammed = true; // 使用局部变量,与基类 IsJammed 分开? 还是统一? **统一使用基类的 IsJammed** - // isJammed = _jammingComponent.IsJammed; // Correct way to get status - jammingPower = parameters.Power; // 记录干扰功率 - Debug.WriteLine($"[MMW_GUIDANCE] 受到毫米波干扰,功率:{jammingPower} W。切换到搜索模式。", "Jamming"); + Debug.WriteLine($"[MMW_GUIDANCE] 受到毫米波干扰,功率:{parameters.Power} W。切换到搜索模式。", "Jamming"); // 干扰时切换到搜索模式 if (currentMode != WorkMode.Search) { SwitchToSearchMode(); } - // 基类已经设置 HasGuidance = false } - // 3. 处理烟幕干扰特定逻辑 else if (parameters.Type == JammingType.SmokeScreen) { // 计算烟幕透过率 // TODO: 实现基于 JammingParameters 中烟幕属性 (浓度、厚度等) 的真实透过率计算。 _currentSmokeTransmittance = 1.0; // 暂时设置为无遮挡 - Debug.WriteLine($"[MMW_GUIDANCE] 烟幕干扰应用,(临时) 透过率: {_currentSmokeTransmittance:P2}", "Jamming"); + Debug.WriteLine($"[MMW_GUIDANCE] 烟幕干扰应用,(临时) 透过率: {_currentSmokeTransmittance:P2}", "Jamming"); } } /// /// 处理系统干扰被清除的事件 /// - /// 被清除的干扰类型 - protected override void HandleJammingCleared(JammingType type) + /// 干扰参数 + protected override void HandleJammingCleared(JammingParameters parameters) { - base.HandleJammingCleared(type); // 调用基类处理 IsHardJammed 和 HasGuidance + base.HandleJammingCleared(parameters); // 调用基类处理 IsHardJammed 和 HasGuidance - if (type == JammingType.MillimeterWave) + if (parameters.Type == JammingType.MillimeterWave) { - isJammed = false; // 重置局部变量? **统一使用基类的 IsJammed** - // isJammed = _jammingComponent.IsJammed; // Correct way to get status - jammingPower = 0; // 重置干扰功率 - Debug.WriteLine($"[MMW_GUIDANCE] 毫米波干扰已清除。", "Jamming"); + Debug.WriteLine($"[MMW_GUIDANCE] 毫米波干扰已清除。", "Jamming"); // 干扰清除后是否需要切换模式?取决于当前是否有目标。Update 会处理。 } - else if (type == JammingType.SmokeScreen) + else if (parameters.Type == JammingType.SmokeScreen) { _currentSmokeTransmittance = 1.0; // 重置烟幕透过率 Debug.WriteLine($"[MMW_GUIDANCE] 烟幕干扰已清除。", "Jamming"); @@ -566,9 +538,8 @@ namespace ThreatSource.Guidance bool foundTarget = false; double currentSNR = double.MinValue; - if (isJammed) + if (IsJammed) { - Trace.WriteLine($"毫米波导引头受到干扰,干扰功率: {jammingPower:F2}W"); HasGuidance = false; return false; } diff --git a/ThreatSource/src/Indicator/BaseIndicator.cs b/ThreatSource/src/Indicator/BaseIndicator.cs index f7d5841..66fa929 100644 --- a/ThreatSource/src/Indicator/BaseIndicator.cs +++ b/ThreatSource/src/Indicator/BaseIndicator.cs @@ -127,14 +127,14 @@ namespace ThreatSource.Indicator /// /// 清除干扰 /// - /// 要清除的干扰类型 + /// 干扰参数 /// /// 移除特定类型的干扰影响 /// 恢复指示器的正常工作状态 /// - public virtual void ClearJamming(JammingType type) + public virtual void ClearJamming(JammingParameters parameters) { - _jammingComponent.ClearJamming(type); + _jammingComponent.ClearJamming(parameters); } /// @@ -160,11 +160,11 @@ namespace ThreatSource.Indicator /// /// 处理指示器干扰被清除的事件 /// - /// 被清除的干扰类型 - protected virtual void HandleJammingCleared(JammingType type) + /// 干扰参数 + protected virtual void HandleJammingCleared(JammingParameters parameters) { // 如果是烟幕干扰,重新计算遮挡状态 - if (type == JammingType.SmokeScreen) + if (parameters.Type == JammingType.SmokeScreen) { RecalculateObscurationStatus(); Debug.WriteLine($"[BaseIndicator] 烟幕状态更新,IsTargetObscured: {IsTargetObscured}", "Jamming"); @@ -172,7 +172,7 @@ namespace ThreatSource.Indicator else // 其他干扰类型打印通用消息 { // 子类可以重写此方法以实现干扰清除后的特定行为 - Debug.WriteLine($"[BaseIndicator] {this.GetType().Name} {Id} {type} 类型干扰已清除", "Jamming"); + Debug.WriteLine($"[BaseIndicator] {this.GetType().Name} {Id} {parameters.Type} 类型干扰已清除", "Jamming"); } } diff --git a/ThreatSource/src/Indicator/InfraredTracker.cs b/ThreatSource/src/Indicator/InfraredTracker.cs index 41da9ad..e3df858 100644 --- a/ThreatSource/src/Indicator/InfraredTracker.cs +++ b/ThreatSource/src/Indicator/InfraredTracker.cs @@ -415,13 +415,13 @@ namespace ThreatSource.Indicator /// /// 处理指示器干扰被清除的事件 /// - /// 被清除的干扰类型 - protected override void HandleJammingCleared(JammingType type) + /// 干扰参数 + protected override void HandleJammingCleared(JammingParameters parameters) { - base.HandleJammingCleared(type); // Calls RecalculateObscurationStatus for smoke + base.HandleJammingCleared(parameters); // Calls RecalculateObscurationStatus for smoke // 红外干扰清除后,不需要特殊操作,UpdateIndicator 会重新评估跟踪状态 - if (type == JammingType.Infrared) + if (parameters.Type == JammingType.Infrared) { Debug.WriteLine($"[InfraredTracker] {Id} 红外干扰已清除。", "Jamming"); } diff --git a/ThreatSource/src/Indicator/LaserBeamRider.cs b/ThreatSource/src/Indicator/LaserBeamRider.cs index a54d522..8d3f832 100644 --- a/ThreatSource/src/Indicator/LaserBeamRider.cs +++ b/ThreatSource/src/Indicator/LaserBeamRider.cs @@ -367,13 +367,13 @@ namespace ThreatSource.Indicator /// /// 处理指示器干扰被清除的事件 /// - /// 被清除的干扰类型 - protected override void HandleJammingCleared(JammingType type) + /// 干扰参数 + protected override void HandleJammingCleared(JammingParameters parameters) { - base.HandleJammingCleared(type); // Calls RecalculateObscurationStatus for smoke + base.HandleJammingCleared(parameters); // Calls RecalculateObscurationStatus for smoke // 添加子类特定响应:如果是激光干扰清除,并且设备仍激活,尝试启动光束 - if (type == JammingType.Laser) + if (parameters.Type == JammingType.Laser) { Debug.WriteLine($"[LaserBeamRider] {Id} 激光干扰已清除。", "Jamming"); if (IsActive && !IsJammed) // Check IsJammed in case other jams exist diff --git a/ThreatSource/src/Indicator/LaserDesignator.cs b/ThreatSource/src/Indicator/LaserDesignator.cs index 017f343..18dd973 100644 --- a/ThreatSource/src/Indicator/LaserDesignator.cs +++ b/ThreatSource/src/Indicator/LaserDesignator.cs @@ -194,13 +194,13 @@ namespace ThreatSource.Indicator /// /// 处理指示器干扰被清除的事件 /// - /// 被清除的干扰类型 - protected override void HandleJammingCleared(JammingType type) + /// 干扰参数 + protected override void HandleJammingCleared(JammingParameters parameters) { - base.HandleJammingCleared(type); // Calls RecalculateObscurationStatus for smoke + base.HandleJammingCleared(parameters); // Calls RecalculateObscurationStatus for smoke // 添加子类特定响应:如果是激光干扰清除,并且设备仍激活,尝试启动照射 - if (type == JammingType.Laser) + if (parameters.Type == JammingType.Laser) { Debug.WriteLine($"[LaserDesignator] {Id} 激光干扰已清除。", "Jamming"); // 如果设备仍处于激活状态,并且没有其他干扰,恢复激光照射 @@ -223,9 +223,7 @@ namespace ThreatSource.Indicator { if (!IsActive) { - base.Activate(); // Handles IsActive and subscribes HandleJammingEvent - // Removed JammingEvent subscriptions for OnLaserJamming and HandleSmokeEvent - + base.Activate(); // 子类特定的激活逻辑 Debug.WriteLine($"激光指示器 {Id} 已激活"); StartLaserIllumination(); @@ -246,8 +244,7 @@ namespace ThreatSource.Indicator { // 子类特定的停用逻辑 StopLaserIllumination(); - // Removed JammingEvent subscriptions for OnLaserJamming and HandleSmokeEvent - Debug.WriteLine($"激光指示器 {Id} 已停用"); + Debug.WriteLine($"激光指示器 {Id} 已停用"); base.Deactivate(); // Handles IsActive and unsubscribes HandleJammingEvent } } diff --git a/ThreatSource/src/Jammable/IJammable.cs b/ThreatSource/src/Jammable/IJammable.cs index b9f0490..e63f1a2 100644 --- a/ThreatSource/src/Jammable/IJammable.cs +++ b/ThreatSource/src/Jammable/IJammable.cs @@ -26,7 +26,7 @@ namespace ThreatSource.Jammable /// /// 清除干扰 /// - /// 要清除的干扰类型 - void ClearJamming(JammingType type); + /// 干扰参数 + void ClearJamming(JammingParameters parameters); } } \ No newline at end of file diff --git a/ThreatSource/src/Jammable/JammableComponent.cs b/ThreatSource/src/Jammable/JammableComponent.cs index f48c898..e90e332 100644 --- a/ThreatSource/src/Jammable/JammableComponent.cs +++ b/ThreatSource/src/Jammable/JammableComponent.cs @@ -49,7 +49,7 @@ namespace ThreatSource.Jammable /// /// 当干扰被清除时触发 /// - public event Action? JammingCleared; + public event Action? JammingCleared; /// /// 获取设备支持的干扰类型 @@ -131,10 +131,10 @@ namespace ThreatSource.Jammable /// /// 清除干扰 /// - /// 要清除的干扰类型 (Note: JammingHandler clears all current jamming regardless of type) - public void ClearJamming(JammingType type) + /// 干扰参数 + public void ClearJamming(JammingParameters parameters) { - _jammingHandler.ClearJamming(); + _jammingHandler.ClearJamming(parameters); } /// @@ -247,7 +247,7 @@ namespace ThreatSource.Jammable // 触发公共事件,如果可用,则提供类型 if (parameters != null) { - JammingCleared?.Invoke(parameters.Type); + JammingCleared?.Invoke(parameters); } } } diff --git a/ThreatSource/src/Jammable/JammingHandler.cs b/ThreatSource/src/Jammable/JammingHandler.cs index 68387f1..727d67f 100644 --- a/ThreatSource/src/Jammable/JammingHandler.cs +++ b/ThreatSource/src/Jammable/JammingHandler.cs @@ -45,7 +45,7 @@ namespace ThreatSource.Jammable // 检查是否超时 if (_elapsedTime >= CurrentJamming.Duration.Value) { - ClearJamming(); + ClearJamming(CurrentJamming); } } } @@ -65,7 +65,7 @@ namespace ThreatSource.Jammable /// /// 清除干扰 /// - public virtual void ClearJamming() + public virtual void ClearJamming(JammingParameters parameters) { if (IsJammed) { diff --git a/ThreatSource/src/Jammer/BaseJammer.cs b/ThreatSource/src/Jammer/BaseJammer.cs index 6c67d1d..9398e70 100644 --- a/ThreatSource/src/Jammer/BaseJammer.cs +++ b/ThreatSource/src/Jammer/BaseJammer.cs @@ -25,16 +25,16 @@ namespace ThreatSource.Jammer /// protected abstract JammerType Type { get; } + /// + /// 支持的干扰类型 + /// + protected abstract JammingType[] SupportedJammingTypes { get; } + /// /// 干扰器状态 /// protected JammerState State { get; private set; } - /// - /// 获取干扰器支持的干扰类型 - /// - public abstract IEnumerable SupportedJammingTypes { get; } - /// /// 获取干扰器当前是否处于工作状态 /// @@ -59,9 +59,14 @@ namespace ThreatSource.Jammer public override void Activate() { IsActive = true; - if (!IsJamming && CurrentParameters != null) + if (!IsJamming) { - StartJamming(CurrentParameters); + CurrentParameters ??= CreateJammingParameters(); + + if (CurrentParameters != null) + { + StartJamming(CurrentParameters); + } } } @@ -97,7 +102,7 @@ namespace ThreatSource.Jammer /// 干扰参数 public virtual void StartJamming(JammingParameters parameters) { - // 检查是否支持该类型的干扰 + // 检查是否是该类型的干扰 if (!SupportedJammingTypes.Contains(parameters.Type)) { Console.WriteLine($"干扰器 {Id} 不支持 {parameters.Type} 类型的干扰"); diff --git a/ThreatSource/src/Jammer/IJammer.cs b/ThreatSource/src/Jammer/IJammer.cs index 11630e2..2ba2602 100644 --- a/ThreatSource/src/Jammer/IJammer.cs +++ b/ThreatSource/src/Jammer/IJammer.cs @@ -13,11 +13,6 @@ namespace ThreatSource.Jammer /// public interface IJammer { - /// - /// 获取干扰器支持的干扰类型 - /// - IEnumerable SupportedJammingTypes { get; } - /// /// 获取干扰器当前是否处于工作状态 /// diff --git a/ThreatSource/src/Jammer/InfraredJammer.cs b/ThreatSource/src/Jammer/InfraredJammer.cs index 7589791..c16156c 100644 --- a/ThreatSource/src/Jammer/InfraredJammer.cs +++ b/ThreatSource/src/Jammer/InfraredJammer.cs @@ -23,7 +23,7 @@ namespace ThreatSource.Jammer /// /// 支持的干扰类型 /// - public override IEnumerable SupportedJammingTypes => [JammingType.Infrared]; + protected override JammingType[] SupportedJammingTypes => [JammingType.Infrared]; /// /// 初始化红外干扰器的新实例 @@ -53,8 +53,26 @@ namespace ThreatSource.Jammer SourcePosition = Position, AngleRange = config.AngleRange, Mode = config.Mode, - Duration = config.Duration + Duration = config.Duration, + StartTime = DateTime.UtcNow }; } + + /// + /// 更新干扰效果 + /// + protected override void UpdateJamming(double deltaTime) + { + base.UpdateJamming(deltaTime); + + // 更新位置 + Position += Velocity * deltaTime; + + // 更新干扰事件 + if (CurrentParameters != null) + { + PublishJammingEvent(CurrentParameters); + } + } } } \ No newline at end of file diff --git a/ThreatSource/src/Jammer/JammingParameters.cs b/ThreatSource/src/Jammer/JammingParameters.cs index 152ab6d..3232945 100644 --- a/ThreatSource/src/Jammer/JammingParameters.cs +++ b/ThreatSource/src/Jammer/JammingParameters.cs @@ -12,11 +12,21 @@ namespace ThreatSource.Jammer /// public JammingType Type { get; set; } + /// + /// 干扰模式 + /// + public JammingMode Mode { get; set; } + /// /// 干扰源ID /// public string JammerId { get; set; } = ""; + /// + /// 干扰源ID + /// + public string? SourceId { get; set; } + /// /// 干扰目标ID /// @@ -56,11 +66,6 @@ namespace ThreatSource.Jammer /// public double? Duration { get; set; } - /// - /// 干扰模式 - /// - public JammingMode Mode { get; set; } - /// /// 干扰开始时间 /// @@ -132,9 +137,9 @@ namespace ThreatSource.Jammer public enum JammingMode { /// - /// 噪声干扰 + /// 阻塞干扰 /// - Noise, + Blocking, /// /// 欺骗干扰 @@ -142,14 +147,9 @@ namespace ThreatSource.Jammer Deception, /// - /// 阻塞干扰 + /// 噪声干扰 /// - Blocking, - - /// - /// 扫频干扰 - /// - Sweep, + Noise, /// /// 遮蔽干扰(烟幕) diff --git a/ThreatSource/src/Jammer/LaserDecoy.cs b/ThreatSource/src/Jammer/LaserDecoy.cs index fbe4fef..7379478 100644 --- a/ThreatSource/src/Jammer/LaserDecoy.cs +++ b/ThreatSource/src/Jammer/LaserDecoy.cs @@ -17,9 +17,9 @@ namespace ThreatSource.Jammer protected override JammerType Type => JammerType.LaserDecoy; /// - /// 获取支持的干扰类型 + /// 支持的干扰类型 /// - public override IEnumerable SupportedJammingTypes => [JammingType.Decoy]; + protected override JammingType[] SupportedJammingTypes => [JammingType.Decoy]; /// /// 激光诱偏目标配置 @@ -57,27 +57,44 @@ namespace ThreatSource.Jammer return new JammingParameters { Type = JammingType.Decoy, + Mode = config.Mode, JammerId = Id, - Power = config.DecoyPower, - Wavelength = config.DecoyWavelength, + SourceId = SourceId, + Power = config.Power, + Wavelength = config.Wavelength, SourcePosition = sourcePosition, Direction = Orientation.ToVector(), DecoyPosition = Position, - AngleRange = config.DecoyLaserDivergenceAngle, - Duration = config.LifeTime, + AngleRange = config.DivergenceAngle, + Duration = config.Duration, ReflectiveArea = config.ReflectiveArea, ReflectionCoefficient = config.ReflectionCoefficient, StartTime = DateTime.UtcNow }; } + /// + /// 更新干扰效果 + /// + protected override void UpdateJamming(double deltaTime) + { + base.UpdateJamming(deltaTime); + // 更新诱偏目标的位置 + Position += Velocity * deltaTime; + + if (CurrentParameters != null) + { + PublishJammingEvent(CurrentParameters); + } + } + /// /// 获取激光诱偏目标状态 /// /// 激光诱偏目标状态 public override string GetStatus() { - return base.GetStatus() + $"诱饵位置: {Position}, 源 ID: {SourceId}, 诱偏功率: {config.DecoyPower}, 诱偏激光发散角: {config.DecoyLaserDivergenceAngle}, 反射系数: {config.ReflectionCoefficient}, 有效反射面积: {config.ReflectiveArea}, 生命周期: {config.LifeTime}\n"; + return base.GetStatus() + $"诱饵位置: {Position}, 源 ID: {SourceId}, 诱偏功率: {config.Power}, 诱偏激光发散角: {config.DivergenceAngle}, 反射系数: {config.ReflectionCoefficient}, 有效反射面积: {config.ReflectiveArea}, 生命周期: {config.Duration}\n"; } } } \ No newline at end of file diff --git a/ThreatSource/src/Jammer/LaserJammer.cs b/ThreatSource/src/Jammer/LaserJammer.cs index cee34aa..5a598c8 100644 --- a/ThreatSource/src/Jammer/LaserJammer.cs +++ b/ThreatSource/src/Jammer/LaserJammer.cs @@ -18,7 +18,7 @@ namespace ThreatSource.Jammer /// /// 支持的干扰类型 /// - public override IEnumerable SupportedJammingTypes => [JammingType.Laser]; + protected override JammingType[] SupportedJammingTypes => [JammingType.Laser]; /// /// 激光干扰器配置 @@ -52,8 +52,26 @@ namespace ThreatSource.Jammer Direction = Orientation.ToVector(), SourcePosition = Position, Mode = config.Mode, - Duration = config.Duration + Duration = config.Duration, + StartTime = DateTime.UtcNow }; } + + /// + /// 更新干扰效果 + /// + protected override void UpdateJamming(double deltaTime) + { + base.UpdateJamming(deltaTime); + + // 更新位置 + Position += Velocity * deltaTime; + + // 更新干扰事件 + if (CurrentParameters != null) + { + PublishJammingEvent(CurrentParameters); + } + } } } \ No newline at end of file diff --git a/ThreatSource/src/Jammer/MillimeterWaveJammer.cs b/ThreatSource/src/Jammer/MillimeterWaveJammer.cs index aba88ed..c191140 100644 --- a/ThreatSource/src/Jammer/MillimeterWaveJammer.cs +++ b/ThreatSource/src/Jammer/MillimeterWaveJammer.cs @@ -18,7 +18,7 @@ namespace ThreatSource.Jammer /// /// 支持的干扰类型 /// - public override IEnumerable SupportedJammingTypes => [JammingType.MillimeterWave]; + protected override JammingType[] SupportedJammingTypes => [JammingType.MillimeterWave]; /// /// 毫米波干扰器配置 @@ -52,10 +52,26 @@ namespace ThreatSource.Jammer Direction = Orientation.ToVector(), SourcePosition = Position, Mode = config.Mode, - Duration = config.Duration + Duration = config.Duration, + StartTime = DateTime.UtcNow }; } - // 可在此处重写 UpdateJamming(double deltaTime) 以实现毫米波干扰的特定效果更新逻辑 + /// + /// 更新干扰效果 + /// + protected override void UpdateJamming(double deltaTime) + { + base.UpdateJamming(deltaTime); + + // 更新位置 + Position += Velocity * deltaTime; + + // 更新干扰事件 + if (CurrentParameters != null) + { + PublishJammingEvent(CurrentParameters); + } + } } } \ No newline at end of file diff --git a/ThreatSource/src/Jammer/SmokeGrenade.cs b/ThreatSource/src/Jammer/SmokeGrenade.cs index 6c257c5..0ed6a64 100644 --- a/ThreatSource/src/Jammer/SmokeGrenade.cs +++ b/ThreatSource/src/Jammer/SmokeGrenade.cs @@ -21,12 +21,12 @@ namespace ThreatSource.Jammer /// 获取干扰器类型 /// protected override JammerType Type => JammerType.SmokeGrenade; - + /// - /// 获取支持的干扰类型 + /// 支持的干扰类型 /// - public override IEnumerable SupportedJammingTypes => [JammingType.SmokeScreen]; - + protected override JammingType[] SupportedJammingTypes => [JammingType.SmokeScreen]; + /// /// 初始化烟幕弹实例 /// @@ -45,32 +45,6 @@ namespace ThreatSource.Jammer IsActive = false; } - /// - /// 激活烟幕弹 - /// - public override void Activate() - { - IsActive = true; - _elapsedTime = 0; - if (!IsJamming) - { - var parameters = CreateJammingParameters(); - StartJamming(parameters); - } - } - - /// - /// 禁用烟幕弹 - /// - public override void Deactivate() - { - IsActive = false; - if (IsJamming) - { - StopJamming(); - } - } - /// /// 创建烟幕干扰参数 /// @@ -79,6 +53,7 @@ namespace ThreatSource.Jammer return new JammingParameters { Type = JammingType.SmokeScreen, + Mode = config.Mode, JammerId = Id, Power = 0, // 烟幕不需要功率参数 Direction = Orientation.ToVector(), diff --git a/ThreatSource/src/Sensor/InfraredDetector.cs b/ThreatSource/src/Sensor/InfraredDetector.cs index 09d84ca..59715a9 100644 --- a/ThreatSource/src/Sensor/InfraredDetector.cs +++ b/ThreatSource/src/Sensor/InfraredDetector.cs @@ -240,12 +240,12 @@ namespace ThreatSource.Sensor /// /// 处理红外干扰清除 /// - protected override void HandleJammingCleared(JammingType type) + protected override void HandleJammingCleared(JammingParameters parameters) { - base.HandleJammingCleared(type); + base.HandleJammingCleared(parameters); // 基类 JammableComponent 和 Sensor 已经处理了 IsJammed 状态 // 这里只处理探测器特定的响应 - if (type == JammingType.Infrared) + if (parameters.Type == JammingType.Infrared) { Debug.WriteLine("[InfraredDetector] 红外探测器干扰已清除", "Jamming"); // 只有在整体未被干扰时才恢复有效状态 diff --git a/ThreatSource/src/Sensor/LaserRangefinder.cs b/ThreatSource/src/Sensor/LaserRangefinder.cs index 28321e6..f051ed3 100644 --- a/ThreatSource/src/Sensor/LaserRangefinder.cs +++ b/ThreatSource/src/Sensor/LaserRangefinder.cs @@ -216,12 +216,12 @@ namespace ThreatSource.Sensor /// /// 处理激光干扰清除 /// - protected override void HandleJammingCleared(JammingType type) + protected override void HandleJammingCleared(JammingParameters parameters) { - base.HandleJammingCleared(type); + base.HandleJammingCleared(parameters); // 基类 JammableComponent 和 Sensor 已经处理了 IsJammed 状态 // 这里只处理测距仪特定的响应 - if (type == JammingType.Laser) + if (parameters.Type == JammingType.Laser) { Debug.WriteLine("[LaserRangefinder] 激光测距仪干扰已清除", "Jamming"); // 只有在整体未被干扰时才恢复有效状态 diff --git a/ThreatSource/src/Sensor/MillimeterWaveAltimeter.cs b/ThreatSource/src/Sensor/MillimeterWaveAltimeter.cs index 3b98d83..d86d5e3 100644 --- a/ThreatSource/src/Sensor/MillimeterWaveAltimeter.cs +++ b/ThreatSource/src/Sensor/MillimeterWaveAltimeter.cs @@ -220,12 +220,12 @@ namespace ThreatSource.Sensor /// /// 处理毫米波干扰清除 /// - protected override void HandleJammingCleared(JammingType type) + protected override void HandleJammingCleared(JammingParameters parameters) { - base.HandleJammingCleared(type); + base.HandleJammingCleared(parameters); // 基类 JammableComponent 和 Sensor 已经处理了 IsJammed 状态 // 这里只处理测高雷达特定的响应 - if (type == JammingType.MillimeterWave) + if (parameters.Type == JammingType.MillimeterWave) { Debug.WriteLine("[MillimeterWaveAltimeter] 毫米波测高雷达干扰已清除", "Jamming"); // 只有在整体未被干扰时才恢复有效状态 diff --git a/ThreatSource/src/Sensor/MillimeterWaveRadiometer.cs b/ThreatSource/src/Sensor/MillimeterWaveRadiometer.cs index 3d58cb1..d5be46d 100644 --- a/ThreatSource/src/Sensor/MillimeterWaveRadiometer.cs +++ b/ThreatSource/src/Sensor/MillimeterWaveRadiometer.cs @@ -279,12 +279,12 @@ namespace ThreatSource.Sensor /// /// 处理毫米波干扰清除 /// - protected override void HandleJammingCleared(JammingType type) + protected override void HandleJammingCleared(JammingParameters parameters) { - base.HandleJammingCleared(type); + base.HandleJammingCleared(parameters); // 基类 JammableComponent 和 Sensor 已经处理了 IsJammed 状态 // 这里只处理辐射计特定的响应 - if (type == JammingType.MillimeterWave) + if (parameters.Type == JammingType.MillimeterWave) { Debug.WriteLine("[MillimeterWaveRadiometer] 毫米波辐射计干扰已清除", "Jamming"); // 只有在整体未被干扰时才恢复有效状态 diff --git a/ThreatSource/src/Sensor/Sensor.cs b/ThreatSource/src/Sensor/Sensor.cs index 325d6e1..d656a05 100644 --- a/ThreatSource/src/Sensor/Sensor.cs +++ b/ThreatSource/src/Sensor/Sensor.cs @@ -116,15 +116,15 @@ namespace ThreatSource.Sensor /// /// 处理传感器干扰被清除的事件 /// - /// 被清除的干扰类型 + /// 干扰参数 /// /// 当干扰被清除时调用 /// 子类可以重写以实现干扰清除后的特定行为 /// - protected virtual void HandleJammingCleared(JammingType type) + protected virtual void HandleJammingCleared(JammingParameters parameters) { // 子类可以重写此方法以实现干扰清除后的特定行为 - System.Diagnostics.Debug.WriteLine($"传感器{type}类型干扰已清除"); + System.Diagnostics.Debug.WriteLine($"传感器{parameters.Type}类型干扰已清除"); } /// @@ -179,17 +179,26 @@ namespace ThreatSource.Sensor /// 干扰事件 protected virtual void HandleJammingEvent(JammingEvent evt) { - if (evt == null) return; - - // 在应用干扰前检查是否应该处理此干扰 - if (!ShouldHandleJamming(evt.Parameters)) + if (evt != null) { - // 可选择记录日志:Debug.WriteLine($"传感器 {Id} 忽略干扰事件,类型: {evt.Parameters.Type}"); - return; + // 在应用干扰前检查是否应该处理此干扰 + if (ShouldHandleJamming(evt.Parameters)) + { + ApplyJamming(evt.Parameters); + } } + } - // 如果应该处理,则应用干扰 - ApplyJamming(evt.Parameters); + /// + /// 统一处理干扰停止事件 + /// + /// 干扰停止事件 + protected virtual void HandleJammingStoppedEvent(JammingStoppedEvent evt) + { + if (evt != null) + { + ClearJamming(evt.Parameters); + } } /// @@ -220,14 +229,14 @@ namespace ThreatSource.Sensor /// /// 清除干扰 /// - /// 要清除的干扰类型 + /// 干扰参数 /// /// 移除特定类型的干扰影响 /// 恢复传感器的正常工作状态 /// - public virtual void ClearJamming(JammingType type) + public virtual void ClearJamming(JammingParameters parameters) { - _jammingComponent.ClearJamming(type); + _jammingComponent.ClearJamming(parameters); } /// @@ -248,12 +257,12 @@ namespace ThreatSource.Sensor /// public override void Activate() { - if (!IsActive) + if (!IsActive) { IsActive = true; // 统一订阅 HandleJammingEvent SimulationManager.SubscribeToEvent(HandleJammingEvent); - // 移除可能存在的旧订阅(如果子类之前有单独订阅) + SimulationManager.SubscribeToEvent(HandleJammingStoppedEvent); } base.Activate(); } @@ -263,12 +272,12 @@ namespace ThreatSource.Sensor /// public override void Deactivate() { - if (IsActive) + if (IsActive) { IsActive = false; // 统一取消订阅 HandleJammingEvent SimulationManager.UnsubscribeFromEvent(HandleJammingEvent); - // 移除可能存在的旧取消订阅 + SimulationManager.UnsubscribeFromEvent(HandleJammingStoppedEvent); } base.Deactivate(); } diff --git a/ThreatSource/src/Simulation/SimulationConfig.cs b/ThreatSource/src/Simulation/SimulationConfig.cs index 2990f62..e1612fc 100644 --- a/ThreatSource/src/Simulation/SimulationConfig.cs +++ b/ThreatSource/src/Simulation/SimulationConfig.cs @@ -1574,6 +1574,11 @@ namespace ThreatSource.Simulation /// public SmokeScreenType SmokeType { get; set; } = SmokeScreenType.Cloud; + /// + /// 干扰模式 + /// + public JammingMode Mode { get; set; } = JammingMode.Obscuration; + /// /// 是否是遮蔽型烟幕 /// @@ -1708,7 +1713,7 @@ namespace ThreatSource.Simulation /// /// 干扰模式 /// - public JammingMode Mode { get; set; } = JammingMode.Noise; + public JammingMode Mode { get; set; } = JammingMode.Blocking; /// /// 持续时间,单位:秒 @@ -1739,7 +1744,7 @@ namespace ThreatSource.Simulation /// /// 干扰模式 /// - public JammingMode Mode { get; set; } = JammingMode.Noise; + public JammingMode Mode { get; set; } = JammingMode.Blocking; /// /// 持续时间,单位:秒 @@ -1770,7 +1775,7 @@ namespace ThreatSource.Simulation /// /// 干扰模式 /// - public JammingMode Mode { get; set; } = JammingMode.Noise; + public JammingMode Mode { get; set; } = JammingMode.Blocking; /// /// 持续时间,单位:秒 @@ -1783,20 +1788,25 @@ namespace ThreatSource.Simulation /// public class LaserDecoyConfig { + /// + /// 干扰模式 + /// + public JammingMode Mode { get; set; } = JammingMode.Deception; + /// /// 诱偏源功率,单位:瓦特 /// - public double DecoyPower { get; set; } = 0; + public double Power { get; set; } = 0; /// /// 诱偏激光波长,单位:微米 /// - public double DecoyWavelength { get; set; } = 1.06; + public double Wavelength { get; set; } = 1.06; /// /// 诱偏激光发散角,单位:度 /// - public double DecoyLaserDivergenceAngle { get; set; } = 0; + public double DivergenceAngle { get; set; } = 0; /// /// 有效反射面积,单位:平方米 @@ -1809,9 +1819,9 @@ namespace ThreatSource.Simulation public double ReflectionCoefficient { get; set; } = 0; /// - /// 生命周期,单位:秒 + /// 持续时间,单位:秒 /// - public double LifeTime { get; set; } = 0; + public double Duration { get; set; } = 0; } diff --git a/ThreatSource/src/Simulation/SimulationEvents.cs b/ThreatSource/src/Simulation/SimulationEvents.cs index 127152d..a6360d9 100644 --- a/ThreatSource/src/Simulation/SimulationEvents.cs +++ b/ThreatSource/src/Simulation/SimulationEvents.cs @@ -487,51 +487,6 @@ namespace ThreatSource.Simulation public LaserCodeConfig? ReceivedCodeConfig { get; set; } } - - /// - /// 激光诱偏目标事件,表示激光诱偏目标被照射 - /// - /// - /// 用于模拟激光诱偏目标被照射的情况 - /// 触发时机:激光诱偏目标被照射时 - /// - public class LaserDecoyEvent : SimulationEvent - { - /// - /// 获取或设置激光诱偏目标的ID - /// - /// - /// 标识被照射的激光诱偏目标 - /// - public string? LaserDecoyId { get; set; } - - /// - /// 获取或设置激光诱偏源的ID - /// - /// - /// 标识照射激光诱偏目标的激光诱偏源 - /// - public string? SourceId { get; set; } - } - - /// - /// 激光诱偏目标停止事件,表示激光诱偏目标停止 - /// - /// - /// 用于模拟激光诱偏目标停止的情况 - /// 触发时机:激光诱偏目标停止时 - /// - public class LaserDecoyStopEvent : SimulationEvent - { - /// - /// 获取或设置激光诱偏目标的ID - /// - /// - /// 标识停止的激光诱偏目标 - /// - public string? LaserDecoyId { get; set; } - } - // --- General Jamming Events --- /// diff --git a/docs/project/missiles_jamming_methods.md b/docs/project/missiles_jamming_methods.md new file mode 100644 index 0000000..1ecaebb --- /dev/null +++ b/docs/project/missiles_jamming_methods.md @@ -0,0 +1,33 @@ +# 导弹-干扰方式对照表 + +| 导弹类型 | 干扰方式 | 干扰模式 | 作用对象 | 干扰效果 | +|---------|----------|---------|---------|---------| +| 激光驾束导弹 | 激光干扰 | 阻塞 | 指示器 | 通过强光干扰激光指示器,使其无法发射引导光束 | +| 激光驾束导弹 | 烟幕弹 | 遮蔽 | 两者 | 阻断激光束的传播,导弹无法接收到正确的光束信号 | +| 激光半主动制导导弹 | 激光干扰 | 阻塞 | 指示器 | 干扰照射器使其无法正常照射目标 | +| 激光半主动制导导弹 | 激光干扰 | 阻塞 | 导弹 | 干扰导弹上的激光接收器,使其无法正确感知反射激光 | +| 激光半主动制导导弹 | 激光诱偏目标 | 欺骗 | 导弹 | 在目标附近创建虚假的激光反射点,误导导弹攻击错误目标 | +| 激光半主动制导导弹 | 烟幕弹 | 遮蔽 | 两者 | 阻断激光传播和反射,同时影响照射器和导弹的激光接收 | +| 红外指令制导导弹 | 红外干扰 | 阻塞 | 指示器 | 干扰红外指示器的成像系统,使其无法正确识别和跟踪目标 +| 红外指令制导导弹 | 烟幕弹 | 遮蔽 | 指示器 | 阻断红外辐射,指示器无法探测目标热特征 | +| 红外成像末制导导弹 | 红外干扰 | 阻塞 | 导弹 | 向导弹红外成像系统发射强红外干扰信号,使导弹无法形成有效目标图像 | +| 红外成像末制导导弹 | 烟幕弹 | 遮蔽 | 导弹 | 遮挡目标红外特征,使导弹无法形成有效目标图像 | +| 毫米波末制导导弹 | 毫米波干扰 | 阻塞 | 导弹 | 高功率阻塞干扰,使毫米波雷达接收机饱和 | +| 毫米波末制导导弹 | 烟幕弹 | 遮蔽 | 导弹 | 阻断毫米波传播,使导弹无法形成有效目标图像 | +| 末敏子弹药 | 激光干扰 | 阻塞 | 子弹药 | 干扰激光测高仪,影响高度测量 | +| 末敏子弹药 | 红外干扰 | 阻塞 | 子弹药 | 干扰红外探测器,影响发现目标 | +| 末敏子弹药 | 毫米波干扰 | 阻塞 | 子弹药 | 干扰毫米波探测器,影响发现目标 | +| 末敏子弹药 | 毫米波假信号 | 欺骗 | 子弹药 | 发射假背景信号,干扰毫米波发现目标 | +| 末敏子弹药 | 烟幕弹 | 遮蔽 | 子弹药 | 减弱各种传感器信号,降低引信触发概率 | + +## 干扰方式分类说明 + +### 干扰模式 +1. **阻塞干扰**:使用高功率干扰信号完全覆盖目标频段或通道,目的在于完全中断信号传输 +2. **欺骗干扰**:发送伪造信号,使目标系统产生错误判断 +3. **遮蔽干扰**:通过物理屏障阻断信号传播,如烟幕遮挡光学和红外线 + +### 作用对象说明 +- **导弹**:干扰直接作用于导弹上的传感器或制导系统 +- **指示器**:干扰作用于地面/平台上的指示器或照射设备 +- **两者**:同时影响导弹和指示器的工作 \ No newline at end of file diff --git a/tools/ComprehensiveMissileSimulator.cs b/tools/ComprehensiveMissileSimulator.cs index 9d70a68..d16ce05 100644 --- a/tools/ComprehensiveMissileSimulator.cs +++ b/tools/ComprehensiveMissileSimulator.cs @@ -6,6 +6,7 @@ using System.Diagnostics; using ThreatSource.Missile; using ThreatSource.Simulation; using ThreatSource.Utils; +using ThreatSource.Jammable; using ThreatSource.Jammer; using ThreatSource.Sensor; using ThreatSource.Equipment; @@ -33,6 +34,32 @@ namespace ThreatSource.Tools.MissileSimulation private readonly Dictionary jammers; private Dictionary missileActiveStatus; private readonly double timeStep = 0.01; // 时间步长,单位:秒 + + // 导弹-干扰映射表 + private Dictionary> missileJammingMap; + + // 当前选中的导弹ID + public string SelectedMissileId { get; private set; } + + /// + /// 获取当前选中导弹的显示名称 + /// + public string SelectedMissileDisplayName + { + get + { + switch (SelectedMissileId) + { + case "LSGM_1": return "激光半主动制导导弹"; + case "LBRM_1": return "激光驾束制导导弹"; + case "TSM_1": return "末敏子弹药"; + case "ICGM_1": return "红外指令制导导弹"; + case "ITGM_1": return "红外成像末制导导弹"; + case "MMWG_1": return "毫米波末制导导弹"; + default: return "未知导弹"; + } + } + } /// /// 初始化综合导弹模拟器 @@ -47,8 +74,67 @@ namespace ThreatSource.Tools.MissileSimulation indicators = new Dictionary(); jammers = new Dictionary(); missileActiveStatus = new Dictionary(); + + // 初始化导弹-干扰映射 + InitializeMissileJammingMap(); + InitializeSimulation(); } + + /// + /// 初始化导弹-干扰映射关系 + /// + private void InitializeMissileJammingMap() + { + missileJammingMap = new Dictionary>(); + + // 激光驾束导弹 + missileJammingMap["LBRM_1"] = new List<(JammingType, string, string, string, string)> + { + (JammingType.Laser, "激光干扰", "LaserJammer_Designator", "阻塞", "指示器"), + (JammingType.SmokeScreen, "烟幕弹", "SG_1", "遮蔽", "两者") + }; + + // 激光半主动制导导弹 + missileJammingMap["LSGM_1"] = new List<(JammingType, string, string, string, string)> + { + (JammingType.Laser, "激光干扰(指示器)", "LaserJammer_Designator", "阻塞", "指示器"), + (JammingType.Laser, "激光干扰(导弹)", "LaserJammer_Missile", "阻塞", "导弹"), + (JammingType.Decoy, "激光诱偏目标", "LDY_1", "欺骗", "导弹"), + (JammingType.SmokeScreen, "烟幕弹", "SG_1", "遮蔽", "两者") + }; + + // 红外指令制导导弹 + missileJammingMap["ICGM_1"] = new List<(JammingType, string, string, string, string)> + { + (JammingType.Infrared, "红外干扰", "InfraredJammer_Designator", "阻塞", "指示器"), + (JammingType.SmokeScreen, "烟幕弹", "SG_2", "遮蔽", "指示器") + }; + + // 红外成像末制导导弹 + missileJammingMap["ITGM_1"] = new List<(JammingType, string, string, string, string)> + { + (JammingType.Infrared, "红外干扰", "InfraredJammer_Missile", "阻塞", "导弹"), + (JammingType.SmokeScreen, "红外烟幕弹", "SG_2", "遮蔽", "导弹") + }; + + // 毫米波末制导导弹 + missileJammingMap["MMWG_1"] = new List<(JammingType, string, string, string, string)> + { + (JammingType.MillimeterWave, "毫米波干扰", "MillimeterWaveJammer_Missile", "阻塞", "导弹"), + (JammingType.SmokeScreen, "烟幕弹", "SG_1", "遮蔽", "导弹") + }; + + // 末敏子弹药 + missileJammingMap["TSM_1"] = new List<(JammingType, string, string, string, string)> + { + (JammingType.Laser, "激光干扰", "LaserJammer_Missile", "阻塞", "子弹药"), + (JammingType.Infrared, "红外干扰", "InfraredJammer_Missile", "阻塞", "子弹药"), + (JammingType.MillimeterWave, "毫米波干扰", "MillimeterWaveJammer_Submunition", "阻塞", "子弹药"), + (JammingType.MillimeterWave, "毫米波假信号", "MillimeterWaveJammer_Submunition", "欺骗", "子弹药"), + (JammingType.SmokeScreen, "烟幕弹", "SG_3", "遮蔽", "子弹药") + }; + } /// /// 初始化仿真环境 @@ -77,6 +163,12 @@ namespace ThreatSource.Tools.MissileSimulation // 添加激光诱偏目标 AddLaserDecoy(); + + // 添加各类型干扰器 + AddJammers(); + + // 打印所有注册的干扰器 + PrintAllJammers(); } /// @@ -330,6 +422,120 @@ namespace ThreatSource.Tools.MissileSimulation Console.WriteLine($"注册红外测角仪 {infraredTrackerId}"); } + /// + /// 添加各类型干扰器 + /// + private void AddJammers() + { + // 添加激光干扰器 - 指向指示器 + var laserJammerParams = new MotionParameters + { + Position = new Vector3D(0, 0, 0), + Orientation = CalculateOrientationToEntity(indicators["LD_1"]), // 朝向激光指示器 + InitialSpeed = 0.0 + }; + string laserJammerId = "LaserJammer_Designator"; + var laserJammer = _threatSourceFactory.CreateJammer(laserJammerId, "laser_blocking", laserJammerParams, "Tank_1"); + if (laserJammer != null) + { + simulationManager.RegisterEntity(laserJammerId, laserJammer); + jammers[laserJammerId] = laserJammer as BaseJammer; + Console.WriteLine($"注册激光干扰器(指向指示器) {laserJammerId}"); + } + + // 添加激光干扰器 - 指向导弹 + laserJammerParams = new MotionParameters + { + Position = new Vector3D(0, 0, 0), + Orientation = CalculateOrientationToEntity(missiles["LSGM_1"]), // 朝向激光半主动导弹 + InitialSpeed = 0.0 + }; + laserJammerId = "LaserJammer_Missile"; + laserJammer = _threatSourceFactory.CreateJammer(laserJammerId, "laser_blocking", laserJammerParams, "Tank_1"); + if (laserJammer != null) + { + simulationManager.RegisterEntity(laserJammerId, laserJammer); + jammers[laserJammerId] = laserJammer as BaseJammer; + Console.WriteLine($"注册激光干扰器(指向导弹) {laserJammerId}"); + } + + // 添加红外干扰器 - 指向指示器 + var irJammerParams = new MotionParameters + { + Position = new Vector3D(0, 0, 0), + Orientation = CalculateOrientationToEntity(indicators["IT_1"]), // 朝向红外指示器 + InitialSpeed = 0.0 + }; + string irJammerId = "InfraredJammer_Designator"; + var irJammer = _threatSourceFactory.CreateJammer(irJammerId, "infrared_blocking", irJammerParams, "Tank_1"); + if (irJammer != null) + { + simulationManager.RegisterEntity(irJammerId, irJammer); + jammers[irJammerId] = irJammer as BaseJammer; + Console.WriteLine($"注册红外干扰器(指向指示器) {irJammerId}"); + } + + // 添加红外干扰器 - 指向导弹 + irJammerParams = new MotionParameters + { + Position = new Vector3D(0, 0, 0), + Orientation = CalculateOrientationToEntity(missiles["ITGM_1"]), // 朝向红外成像导弹 + InitialSpeed = 0.0 + }; + irJammerId = "InfraredJammer_Missile"; + irJammer = _threatSourceFactory.CreateJammer(irJammerId, "infrared_blocking", irJammerParams, "Tank_1"); + if (irJammer != null) + { + simulationManager.RegisterEntity(irJammerId, irJammer); + jammers[irJammerId] = irJammer as BaseJammer; + Console.WriteLine($"注册红外干扰器(指向导弹) {irJammerId}"); + } + + // 添加毫米波干扰器 - 指向导弹 + var mmwJammerParams = new MotionParameters + { + Position = new Vector3D(0, 0, 0), + Orientation = CalculateOrientationToEntity(missiles["MMWG_1"]), // 朝向毫米波导弹 + InitialSpeed = 0.0 + }; + string mmwJammerId = "MillimeterWaveJammer_Missile"; + var mmwJammer = _threatSourceFactory.CreateJammer(mmwJammerId, "mmw_blocking", mmwJammerParams, "Tank_1"); + if (mmwJammer != null) + { + simulationManager.RegisterEntity(mmwJammerId, mmwJammer); + jammers[mmwJammerId] = mmwJammer as BaseJammer; + Console.WriteLine($"注册毫米波干扰器(指向导弹) {mmwJammerId}"); + } + + // 添加毫米波干扰器 - 指向子弹药 + mmwJammerParams = new MotionParameters + { + Position = new Vector3D(0, 0, 0), + Orientation = CalculateOrientationToEntity(missiles["TSM_1"]), // 朝向末敏子弹药 + InitialSpeed = 0.0 + }; + mmwJammerId = "MillimeterWaveJammer_Submunition"; + mmwJammer = _threatSourceFactory.CreateJammer(mmwJammerId, "mmw_deception", mmwJammerParams, "Tank_1"); + if (mmwJammer != null) + { + simulationManager.RegisterEntity(mmwJammerId, mmwJammer); + jammers[mmwJammerId] = mmwJammer as BaseJammer; + Console.WriteLine($"注册毫米波干扰器(指向子弹药) {mmwJammerId}"); + } + } + + /// + /// 计算朝向实体的方向 + /// + private Orientation CalculateOrientationToEntity(SimulationElement target) + { + // 使用CalculateDirectionToTarget获取归一化方向向量 + Vector3D direction = CalculateDirectionToTarget(new Vector3D(0, 0, 0), target.Position); + + // 创建朝向目标的方向 + return Orientation.FromVector(direction); + } + /// /// 选择要激活的导弹 /// @@ -359,7 +565,8 @@ namespace ThreatSource.Tools.MissileSimulation // 激活选中的导弹 missileActiveStatus[missileId] = true; missiles[missileId].Activate(); - Console.WriteLine($"已选择导弹:{missileId}"); + SelectedMissileId = missileId; + Console.WriteLine($"已选择导弹:{missileId} ({SelectedMissileDisplayName})"); // 确保所有目标都处于激活状态 foreach (var target in targets.Values) @@ -410,84 +617,329 @@ namespace ThreatSource.Tools.MissileSimulation } } + /// + /// 获取当前选中导弹可用的干扰选项 + /// + public (JammingType Type, string DisplayName, string JammerId, string Mode, string Target)[] GetAvailableJammingOptions() + { + if (string.IsNullOrEmpty(SelectedMissileId) || !missileJammingMap.ContainsKey(SelectedMissileId)) + { + return Array.Empty<(JammingType, string, string, string, string)>(); + } + + return missileJammingMap[SelectedMissileId].ToArray(); + } + /// /// 应用干扰 /// - public void ApplyJamming(JammingType type, string category, double power, double duration, Vector3D position) + public void ApplyJamming(JammingType type, string displayName, string jammerId, string mode, string target) { - var jammingParams = new JammingParameters + // 检查并激活干扰器 + if (jammers.ContainsKey(jammerId)) { - Type = type, - Power = power, - Duration = duration, - Direction = new Vector3D(1, 0, 0), - SourcePosition = position - }; - - switch (type) - { - case JammingType.Laser: - - break; - case JammingType.Infrared: - - break; - case JammingType.MillimeterWave: - - break; - case JammingType.SmokeScreen: - if (category == "水平烟幕弹") - { - jammingParams.JammerId = "SG_1"; - jammers["SG_1"].Activate(); - } - else if (category == "红外烟幕弹") - { - jammingParams.JammerId = "SG_2"; - jammers["SG_2"].Activate(); - } - else if (category == "顶部烟幕弹") - { - jammingParams.JammerId = "SG_3"; - jammers["SG_3"].Activate(); - } - break; - case JammingType.Decoy: - jammingParams.JammerId = "LDY_1"; - jammers["LDY_1"].Activate(); - break; - } - - foreach (var missile in missiles.Values) - { - if (missile is BaseMissile actualMissile) + var jammer = jammers[jammerId]; + + // 激活干扰器实例 + jammer.Activate(); + + // 创建干扰参数 + JammingParameters jammingParams = new JammingParameters { - // 获取导弹内部的传感器 - var infraredDetector = actualMissile.GetType().GetField("infraredDetector", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(actualMissile) as InfraredDetector; - var radiometer = actualMissile.GetType().GetField("radiometer", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(actualMissile) as MillimeterWaveRadiometer; - var rangefinder = actualMissile.GetType().GetField("rangefinder", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(actualMissile) as LaserRangefinder; - var altimeter = actualMissile.GetType().GetField("altimeter", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(actualMissile) as MillimeterWaveAltimeter; - - switch (type) - { - case JammingType.Infrared: - infraredDetector?.ApplyJamming(jammingParams); - break; - case JammingType.MillimeterWave: - radiometer?.ApplyJamming(jammingParams); - altimeter?.ApplyJamming(jammingParams); - break; - case JammingType.Laser: - rangefinder?.ApplyJamming(jammingParams); - break; - } + Type = type, + Mode = mode.Equals("阻塞") ? JammingMode.Blocking : + mode.Equals("欺骗") ? JammingMode.Deception : + mode.Equals("噪声") ? JammingMode.Noise : JammingMode.Blocking, + JammerId = jammerId, + SourceId = jammer.Id, + Power = 1000, // 设置高功率 + Direction = jammer.Orientation.ToVector(), + SourcePosition = jammer.Position, + StartTime = DateTime.UtcNow, // 设置为当前时间 + Duration = 600 // 设置为10分钟(600秒) + }; + + // 调用StartJamming方法开始干扰行为 + jammer.StartJamming(jammingParams); + + Console.WriteLine($"激活干扰器并开始干扰: {jammerId}: {displayName} (模式: {mode}, 作用: {target})"); + Console.WriteLine($"干扰器 {jammerId} 激活状态: {jammer.IsActive}, 干扰状态: {jammer.IsJamming}"); + Console.WriteLine($"干扰参数: 类型={type}, 模式={jammingParams.Mode}, 开始时间={jammingParams.StartTime}, 持续时间={jammingParams.Duration}秒"); + Console.WriteLine($"干扰器 {jammerId} 状态信息: {jammer.GetStatus()}"); + } + else + { + Console.WriteLine($"警告:找不到干扰器 {jammerId},可用干扰器: {string.Join(", ", jammers.Keys)}"); + PrintAllJammers(); + } + + // 根据干扰目标对象应用干扰 + ApplyJammingToTargets(type, displayName, mode, target); + } + + /// + /// 打印所有注册的干扰器信息 + /// + private void PrintAllJammers() + { + Console.WriteLine("\n所有注册的干扰器:"); + if (jammers.Count == 0) + { + Console.WriteLine("没有任何干扰器被注册!"); + return; + } + + foreach (var jammer in jammers) + { + Console.WriteLine($"- {jammer.Key}: 类型={jammer.Value.GetType().Name}, 激活状态={jammer.Value.IsActive}"); + if (jammer.Value.IsActive) + { + Console.WriteLine($" 状态: {jammer.Value.GetStatus()}"); } } } + + /// + /// 根据目标类型应用干扰 + /// + private void ApplyJammingToTargets(JammingType type, string displayName, string mode, string target) + { + // 根据target决定干扰作用对象 + switch (target.ToLower()) + { + case "指示器": + ApplyJammingToIndicators(type, mode); + break; + + case "导弹": + ApplyJammingToMissiles(type, mode); + break; + + case "两者": + ApplyJammingToIndicators(type, mode); + ApplyJammingToMissiles(type, mode); + break; + + case "子弹药": + ApplyJammingToMissiles(type, mode); + break; + } + } + + /// + /// 应用干扰到指示器 + /// + private void ApplyJammingToIndicators(JammingType type, string mode) + { + foreach (var indicator in indicators.Values.Where(i => i.IsActive)) + { + Console.WriteLine($"应用{mode}干扰到指示器 {indicator.Id}"); + try + { + // 根据干扰类型选择合适的干扰器ID + string jammerId = string.Empty; + switch (type) + { + case JammingType.Laser: + jammerId = "LaserJammer_Designator"; + break; + case JammingType.Infrared: + jammerId = "InfraredJammer_Designator"; + break; + case JammingType.MillimeterWave: + jammerId = "MillimeterWaveJammer_Missile"; // 假设这个也可以用于指示器 + break; + case JammingType.SmokeScreen: + if (indicator.Id.Contains("LD")) + jammerId = "SG_1"; // 激光烟幕 + else if (indicator.Id.Contains("IR")) + jammerId = "SG_2"; // 红外烟幕 + else + jammerId = "SG_3"; // 默认烟幕 + break; + case JammingType.Decoy: + jammerId = "LDY_1"; + break; + } + + if (!string.IsNullOrEmpty(jammerId) && jammers.ContainsKey(jammerId)) + { + var jammer = jammers[jammerId]; + + // 创建干扰参数 + JammingParameters jammingParams = new JammingParameters + { + Type = type, + Mode = mode.Equals("阻塞") ? JammingMode.Blocking : + mode.Equals("欺骗") ? JammingMode.Deception : + mode.Equals("噪声") ? JammingMode.Noise : JammingMode.Blocking, + JammerId = jammerId, + SourceId = jammer.Id, + Power = 800, // 设置合适功率 + Direction = CalculateDirectionToTarget(jammer.Position, indicator.Position), + SourcePosition = jammer.Position, + StartTime = DateTime.UtcNow, + Duration = 600 // 10分钟 + }; + + // 找到指示器的实际实现类 + if (indicator is IJammable jammableIndicator) + { + // 调用IJammable接口的ApplyJamming方法 + jammableIndicator.ApplyJamming(jammingParams); + Console.WriteLine($"成功应用干扰到指示器 {indicator.Id},干扰源: {jammerId}"); + } + else + { + Console.WriteLine($"警告: 指示器 {indicator.Id} 不支持IJammable接口"); + } + } + else + { + Console.WriteLine($"警告: 找不到合适的干扰器ID: {jammerId}"); + } + } + catch (Exception ex) + { + Console.WriteLine($"对指示器 {indicator.Id} 应用干扰时出错: {ex.Message}"); + } + } + } + + /// + /// 应用干扰到导弹 + /// + private void ApplyJammingToMissiles(JammingType type, string mode) + { + foreach (var missile in missiles.Values.Where(m => m.IsActive)) + { + Console.WriteLine($"应用{mode}干扰到导弹 {missile.Id}"); + try + { + // 根据干扰类型和导弹类型选择合适的干扰器ID + string jammerId = string.Empty; + switch (type) + { + case JammingType.Laser: + jammerId = "LaserJammer_Missile"; + break; + case JammingType.Infrared: + jammerId = "InfraredJammer_Missile"; + break; + case JammingType.MillimeterWave: + if (missile.Id.Contains("TSM")) + jammerId = "MillimeterWaveJammer_Submunition"; // 针对子弹药 + else + jammerId = "MillimeterWaveJammer_Missile"; + break; + case JammingType.SmokeScreen: + if (missile.Id.Contains("ITGM") || missile.Id.Contains("ICGM")) + jammerId = "SG_2"; // 红外烟幕用于红外导弹 + else if (missile.Id.Contains("TSM")) + jammerId = "SG_3"; // 顶部烟幕用于子弹药 + else + jammerId = "SG_1"; // 默认烟幕 + break; + case JammingType.Decoy: + jammerId = "LDY_1"; + break; + } + + if (!string.IsNullOrEmpty(jammerId) && jammers.ContainsKey(jammerId)) + { + var jammer = jammers[jammerId]; + + // 创建干扰参数 + JammingParameters jammingParams = new JammingParameters + { + Type = type, + Mode = mode.Equals("阻塞") ? JammingMode.Blocking : + mode.Equals("欺骗") ? JammingMode.Deception : + mode.Equals("噪声") ? JammingMode.Noise : JammingMode.Blocking, + JammerId = jammerId, + SourceId = jammer.Id, + Power = 1000, // 设置高功率 + Direction = CalculateDirectionToTarget(jammer.Position, missile.Position), + SourcePosition = jammer.Position, + StartTime = DateTime.UtcNow, + Duration = 600 // 10分钟 + }; + + // 判断导弹是否实现了IJammable接口 + if (missile is IJammable jammableMissile) + { + // 调用IJammable接口的ApplyJamming方法 + jammableMissile.ApplyJamming(jammingParams); + Console.WriteLine($"成功应用干扰到导弹 {missile.Id},干扰源: {jammerId}"); + } + else + { + Console.WriteLine($"警告: 导弹 {missile.Id} 不支持IJammable接口"); + } + } + else + { + Console.WriteLine($"警告: 找不到合适的干扰器ID: {jammerId}"); + } + } + catch (Exception ex) + { + Console.WriteLine($"对导弹 {missile.Id} 应用干扰时出错: {ex.Message}"); + } + } + } + + /// + /// 计算从源位置到目标位置的方向向量 + /// + private Vector3D CalculateDirectionToTarget(Vector3D sourcePosition, Vector3D targetPosition) + { + Vector3D direction = targetPosition - sourcePosition; + return direction.Normalize(); + } /// /// 清除干扰 /// + public void ClearJamming(JammingType type, string displayName, string jammerId) + { + if (jammers.ContainsKey(jammerId)) + { + jammers[jammerId].Deactivate(); + Console.WriteLine($"关闭干扰器 {jammerId}: {displayName}"); + } + } + + /// + /// 应用干扰 (原有方法,保留向后兼容) + /// + public void ApplyJamming(JammingType type, string category) + { + switch (type) + { + case JammingType.SmokeScreen: + if (category == "水平烟幕弹") + { + jammers["SG_1"].Activate(); + } + else if (category == "红外烟幕弹") + { + jammers["SG_2"].Activate(); + } + else if (category == "顶部烟幕弹") + { + jammers["SG_3"].Activate(); + } + break; + case JammingType.Decoy: + jammers["LDY_1"].Activate(); + break; + } + } + + /// + /// 清除干扰 (原有方法,保留向后兼容) + /// public void ClearJamming(JammingType type, string category) { var jammingParams = new JammingParameters @@ -499,31 +951,7 @@ namespace ThreatSource.Tools.MissileSimulation SourcePosition = new Vector3D(0, 0, 0) }; - foreach (var missile in missiles.Values) - { - if (missile is BaseMissile actualMissile) - { - // 获取导弹内部的传感器 - var infraredDetector = actualMissile.GetType().GetField("infraredDetector", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(actualMissile) as InfraredDetector; - var radiometer = actualMissile.GetType().GetField("radiometer", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(actualMissile) as MillimeterWaveRadiometer; - var rangefinder = actualMissile.GetType().GetField("rangefinder", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(actualMissile) as LaserRangefinder; - var altimeter = actualMissile.GetType().GetField("altimeter", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(actualMissile) as MillimeterWaveAltimeter; - - switch (type) - { - case JammingType.Infrared: - infraredDetector?.ClearJamming(type); - break; - case JammingType.MillimeterWave: - radiometer?.ClearJamming(type); - altimeter?.ClearJamming(type); - break; - case JammingType.Laser: - rangefinder?.ClearJamming(type); - break; - } - } - } + // 保留原有实现... } /// @@ -573,53 +1001,142 @@ namespace ThreatSource.Tools.MissileSimulation } /// - /// 打印仿真状态 + /// 打印当前模拟状态 /// private void PrintSimulationStatus() { - // 打印当前天气状态 + Console.Clear(); + + // 获取当前仿真时间 + double simulationTime = simulationManager.CurrentTime; var weather = simulationManager.CurrentWeather; + + Console.WriteLine($"\n========== 模拟状态 (时间: {simulationTime:F1}s)=========="); + + // 天气状态 + Console.WriteLine("\n--- 天气状态 ---"); if (weather != null) { - Console.WriteLine("\n========== 天气状态 =========="); Console.WriteLine($"天气类型: {weather.Type}"); - Console.WriteLine($"温度: {weather.Temperature}°C"); - Console.WriteLine($"湿度: {weather.RelativeHumidity}%"); - Console.WriteLine($"能见度: {weather.Visibility}公里"); - Console.WriteLine($"风速: {weather.WindSpeed}米/秒"); - Console.WriteLine($"风向: {weather.WindDirection}°"); + Console.WriteLine($"温度: {weather.Temperature:F1}°C, 湿度: {weather.RelativeHumidity:F1}%"); + Console.WriteLine($"风速: {weather.WindSpeed:F1} m/s, 方向: ({weather.WindDirection:F1}°)"); + Console.WriteLine($"雨量: {weather.Precipitation:F1} mm"); + Console.WriteLine($"能见度: {weather.Visibility:F1} m"); } - // 打印所有活跃导弹的状态 - var activeMissiles = simulationManager.GetEntitiesByType() - .Where(m => m.IsActive); - - foreach (var missile in activeMissiles) + // 导弹状态 + Console.WriteLine("\n--- 导弹状态 ---"); + var activeMissiles = missiles.Values.Where(m => m.IsActive).ToList(); + if (activeMissiles.Any()) { - Console.WriteLine("\n========== 导弹状态 =========="); - Console.WriteLine(missile.GetStatus()); + foreach (var missile in activeMissiles) + { + // 直接调用导弹的GetStatus方法 + Console.WriteLine(missile.GetStatus()); + } } - - // 打印目标状态 - foreach (var target in targets.Values) + else { - Console.WriteLine("\n========== 目标状态 =========="); - Console.WriteLine(target.GetStatus()); + Console.WriteLine("没有激活的导弹"); } - - // 打印激活的传感器状态 - foreach (var sensor in indicators.Values.Where(s => s.IsActive)) + + // 目标状态 + Console.WriteLine("\n--- 目标状态 ---"); + var activeTargets = targets.Values.Where(t => t.IsActive).ToList(); + if (activeTargets.Any()) { - Console.WriteLine("\n========== 传感器状态 =========="); - Console.WriteLine(sensor.GetStatus()); + foreach (var target in activeTargets) + { + // 调用目标的GetStatus方法 + Console.WriteLine(target.GetStatus()); + } } - - // 打印激活的干扰器状态 - foreach (var jammer in jammers.Values.Where(j => j.IsActive)) + else { - Console.WriteLine("\n========== 干扰器状态 =========="); - Console.WriteLine(jammer.GetStatus()); + Console.WriteLine("没有激活的目标"); } + + // 传感器状态 + Console.WriteLine("\n--- 传感器和指示器状态 ---"); + var activeIndicators = indicators.Values.Where(i => i.IsActive).ToList(); + if (activeIndicators.Any()) + { + foreach (var indicator in activeIndicators) + { + // 调用指示器的GetStatus方法 + Console.WriteLine(indicator.GetStatus()); + + // 如果是IIndicator接口,显示干扰状态信息 + if (indicator is IIndicator indInterface && indInterface.IsJammed) + { + Console.WriteLine($" 受干扰状态: 受到干扰"); + + // 尝试显示干扰类型 + if (indicator is LaserDesignator) + Console.WriteLine($" 干扰类型: 激光干扰"); + else if (indicator is LaserBeamRider) + Console.WriteLine($" 干扰类型: 激光干扰"); + else if (indicator is InfraredTracker) + Console.WriteLine($" 干扰类型: 红外干扰"); + } + } + } + else + { + Console.WriteLine("没有激活的传感器或指示器"); + } + + // 干扰器状态 + Console.WriteLine("\n--- 干扰器状态 ---"); + var activeJammers = jammers.Values.Where(j => j.IsActive).ToList(); + if (activeJammers.Any()) + { + foreach (var jammer in activeJammers) + { + // 调用干扰器的GetStatus方法 + Console.WriteLine(jammer.GetStatus()); + + // 如果正在干扰,显示更多详细信息 + if (jammer.IsJamming) + { + try + { + var runningState = jammer.GetRunningState(); + if (runningState.CurrentParameters != null) + { + var jammingParams = runningState.CurrentParameters; + Console.WriteLine($" 干扰详情:"); + Console.WriteLine($" - 类型: {jammingParams.Type}"); + Console.WriteLine($" - 模式: {jammingParams.Mode}"); + Console.WriteLine($" - 功率: {jammingParams.Power:F1} W"); + + // 计算已干扰时间和剩余时间 + var jammingTimeSeconds = (DateTime.UtcNow.Ticks - jammingParams.StartTime.Ticks) / TimeSpan.TicksPerSecond; + Console.WriteLine($" - 已干扰时间: {jammingTimeSeconds:F1} 秒"); + + if (jammingParams.Duration.HasValue) + { + var remainingTime = jammingParams.Duration.Value - jammingTimeSeconds; + if (remainingTime > 0) + Console.WriteLine($" - 剩余时间: {remainingTime:F1} 秒"); + else + Console.WriteLine(" - 干扰即将结束"); + } + } + } + catch (Exception ex) + { + Console.WriteLine($" 获取干扰器详细状态出错: {ex.Message}"); + } + } + } + } + else + { + Console.WriteLine("没有激活的干扰器"); + } + + Console.WriteLine("\n========================================"); } /// diff --git a/tools/Program.cs b/tools/Program.cs index 7e5c672..64cc045 100644 --- a/tools/Program.cs +++ b/tools/Program.cs @@ -169,27 +169,22 @@ namespace ThreatSource.Tools.MissileSimulation static bool ConfigureJamming(ComprehensiveMissileSimulator simulator) { - var jammingTypes = new[] - { - (JammingType.Infrared, "红外干扰"), - (JammingType.MillimeterWave, "毫米波干扰"), - (JammingType.Laser, "激光干扰"), - (JammingType.SmokeScreen, "水平烟幕弹"), - (JammingType.SmokeScreen, "红外烟幕弹"), - (JammingType.SmokeScreen, "顶部烟幕弹"), - (JammingType.Decoy, "假目标干扰") - }; - - var jammingStatus = new bool[jammingTypes.Length]; + var availableJammingOptions = simulator.GetAvailableJammingOptions(); + var jammingStatus = new bool[availableJammingOptions.Length]; while (true) { Console.WriteLine("\n第三步:配置干扰方式"); - Console.WriteLine("当前干扰状态:"); - for (int i = 0; i < jammingTypes.Length; i++) + Console.WriteLine($"当前导弹: {simulator.SelectedMissileDisplayName}"); + Console.WriteLine("可用干扰方式:"); + + for (int i = 0; i < availableJammingOptions.Length; i++) { - Console.WriteLine($" {i + 1}. {jammingTypes[i].Item2} [{(jammingStatus[i] ? "激活" : "未激活")}]"); + var option = availableJammingOptions[i]; + Console.WriteLine($" {i + 1}. {option.DisplayName} [{(jammingStatus[i] ? "激活" : "未激活")}] " + + $"(干扰模式: {option.Mode}, 作用对象: {option.Target})"); } + Console.WriteLine(" 0. 开始仿真"); Console.WriteLine(" exit. 退出程序"); @@ -200,13 +195,16 @@ namespace ThreatSource.Tools.MissileSimulation if (int.TryParse(input, out int choice)) { if (choice == 0) return true; - if (choice >= 1 && choice <= jammingTypes.Length) + if (choice >= 1 && choice <= availableJammingOptions.Length) { + var option = availableJammingOptions[choice - 1]; jammingStatus[choice - 1] = !jammingStatus[choice - 1]; + if (jammingStatus[choice - 1]) - simulator.ApplyJamming(jammingTypes[choice - 1].Item1, jammingTypes[choice - 1].Item2, 100, 5, new Vector3D(0, 0, 0)); + simulator.ApplyJamming(option.Type, option.DisplayName, option.JammerId, option.Mode, option.Target); else - simulator.ClearJamming(jammingTypes[choice - 1].Item1, jammingTypes[choice - 1].Item2); + simulator.ClearJamming(option.Type, option.DisplayName, option.JammerId); + continue; } }