📄 directx9hook.pas.svn-base
字号:
desc.Width:=0; desc.Weight:=0; desc.MipLevels:=1; desc.Italic:=false; desc.CharSet:=DEFAULT_CHARSET; desc.OutputPrecision:=0; desc.Quality:=DEFAULT_QUALITY ; desc.PitchAndFamily:=DEFAULT_PITCH; desc.FaceName:='Courier'; //Why doesn't the font creation in dx9 work on a intel 82815 graphics controller, but the dx8 version does work ? d3dx9.d3dxcreatefontindirectA(ReturnedDeviceInterface,@desc,CEFont); end; end; if result=0 then fixhook(ReturnedDeviceInterface);end;function IDirect3DDevice9_Reset_Hook(const self: IDirect3DDevice9 ;var PresentationParameters : TD3DPresentParameters) : HResult; stdcall;var i: integer; err: dword;begin try mysprite.OnLostDevice; cefont.OnLostDevice; fillmemory(@texturelist[0],length(texturelist)*sizeof(TTextureInfo),0); fillmemory(@lockedtexturelist[0],length(texturelist)*sizeof(TTextureInfo),0); setlength(texturelist,0); setlength(lockedtexturelist,0); except end; texturepointer:=-1; err:=TIDirect3DDevice9_Reset_Original(IDirect3DDevice9_Reset.location)(self,PresentationParameters); try if err=0 then begin mysprite.OnResetDevice; cefont.OnResetDevice; end else begin resetdevice:=true; end; except //outputdebugstring('Error in my reset routine'); end; result:=err;end;function IDirect3DDevice9_CreateTexture_Hook(const self: IDirect3DDevice9 ;const Width, Height, Levels : Cardinal; const Usage : LongWord; Format : TD3DFormat; Pool : TD3DPool; out Texture : IDirect3DTexture9; SharedHandle : PHandle) : HResult; stdcall;var i: integer; x: dword;begin result:=TIDirect3DDevice9_CreateTexture_Original(IDirect3DDevice9_CreateTexture.location)(self,width,height,levels,usage,format,pool,texture,sharedhandle); if imdrawing then exit; if not ((usage=0) and (pool=D3DPOOL_DEFAULT)) then begin i:=length(texturelist); setlength(texturelist,i+1); copymemory(@texturelist[i].texturehandle,@texture,4); texturelist[i].Width:=width; texturelist[i].Height:=height; texturelist[i].Levels:=levels; texturelist[i].Usage:=usage; texturelist[i].Format:=format; texturelist[i].Pool:=pool; texturelist[i].locked:=false; if texturepointer=-1 then texturepointer:=0; end; if result=0 then begin //hook release virtualprotect(pdword(pdword(dword(Texture))^+4*2),4,PAGE_EXECUTE_READWRITE,x); if IDirect3DTexture9_release.location=nil then IDirect3DTexture9_release.location:=pointer(pdword(pdword(dword(Texture))^+4*2)^); pdword(pdword(dword(Texture))^+4*2)^:=dword(@IDirect3DTexture9_release_Hook); virtualprotect(pdword(pdword(dword(Texture))^+4*2),4,x,x); end;end;function IDirect3DDevice9_BeginScene_Hook(const self: IDirect3DDevice9): HResult; stdcall;begin setlength(xylist,0); result:=TIDirect3DDevice9_BeginScene_Original(IDirect3DDevice9_BeginScene.location)(self);end;procedure DrawHotkeylist9(const self: IDirect3DDevice9;vp:td3dviewport9);var position,scale: td3dxvector3; transform: td3dmatrix; pdesc: TD3DSurface_Desc; i: integer; r: trect;begin mysprite._Begin(D3DXSPRITE_ALPHABLEND); if blacktexture.GetLevelDesc(0,pdesc)=0 then begin scale.x:=requiredkeylistwidth / pdesc.Width; scale.y:=requiredkeylistheight / pdesc.Height; scale.z:=1; end else begin scale.x:=requiredkeylistwidth; scale.y:=requiredkeylistheight; scale.z:=1; end; position.x:=vp.Width-requiredkeylistwidth; position.y:=0; position.z:=0; D3DXMatrixTransformation(transform,nil,nil,scale,nil,nil,position); mysprite.SetTransform(transform); mysprite.Draw(blacktexture,nil,nil,nil,D3DCOLOR_ARGB(127,255,255,255)); D3DXMatrixScaling(transform,1,1,1); mysprite.SetTransform(transform); mysprite._End; //draw the strings in the box r.Left:=vp.Width-requiredkeylistwidth+1; r.Top:=0; r.Bottom:=r.left+16; r.Right:=vp.Width; for i:=0 to keylist.Count-1 do begin r.Top:=i*16; r.Bottom:=i*16+(r.left+16); cefont.DrawTextA(nil,pchar(keylist[i]),length(keylist[i]),r,0,D3DCOLOR_ARGB(240,255,255,255)); end; end;function IDirect3DDevice9_EndScene_Hook(const self: IDirect3DDevice9): HResult; stdcall;var i: integer; r: trect; scale:td3dxvector3; position: td3dxvector3; desc: TD3Dsurface_desc; transform,transform2: td3dmatrix; closest: integer; closestsqr1: single; closestsqr2: single; vp: Td3dViewport9; tempstring: string; tempsingle: single; xd,yd: single; xd2,yd2: integer; start,stop: integer; curtime:dword;begin position.z:=0; try imdrawing:=true; try dontsetlastworldmatrix:=true; dontsetlastprojectionmatrix:=true; dontsetlastviewmatrix:=true; self.GetViewport(vp); mysprite._Begin(D3DXSPRITE_ALPHABLEND); try if callibrationmode then begin //draw texture string position.x:=0; position.y:=0; position.z:=0; mysprite.Draw(texturestringtexture,nil,nil,@position,D3DCOLOR_ARGB(127,255,255,255)); if texturepointer>=0 then begin position.y:=16; scale.z:=1; try tempstring:=format('texturepointer=%d',[texturepointer]); r.left:=trunc(position.x)+100; r.Top:=trunc(position.y)+16; r.Right:=trunc(position.x)+100+800; r.Bottom:=trunc(position.y)+16+16; cefont.DrawTextA(nil,pchar(tempstring),length(tempstring),r,0,D3DCOLOR_ARGB(255,255,255,255)); if texturelist[texturepointer].texturehandle.GetLevelDesc(0,desc)=0 then begin scale.x:=100 / desc.Width; scale.y:=100 / desc.Height; end else begin scale.x:=1; scale.y:=1; end; D3DXMatrixTransformation(transform,nil,nil,scale,nil,nil,position); mysprite.SetTransform(transform); mysprite.Draw(texturelist[texturepointer].texturehandle,nil,nil,nil,D3DCOLOR_ARGB(127,255,255,255)); D3DXMatrixScaling(transform,1,1,1); mysprite.SetTransform(transform); except removetexture(texturepointer); end; position.y:=116; if texturelist[texturepointer].locked then begin mysprite.Draw(lockedstringtexture,nil,nil,@position,D3DCOLOR_ARGB(127,255,255,255)); tempstring:=format('x=%.1f y=%.1f z=%.1f',[texturelist[texturepointer].xdelta, texturelist[texturepointer].ydelta, texturelist[texturepointer].zdelta]); r.left:=trunc(position.x)+10; r.Top:=trunc(position.y)+16; r.Right:=trunc(position.x)+10+800; r.Bottom:=trunc(position.y)+16+16; cefont.DrawTextA(nil,pchar(tempstring),length(tempstring),r,0,D3DCOLOR_ARGB(255,0,255,0)); end else mysprite.Draw(unlockedstringtexture,nil,nil,@position,D3DCOLOR_ARGB(127,255,255,255)); end; end; closest:=0; closestsqr2:=-1; if length(xylist)>0 then closestsqr2:=(abs((vp.Width/2)-(xylist[0].x)))*(abs((vp.height/2)-(xylist[0].y))); for i:=0 to length(xylist)-1 do begin position.x:=xylist[i].x-8; //I thought it would be -4.... position.y:=xylist[i].y-8; mysprite.Draw(targettexture,nil,nil,@position,D3DCOLOR_ARGB(255,255,255,255)); tempstring:=format('(%.3f,%.3f,%.3f)',[xylist[i].x,xylist[i].y,xylist[i].z]); r.left:=trunc(position.x)+10; r.Top:=trunc(position.y); r.Right:=trunc(position.x)+10+800; r.Bottom:=trunc(position.y)+16; cefont.DrawTextA(nil,pchar(tempstring),length(tempstring),r,0,D3DCOLOR_ARGB(255,0,255,0)); closestsqr1:=(abs((vp.Width/2)-(xylist[i].x)))*(abs((vp.height/2)-(xylist[i].y))); if closestsqr2>closestsqr1 then begin closestsqr2:=closestsqr1; closest:=i; end; end; //lock on to something if there is something if length(xylist)>0 then begin //put in xd and yd the distance between the closest object and the screencenter xd:=xylist[closest].x-(vp.Width/2); yd:=xylist[closest].y-(vp.height/2); //----------------------------------------------------- //extrapolate the speed of the player when there is lag between pressing fire and actually shooting //Doesn't handle acceleration or decceleration, just if it is using a constant speed (standing still is also a constant speed...) inc(bbb); if (bbb mod 4)=0 then //get oldpos if b mod 4=0 begin oldpos:=xylist[closest]; //store current position QueryPerformanceCounter(lasttick); //store current time bbb:=4; //I hate overflows end; if (bbb mod 4)=2 then //calculate the new speed(assuming the player is moving with a constant speed) begin //calculate new speed QueryPerformanceCounter(newtick); tickssincelastdraw:=newtick-lasttick; mssincelastdraw:=tickssincelastdraw*onetick; xdelta:=xylist[closest].x-oldpos.x; ydelta:=xylist[closest].y-oldpos.y; //delta now contains the location differences since 3 frames ago //delta devided by the time since the oldpos and the newpos is the position change per milisecond //positionchange per milisecond multiplied by the ammount of milliseconds you want to be in fron if usefpslag then begin fpslag:=mssincelastdraw/2; //there where 2 draws since the start of the measurement xdelta:=(xdelta/mssincelastdraw)*(lag+lagfrommemory+fpslag); ydelta:=(ydelta/mssincelastdraw)*(lag+lagfrommemory+fpslag); end else begin xdelta:=(xdelta/mssincelastdraw)*(lag+lagfrommemory); ydelta:=(ydelta/mssincelastdraw)*(lag+lagfrommemory); end; end; if zoom=1 then begin position.x:=xylist[closest].x-8+xdelta; position.y:=xylist[closest].y-8+ydelta; mysprite.draw(movementtexture,nil,nil,@position,D3DCOLOR_ARGB(255,255,255,255)); end; if (bbb mod 4>=2) then //move the mouse, after recalculating the speed or when it's doing nothing begin //modify xd and yd with the predicted location (so move the mouse to the predicted location instead of the current location) xd:=xd+xdelta; yd:=yd+ydelta; //-------------------------------------------------------------- if autoaim then begin xd2:=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -