PDA

Просмотр полной версии : [Руководство] Получаем список ближайших мобов и NPC [Delphi 7]


sedrik1992
12.07.2014, 03:05
Доброго времени суток.

Сделал небольшую наработку для получения списка ближайших мобов и NPC,
в приложении исходник на Delphi 7.

Код работающий, но по-моему громоздкий.
Если кто разбирается, подскажите, можно ли как-то код оптимизировать?

[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Ginrey
12.07.2014, 17:09
зачем тебе вообще этот участок кода?

ReadProcessMemory (hProcess, Pointer(ba), @tpm, 4, Nob);
ReadProcessMemory (hProcess, Pointer(tpm+$1C), @tpm1, 4, Nob);
ReadProcessMemory (hProcess, Pointer(tpm1+$30), @tpm2, 4, Nob);
ReadProcessMemory (hProcess, Pointer(tpm2+$1458), @cnt1, 4, Nob);
ReadProcessMemory (hProcess, Pointer(cnt1+$3C), @cnt1, 4, Nob);
tc1:=integer(cnt1); //Target counter

ты же его нигде не применяешь в конечном счете

так же идет двойной повтор SetLength(D,n+1);
то есть у тебя массив станет в 2 раза больше чем есть мобов на карте, не критично но все же.
Убрать излишние Begin_End и будет минимум используемого кода

csx: _or_75
12.07.2014, 17:32
Вообще количество мобов вокруг можно было сделать проще чере GameAddress

GA + 1C + 20 + 5C

[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Но ты делаешь через BaseAddress

BA + 1C + 1C+ 20 + 14

[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Итог:

[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Kyroki
12.07.2014, 18:51
Я мобов(и нпс) нахожу так
for i:=0 to 768 do begin
MobWID:=0;
ReadProcessMemory (hProcess, Pointer(GameAdress), @Mob, 4, NoB);
ReadProcessMemory (hProcess, Pointer(Mob+$1C), @Mob, 4, NoB);
ReadProcessMemory (hProcess, Pointer(Mob+$20), @Mob, 4, NoB);
ReadProcessMemory (hProcess, Pointer(Mob+$1C), @Mob, 4, NoB);
ReadProcessMemory (hProcess, Pointer(Mob+i*$4), @Mob, 4, NoB);
ReadProcessMemory (hProcess, Pointer(Mob+$4), @Mob, 4, NoB);
ReadProcessMemory (hProcess, Pointer(Mob+$120), @MobWId, 4, NoB);
if Integer(MobWId) <> 0 then begin
ReadProcessMemory (hProcess, Pointer(Mob+$B4), @MobType, 4, NoB);
if Integer(MobType) = 6 then begin
ReadProcessMemory (hProcess, Pointer(Mob+$29C), @MobDis, 4, NoB);
ReadProcessMemory (hProcess, Pointer(Mob+$124), @MobId, 4, NoB);
ReadProcessMemory (hProcess, Pointer(Mob+$128), @MobLVL, 4, NoB);
ReadProcessMemory (hProcess, Pointer(Mob+$278), @MobN, 4, NoB);
ReadProcessMemory (hProcess, Pointer(MobN+$0), @MobName, 255, NoB);
ReadProcessMemory (hProcess, Pointer(Mob+$3C), @MobLocX, 4, NoB);
ReadProcessMemory (hProcess, Pointer(Mob+$44), @MobLocY, 4, NoB);
ReadProcessMemory (hProcess, Pointer(Mob+$40), @MobLocZ, 4, NoB);
end;
end;
end;

sedrik1992
13.07.2014, 08:08
зачем тебе вообще этот участок кода?

ReadProcessMemory (hProcess, Pointer(ba), @tpm, 4, Nob);
ReadProcessMemory (hProcess, Pointer(tpm+$1C), @tpm1, 4, Nob);
ReadProcessMemory (hProcess, Pointer(tpm1+$30), @tpm2, 4, Nob);
ReadProcessMemory (hProcess, Pointer(tpm2+$1458), @cnt1, 4, Nob);
ReadProcessMemory (hProcess, Pointer(cnt1+$3C), @cnt1, 4, Nob);
tc1:=integer(cnt1); //Target counter

ты же его нигде не применяешь в конечном счете

так же идет двойной повтор SetLength(D,n+1);
то есть у тебя массив станет в 2 раза больше чем есть мобов на карте, не критично но все же.
Убрать излишние Begin_End и будет минимум используемого кода


Спасибо за ответ. Да,лишнее не убрал. Я изначально мобов заносил в массив, одновременно с ID и LVL, а затем циклом в листбокс выводил. Честно говоря пытался сделать 3 массива, для ID, Имени и LVL, но не додумал, как это проще реализовать...