88 lines
3.5 KiB
C#
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);
|
|
}
|
|
}
|
|
} |