Rus. server

11/07/2009 13:20 drShtain#571
Quote:
Originally Posted by sumikot View Post
Ну раз я первый зашел, мне и флудить...

drShtain
Насчет умного поста есть один глупый вопрос - не могу придумать, каким способом можно обходить препятствия. Могу включить в умения перса проходить сквозь них, если возникнет ситуация, с которой бот не справится.
Могу предложить выход для этой ситуации, но это уже не по силам будет аутоиту, я думаю. Точнее, этот выход будет нагружать систему до небывалых высот.
Тем не менее, смотри в сторону алгоритма "красскал" или алгоритма "Дейкстра". Второй сложнее, но результативнее. А крас простой, тупой, долгий, но работает. :)
Это алгоритмы ИИ перемещения. ;)
11/07/2009 17:04 sumikot#572
Гм.... Слишком умный ответ. Ну, по крайней мере, для меня... А для аутоита так вообще... Но все равно спасибо.

Добавил:
Погуглил, подумал... Ну в принципе, с красскалом даже скриптовый справится. Попадаются ресурсы, где все это обьяснено на пальцах... Но я не собирался прикручивать к боту матрицу для рассчета интеллектуального движения от города к городу. Задача минимум - при не привязанном к определенной точке фарме обходить единичное препятствие от координат, где стоял перс до координат трупа моба. Поиск ближайшего незанятого моба соответствующего лвл соответствующего типа есть. Как следствие - постоянный неконтролируемый сдвиг координат перса. При агре моба удар скилом через встреченное препятствие проходит (я так понимаю - магия, блин), а вот перс до выпавшего лута иногда дойти не может. Так что решение - либо привязать перса к точке фарма с ограничением действия по доступному радиусу, либо все таки читать геодату, потому что "тыканье" персом для определения доступности прохода сделать можно, но выглядеть это будет не совсем эстетично.
11/07/2009 19:36 BuBucekTop#573
Насчёт дэйкстры, это ты хорошо подколол... Кстати, далеко не самый удачный алгоритм. Есть вариант делать собственную геодату и карту проходимости. И потом (если её разбить по квадратам) можно и a* использовать. Но всё выше описанное - извращение из разряда "онанизм в присядку".
11/07/2009 20:44 Skand#574
А из клиента можно получить геодату?
11/08/2009 06:20 drShtain#575
BuBucekTop: по CS болел раньше? про PodBOT знавал? :)
Там используется именно тобой описанный алгоритм, самый простой в создании и самый объемный, я тоже делал waypoint-ы, просто бегал по полям, бот у меня сам ставил точки где надо ;)
Где надо - точка с прыжком, где надо - точка с обзором мобов, где надо взлетать, где садиться, какую высоту держать... :) и т.д. :)
А потом для формирования маршрутного графа я юзал дейкстру. Таким образом перс легко пересекал всю карту. :)
ну... я думаю, ясно, что это не понты, а открытая передача неформализованного алгоритма? :)

Skand: геодату из клиента не просто получить можно, ей можно пользоваться прямо в клиенте. Это тоже одно из полей основного класса игры.

что то я задумываться стал о переработке своей зверушки... под открытый пкоаз. :)
11/08/2009 11:09 dwar#576
Quote:
Originally Posted by drShtain View Post
геодату из клиента не просто получить можно, ей можно пользоваться прямо в клиенте. Это тоже одно из полей основного класса игры.
А можно немного подробнее: как найти эти данные, что они из себя представляют?
11/08/2009 15:22 drShtain#577
Можно, но чуть погодя. Там все поля по другому теперь расположены и моя старая информация негодня, разве только для обучения.
Кстати все это можно углядеть в моей ексельке, которую я где то на 55 странице выложил...
11/10/2009 13:45 ajiekc92#578
Всем привет
После изучения autoit и копания в коде MHS возник вопрос:
как сделать так чтобы бот после убийства моба атаковал другова моба петом, а потом летел на место смерти предыдущего моба и собирал лут?
Буду рад любым подсказкам, заранее спс.
11/10/2009 14:44 drShtain#579
ajiekc92: последовательность действий:
1- проверяем хп моба, если больше 0, то выходим.
2- запоминаем координаты моба.
3- выбираем следующего моба.
4- шлем команду 'Alt+1' в клиент.
5- устанавливаем точку перемещения на запомненные координаты.
6- в течении 2-3 сек собираем лут просто посылкой команды сбора лута.
7- включаем режим атаки текущего моба.

