Доброго времени суток.
Пытаюсь читать данные по структуре моба.
алгоритм ясен, но просидел целый день и безрезультатно..
в общем часть кода:
Код:
ReadProcessMemory(hProcess,Ptr(ba), @buf, 4,PF);
ReadProcessMemory(hProcess,Ptr(buf+$1C), @buf, 4,PF);
ReadProcessMemory(hProcess,Ptr(buf+$34), @WID, 4,PF);
ReadProcessMemory(hProcess,Ptr(WID+$C88), @WID, 4,PF); //Считываем Target ID
ReadProcessMemory(hProcess,Ptr(buf+$1C), @buf, 4,PF);
ReadProcessMemory(hProcess,Ptr(buf+$24), @buf1, 4,PF);
ReadProcessMemory(hProcess,Ptr(buf1+$1C), @buf2, 4,PF); //Добрались до структуры моба
ReadProcessMemory(hProcess,Ptr(buf1+$14), @buf3, 4,PF); //Счетчик мобов вокруг
// Теперь нужно запустить цикл по ближайшим мобам:
For i:=1 to buf3 do
begin
ReadProcessMemory(hProcess,Ptr(buf2+i*p), @buf4, 4,PF); // p=0x4 (const)
IF buf4<>0 then
begin
ReadProcessMemory(hProcess,Ptr(buf2+$120), @mwid, 4,PF); //World ID
ReadProcessMemory(hProcess,Ptr(buf2+$124), @mid, 4,PF); // ID
If WID=mwid then
begin
RealID:=IntToStr(mid);
здесь нужно закончить цикл по i
end;
end;
end;
Подскажите, как правильно остановить цикл и считать допустим RealID
функция Exit у нас завершает данную процедуру полностью, но вам нужно только выйти из цикла , в случае совпадения, в этом поможет break . который прерывает текущий цикл и переходит на следующую процедуру. И так ради интереса зачем задавать переменную "p" если можно просто умножить на 4
________________
Хотите как то отблагодарить за помощь?
Не стесняйтесь нажимайте "Спасибо"
Делаю программы на заказ, по всем вопросам в скайп: Ginrey2
Последний раз редактировалось Ginrey; 03.10.2013 в 20:35.
Это количество мобов? Тогда спешу огорчить, цикл не будет правильно считывать. Массив мобов имеет вид не:
Код:
array[1] - моб 1-й
array[2] - моб 2-й
....
array[n] - моб n-й
Он имеет вид
Код:
array[3] - моб 1-й
array[7] - моб 2-й
array[87] - моб 3-й
array[182] - моб 4-й
....
П.с. числа рандомные брал
Структуры отдельных мобов разбросаны по всему массиву. Поэтому цикл меняем на
Код:
repeat
бла бла
..
if WID <> 0 Then i += 1;
until i >= buf3
(хз, как в дельфи)
перед циклом счетчик i = 0
Так, стоп. Я понял, что ТСу весь массив не нужен. Тогда
Код:
i = -1;
repeat
i := i+1;
wid = trololo // *считываем айди моба по структуре i*4*
until (i >= $300) OR (wid = needed_id) // ждем нужного айди, либо конца массива мобов (768 мобов)
На выходе получаем i - значение итератора, смотрим структуру i*4 - там и лежит инфа о нужном мобе
________________
Больше не занимаюсь читами, ушёл в серверную часть. Новый ник - int 3.
P.S. Но я всё такой же добрый модератор раздела PW.
Последний раз редактировалось Smertig; 03.10.2013 в 23:08.
i:=$56; //Высчитал через CE под конкретного моба
ReadProcessMemory(hProcess,Ptr(buf2+i*$4), @buf2, 4,PF);
ReadProcessMemory(hProcess,Ptr(buf2+$4), @buf2, 4,PF);
ReadProcessMemory(hProcess,Ptr(buf2+$120), @mwid, 4,PF);
ReadProcessMemory(hProcess,Ptr(buf2+$124), @mid, 4,PF);
edit3.Text:=inttostr(mwid); //Вывожу значение, совпадает с ID таргета
а с циклом выдает всегда ноль, почему я в 1м посте и написал, что не знаю как закончить цикл, что б сохранить значение.
Код:
i:=-1;
repeat
i:=i+1;
ReadProcessMemory(hProcess,Ptr(buf2+i*$4), @buf2, 4,PF);
ReadProcessMemory(hProcess,Ptr(buf2+$4), @buf2, 4,PF);
ReadProcessMemory(hProcess,Ptr(buf2+$120), @mwid, 4,PF);
until (i >= $300) OR (mwid = WID);
edit3.Text:=inttostr(i); // i выдает 768, т.е. цикл не остановился на mwid=WID
У меня появляется подозрение, что в цикле не сравниdаются mwid и WID, почему - не могу понять
Добавлено через 32 минуты
Разобрался, я в самом начале затупил... считал Таргет ID не в основном цикле (от i=0 до i=768).
как только перенес, всё заработало.
а ты попробуй выводить сообщение на каждом мобе и проверить работоспособность своего цикла. засунь все в один и не разделяй, вот тебе пример
Код:
for i:=0 to $300 do
begin
ReadProcessMemory(hProcess,ptr(baseadress),@buf,4,BytesCount);
ReadProcessMemory(hProcess,ptr(buf+$1C),@buf,4,BytesCount);
ReadProcessMemory(hProcess,ptr(buf+$1C),@buf,4,BytesCount);
ReadProcessMemory(hProcess,ptr(buf+$20),@buf,4,BytesCount);
ReadProcessMemory(hProcess,ptr(buf+$18),@value,4,BytesCount);
ReadProcessMemory(hProcess,ptr(buf+i*4),@buf,4,BytesCount);
ReadProcessMemory(hProcess,ptr(buf+$4),@value,4,BytesCount);
ReadProcessMemory(hProcess,ptr(value+offhp),@hp,4,BytesCount);
ReadProcessMemory(hProcess,ptr(value+offmaxhp),@Maxhp,4,BytesCount);
ReadProcessMemory(hProcess,ptr(value+offmp),@mp,4,BytesCount);
ReadProcessMemory(hProcess,ptr(value+offmaxmp),@maxmp,4,BytesCount);
ReadProcessMemory(hProcess,ptr(value+offlvl),@lvl,4,BytesCount);
ReadProcessMemory(hProcess,ptr(value+OffWID),@MobWId,sizeof(MobWId),BytesCount);
if MobWId=TargetWid then Break;
Оффсеты разумеется свои
________________
Хотите как то отблагодарить за помощь?
Не стесняйтесь нажимайте "Спасибо"
Делаю программы на заказ, по всем вопросам в скайп: Ginrey2