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

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using System.Runtime.InteropServices;

namespace XFEEDToolBox.Plugin;

internal static unsafe partial class Navigation
{
    static uint GalaxyPowerOuterSelfTest()
    {
        var memory=Platform.Allocate(0x20000);if(memory==0)return 0;
        try
        {
            // Only private allocations. The two expected navigation vtables
            // are inside this allocation; no game code pointer is invoked.
            var expectedImage=memory+0x10000-0x552A9B8;var manager=memory+0x1000;var service=manager+0x58;
            var owner=memory+0x2000;var navigation=memory+0x3000+0x58;var navigationOwner=memory+0x2200;
            var metadata=memory+0x4000;var obj=memory+0x5000;var compact=memory+0x6000;var node=memory+0x7000;
            var buckets=memory+0x8000;var empty=memory+0x8100;const ulong centre=9007199254740995UL,target=9007199254741119UL;
            Write(manager,expectedImage+0x51BB4D0);Write(manager+8,expectedImage+0x51BB500);Write(service,expectedImage+0x51BB600);Write(manager+0x10,owner);
            Write(service+0x308,(byte)1);Write(service+0x309,(byte)1);Write(service+0x30A,(byte)1);Write(service+0x3E8,100f);
            Write(navigation,expectedImage+0x552A9B8);Write(expectedImage+0x552A9B8+0x50,expectedImage+0x21E8CB0);
            Write(navigation-0x48,navigationOwner);Write(navigation+0x2B0,obj);
            Write(obj+0x20,2U);Write(obj+0x28,centre);Write(obj+0x38,compact);Write(compact,centre);
            Write(compact+0x42,(ushort)64);Write(compact+0x44,(ushort)96);Write(compact+0x46,(ushort)128);
            Write(metadata,expectedImage+0x551A1B0);Write(metadata+0xA8,buckets);Write(metadata+0xB0,1UL);Write(metadata+0xC0,1UL);
            Write(metadata+0xC8,empty);Write(metadata+0xD0,1UL);Write(metadata+0xE0,0UL);Write(empty,empty);
            Write(buckets,node);Write(node,buckets);Write(node+8,target);Write(node+0x40,memory+0x9000);
            bool Context(out GalaxyPowerOuterContext value)=>CopyGalaxyPowerOuterContext(service,owner,navigation,metadata,expectedImage,[0,0,0],out value);
            uint passed=0;
            if(!Context(out var context))return 0;
            double[] Point(double delta=0)=>[context.centrePosition.x+delta,context.centrePosition.y,context.centrePosition.z];
            bool Visible(double delta,out bool? value)=>CopyGalaxyPowerOuterVisible(context,target,Point(delta),out value);
            if(context.centreSystemAddress==centre&&context.radius==100&&context.centreOffsetX==64&&context.source=="original-power-outer-activities-context")passed|=1;
            if(Visible(0,out var visible)&&visible==true)passed|=2;
            if(Visible(100,out visible)&&visible==true&&Visible(100.03125,out visible)&&visible==false)passed|=4;
            if(CopyGalaxyPowerOuterVisible(context,target+1,Point(),out visible)&&visible is null)passed|=8;
            Write(node+0x40,(nuint)0);
            if(Visible(0,out visible)&&visible==false)passed|=16;
            Write(node+0x40,memory+0x9000);Write(node+0x1E0,(byte)1);var states=true;
            foreach(var state in new[]{0,33,34,35,36,37,38,39})
            {Write(node+0x170,state);states&=Visible(0,out visible)&&visible==(state is 0 or 33 or 37 or 39);}
            if(states)passed|=32;
            Write(service+0x30A,(byte)0);
            if(!Context(out _)&&!Visible(0,out visible)&&visible is null)passed|=64;
            Write(service+0x30A,(byte)1);Write(node+0x170,-1);
            var badState=Visible(0,out visible)&&visible is null;Write(node+0x1E0,(byte)2);
            if(badState&&Visible(0,out visible)&&visible is null)passed|=128;
            Write(node+0x1E0,(byte)0);Write(navigation+0x2B0,(nuint)0);
            if(!Visible(0,out visible)&&visible is null)passed|=256;
            Write(navigation+0x2B0,obj);Write(compact+0x42,(ushort)65);
            if(!Visible(0,out visible)&&visible is null)passed|=512;
            Write(compact+0x42,(ushort)64);Write(service+0x3E8,101f);
            if(!Visible(0,out visible)&&visible is null)passed|=1024;
            Write(service+0x3E8,100f);Write(navigation-0x48,navigationOwner+8);
            if(!Visible(0,out visible)&&visible is null)passed|=2048;
            Write(navigation-0x48,navigationOwner);
            if(!CopyGalaxyPowerOuterVisible(context,target,[double.NaN,0,0],out visible)&&visible is null&&
               !CopyGalaxyPowerOuterVisible(context,0,Point(),out visible)&&visible is null)passed|=4096;
            Write(navigation,expectedImage+0x552AE60);Write(expectedImage+0x552AE60+0x50,expectedImage+0x56FCB0);Write(navigation+0xD8,obj);
            if(Context(out var alternate)&&alternate.centreSystemAddress==centre&&CopyGalaxyPowerOuterVisible(alternate,target,Point(),out visible)&&visible==true)passed|=8192;
            Write(navigation,expectedImage+0x552A9B8);
            if(CopyGalaxyPowerOuterContext(service,owner,navigation,0,expectedImage,[0,0,0],out var missing)&&
               CopyGalaxyPowerOuterVisible(missing,target,Point(),out visible)&&visible is null&&
               CopyGalaxyPowerOuterVisible(missing,target,Point(101),out visible)&&visible==false)passed|=16384;
            var before=Platform.ReadBytes(memory,0x20000);var noWrites=Context(out _)&&Visible(0,out visible)&&visible==true&&
                Platform.ReadBytes(memory,0x20000).AsSpan().SequenceEqual(before);
            Write(service+0x3E8,0f);if(noWrites&&!Context(out _))passed|=32768;
            return passed;
        }
        finally{Platform.Free(memory);}
    }
#if PLUGIN_NAVIGATION
    [UnmanagedCallersOnly(EntryPoint="XFENavigationGalaxyPowerOuterSelfTest")]
    internal static uint ExportGalaxyPowerOuterSelfTest()=>RunTest(GalaxyPowerOuterSelfTest);
#endif
}