XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
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;
    }
}