Добрый вечер. Помогите пожалуйста реализовать получение ХП у таргет-моба. Пока написал только это:
Код:
function GetMobInfo: TMobInfo;
var
BytesCount: DWORD;
Mobs,id: DWORD;
i,j : integer;
begin
ReadProcessMemory(hProcess, ptr(GA), @Mobs, sizeof(Mobs), BytesCount);
ReadProcessMemory(hProcess, ptr(Mobs+$8), @Mobs sizeof(MobsTemp), BytesCount);
ReadProcessMemory(hProcess, ptr(MobsTemp+$24), @Mobs, sizeof(Mobs), BytesCount);
ReadProcessMemory(hProcess, ptr(MobsTemp+$18), @Mobs, sizeof(Mobs), BytesCount);
//----------------- Именно здесь и должно быть получение
end;
по первому и второму вопросу... ответ один )) +1С теперь вместо +8... как итог, +1С надо(и никакого отношение к BA+1C это не имеет), а +8, наоборот, не надо)
то есть другими словами:
GA +1с +24 +18 +[I*4] + (+0)^J +4: (I in [0..300])
Цитата:
Сообщение от trixicus
MobID всегда равен 4949149
тут сложно помочь... либо прикрепи обновленный архив.. потому что код в нем и код тут различны... либо сам проверь, что все оффсеты правильно прописал... проектик, честно, не запускал, тока в блокноте пролистал... но WIDы всех вокруг, по твоему коду (от сюда, а не из архива) у меня получил на ура...
Все, эту проблему решил. Теперь осталось узнать только ХП пета для полного счастья. Точнее максимальное ХП.
Пробовал получить по GA+34+1068+i*4+10+1C (%ХП), но возвращается совсем не то; оффсеты случаем не менялись?
Получение текущего ХП:
Код:
ReadProcessMemory(hProcess, ptr(gamer_addr + $1068), @addr, sizeof(addr), BytesCountOfRead);
ReadProcessMemory(hProcess, ptr(addr + 8), @i, sizeof(i), BytesCountOfRead);
if i <> (-1) then begin
ReadProcessMemory(hProcess, ptr(addr+i*4+$10), @addr, sizeof(addr), BytesCountOfRead);
ReadProcessMemory(hProcess, ptr(addr+$38), @addr, sizeof(addr), BytesCountOfRead);
ShowMessage(IntToStr(addr)) ;
end;
Пробовал получить по GA+34+1068+i*4+10+1C (%ХП), но возвращается совсем не то
Оффсеты верные, просто там тип данных single )) скорей всего именно это ты и не учел )) обозначь переменную так же, и получишь то что надо )) 1-пет здоров, 0.99999..9 пета ранили )) ну а как имея текущее и процент получить макс хп, думаю догадаешься )) простая математика ))
Все написал, спасибо огромное. Кстати, не поможешь исходником инжекта по сбору лута.
А то я ни подбежать ни просто взять не могу. Игра с клиент с критом валится.
Последний раз редактировалось trixicus; 01.11.2011 в 07:43.
Все написал, спасибо огромное. Кстати, не поможешь исходником инжекта по сбору лута.
А то я ни подбежать ни просто взять не могу. Игра с клиент с критом валится.
хех, совершенно не заметил ее. А проблема в том, что у меня не так работает определение типа лута:
Цитата:
+14C ItemType (1 - Money; 2 - Mine; Other - Item)
1 - все кроме монет
2 - растения и пр.
3 - только монеты
Лут он отображает весь, который найдет. Мне же нужен только свой.
И еще не могу определить, поднял он вещь или нет, и в какой момент уже можно бежать за следующей. Вот
Последний раз редактировалось trixicus; 01.11.2011 в 18:26.
Лут он отображает весь, который найдет. Мне же нужен только свой.
И еще не могу определить, поднял он вещь или нет, и в какой момент уже можно бежать за следующей.
Сделай функцию которая бы возвращала wid лута, конечно отсеивая по координатам смерти моба в определенном радиусе.
И через цикл
Код:
while loot <> 0 then
//и тут собираем его же
PickWalk(loot)
Это все безусловно хорошо, если бы не парачка "НО":
- в этом месте где мы убили моба, могут оказаться и чужой лут, который попадет в этот радиус.
Цитата:
while loot <> 0 then PickWalk(loot)
- быстренько все переберет и побежит за последним. Поэтому и нужно определить взяли мы вещь или нет
PS: Скорее всего клиент автоматически выгружает из памяти WID того объекта, который мы взяли. Поэтому можно ждать пока WID не пропадет из списка, но какова вероятность, что он не появится снова от фармящих рядом.
А зная я список только своего лута, я мог бы сравнить просто 2 списка, ДО и После убийства моба, и определить WID-ы того, что мне надо поднять
Ну у меня возвращает первое найденное соответствие, теотсь пока не возьму его, не пойдет дальше, топорно, но работает, радиус под мобом метров 5-ть, да старается брать и чужой, но это же не сильная проблема, можно решить занося во временный черный список того что неберется в течении некоторого времени, а после удалять
Сейчас потестил. Действительно собирает по порядку. Цикл отрабатывает моментально, как я и предполагал, но выражаясь вольным языком, "запросы встают в очередь" и бот бегает собирает лут. Осталось только заставить его собирать лут около места смерти моба, но я, признаюсь, понятия не имею как это сделать
Осталось только заставить его собирать лут около места смерти моба, но я, признаюсь, понятия не имею как это сделать
Не буду давать готовое)
У меня сделано так:
Дополнительно крутится поточег на получение координат моба, тоетсь пока моб в таргете пишем его координаты, после смерти запись прерывается и я собираю лут в пределах радиуса этих координат
Код:
if id = TargetID then
begin
ReadProcessMemory(ProcessID, Pointer(struct_ + $3C), @x, 4, num);
ReadProcessMemory(ProcessID, Pointer(struct_ + $44), @y, 4, num);
ReadProcessMemory(ProcessID, Pointer(struct_ + $40), @z, 4, num);
last_x := x;
last_y := y;
last_z := z;
end;
Код:
function getdistanceloot(x2, y2: single): integer;
begin
getcord;
result := round(sqrt(sqr(last_x - x2) + sqr(last_y - y2)));
end;
function getdistanceloot3d(x2, y2, z2: single): integer;
begin
getcord;
result := round(sqrt(sqr(last_x - x2) + sqr(last_y - y2) + sqr(last_z - z2)));
end;
Код:
...
if getdistanceloot(Loot_x, Loot_y) < {form1.TrackBar3.Position} 5 then
...
Последний раз редактировалось aktivizion15; 01.11.2011 в 21:23.