Rus. server

02/15/2010 13:02 BuBucekTop#1456
Quote:
Originally Posted by AlexGD View Post
Есть дикое подозрение, что координаты точки - те же самые, что и для нашего инжекта. А автопилот следит исключительно только за высотой...
Тут всё оказалось гораздо сложнее и в китайском стиле. Итого, для перемещения мы имеем:
1. координаты точки назначения (известны и кладутся через вызов Walk_Call_2)
2. Координаты точки , к которой прокладывается трасса на карте и миникарте
3. "Звёздочка" на миникарте
4. "Звёздочка" на большой карте

и все эти вещи ВООБЩЕ не связаны....
С пунктами 1 и 3 всё понятно, но меня интересуют как раз таки пункты 2 и 4. Особенно пункт 2.

Что касается автопилота - автопилот не обновляет координаты точек из п.2, п.3 и п.4

Он тупо показывает последнюю введенную через Alt+M "Звёздочку" и к ней же прибиты координаты конечного пункта трассы. В итоге я наблюдаю печальную картину - чар летит куда надо, но трасса от него тянется куда-то в жёппу =(((

Так что для полного счастья мне нужно раскопать адреса в памяти и адреса для инжекта для п.2 и п.4.
02/15/2010 13:08 BuBucekTop#1457
Quote:
Originally Posted by Barmank View Post
2BuBucekTop
Можно поподробней как ты нашел масив?
Точнее как его распознать в Асме?
А то у меня есть одна переменная и теперь я подозреваю, что это массив.
Элементарно, Ватсон - ставим брэйкпоинт на интересующую тебя функцию, выполняем действие в игре и когда бряк срабатывает - смотрим, что запихнуто в стек.
Если в стеке лежит много-много интересных и главное знакомых цыферек, а судя по дампу функция принимает только один аргумент - значит то, что лежит в стеке и есть массив.
02/15/2010 14:48 Barmank#1458
РАБОЧАЯ ПРОДАЖА
Предмет должен лежать в 1й ячейки трейд окна.

Quote:
procedure SellCall(buf:Pointer); stdcall;
var
Address, addres2: pointer;
begin
Address:=Pointer(PW_Sell_Call);
asm
pushad
push buf
push 1
call Address
add esp, $8
popad
end;
end;

procedure Sell();
var
aParamsSize: DWORD;
p1,p2,p3:DWORD;
buf : array [0..2] of DWORD;
begin
p1:= getDWORD(hProcess, PW_BASE_ADDRESS);
p1:= getDWORD(hProcess, p1 + $1C);
p1:= getDWORD(hProcess, p1 + $20);
p1:= getDWORD(hProcess, p1 + $C34);
p3:= getDWORD(hProcess, p1 + $C);
p2:= getDWORD(hProcess, p3 + $0);
p2:= getDWORD(hProcess, p2 + $8);
buf[0] := p2; // ID
p2:= getDWORD(hProcess, p1 + $24);
buf[1] := getDWORD(hProcess, p2); // Num ячеки инвентаря
p2:= getDWORD(hProcess, p2 + $4);
buf[2] := p2; // количество
aParamsSize:=SizeOf(buf);
InjectFunc(hProcess, @SellCall, @buf, aParamsSize);
putDWORD(hProcess, p3 + $0, 0); // обнуляем адрес
end;
Теперь тестируем на вылет:)

Есть мысль что инжект может срабатывать и без перекладывания в трейд окно!
02/17/2010 09:21 slavapil#1459
Code:
procedure Sell();
var
aParamsSize: DWORD;
p1,p2, i : WORD;
buf : array [0..2] of DWORD;
begin
p1:= getDWORD(hProcess, PW_BASE_ADDRESS);
p1:= getDWORD(hProcess, p1 + $1C);
p1:= getDWORD(hProcess, p1 + $20);
p1:= getDWORD(hProcess, p1 + [B]$C1C[/B]);
p1:= getDWORD(hProcess, p1 + $C);

i:= 0;// Ячейка инвентаря

p2:= getDWORD(hProcess, p1 + (i*4)); // итем
buf[0] := getDWORD(hProcess, p2 + $8); // ID
buf[1] := i; // Ячека инвентаря
buf[2] := getDWORD(hProcess, p2 + $10);// количество в ячейке
aParamsSize:=SizeOf(buf);
InjectFunc(hProcess, @SellCall, @buf, aParamsSize);
end;
так должно работать :)
02/17/2010 11:43 Barmank#1460
Как я и писал выше покупка вещей похожа

Quote:
procedure BuyCall(buf:Pointer); stdcall;
var
Address, addres2: pointer;
begin
Address:=Pointer(pw_buy_call);
asm
pushad
push buf
push 1
call Address
add esp, $8
popad
end;
end;

procedure Buy();
var
aParamsSize: DWORD;
p1,p2,p3:DWORD;
buf : array [0..2] of DWORD;
begin
p1:= getDWORD(hProcess, PW_BASE_ADDRESS);
p1:= getDWORD(hProcess, p1 + $1C);
p1:= getDWORD(hProcess, p1 + $20);
p1:= getDWORD(hProcess, p1 + $C30);
p3:= getDWORD(hProcess, p1 + $C);
p2:= getDWORD(hProcess, p3 + $0);
p2:= getDWORD(hProcess, p2 + $8);
buf[0] := p2; // id
p2:= getDWORD(hProcess, p1 + $24);
buf[1] := getDWORD(hProcess, p2); // номер ячейки у продавца
p2:= getDWORD(hProcess, p2 + $4);
buf[2] := p2; // количество
aParamsSize:=SizeOf(buf);
InjectFunc(hProcess, @BuyCall, @buf, aParamsSize);
putDWORD(hProcess, p3 + $0, 0);
end;
Как и ожидалось покупка работает без перетаскивания в поля для покупки, главное знать номер ячейки у продавца, где лежит нужный предмет.
Структура должна быть похожа на инвентарь, кто знает или наталкивался, пожалуйста выложите.
02/17/2010 11:49 Barmank#1461
Quote:
Originally Posted by slavapil View Post
Code:
procedure Sell();
var
aParamsSize: DWORD;
p1,p2, i : WORD;
buf : array [0..2] of DWORD;
begin
p1:= getDWORD(hProcess, PW_BASE_ADDRESS);
p1:= getDWORD(hProcess, p1 + $1C);
p1:= getDWORD(hProcess, p1 + $20);
p1:= getDWORD(hProcess, p1 + [B]$C1C[/B]);
p1:= getDWORD(hProcess, p1 + $C);

i:= 0;// Ячейка инвентаря

p2:= getDWORD(hProcess, p1 + (i*4)); // итем
buf[0] := getDWORD(hProcess, p2 + $8); // ID
buf[1] := i; // Ячека инвентаря
buf[2] := getDWORD(hProcess, p2 + $10);// количество в ячейке
aParamsSize:=SizeOf(buf);
InjectFunc(hProcess, @SellCall, @buf, aParamsSize);
end;
так должно работать :)
Верно я сам потом это заметил, и теперь буду упрощать:)
Таким образом не надо будет перемещать предмет в трейд окно что очень удобно:)
Таким же образом можно и покупать , вот тока кто бы выложил бы смещения для инвентаря НПЦ
02/18/2010 19:57 muzhig#1462
А я движение к точке разбиваю на кучу маленьких движений.
Это позволяет облетать сложные траектории, при этом движение производится довольно мягко.

Кстати, у инжекта движения есть минус- при подлете к точке он начинает плавно сбавлять скорость.

Например, подлетая к ресурсу, он начинает тупо тормозить так, вообще некрасиво.
Кто нибудь с этим боролся?

Есть идея как сделать через задницу: ставить движение дальше чем рес, а потом когда ресурс рядом- обрубать движение. Отсюда опять старый вопрос:
Кто знает как грамотно обрубить движение? И каст скила хорошо бы тоже отменять научиться- но самое главное движение.
02/18/2010 22:37 gen-ostr#1463
Code:
		////если надо поддерживать высоту	или срочно остановится
		//DWORD tt2=1; //0-текущая высота  1- автовысота 3-срочная остановка
	ReadProcessMemory(Proc,(LPCVOID)(Base),	&tempOffset,  4,0);	//
	ReadProcessMemory(Proc,(LPCVOID)(tempOffset+0x20),	&tempOffset,  4,0);	//
	ReadProcessMemory(Proc,(LPCVOID)(tempOffset+0xDDC),	&tempOffset,  4,0);	// 
	ReadProcessMemory(Proc,(LPCVOID)(tempOffset+0x30),	&tempOffset,  4,0);	// 
	ReadProcessMemory(Proc,(LPCVOID)(tempOffset+0x4),	&tempOffset,  4,0);	//
	WriteProcessMemory(Proc,(LPVOID)(tempOffset+0x2C),&m_Param,4,0);

if(m_Param==3) return true;
в свою очередь прошу инжект юзания скила. нашел адрес 45А060 , но вот что заносить в регистры?
02/18/2010 22:51 gen-ostr#1464
Quote:
Originally Posted by muzhig View Post
Я тоже не нашел что то. ТАк что если найдешь, выложи плиз.
решил просто -заюзал инжект, чтобы банки прямо с инвентаря лопал. орать в чат перестал.(но в окно действий все-равно орет)
02/19/2010 10:14 johnic#1465
Если кому интересно вот инжект выполненный на C#.
Может кто подсказать функцию вызова питомца?
02/19/2010 13:45 SergXD#1466
muzhig тормозит скорее всего из-за того что неправильно разбиваете путь на короткие (это если путь не прямая) =) попробуйте интерполяцию пути кубическим сплайном

[Only registered and activated users can see links. Click Here To Register...]

[Only registered and activated users can see links. Click Here To Register...]

Тут есть примеры на c++ и C#
02/19/2010 15:41 diahellfire#1467
Кстати кто может дать пример получение имени локации на Автоите, а то пытаюсь в всегда возвращается "0"?
02/19/2010 17:40 gen-ostr#1468
Quote:
Originally Posted by muzhig View Post

Кстати, у инжекта движения есть минус- при подлете к точке он начинает плавно сбавлять скорость.
это не минус, а алгоритм работы. даже если не использовать инжект, а запись в память-при подлете тоже замедление
02/19/2010 22:34 getres#1469
Ребят, ну подскажите! я уже писал что я не программист, но для себя читаю умные книги пытаюсь выучить С++! Вот инжект который выложил johnic, его как использовать? просто добавить в проект и включать в исполняемый файл инклудами и вызывать нужные функции? и если да то надо ли менять переменные тапа ИД процесса-"processID" на мой "Pid" в боте? Visual C++ 2008
02/20/2010 10:47 johnic#1470
Quote:
Originally Posted by getres View Post
Ребят, ну подскажите! я уже писал что я не программист, но для себя читаю умные книги пытаюсь выучить С++! Вот инжект который выложил johnic, его как использовать? просто добавить в проект и включать в исполняемый файл инклудами и вызывать нужные функции? и если да то надо ли менять переменные тапа ИД процесса-"processID" на мой "Pid" в боте? Visual C++ 2008
Вот готовый инжект выполненный на С++, думаю как включить в проект разберешься.


Никто не нашел функцию вызова питомца из клетки? А то я что-то совсем запарился, голова не работает