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

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
namespace XFEEDToolBox.Plugin;

internal static unsafe partial class Navigation
{
    // DockingUpdate reads this original logical ForwardReverseThrust source.
    // The controller's +680 cache and the materialized inputRoot +70 are
    // separate consumers and cannot prove that this source reached zero.
    private static bool ReadOriginalDockingThrottle(nuint computer,out float value)
    {
        value=float.NaN;
        try
        {
            if(computer<0x10000)return false;
            var source=Pointer(computer+0x260);
            if(source<0x10000)return false;
            value=Read<float>(source+0x18);
            return float.IsFinite(value)&&Math.Abs(value)<=1.001f&&Pointer(computer+0x260)==source;
        }
        catch{return false;}
    }
    private static bool LocalDockingSourceZeroConfirmed(bool nativeDuty,bool inputSent,float controllerThrottle,double actualThrottle,double sourceThrottle)
        =>nativeDuty||LocalDockingZeroConfirmed(false,inputSent,controllerThrottle,actualThrottle)
            &&double.IsFinite(sourceThrottle)&&Math.Abs(sourceThrottle)<=.001;
    private static uint DockingSourceZeroSelfTest()
    {
        uint passed=0;
        if(!LocalDockingSourceZeroConfirmed(false,true,0,0,.75))passed|=1;
        if(LocalDockingSourceZeroConfirmed(false,true,0,0,0))passed|=2;
        if(!LocalDockingSourceZeroConfirmed(false,false,0,0,0))passed|=4;
        if(!LocalDockingSourceZeroConfirmed(false,true,.5f,0,0)&&!LocalDockingSourceZeroConfirmed(false,true,0,.75,0))passed|=8;
        if(!LocalDockingSourceZeroConfirmed(false,true,0,0,double.NaN)&&!LocalDockingSourceZeroConfirmed(false,true,0,0,double.PositiveInfinity))passed|=16;
        if(LocalDockingSourceZeroConfirmed(true,false,-100,.75,.75))passed|=32;
        if(!ReadOriginalDockingThrottle(0,out _)&&!ReadOriginalDockingThrottle(1,out _))passed|=64;
        var memory=Platform.Allocate(1024);if(memory==0)return passed;
        try
        {
            var source=memory+768;Write(memory+0x260,source);Write(source+0x18,.75f);
            var rejected=ReadOriginalDockingThrottle(memory,out var value)&&value==.75f&&!LocalDockingSourceZeroConfirmed(false,true,0,0,value);
            Write(source+0x18,0f);
            if(rejected&&ReadOriginalDockingThrottle(memory,out value)&&LocalDockingSourceZeroConfirmed(false,true,0,0,value))passed|=128;
        }
        finally{Platform.Free(memory);}
        return passed;
    }
#if PLUGIN_NAVIGATION
    [UnmanagedCallersOnly(EntryPoint="XFENavigationDockingSourceZeroSelfTest")]
    internal static uint ExportDockingSourceZeroSelfTest()=>RunTest(DockingSourceZeroSelfTest);
#endif
}