using System; using ActiveProtect.SimulationEnvironment; namespace ActiveProtect.Models { /// /// 激光干扰器类,用于对抗激光制导武器 /// public class LaserJammer : SimulationElement { /// /// 是否正在进行干扰 /// public bool IsJamming { get; private set; } /// /// 当前干扰功率(瓦特) /// public double JammingPower { get; private set; } /// /// 当前冷却时间(秒) /// private double jammingCooldown = 0; /// /// 最大冷却时间(秒) /// private readonly double maxJammingCooldown; /// /// 最大干扰功率(瓦特) /// private readonly double maxJammingPower; /// /// 初始干扰功率(瓦特) /// private readonly double initialJammingPower; /// /// 功率增加速率(瓦特/秒) /// private readonly double powerIncreaseRate; /// /// 被监视实体的ID /// public string MonitoredEntityId { get; private set; } /// /// 构造函数 /// /// 激光干扰器ID /// 初始位置 /// 初始朝向 /// 仿真管理器 /// 被监视实体的ID /// 激光干扰器配置 public LaserJammer(string id, Vector3D position, Orientation orientation, ISimulationManager simulationManager, string monitoredEntityId, LaserJammerConfig config) : base(id, position, orientation, 0, simulationManager) { MonitoredEntityId = monitoredEntityId; IsJamming = false; JammingPower = 0; maxJammingCooldown = config.MaxJammingCooldown; maxJammingPower = config.MaxJammingPower; initialJammingPower = config.InitialJammingPower; powerIncreaseRate = config.PowerIncreaseRate; SimulationManager.SubscribeToEvent(OnLaserWarnerAlarmEvent); SimulationManager.SubscribeToEvent(OnLaserWarnerAlarmStopEvent); } /// /// 更新激光干扰器状态 /// /// 时间步长 public override void Update(double deltaTime) { if (!IsActive) return; if (SimulationManager.GetEntityById(MonitoredEntityId) is Tank tank) { Position = tank.Position; Orientation = tank.Orientation; } if (IsJamming) { JammingPower = Math.Min(JammingPower + powerIncreaseRate * deltaTime, maxJammingPower); jammingCooldown += deltaTime; if (jammingCooldown >= maxJammingCooldown) { StopJamming(); } else { // 发布干扰事件 PublishEvent(new LaserJammingEvent { TargetId = MonitoredEntityId, JammingPower = JammingPower }); } Console.WriteLine($"激光干扰器 {Id} 正在工作,当前功率: {JammingPower:F2}"); } } /// /// 处理激光告警器警报事件 /// /// 激光告警器警报事件 private void OnLaserWarnerAlarmEvent(LaserWarnerAlarmEvent evt) { if (evt.TargetId == MonitoredEntityId) { StartJamming(); } } /// /// 处理激光告警器警报停止事件 /// /// 激光告警器警报停止事件 private void OnLaserWarnerAlarmStopEvent(LaserWarnerAlarmStopEvent evt) { if (evt.TargetId == MonitoredEntityId) { StopJamming(); } } /// /// 开始干扰 /// private void StartJamming() { if (!IsJamming) { IsJamming = true; JammingPower = initialJammingPower; jammingCooldown = 0; Console.WriteLine($"激光干扰器 {Id} 开始工作,初始功率: {JammingPower:F2}"); } } /// /// 停止干扰 /// private void StopJamming() { if (IsJamming) { IsJamming = false; JammingPower = 0; jammingCooldown = 0; Console.WriteLine($"激光干扰器 {Id} 停止工作"); } } /// /// 获取激光干扰器状态信息 /// /// 状态信息字符串 public override string GetStatus() { return $"激光干扰器 {Id}:\n" + $" 监视实体: {MonitoredEntityId}\n" + $" 干扰状态: {(IsJamming ? "干扰中" : "未干扰")}\n" + $" 当前功率: {JammingPower:F2}/{maxJammingPower:F2}\n" + $" 冷却时间: {jammingCooldown:F2}/{maxJammingCooldown:F2}"; } /// /// 激活激光干扰器 /// public override void Activate() { base.Activate(); SimulationManager.SubscribeToEvent(OnLaserWarnerAlarmEvent); SimulationManager.SubscribeToEvent(OnLaserWarnerAlarmStopEvent); } /// /// 停用激光干扰器 /// public override void Deactivate() { base.Deactivate(); SimulationManager.UnsubscribeFromEvent(OnLaserWarnerAlarmEvent); SimulationManager.UnsubscribeFromEvent(OnLaserWarnerAlarmStopEvent); } } }