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

📄 directx9hook.pas

📁 冒险岛吸怪源码UCE的制作材料 用于冒险岛游戏的外挂
💻 PAS
📖 第 1 页 / 共 5 页
字号:
    cefonthandle.Color:=clred;
    cefonthandle.Name:='Courier';

    if GetObject(cefonthandle.handle, SizeOf(TLogFont), @logfont)<>0 then
    begin
      desc.Height:=logfont.lfHeight;
      desc.Width:=logfont.lfWidth;
      desc.Weight:=logfont.lfWeight;
      desc.MipLevels:=0;
      desc.Italic:=false;
      desc.CharSet:=logfont.lfCharSet;
      desc.OutputPrecision:=logfont.lfOutPrecision;
      desc.Quality:=logfont.lfQuality;
      desc.PitchAndFamily:=logfont.lfPitchAndFamily;

      copymemory(@desc.FaceName[0],@logfont.lfFaceName[0],32);

      desc.Height:=0;
      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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -