ActiveProtect/Models/LaserBeamRiderMissile.cs

84 lines
3.0 KiB
C#

using ActiveProtect.SimulationEnvironment;
namespace ActiveProtect.Models
{
public class LaserBeamRiderMissile : MissileBase
{
private LaserBeamRiderGuidanceSystem LaserBeamRiderGuidanceSystem;
public LaserBeamRiderMissile(string id, MissileConfig missileConfig, ISimulationManager simulationManager)
: base(id, missileConfig, simulationManager)
{
LaserBeamRiderGuidanceSystem = new LaserBeamRiderGuidanceSystem(missileConfig.ProportionalNavigationCoefficient);
}
protected override Vector3D GetGuidanceCommand()
{
return LaserBeamRiderGuidanceSystem.GetGuidanceCommand();
}
private void OnLaserBeamStart(LaserBeamStartEvent evt)
{
if (evt?.LaserBeamRider != null)
{
LaserBeamRiderGuidanceSystem?.ActivateLaserBeam(evt.LaserBeamRider.Position, evt.LaserBeamRider.LaserDirection, evt.LaserBeamRider.LaserPower);
}
}
private void OnLaserBeamUpdate(LaserBeamUpdateEvent evt)
{
if (evt?.LaserBeamRider != null)
{
LaserBeamRiderGuidanceSystem?.UpdateLaserBeamRider(evt.LaserBeamRider.Position, evt.LaserBeamRider.LaserDirection, evt.LaserBeamRider.LaserPower);
}
}
private void OnLaserBeamStop(LaserBeamStopEvent evt)
{
if (evt?.LaserBeamRider != null)
{
LaserBeamRiderGuidanceSystem?.DeactivateLaserBeam(evt.LaserBeamRider.Position, evt.LaserBeamRider.LaserDirection);
}
}
public override void Update(double deltaTime)
{
if (LaserBeamRiderGuidanceSystem.HasGuidance)
{
LaserBeamRiderGuidanceSystem.Update(deltaTime, Position, Velocity);
this.HasGuidance = true;
}
else
{
this.HasGuidance = false;
}
base.Update(deltaTime);
}
public override string GetStatus()
{
string baseStatus = base.GetStatus().Replace("导弹", "激光驾束制导导弹");
string additionalStatus = $"\n 激光引导: {(LaserBeamRiderGuidanceSystem.HasGuidance ? "" : "")}";
return baseStatus + additionalStatus;
}
public override void Activate()
{
base.Activate();
SimulationManager.SubscribeToEvent<LaserBeamStartEvent>(OnLaserBeamStart);
SimulationManager.SubscribeToEvent<LaserBeamStopEvent>(OnLaserBeamStop);
SimulationManager.SubscribeToEvent<LaserBeamUpdateEvent>(OnLaserBeamUpdate);
}
public override void Deactivate()
{
base.Deactivate();
SimulationManager.UnsubscribeFromEvent<LaserBeamStartEvent>(OnLaserBeamStart);
SimulationManager.UnsubscribeFromEvent<LaserBeamStopEvent>(OnLaserBeamStop);
SimulationManager.UnsubscribeFromEvent<LaserBeamUpdateEvent>(OnLaserBeamUpdate);
}
}
}