Всё. Вопросы? :)
11/11/2009 00:01 johnic#580
Здравствуйте, прочитал тему про инжекции [Only registered and activated users can see links. Click Here To Register...] , но не смог в ней разобраться, может сможет кто выложить код на С++ под PW-RU, для таргета
11/12/2009 07:31 johnic#581
Подскажите, в фунции
Quote:
procedure InjectFunc(Hdl: Cardinal; Func: Pointer; aParams: Pointer; aParamsSize: cardinal);
var
BytesWrite :cardinal;
ProcessId :cardinal;
hThread :cardinal;
ThreadId :cardinal;
BytesRead :cardinal;
ThreadAddr : pointer;
ParamAddr : pointer;
begin
if Hdl<>0 then
begin
ChangePrivilege('SeDebugPrivilege', True);

// Выделяем в открытом процессе память под имя модуля
ThreadAddr := VirtualAllocEx(Hdl, 0, 4096, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if ThreadAddr = nil then Exit;

// Пишем имя модуля в его адресное пространство
WriteProcessMemory(Hdl, ThreadAddr, Func, 4096, BytesWrite);

// Выделяем память под структуру, которая передается нашей функции
ParamAddr := VirtualAllocEx(Hdl, nil, aParamsSize, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if ParamAddr = nil then Exit;

// Пишем саму структуру
WriteProcessMemory(Hdl, ParamAddr, aParams, aParamsSize, BytesWrite);

// Запускаем удаленный поток
hThread := CreateRemoteThread(Hdl, nil, 0, ThreadAddr, ParamAddr, 0, ThreadId);
if hThread = 0 then Exit;

// Ждем пока удаленный поток отработает...
WaitForSingleObject(hThread, INFINITE);
VirtualFreeEx(Hdl, ThreadAddr, 4096, MEM_RELEASE);
VirtualFreeEx(Hdl, ParamAddr, aParamsSize, MEM_RELEASE);
CloseHandle(hThread);
end
end;
какие входные параметры.

Как я понял Hdl - это Handle процесса,
а что означает Func, aParams и aParamsSize
11/14/2009 00:05 johnic#582
Может мне все таки кто нибудь объяснить про инжекцию, какая функция вызывается первой InjectFunc или SelectMonster и какие значения подставлять в InjectFunc в Func, aParams и aParamsSize? Какой СallAddress?
11/14/2009 00:15 Skand#583
johnic, сначала определись на каком языке ты будешь писать. Сначала ты просишь пример на С++, а потом даешь код на Delphi.
11/14/2009 03:22 dwar#584
Quote:
Originally Posted by johnic View Post
Может мне все таки кто нибудь объяснить про инжекцию, какая функция вызывается первой InjectFunc или SelectMonster и какие значения подставлять в InjectFunc в Func, aParams и aParamsSize? Какой СallAddress?
После выбора языка, стоит начать читать книжки по программированию.
Чтобы подставлять какие-либо значения в функции, надо знать, что эти функции делают, для этого нужно идти на [Only registered and activated users can see links. Click Here To Register...] или хотя бы гуглом воспользоваться. А для определения СallAddress - дебаггер (ollydbg можно) тебе в руки + много свободного времени и желание учиться.
11/14/2009 08:49 johnic#585
Я пишу на С#, но так как в нем нельзя вставлять ассемблерные строки, приходится создавать проект на C++ и вставлять в мой проект. Я хочу разобраться как делается инжекция, поэтому и спрашиваю разные примеры.