При нажатии на кнопку все повисает... не вылетает, а именно виснет.
Прицепил Олли к ПВ и снова запустил, вот что показывает [Ссылки могут видеть только зарегистрированные пользователи. ]
Адреса брал отсюда [Ссылки могут видеть только зарегистрированные пользователи. ]
Подскажи пожалуйста.
Заранее благодарю.
Не обращайте внимания на неиспользуемые куски.
РЕШЕНИЕ
Был не тот WalkCall (не тот asm код) - ниже рабочий по 1,5,5
Код:
procedure WalkCall(aPParams: PParams); stdcall;
var
CallAddress1, CallAddress2, CallAddress3: Pointer;
x, y, z: single;
flying: DWORD;
begin
CallAddress1 := Pointer($004C7AB0);
CallAddress2 := Pointer($004CDFB0);
CallAddress3 := Pointer($004C80C0);
x := aPParams^.x;
y := aPParams^.y;
z := aPParams^.z;
flying := aPParams^.Param1;
asm
pushad
mov eax, BaseAddr
mov eax, dword ptr[eax]
mov eax, dword ptr[eax + $1C]
mov edi, dword ptr[eax + $34] //должно быть 34
mov ecx, dword ptr[edi + $1500] //должно быть 16E4
push 1
call CallAddress1
lea edx, dword ptr[esp + $20] //должно быть 20
mov esi, eax
push edx
push flying
mov ecx, esi
call CallAddress2
mov ecx, dword ptr[edi + $1500] //должно быть 16E4
mov eax, x
mov dword ptr[esi + $20], eax
mov eax, z
mov dword ptr[esi + $24], eax
mov eax, y
mov dword ptr[esi + $28], eax
push 0
push esi
push 1
call CallAddress3
popad
end;
end;
Последний раз редактировалось den57; 15.11.2018 в 00:42.
Мне кажется, что я передаю координаты неправильно...
Объявляю так
Код:
PParams = ^TParams;
TParams = packed record
Param1: dword;
Param2, Param3, Param4: DWORD; //Если тут Single - то крашит, если DWORD делает пару шагов и зависает
Walk1Adress, Walk2Adress, Walk3adress, ActionArray, gameadress: dword;
end;
Офсеты проверил, все правильно.
Последний раз редактировалось den57; 13.11.2018 в 19:39.
В игре открой консоль, напиши d_showpos - это те координаты которые передавать надо (в клиенте они отображаются как X, Z, Y), не те что у карты указаны
Последний раз редактировалось Kavaii^_^; 13.11.2018 в 19:53.
В игре открой консоль, напиши d_showpos - это те координаты которые передавать надо (в клиенте они отображаются как X, Z, Y), не те что у карты указаны
Спасибо за помощь, начал он бежать, но после того, как параметры типа integer сделал.
Но они не интежер же) Если когда-то захочешь пройти, к примеру, по координатам моба в таргете, у тебя будет ошибка, потому что координаты = float (single)
Попробуй
Код:
x := aPParams^.param2;
y := aPParams^.param3;
z := aPParams^.param4;
поменять на
Код:
x := aPParams^.x;
y := aPParams^.y;
z := aPParams^.z;
Помню такая же проблема была, сравни инжект который я юзаю и свой, в твоих много лишнего
а можно узнать зачем тебе это? эти формулы нужно чтобы из нормальных координат (с которыми клиент работает) перевести в читаемые (те что клиент отображает). То есть эти формулы нужны только когда ты хочешь отобразить координаты для юзера (чтобы он сравнил с теми что видит в игре возле карты)
и зачем hprocess, WalkMode: DWORD в процедуре? они там уже вроде как есть, если ты хочешь чтобы с разными окнами работало, попробуй пока их убрать, разобраться как с одним окном работать, а потом уже меняй под себя)
Нашел в исходниках ПВРУФ полезную штуку, подключение к окну, выбираешь из листбокса ник, он подключает к окну:
Код:
procedure Connect;
begin
GetWindowThreadProcessID (WID, @PID);
hProcess:= OpenProcess (PROCESS_ALL_ACCESS, False, PID);
Player:= GetPlayerInfo;
end;
procedure Disconnect;
begin
CloseHandle (hProcess);
hProcess:= 0;
end;
function connected: boolean;
begin
Result:= hProcess <> 0;
end;
procedure Find_WID;
var
Local_WID : HWND;
buf : array [0..255] of Char;
i: Integer;
ElementClassName: String;
begin
i:= 0;
ElementClassName:= 'ElementClient Window';
MainFormNirka.cmb_Windows.Clear;
FillChar(Found_WID, SizeOf(Found_WID), #0);
Local_WID:= FindWindow (0,0);
while (Local_WID <> 0) do
begin
GetClassName (Local_WID, @buf, 100);
if buf=ElementClassName then
begin
Found_WID[i]:= Local_WID;
WID:= Local_WID;
Connect;
MainFormNirka.cmb_Windows.Items.Add(Player.Name);
inc(i);
Disconnect;
end;
Application.ProcessMessages;
Local_WID:=GetNextWindow(Local_WID,GW_HWNDNEXT);
end;
end;