Если текст вызывает улыбку - он не является флудом
Насчет умного поста есть один глупый вопрос - не могу придумать, каким способом можно обходить препятствия. Могу включить в умения перса проходить сквозь них, если возникнет ситуация, с которой бот не справится.
Допустим, прыгнул - не помогло. Движение вправо - не помогло... Проходим. Но это не выход. Могу еще сирену включить, чтоб ботовода разбудить (системный бипер, например). Это вообще жестоко.
maxim31153 А вот тут есть несколько выходов. Первый - скачать Autoit и начать читать форум полностью. Если будут какие то вопросы - всегда помогут те, кто будет в сети. Но для этого нужны какие то начальные знания. Второй - есть платные боты довольно неплохого качества. Найти их в сети нетрудно. Главное - не накачать вирусов на "левых" сайтах. Третий - подождать, может, все таки кто нибудь напишет что нибудь более путевое и выложит хотя бы для теста. Я собирался выложить, но меня напрягает то обстоятельство, что за это привлекли ботописателей в китае. И, наверно, надолго. Да и не готов мой бот еще...
vies1812 HP первого питомца BaseAdress+$20+$c24+$10+$38
Максимального нет. Может, оно где то и есть - не нашли. Можно при каждом считывании HP сравнивать его с MaxHP. Если HP больше MaxHP, присваиваем значение MaxHP. Вроде работает. Автор идеи FunkU.
KOPC Напиши, какие смещения ему нужны - не пользовался я этим ботом. Или гугли, если до сих пор еще не нашел.
Добавил: Не это?
[Perfect_World_Base_Address_In_Decimal]
Application_Title=Element Client
Base_Address=9925052
[Custom_32_Offsets_In_Decimal]
Target_OffSet=2664
MaxMP_OffSet=1176
MaxHP_OffSet=1172
MP_OffSet=1128
HP_OffSet=1124
Ну вот, нафлудился... Всем удачного фарма!
Тем, кто знает больше меня, над ответами не смеяться!!!
Могу предложить выход для этой ситуации, но это уже не по силам будет аутоиту, я думаю. Точнее, этот выход будет нагружать систему до небывалых высот.
Тем не менее, смотри в сторону алгоритма "красскал" или алгоритма "Дейкстра". Второй сложнее, но результативнее. А крас простой, тупой, долгий, но работает.
Это алгоритмы ИИ перемещения.
Гм.... Слишком умный ответ. Ну, по крайней мере, для меня... А для аутоита так вообще... Но все равно спасибо.
Добавил:
Погуглил, подумал... Ну в принципе, с красскалом даже скриптовый справится. Попадаются ресурсы, где все это обьяснено на пальцах... Но я не собирался прикручивать к боту матрицу для рассчета интеллектуального движения от города к городу. Задача минимум - при не привязанном к определенной точке фарме обходить единичное препятствие от координат, где стоял перс до координат трупа моба. Поиск ближайшего незанятого моба соответствующего лвл соответствующего типа есть. Как следствие - постоянный неконтролируемый сдвиг координат перса. При агре моба удар скилом через встреченное препятствие проходит (я так понимаю - магия, блин), а вот перс до выпавшего лута иногда дойти не может. Так что решение - либо привязать перса к точке фарма с ограничением действия по доступному радиусу, либо все таки читать геодату, потому что "тыканье" персом для определения доступности прохода сделать можно, но выглядеть это будет не совсем эстетично.
Насчёт дэйкстры, это ты хорошо подколол... Кстати, далеко не самый удачный алгоритм. Есть вариант делать собственную геодату и карту проходимости. И потом (если её разбить по квадратам) можно и a* использовать. Но всё выше описанное - извращение из разряда "онанизм в присядку".
BuBucekTop: по CS болел раньше? про PodBOT знавал?
Там используется именно тобой описанный алгоритм, самый простой в создании и самый объемный, я тоже делал waypoint-ы, просто бегал по полям, бот у меня сам ставил точки где надо
Где надо - точка с прыжком, где надо - точка с обзором мобов, где надо взлетать, где садиться, какую высоту держать... и т.д.
А потом для формирования маршрутного графа я юзал дейкстру. Таким образом перс легко пересекал всю карту.
ну... я думаю, ясно, что это не понты, а открытая передача неформализованного алгоритма?
Skand: геодату из клиента не просто получить можно, ей можно пользоваться прямо в клиенте. Это тоже одно из полей основного класса игры.
что то я задумываться стал о переработке своей зверушки... под открытый пкоаз.
Можно, но чуть погодя. Там все поля по другому теперь расположены и моя старая информация негодня, разве только для обучения.
Кстати все это можно углядеть в моей ексельке, которую я где то на 55 странице выложил...
Всем привет
После изучения autoit и копания в коде MHS возник вопрос:
как сделать так чтобы бот после убийства моба атаковал другова моба петом, а потом летел на место смерти предыдущего моба и собирал лут?
Буду рад любым подсказкам, заранее спс.
ajiekc92: последовательность действий:
1- проверяем хп моба, если больше 0, то выходим.
2- запоминаем координаты моба.
3- выбираем следующего моба.
4- шлем команду 'Alt+1' в клиент.
5- устанавливаем точку перемещения на запомненные координаты.
6- в течении 2-3 сек собираем лут просто посылкой команды сбора лута.
7- включаем режим атаки текущего моба.
Код написать не надо просить, я напишу открытый C++ код и ничего не будет понятно. Это неформализованный простенький алгоритм. Формализовать его следует самому, а иначе зачем изучать аутоит вообще?
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
Может мне все таки кто нибудь объяснить про инжекцию, какая функция вызывается первой InjectFunc или SelectMonster и какие значения подставлять в InjectFunc в Func, aParams и aParamsSize? Какой СallAddress?
Может мне все таки кто нибудь объяснить про инжекцию, какая функция вызывается первой InjectFunc или SelectMonster и какие значения подставлять в InjectFunc в Func, aParams и aParamsSize? Какой СallAddress?
После выбора языка, стоит начать читать книжки по программированию.
Чтобы подставлять какие-либо значения в функции, надо знать, что эти функции делают, для этого нужно идти на или хотя бы гуглом воспользоваться. А для определения СallAddress - дебаггер (ollydbg можно) тебе в руки + много свободного времени и желание учиться.
Я пишу на С#, но так как в нем нельзя вставлять ассемблерные строки, приходится создавать проект на C++ и вставлять в мой проект. Я хочу разобраться как делается инжекция, поэтому и спрашиваю разные примеры.