using XFEEDToolBox.NativeSupport; using XFEEDToolBox.Core.Execution; using XFEEDToolBox.Core.Models; using XFEEDToolBox.Core.Native; using XFEEDToolBox.Core.Navigation; namespace XFEEDToolBox.ViewModels; public partial class ToolboxViewModel { private async Task CreateNativeTradeDriverAsync(RoutePlan plan,CancellationToken token,NativeTradeBatchPolicy? requestedBatch=null,string? operationsDirectory=null) { await RequirePluginTradeAsync(); var flight=runtime.FlightDriver as NativeFlightControlDriver??throw new InvalidOperationException("工具箱的原生导航驱动尚未就绪。"); var pid=flight.ProcessId;var hash=NativeSystemLocationReader.GameSha256; Task Protection(CancellationToken cancellation)=>EnsureNativeFlightProtectionAsync(pid,hash,cancellation); await Protection(token); var batch=requestedBatch??(plan.Legs.Any(leg=>leg.Quantity>1) ?new NativeTradeBatchPolicy(runtime.Player.CargoCapacity,Math.Max(runtime.Player.Rebuy,plan.Request.ReserveCredits)):null); var navigation=new NativeTradeNavigation(pid,hash,()=>runtime.Player,NativeSupportPackage.Directory, ()=>runtime.Settings.NavigationFuelReserve,Protection,runtime.FlightAutomation,runtime.RecordScoDiagnostic, ()=>Math.Max(runtime.Player.Rebuy,batch?.ReserveCredits??plan.Request.ReserveCredits)); var lastStatus=""; navigation.Status+=message=>{if(lastStatus==message)return;lastStatus=message;dispatcher.TryEnqueue(()=>RunMessage=message);runtime.Log("自动跑商",message);}; var directory=operationsDirectory??Path.Combine(runtime.DataDirectory,"native-trade-operations"); var driver=new NativeTradeCommandDriver(new NativeCommerceChannel(pid),()=>runtime.Player,directory,navigation.TravelAsync,Protection,batchPolicy:batch) {JournalDirectory=runtime.Settings.JournalDirectory,FlightSafetyActiveProvider=()=>navigation.FlightSafetyActive,RunningMenuRecoveryFactory=navigation.EnterRunningMenuRecovery}; navigation.WalletObserved+=runtime.ObserveNativeWallet;navigation.ServiceConfirmed+=driver.ObserveJourneyService; driver.WalletObserved+=runtime.ObserveNativeWallet;driver.Status+=message=>{dispatcher.TryEnqueue(()=>RunMessage=message);runtime.Log("自动跑商",message);}; return driver; } }