⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 directx9hook.pas.svn-base

📁 这是一段游戏修改工具的源代码.ring3功能由dephi开发,驱动是C开发.希望对大家有帮助
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
      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 + -