using XFEEDToolBox.Core.Native;
using XFEEDToolBox.Core.Navigation;
using XFEEDToolBox.Core.Services;
using XFEEDToolBox.NativeSupport;
namespace XFEEDToolBox.ViewModels;
public partial class ToolboxViewModel
{
private bool currentSystemExtensionsAttempted;
private DateTimeOffset currentSystemExtensionRetryAt;
private static SystemNavigationTarget SystemTarget(CurrentSystemSnapshot snapshot,SystemLocation location)
=>new(snapshot.SystemAddress,location.WorldAddress,location.Name,
location.Category is SystemLocationCategory.Station or SystemLocationCategory.Carrier?SystemTargetKind.Station:
location.Category==SystemLocationCategory.Settlement?SystemTargetKind.SurfacePort:SystemTargetKind.Orbit,location.MarketId)
{NativeKey=location.Key,NativeKind=location.NativeKind,NativeIdentity=location.Identity};
private async Task RefreshCurrentSystemControlAsync(int pid,string hash,CancellationToken token)
{
if(currentSystemCapabilityDriver is not NativeSystemFlightControlDriver driver)
{
Task Protection(CancellationToken cancellation)=>EnsureNativeFlightProtectionAsync(pid,hash,cancellation);
driver=new(pid,hash,()=>runtime.Player,new NativeGameInputChannel(pid,hash,NativeSupportPackage.Directory),Protection,useNativeSupercruiseAssist:false);
currentSystemCapabilityDriver=driver;currentSystemExtensionsAttempted=false;currentSystemCapabilitiesReadAt=default;
}
var capabilities=await driver.InspectAsync(token);
if(capabilities.LocalFlightReady&&!currentSystemExtensionsAttempted&&!SystemFlightActive&&DateTimeOffset.UtcNow>=currentSystemExtensionRetryAt
&&(!Environment.GetCommandLineArgs().Contains("--system-map-only")||Environment.GetCommandLineArgs().Contains("--prepare-system-map-interfaces"))
&&!Environment.GetCommandLineArgs().Contains("--activity-only"))
{
currentSystemExtensionsAttempted=true;
var failed=false;
try{await driver.ConfigureOriginalDockingControlAsync(Path.Combine(NativeSupportPackage.Directory,"DockingControl"),token);runtime.ResolveDiagnostic("current-system.docking","星系内停靠","停靠扩展已连接。");}
catch(Exception error)when(!token.IsCancellationRequested)
{failed=true;runtime.ReportDiagnostic("current-system.docking","星系内停靠",error,ActivitySeverity.Warning,"停靠扩展未连接,暂不开放空间站自动停靠。");}
try
{
var channel=new NativeCruiseControlChannel(pid,hash);await channel.PrepareAsync(Path.Combine(NativeSupportPackage.Directory,"CruiseControl"),token);
await driver.ConfigureOriginalCruiseControlAsync(()=>runtime.Settings.NavigationFuelReserve,token:token,diagnostics:runtime.RecordScoDiagnostic);
runtime.ResolveDiagnostic("current-system.overcharge","星系内驾驶","SCO扩展已连接。");
}
catch(Exception error)when(!token.IsCancellationRequested)
{failed=true;runtime.ReportDiagnostic("current-system.overcharge","星系内驾驶",error,ActivitySeverity.Warning,"SCO暂未连接;可用航段仍支持普通超巡。");}
if(failed){currentSystemExtensionsAttempted=false;currentSystemExtensionRetryAt=DateTimeOffset.UtcNow.AddSeconds(30);}
capabilities=await driver.InspectAsync(token);
}
currentSystemCapabilities=capabilities;currentSystemCapabilitiesReadAt=DateTimeOffset.UtcNow;
SystemFlightReady=capabilities.LocalFlightReady&&capabilities.TelemetryReady;
UpdateSystemControlAvailability();
}
private string? CurrentSystemTargetIssue()
{
if(SelectedSystemLocation is not {} selected||currentSystemSnapshot is not {} snapshot)return "在场景或左侧列表选择目的地。";
if(selected.Record.Position is not {Finite:true})return "地点坐标尚未确认,暂不能自动前往。";
if(currentSystemCapabilities is not {} capabilities)return "正在检查当前游戏的驾驶接口。";
if(!capabilities.TelemetryReady)return capabilities.TelemetryIssue??"等待最新飞船遥测。";
if(currentSystemReadFailures>0)return "地点遥测正在恢复,暂不能启动驾驶。";
return SystemDestinationPolicy.UnsupportedReason(snapshot,selected.Record,capabilities,NavigationAssists.From(runtime.Player));
}
private void UpdateSystemControlAvailability()
{
var issue=CurrentSystemTargetIssue();
if(NavigationActive)issue="星图导航正在运行,停止后可开始星系内驾驶。";
else if(RunActive)issue="跑商任务正在运行,停止后可开始独立驾驶。";
else if(SessionBusy)issue="正在处理游戏会话,稍后可开始驾驶。";
SystemControlAvailability=issue??(SelectedSystemLocation?.Record.Category is SystemLocationCategory.Station or SystemLocationCategory.Carrier
?"可自动前往 · 原生停靠辅助接管进场":"可自动前往 · 工具箱控制超巡进近");
if(!SystemFlightActive)SystemFlightStatus=SystemControlAvailability;
StartSystemFlightCommand.NotifyCanExecuteChanged();
}
}
using XFEEDToolBox.Core.Native;
using XFEEDToolBox.Core.Navigation;
using XFEEDToolBox.Core.Services;
using XFEEDToolBox.NativeSupport;
namespace XFEEDToolBox.ViewModels;
public partial class ToolboxViewModel
{
private bool currentSystemExtensionsAttempted;
private DateTimeOffset currentSystemExtensionRetryAt;
private static SystemNavigationTarget SystemTarget(CurrentSystemSnapshot snapshot,SystemLocation location)
=>new(snapshot.SystemAddress,location.WorldAddress,location.Name,
location.Category is SystemLocationCategory.Station or SystemLocationCategory.Carrier?SystemTargetKind.Station:
location.Category==SystemLocationCategory.Settlement?SystemTargetKind.SurfacePort:SystemTargetKind.Orbit,location.MarketId)
{NativeKey=location.Key,NativeKind=location.NativeKind,NativeIdentity=location.Identity};
private async Task RefreshCurrentSystemControlAsync(int pid,string hash,CancellationToken token)
{
if(currentSystemCapabilityDriver is not NativeSystemFlightControlDriver driver)
{
Task Protection(CancellationToken cancellation)=>EnsureNativeFlightProtectionAsync(pid,hash,cancellation);
driver=new(pid,hash,()=>runtime.Player,new NativeGameInputChannel(pid,hash,NativeSupportPackage.Directory),Protection,useNativeSupercruiseAssist:false);
currentSystemCapabilityDriver=driver;currentSystemExtensionsAttempted=false;currentSystemCapabilitiesReadAt=default;
}
var capabilities=await driver.InspectAsync(token);
if(capabilities.LocalFlightReady&&!currentSystemExtensionsAttempted&&!SystemFlightActive&&DateTimeOffset.UtcNow>=currentSystemExtensionRetryAt
&&(!Environment.GetCommandLineArgs().Contains("--system-map-only")||Environment.GetCommandLineArgs().Contains("--prepare-system-map-interfaces"))
&&!Environment.GetCommandLineArgs().Contains("--activity-only"))
{
currentSystemExtensionsAttempted=true;
var failed=false;
try{await driver.ConfigureOriginalDockingControlAsync(Path.Combine(NativeSupportPackage.Directory,"DockingControl"),token);runtime.ResolveDiagnostic("current-system.docking","星系内停靠","停靠扩展已连接。");}
catch(Exception error)when(!token.IsCancellationRequested)
{failed=true;runtime.ReportDiagnostic("current-system.docking","星系内停靠",error,ActivitySeverity.Warning,"停靠扩展未连接,暂不开放空间站自动停靠。");}
try
{
var channel=new NativeCruiseControlChannel(pid,hash);await channel.PrepareAsync(Path.Combine(NativeSupportPackage.Directory,"CruiseControl"),token);
await driver.ConfigureOriginalCruiseControlAsync(()=>runtime.Settings.NavigationFuelReserve,token:token,diagnostics:runtime.RecordScoDiagnostic);
runtime.ResolveDiagnostic("current-system.overcharge","星系内驾驶","SCO扩展已连接。");
}
catch(Exception error)when(!token.IsCancellationRequested)
{failed=true;runtime.ReportDiagnostic("current-system.overcharge","星系内驾驶",error,ActivitySeverity.Warning,"SCO暂未连接;可用航段仍支持普通超巡。");}
if(failed){currentSystemExtensionsAttempted=false;currentSystemExtensionRetryAt=DateTimeOffset.UtcNow.AddSeconds(30);}
capabilities=await driver.InspectAsync(token);
}
currentSystemCapabilities=capabilities;currentSystemCapabilitiesReadAt=DateTimeOffset.UtcNow;
SystemFlightReady=capabilities.LocalFlightReady&&capabilities.TelemetryReady;
UpdateSystemControlAvailability();
}
private string? CurrentSystemTargetIssue()
{
if(SelectedSystemLocation is not {} selected||currentSystemSnapshot is not {} snapshot)return "在场景或左侧列表选择目的地。";
if(selected.Record.Position is not {Finite:true})return "地点坐标尚未确认,暂不能自动前往。";
if(currentSystemCapabilities is not {} capabilities)return "正在检查当前游戏的驾驶接口。";
if(!capabilities.TelemetryReady)return capabilities.TelemetryIssue??"等待最新飞船遥测。";
if(currentSystemReadFailures>0)return "地点遥测正在恢复,暂不能启动驾驶。";
return SystemDestinationPolicy.UnsupportedReason(snapshot,selected.Record,capabilities,NavigationAssists.From(runtime.Player));
}
private void UpdateSystemControlAvailability()
{
var issue=CurrentSystemTargetIssue();
if(NavigationActive)issue="星图导航正在运行,停止后可开始星系内驾驶。";
else if(RunActive)issue="跑商任务正在运行,停止后可开始独立驾驶。";
else if(SessionBusy)issue="正在处理游戏会话,稍后可开始驾驶。";
SystemControlAvailability=issue??(SelectedSystemLocation?.Record.Category is SystemLocationCategory.Station or SystemLocationCategory.Carrier
?"可自动前往 · 原生停靠辅助接管进场":"可自动前往 · 工具箱控制超巡进近");
if(!SystemFlightActive)SystemFlightStatus=SystemControlAvailability;
StartSystemFlightCommand.NotifyCanExecuteChanged();
}
}