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<NativeTradeCommandDriver> 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;
}
}
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<NativeTradeCommandDriver> 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;
}
}