Тема: AHK: изменение скорости процесса игры
В общем, все знают что в CE есть функця "speed hack" хотелосьбы узнать как можно аналогично данной функции изменить скорость процесса игры.
Чем проще примерчик тем лучше:)
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
В общем, все знают что в CE есть функця "speed hack" хотелосьбы узнать как можно аналогично данной функции изменить скорость процесса игры.
Чем проще примерчик тем лучше:)
В общем, все знают что в CE есть функця "speed hack"
Я не знал.
хотелосьбы узнать как можно аналогично данной функции изменить скорость процесса игры.
Интервал между фреймами в играх под Windows обычно замеряют функцией timeGetTime. Поэтому нужно перехватывать эту функцию и править возвращаемое значение. Это задача не для AHK, без dll тут придётся много ассемблерного кода написать.
на сайте СЕ в исходниках нашёл это , вроде как это должно отвечать за спид хак в связки с DLL
unit speedhack2;
{$MODE Delphi}
interface
uses Classes,LCLIntf, SysUtils, NewKernelHandler,CEFuncProc, symbolhandler,
autoassembler, dialogs,Clipbrd;
type TSpeedhack=class
private
processid: dword;
initaddress: ptrUint;
public
procedure setSpeed(speed: single);
constructor create;
destructor destroy; override;
end;
var speedhack: TSpeedhack;
implementation
uses frmAutoInjectUnit;
constructor TSpeedhack.create;
var i: integer;
script: tstringlist;
AllocArray: TCEAllocArray;
x,y: dword;
a,b: ptrUint;
begin
initaddress:=0;
try
if processhandler.is64bit then
injectdll(CheatEngineDir+'speedhack-x86_64.dll','')
else
injectdll(CheatEngineDir+'speedhack-i386.dll','');
symhandler.reinitialize;
symhandler.waitforsymbolsloaded;
except
raise exception.Create('Failure enabling speedhack. (DLL injection failed)');
end;
script:=tstringlist.Create;
try
script.Add('alloc(init,512)');
//check if it already has a a speedhack script running
a:=symhandler.getAddressFromName('realgettickcount') ;
b:=0;
readprocessmemory(processhandle,pointer(a),@b,processhandler.pointersize,x);
if b<>0 then //already configured
generateAPIHookScript(script, 'GetTickCount', 'speedhackversion_GetTickCount')
else
generateAPIHookScript(script, 'GetTickCount', 'speedhackversion_GetTickCount', 'realgettickcount');
try
setlength(AllocArray,0);
autoassemble(script,false,true,false,false,AllocArray);
//fill in the address for the init region
for i:=0 to length(AllocArray)-1 do
if AllocArray[i].varname='init' then
begin
initaddress:=AllocArray[i].address;
break;
end;
except
raise exception.Create('Failure configuring speedhack part 1');
end;
//timegettime
script.Clear;
script.Add('timeGetTime:');
script.Add('jmp speedhackversion_GetTickCount');
try
autoassemble(script,false);
except //don't mind
end;
script.clear;
a:=symhandler.getAddressFromName('realQueryPerformanceCounter') ;
b:=0;
readprocessmemory(processhandle,pointer(a),@b,processhandler.pointersize,x);
if b<>0 then //already configured
generateAPIHookScript(script, 'QueryPerformanceCounter', 'speedhackversion_QueryPerformanceCounter')
else
generateAPIHookScript(script, 'QueryPerformanceCounter', 'speedhackversion_QueryPerformanceCounter', 'realQueryPerformanceCounter');
try
autoassemble(script,false);
except //do mind
raise exception.Create('Failure configuring speedhack part 2');
end;
finally
script.free;
end;
setspeed(1);
processid:=cefuncproc.processid;
end;
destructor TSpeedhack.destroy;
var script: tstringlist;
i: integer;
x: dword;
begin
if processid=cefuncproc.ProcessID then
begin
try
setSpeed(1);
except
end;
end;
//do not undo the speedhack script (not all games handle a counter that goes back)
end;
procedure TSpeedhack.setSpeed(speed: single);
var x: single;
script: Tstringlist;
begin
x:=speed;
script:=tstringlist.Create;
try
script.add('CreateThread('+inttohex(initaddress,8)+')');
script.add('label(newspeed)');
script.add(inttohex(initaddress,8)+':');
if processhandler.is64Bit then
begin
script.add('sub rsp,#32');
script.add('movss xmm0,[newspeed]');
script.add('push rcx');
end
else
script.add('push [newspeed]');
script.add('call InitializeSpeedhack');
if processhandler.is64Bit then
script.add('add rsp,#40');
script.add('ret');
script.add('newspeed:');
script.add('dd '+inttohex(pdword(@x)^,8));
try
// showmessage(script.Text);
Clipboard.AsText:=script.text;
autoassemble(script,false);
except
raise exception.Create('Failure setting speed');
end;
finally
script.free;
end;
end;
end.
может кто понимает что тут написано я на Delphi ещё не разу не пробовал работать
(dll-библиотеки чучуть попоже залью)
может кто понимает что тут написано я на Delphi ещё не разу не пробовал работать
Это не весь исходник. Сначала там идёт инжект другой dll, в зависимости от разрядности системы, потом перехват функций GetTickCount, timeGetTime и QueryPerformanceCounter. Заканчивается листинг функцией установки коэффициента ускорения.
Я бы на вашем месте не стал ковырять этот код, а просто переписал бы его на хорошо знакомом языке программирования. Для перехвата функций microsoft предлагает готовую библиотеку Detours.
winstan пишет:может кто понимает что тут написано я на Delphi ещё не разу не пробовал работать
Это не весь исходник. Сначала там идёт инжект другой dll, в зависимости от разрядности системы, потом перехват функций GetTickCount, timeGetTime и QueryPerformanceCounter. Заканчивается листинг функцией установки коэффициента ускорения.
Я бы на вашем месте не стал ковырять этот код, а просто переписал бы его на хорошо знакомом языке программирования. Для перехвата функций microsoft предлагает готовую библиотеку Detours.
в общемто хочется чтобы всё делать обной программной.
Сейчас в нужные моменты я ускаряю игру через скрип (он узнает по некоторым усолвиям когда над ускорить процес) и СЕ в которую по горячим клавишам посылаеются команды от скрипта
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться