📄 directx9hook.pas
字号:
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 + -