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

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
'use strict';
const mod=Process.getModuleByName('EliteDangerous64.exe');
if(Process.id!==BINDINGS.pid||mod.path.toLowerCase()!==PROFILE.image.toLowerCase())throw Error('Selected process image changed');
const base=mod.base,life=ptr(BINDINGS.life),pose=ptr(BINDINGS.pose),fsd=ptr(BINDINGS.fsd),nav=ptr(BINDINGS.navigation);
const method=(obj,offset)=>obj.readPointer().add(offset).readPointer();
for(const [offset,rva] of [[0x20,0x2EC81C0],[0x60,0x2EC8AA0],[0x90,0x2ED6900],[0xB8,0x2EC8E20]])if(!method(nav,offset).equals(base.add(rva)))throw Error('Native navigation binding changed');
if(!method(pose,0x60).equals(base.add(0x2D9C2C0)))throw Error('Native world-address getter changed');
const getTarget=new NativeFunction(method(nav,0x20),'pointer',['pointer','int']);
const lockTarget=new NativeFunction(method(nav,0x90),'void',['pointer','int','uchar','pointer']);
const getSelected=new NativeFunction(method(nav,0xB8),'pointer',['pointer']);
const getDirection=new NativeFunction(method(nav,0x60),'void',['pointer','pointer','pointer','pointer','pointer','pointer']);
const source=Memory.alloc(160),distance=Memory.alloc(16),direction=Memory.alloc(16);
let locked=false,busy=false,last=0;
const valid=()=>Process.getCurrentThreadId()===BINDINGS.thread&&life.add(0xC0).readU32()===8&&life.add(0xB0).readU64().toString()===BINDINGS.entity&&fsd.add(0x320).readPointer().equals(pose)&&fsd.add(0x338).readPointer().equals(nav);
Interceptor.attach(base.add(0x2D9C2C0),{
    onEnter(args){this.selected=!busy&&args[0].equals(pose)&&valid();},
    onLeave(ret){
        if(!this.selected||busy||Date.now()-last<200)return;
        busy=true;
        try{
            if(!valid())return;
            if(!locked){
                if(fsd.add(0x758).readU8()!==2||ptr(BINDINGS.physics).add(0x6A8).readFloat()>=1)throw Error('Target calibration requires an idle stationary ship');
                const target=getTarget(nav,BINDINGS.target.key);
                if(target.isNull()||target.add(0x20).readU64().toString()!==BINDINGS.target.worldAddress||target.add(0x188).readU32()!==2||target.add(0x184).readU32()!==0)throw Error('Existing system target changed');
                const text=target.add(0x140).readPointer();if(text.isNull()||text.readU64().compare(128)>0||text.add(0x14).readUtf8String(text.readU64().toNumber())!==BINDINGS.target.name)throw Error('Target name changed');
                const previous=getSelected(nav);
                const needsLock=previous.isNull()||previous.add(0x20).readU64().toString()!==BINDINGS.target.worldAddress;
                if(needsLock)lockTarget(nav,BINDINGS.target.key,1,ptr(0));
                const selected=getSelected(nav);
                if(selected.isNull()||selected.add(0x20).readU64().toString()!==BINDINGS.target.worldAddress)throw Error('Original target lock was not confirmed');
                locked=true;send({kind:'original-target-lock',at:new Date().toISOString(),invoked:needsLock,key:BINDINGS.target.key,name:BINDINGS.target.name,worldAddress:BINDINGS.target.worldAddress,thread:Process.getCurrentThreadId()});
            }
            const selected=getSelected(nav);if(selected.isNull()||selected.add(0x20).readU64().toString()!==BINDINGS.target.worldAddress)throw Error('Locked target changed');
            source.writeByteArray(pose.add(0xE8).readByteArray(160));
            // Match the FSD caller's invalid optional override: the original getter chooses its own current source.
            source.writeU64(0);
            getDirection(nav,distance,selected.add(0xC0),selected.add(0x20),direction,source);
            const vector=[direction.readFloat(),direction.add(4).readFloat(),direction.add(8).readFloat()],length=Math.hypot(...vector),metres=distance.readFloat();
            if(!Number.isFinite(metres)||metres<=0||!Number.isFinite(length)||Math.abs(length-1)>.005)throw Error('Native target direction/distance failed validation');
            send({kind:'target-direction',at:new Date().toISOString(),worldAddress:pose.add(0xE8).readU64().toString(),nativeSourceFallback:true,targetAddress:BINDINGS.target.worldAddress,direction:vector,distanceMetres:metres,distanceLy:metres/9460730472580800,unitLength:length});
            last=Date.now();
        }catch(error){send({kind:'error',error:String(error)});last=Date.now()+60000;}
        finally{busy=false;}
    }
});
send({kind:'ready',pid:Process.id,screenUse:false,flightInputsSent:0});