You are not logged in.
Alien, а если я хочу найти координаты игрока, мне надо пользоваться такой же формулой?
Получается результат 0.
Delphi:
X:=$B6F5F0+($30)*$7C4+$14; ReadProcessMemory(ProcHandle,ptr(X),@value,4,rw); Edit1.Text := FloatToStr(value);
$7С4 - размер педа (в смысле ячейки с педом).
$30 - Х-координата (смещение или как там?).
$14 - ещё какое-то там смещение (не разбираюсь пока в них).
Чувствую, формула неверна. Представил ещё две строки из дельфи на всякий случай (а вдруг в них накосячил, не зная каких-нибудь там правил преобразования данных?).
Last edited by dragonforce (24-12-2009 21:04)
Offline
Должно быть как-то так:
PlPtr, PlPosPtr, BytesRead: LongWord; PlPos: record X, Y, Z: Single; end; ReadProcessMemory(hProcess, Ptr($B6F5F0), @PlPtr, 4, BytesRead); ReadProcessMemory(hProcess, Ptr(PlPtr + $14), @PlPosPtr, 4, BytesRead); ReadProcessMemory(hProcess, Ptr(PlPosPtr + $30), @PlPos, 12, BytesRead);
---
В строку преобразовывать лучше через Format, чтобы не было длинных 'хвостов':
Edit1.Text := Format('%.4f %.4f %.4f', [PlPos.X, plPos.Y, PlPos.Z]);---
Исправленный вариант:
procedure TForm1.Button1Click(Sender: TObject);
var
hWindow: HWND;
dwProcessId, hProcess, BytesRead: Cardinal;
PlPtr, MatrixPtr: Cardinal;
PlPos: record
X, Y, Z: Single;
end;
begin
hWindow := FindWindow('Grand theft auto: San Andreas', 'GTA: San Andreas');
if hWindow = 0 then Exit;
GetWindowThreadProcessId(hWindow, dwProcessId);
hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, dwProcessId);
if hProcess = 0 then Exit;
ReadProcessMemory(hProcess, Ptr($00B7CD98), @PlPtr, 4, BytesRead);
if PlPtr = 0 then Exit;
ReadProcessMemory(hProcess, Ptr(PlPtr + $14), @MatrixPtr, 4, BytesRead);
if MatrixPtr <> 0 then
ReadProcessMemory(hProcess, Ptr(MatrixPtr + $30), @PlPos, 12, BytesRead)
else
ReadProcessMemory(hProcess, Ptr(PlPtr + $4), @PlPos, 12, BytesRead);
Edit1.Text := Format('%.4f %.4f %.4f', [PlPos.X, PlPos.Y, PlPos.Z]);
end;
Last edited by Sanchez (24-12-2009 23:19)
Offline
Так я и не понял, что мы делаем, чтобы находить значения правильно.
Мы складываем адрес из смещений и сразу из него читаем?
Или читаем один адрес, складываем смещение со значением из этого адреса, читаем получившийся адрес (адрес-сумма предыдущего адреса и смещения)?
Почему, кстати надо использовать Single? Простенький Real разве не подходит под максимальные значения координат на карте? Я пробовал уже и так, и так, но дельного ничего не вышло.
Offline
Этот код получает координаты камеры, а не игрока.
Если нужны координаты игрока:
[c]var
pPlayerPed, pMatrix: DWORD;
PlayerPos: record
x, y, z: Single;
end;
ReadProcessMemory(ProcHandle,Pointer($B7CD98),@pPlayerPed,4,NULL);
if (pPlayerPed <> 0) then
begin
ReadProcessMemory(ProcHandle,Pointer(pPlayerPed + $14),@pMatrix,4,NULL);
if (pMatrix <> 0) then
ReadProcessMemory(ProcHandle,Pointer(pMatrix + $30),@PlayerPos,12,NULL);
else
ReadProcessMemory(ProcHandle,Pointer(pPlayerPed + 4),@PlayerPos,12,NULL);
Edit1.Text := Format('%.4f %.4f %.4f', [PlayerPos.x, PlayerPos.y, PlayerPos.z]);
end
else
Edit1.Text := 'Player ped not defined yet';[/c]
плохо помню дельфи, поэтому просто внес поправки в код Sanchez'а...=)
Почему, кстати надо использовать Single? Простенький Real разве не подходит под максимальные значения координат на карте? Я пробовал уже и так, и так, но дельного ничего не вышло.
Single - 4 байта, Real - 6 байт.
Last edited by Alien (24-12-2009 21:49)
Offline
Оу! Результаты есть. Спасибо)
ReadProcessMemory(ProcHandle,Pointer(pPlayerPed + $14),@pMatrix,4,NULL); if (pMatrix <> 0) then ReadProcessMemory(ProcHandle,Pointer(pMatrix + $30),@PlayerPos,12,NULL); else ReadProcessMemory(ProcHandle,Pointer(pPlayerPed + 4),@PlayerPos,12,NULL);
Можно тут поподробнее? Почему сначала читается адрес со смещением +$30, а потом другой адрес со смещением +4?
Ещё вопрос: как получить угол игрока? Меня интересует значение направления лица игрока (Z). На gtamodding.ru написано "матрица вращения", то есть, надо создать ещё одну запись (pAng : record ax,ay,az:single end;). Так я сделал. А вот считать как?
Я не понял (выше), почему смещения в этих двух случаях (pMatrix=0 или pMatrix<>0) разные, но принцип вроде должен быть таким же и для координат?
ReadProcessMemory(ProcHandle,ptr(pPlayerPed + $14),@pMatrix,4,rw);
if (pMatrix <> 0) then
begin
ReadProcessMemory(ProcHandle,ptr(pMatrix + $30),@pPos,12,rw);
ReadProcessMemory(ProcHandle,ptr(pMatrix),@pAng,12,rw)
end
else
begin
ReadProcessMemory(ProcHandle,ptr(pPlayerPed + 4),@pPos,12,rw);
ReadProcessMemory(ProcHandle,ptr(pMatrix),@pAng,12,rw) //вот тут другое смещение?
end;Я читаю из pMatrix, ибо в базе адресов стоит непонятное 0x0 to 0x2C... (а откуда надо читать? x_X)
Last edited by dragonforce (25-12-2009 11:24)
Offline
dragonforce, если надо сделать айр брейк с вращением относительно Z ,то может поможет вот этот код, на delphi думаю не сложно перенести будет.
0000: NOP
:NONAME_2
wait 1
if and
Player.Defined($PLAYER_CHAR) //found
not actor.dead($PLAYER_ACTOR) //notdead
004D: jump_if_false @NONAME_2
if
0AB0: key_pressed 16//activation/deactivation
then
if
22@ > 0
then
if
26@ > 0
then
0A8D: 10@ = read_memory 1@ size 4 virtual_protect 0
10@ += 66
0A8D: 25@ = read_memory 10@ size 1 virtual_protect 0
25@ -= 3
0A8C: write_memory 10@ size 1 value 25@ virtual_protect 0
26@ = 0
end
22@ = 0
wait 700
else
22@ = 1
wait 700
end
end
if
22@ == 1
then
1@ = 0xB6F5F0
0A8D: 2@ = read_memory 1@ size 4 virtual_protect 0
2@ += 0x14
0A8D: 3@ = read_memory 2@ size 4 virtual_protect 0
0A8E: 4@ = 3@ + 0x30
0A8E: 5@ = 3@ + 0x34
0A8E: 6@ = 3@ + 0x38
0A8D: 7@ = read_memory 4@ size 4 virtual_protect 0
0A8D: 8@ = read_memory 5@ size 4 virtual_protect 0
0A8D: 9@ = read_memory 6@ size 4 virtual_protect 0
//---------------------------------------------------------
0A8D: 10@ = read_memory 1@ size 4 virtual_protect 0
10@ += 1132
0A8C: write_memory 10@ size 1 value 3 virtual_protect 0
10@ -= 1132
10@ += 66
if
26@ < 1
then
0A8D: 25@ = read_memory 10@ size 1 virtual_protect 0
25@ += 3
0A8C: write_memory 10@ size 1 value 25@ virtual_protect 0
26@ = 1
end
10@ -= 66
10@ += 348
0A8C: write_memory 10@ size 1 value 205 virtual_protect 0
//---------------------------------------------------------
0A8D: 11@ = read_memory 2@ size 4 virtual_protect 0
0A8D: 12@ = read_memory 2@ size 4 virtual_protect 0
11@ += 0x10
12@ += 0x14
0A8D: 13@ = read_memory 11@ size 4 virtual_protect 0
0A8D: 14@ = read_memory 12@ size 4 virtual_protect 0
006B: 13@ *= 21@
006B: 14@ *= 21@
if or
0AB0: key_pressed 87//W
0AB0: key_pressed 65//A
0AB0: key_pressed 83//S
0AB0: key_pressed 68//D
then
005B: 7@ += 13@
005B: 8@ += 14@
if
21@ <= 12.0
then
21@ += 0.12
end
else
21@ = 0.0
end
if
0AB0: key_pressed 90//down
then
0063: 9@ -= 23@
if
23@ <= 12.0
then
23@ += 0.12
end
else
23@ = 0.0
end
if
0AB0: key_pressed 88//up
then
005B: 9@ += 24@
if
24@ <= 12.0
then
24@ += 0.12
end
else
24@ = 0.0
end
//---------------------------------------------------------
0A8C: write_memory 4@ size 4 value 7@ virtual_protect 0
0A8C: write_memory 5@ size 4 value 8@ virtual_protect 0
0A8C: write_memory 6@ size 4 value 9@ virtual_protect 0
end
jump @NONAME_2Просто получаем cos и sin из матрицы вращения, умножаем на какое нибудь число n(чем больше тем скорость выше) и прибавляем cos*n + x , sin*n+y. Для лица игрока читать вроде нужно из
0x10 и 0x14 ,хотя может это не так,но все работает.
И у меня вопрос, где находится матрица вращения камеры ?, что бы сделать движение по всем осям
Last edited by DimP (25-12-2009 15:19)
Offline
Можно тут поподробнее? Почему сначала читается адрес со смещением +$30, а потом другой адрес со смещением +4?
Ещё вопрос: как получить угол игрока? Меня интересует значение направления лица игрока (Z). На gtamodding.ru написано "матрица вращения", то есть, надо создать ещё одну запись (pAng : record ax,ay,az:single end;). Так я сделал. А вот считать как?
Я не понял (выше), почему смещения в этих двух случаях (pMatrix=0 или pMatrix<>0) разные, но принцип вроде должен быть таким же и для координат?
Координаты Entity могут храниться либо в CPlaceable, либо в матрице трансформации.
Соответственно, рекомендованный метод - сначала попробовать получить матрицу трансформации (+0x14), а, если это не удалось, получить точку по слещению +4.
Если удалось - из матрицы берется вектор pos (+0x30).
Offline