Добрался до перемещений перса.
Спасибо мужику за адреса инжектов.
Вот код исправленный и дополненный:
7й дельфи почему-то не захотел работать с двордом в колле - пришлось вводить в ТПарамс еще и кардинал (
aPlayer.TransportMode: Cardinal. Но нужно не забывать, что на самом деле это байт(!). И получать его нужно:
result.TransportMode := getBYTE(playerPointer + $60D);
Гет функции, что я юзаю:
Спасибо мужику за адреса инжектов.
Вот код исправленный и дополненный:
Code:
Type
PParams = ^TParams;
TParams = packed record
Param1: DWORD;
Param2: DWORD;
Param3: single;
Param4: single;
Param5: single;
Param6: byte;
Param7: Cardinal;
end;
aBaseAddress = $009771BC; //base address for getting info
...
aBasePointer := getDWORD(aBaseAddress);
...
PW_Base_Call = $00976B1C; //base address for injections
PW_Walk_Call1 = $00461FD0; //addresses for walk injection
PW_Walk_Call2 = $00465AB0; //addresses for walk injection
PW_Walk_Call3 = $004623D0; //addresses for walk injection
procedure WalkCall(aPParams:PParams); Stdcall;
var
Address1: pointer;
Address2: pointer;
Address3: pointer;
x, y, z : single;
flying : Cardinal;
begin
Address1 := pointer(PW_Walk_Call1);
Address2 := pointer(PW_Walk_Call2);
Address3 := pointer(PW_Walk_Call3);
x := aPParams^.Param3;
y := aPParams^.Param4;
z := aPParams^.Param5;
flying := aPParams^.Param7;
asm
pushad
mov eax, dword ptr [PW_Base_Call]
mov eax, dword ptr [eax+$1C]
mov esi, dword ptr [eax+$20]
mov ecx, dword ptr [esi+$C10]
push 1
call Address1
mov edi, eax
lea eax, dword ptr [esp+$0C]
push eax
push flying
mov ecx, edi
call Address2
mov ecx, dword ptr [esi+$C10]
push 0
push 1
push edi
push 1
call Address3
mov eax, dword ptr [PW_Base_Call]
mov eax, dword ptr [eax+$1C]
mov eax, dword ptr [eax+$20]
mov eax, dword ptr [eax+$C10]
mov eax, dword ptr [eax+$30]
mov ecx, dword ptr [eax+$4]
mov eax, x
mov dword ptr[ecx+$20], eax
mov eax, z
mov dword ptr[ecx+$24], eax
mov eax, y
mov dword ptr[ecx+$28], eax
popad
end;
end;
procedure TaPWT.WalkTo(x, y, z: single);
var
aParams : TParams;
aParamsSize: DWORD;
aPlayer: TaPlayer;
begin
aPlayer := getPlayer(getDWORD(aBasePointer + $20));
aParams.Param3 := (x - 400) * 10;
aParams.Param4 := (y - 550) * 10;
aParams.Param5 := z * 10;
aParams.Param7 := aPlayer.TransportMode;
aParamsSize := SizeOf(aParams);
injectfunc(aProcessID, @WalkCall, @aParams, aParamsSize);
end;
aPlayer.TransportMode: Cardinal. Но нужно не забывать, что на самом деле это байт(!). И получать его нужно:
result.TransportMode := getBYTE(playerPointer + $60D);
Гет функции, что я юзаю:
Code:
function TaPWT.getBYTE(aPointer: integer) : BYTE; var dwReaded: DWORD; begin ReadProcessMemory(aProcessID, ptr(aPointer), @result, SizeOf(result), dwReaded); end; function TaPWT.getWORD(aPointer: integer) : WORD; var dwReaded: DWORD; begin ReadProcessMemory(aProcessID, ptr(aPointer), @result, SizeOf(result), dwReaded); end; function TaPWT.getDWORD(aPointer: integer) : DWORD; var dwReaded: DWORD; begin ReadProcessMemory(aProcessID, ptr(aPointer), @result, SizeOf(result), dwReaded); end; function TaPWT.getFLOAT(aPointer: integer) : Single; var dwReaded: DWORD; begin ReadProcessMemory(aProcessID, ptr(aPointer), @result, SizeOf(result), dwReaded); end; function TaPWT.getSTRING16(aPointer: integer) : WideString; var dwReaded: DWORD; buf : array[0..16] of WideChar; begin ReadProcessMemory(aProcessID, ptr(aPointer), @buf, 16, dwReaded); result := buf; end; function TaPWT.getSTRING32(aPointer: integer) : WideString; var dwReaded: DWORD; buf : array[0..32] of WideChar; begin ReadProcessMemory(aProcessID, ptr(aPointer), @buf, 32, dwReaded); result := buf; end;