ActiveProtect/Models/LaserSemiActiveGuidedMissile.cs

88 lines
3.5 KiB
C#

using ActiveProtect.SimulationEnvironment;
using System;
namespace ActiveProtect.Models
{
public class LaserSemiActiveGuidedMissile : Missile
{
private const double LaserLockDistance = 1500; // 锁定距离,单位:米
public LaserSemiActiveGuidedMissile(
string id,
MissileConfig missileConfig,
ISimulationManager simulationManager)
: base(id, missileConfig, simulationManager)
{
Type = MissileType.LaserSemiActiveGuidance;
simulationManager.SubscribeToEvent<LaserIlluminationEvent>(OnLaserIllumination);
simulationManager.SubscribeToEvent<LaserIlluminationStopEvent>(OnLaserIlluminationStop);
}
protected override void UpdateGuidanceStatus()
{
bool previousHasGuidance = HasGuidance;
if (SimulationManager.GetEntityById(TargetId) is ILaserIlluminatable target)
{
bool isIlluminated = target.IsIlluminated;
bool isWithinRange = DistanceToTarget <= LaserLockDistance;
HasGuidance = isIlluminated && isWithinRange;
Console.WriteLine($"激光半主动制导导弹 {Id} 状态更新:");
Console.WriteLine($" 目标 {TargetId} 是否被照射: {isIlluminated}");
Console.WriteLine($" 距离目标: {DistanceToTarget:F2} m (最大锁定距离: {LaserLockDistance} m)");
Console.WriteLine($" 是否在锁定范围内: {isWithinRange}");
Console.WriteLine($" 引导状态: {(HasGuidance ? "" : "")}");
if (!HasGuidance && previousHasGuidance)
{
Console.WriteLine($"激光半主动制导导弹 {Id} 失去引导");
LastKnownVelocity = Velocity;
}
else if (HasGuidance && !previousHasGuidance)
{
Console.WriteLine($"激光半主动制导导弹 {Id} 获得引导");
}
}
else
{
HasGuidance = false;
Console.WriteLine($"激光半主动制导导弹 {Id} 无法找到目标 {TargetId}");
}
base.UpdateGuidanceStatus();
}
private void OnLaserIllumination(LaserIlluminationEvent evt)
{
if (evt.TargetId == TargetId)
{
Console.WriteLine($"激光半主动制导导弹 {Id} 检测到目标 {TargetId} 被激光照射");
UpdateGuidanceStatus();
}
}
private void OnLaserIlluminationStop(LaserIlluminationStopEvent evt)
{
if (evt.TargetId == TargetId)
{
Console.WriteLine($"激光半主动制导导弹 {Id} 检测到目标 {TargetId} 激光照射停止");
UpdateGuidanceStatus();
}
}
public override string GetStatus()
{
string baseStatus = base.GetStatus().Replace("导弹", "激光半主动制导导弹");
string additionalStatus = $"\n 激光引导: {(HasGuidance ? "" : "")}";
return baseStatus + additionalStatus;
}
protected override void Deactivate()
{
base.Deactivate();
SimulationManager.UnsubscribeFromEvent<LaserIlluminationEvent>(OnLaserIllumination);
SimulationManager.UnsubscribeFromEvent<LaserIlluminationStopEvent>(OnLaserIlluminationStop);
}
}
}