ActiveProtect/Models/LaserDesignator.cs

236 lines
8.3 KiB
C#

using ActiveProtect.SimulationEnvironment;
using System;
namespace ActiveProtect.Models
{
/// <summary>
/// 激光指示器类,用于对目标进行激光照射
/// </summary>
public class LaserDesignator : SimulationElement
{
/// <summary>
/// 目标ID
/// </summary>
public string TargetId { get; private set; }
/// <summary>
/// 导弹ID
/// </summary>
public string MissileId { get; private set; }
/// <summary>
/// 干扰阈值(分贝)
/// </summary>
public double JammingThreshold { get; private set; } = 0.0;
/// <summary>
/// 是否被干扰
/// </summary>
public bool IsJammed { get; private set; } = false;
/// <summary>
/// 是否正在照射
/// </summary>
public bool IlluminationOn { get; private set; } = false;
/// <summary>
/// 激光功率
/// </summary>
public double LaserPower { get; private set; } = 0;
/// <summary>
/// 激光发散角
/// </summary>
public double LaserDivergenceAngle { get; private set; } = 0;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="id">激光指示器ID</param>
/// <param name="targetId">目标ID</param>
/// <param name="missileId">导弹ID</param>
/// <param name="config">激光指示器配置</param>
/// <param name="simulationManager">仿真管理器</param>
public LaserDesignator(string id, string targetId, string missileId, LaserDesignatorConfig config, ISimulationManager simulationManager)
: base(id, config.InitialPosition, new Orientation(), simulationManager)
{
TargetId = targetId;
MissileId = missileId;
IsActive = false;
IlluminationOn = false;
LaserPower = config.LaserPower;
LaserDivergenceAngle = config.LaserDivergenceAngle;
}
/// <summary>
/// 更新激光指示器状态
/// </summary>
/// <param name="deltaTime">时间步长</param>
public override void Update(double deltaTime)
{
if (IsActive && !IsJammed)
{
if (IlluminationOn)
{
PublishIlluminationUpdateEvent();
}
}
}
/// <summary>
/// 开始激光照射
/// </summary>
private void StartLaserIllumination()
{
if (!IlluminationOn)
{
IlluminationOn = true;
Console.WriteLine($"激光目标指示器 {Id} 开始照射目标 {TargetId}");
PublishIlluminationStartEvent();
}
}
/// <summary>
/// 停止激光照射
/// </summary>
private void StopLaserIllumination()
{
if (IlluminationOn)
{
IlluminationOn = false;
Console.WriteLine($"激光目标指示器 {Id} 停止照射目标 {TargetId}");
PublishIlluminationStopEvent();
}
}
/// <summary>
/// 处理激光干扰事件
/// </summary>
/// <param name="evt">激光干扰事件</param>
private void OnLaserJamming(LaserJammingEvent evt)
{
if (evt.TargetId == TargetId)
{
var tank = SimulationManager.GetEntityById(TargetId) as Tank;
if (tank != null)
{
double distanceToTarget = Vector3D.Distance(Position, tank.Position);
double jammingEffectiveness = 20 * Math.Log10(evt.JammingPower) - 20 * Math.Log10(distanceToTarget) - 20 * Math.Log10(4 * Math.PI);
Console.WriteLine($"激光目标指示器 {Id} 收到干扰事件,干扰功率: {evt.JammingPower:F2}, 距离: {distanceToTarget:F2}, 干扰效果: {jammingEffectiveness:F2} dB, 阈值: {JammingThreshold:F2} dB");
if (jammingEffectiveness > JammingThreshold)
{
if (!IsJammed)
{
Console.WriteLine($"激光目标指示器 {Id} 被干扰,停止工作");
IsJammed = true;
StopLaserIllumination();
}
}
else
{
if (IsJammed)
{
Console.WriteLine($"激光目标指示器 {Id} 干扰解除,恢复工作");
IsJammed = false;
}
}
}
}
}
/// <summary>
/// 激活激光指示器
/// </summary>
public override void Activate()
{
if (!IsActive)
{
IsActive = true;
IsJammed = false;
Console.WriteLine($"激光目标指示器 {Id} 已激活");
StartLaserIllumination();
SimulationManager.SubscribeToEvent<LaserJammingEvent>(OnLaserJamming);
SimulationManager.SubscribeToEvent<EntityDeactivatedEvent>(OnEntityDeactivatedEvent);
}
base.Activate();
}
/// <summary>
/// 停用激光指示器
/// </summary>
public override void Deactivate()
{
if (IsActive)
{
IsActive = false;
StopLaserIllumination();
Console.WriteLine($"激光目标指示器 {Id} 已停用");
SimulationManager.UnsubscribeFromEvent<LaserJammingEvent>(OnLaserJamming);
SimulationManager.UnsubscribeFromEvent<EntityDeactivatedEvent>(OnEntityDeactivatedEvent);
}
base.Deactivate();
}
/// <summary>
/// 发布激光照射事件
/// </summary>
private void PublishIlluminationStartEvent()
{
var evt = new LaserIlluminationStartEvent { LaserDesignator = this, Target = SimulationManager.GetEntityById(TargetId) as SimulationElement };
PublishEvent(evt);
Console.WriteLine($"激光指示器 {Id} 发布激光照射事件");
}
/// <summary>
/// 发布激光照射更新事件
/// </summary>
private void PublishIlluminationUpdateEvent()
{
var evt = new LaserIlluminationUpdateEvent { LaserDesignator = this, Target = SimulationManager.GetEntityById(TargetId) as SimulationElement };
PublishEvent(evt);
Console.WriteLine($"激光指示器 {Id} 发布激光照射更新事件");
}
/// <summary>
/// 发布激光照射停止事件
/// </summary>
private void PublishIlluminationStopEvent()
{
var evt = new LaserIlluminationStopEvent { LaserDesignator = this, Target = SimulationManager.GetEntityById(TargetId) as SimulationElement };
PublishEvent(evt);
Console.WriteLine($"激光指示器 {Id} 发布激光照射停止事件");
}
/// <summary>
/// 处理实体停用事件
/// </summary>
/// <param name="evt">实体停用事件</param>
private void OnEntityDeactivatedEvent(EntityDeactivatedEvent evt)
{
if (evt.DeactivatedEntityId == TargetId || evt.DeactivatedEntityId == MissileId)
{
StopLaserIllumination();
}
}
/// <summary>
/// 获取激光指示器状态信息
/// </summary>
/// <returns>状态信息字符串</returns>
public override string GetStatus()
{
return $"激光目标指示器 {Id}:\n" +
$" 位置: {Position}\n" +
$" 目标: {TargetId}\n" +
$" 导弹: {MissileId}\n" +
$" 激活状态: {(IsActive ? "" : "")}\n" +
$" 照射状态: {(IlluminationOn ? "" : "")}\n" +
$" 干扰状态: {(IsJammed ? "" : "")}\n" +
$" 激光功率: {LaserPower:E} W";
}
}
}