Привет всем,
Я давно забил на rf online и хочу выложить свои наработки по боту, который я написал для себя в свое время. Возможно, они кому-то понадобятся.
Бот работает на всех серверах PvPWaR, работал он на RF Angel и, я полагаю, его можно адаптировать к любым серверам. Не уверен насчет офа и защиты. Все работало на windows 7, для 10-ки нужен запуск от администратора (вроде как) и может быть придется поменять кое-какие хоткеи.
Сразу оговорюсь, что для людей, не знакомых с программированием, это все - просто бесполезный набор файлов, потому что поведение бота достаточно сложное и его нужно программировать. Поэтому я набросаю пару абзацев о принципах работы бота и как я к этому пришел, чтобы было понятно как с этим жить и какие ограничения у него есть, а также помочь разработчикам вроде меня, мало знакомым со спецификой в их начинаниях.
Что важно: уверен, что большинство вещей были сделаны через одно место просто потому что я программист про другое, сделанное не является ни в коем случае лучшей практикой, это просто работало.
Как человек, который мало знаком с системным программированием, перехватом пакетов и т.п. мне было проблемно начать разработку бота таким же образом. Все эти шифрования, подсчет байтов в пакетах и прочее прочее для php-разработчика было мутью, в которую совсем не хотелось влазить. Поэтому выбор изначально пал на кликер на базе AutoIT. Это очень простой скриптовой язык для автоматизации рутинных дел. Тем не менее он обладает рядом ограничений: он умеет читать данные, и умеет нажимать на кнопки и двигать курсор, кликать. Он не умеет ничего “взламывать”, вклиниваться в пересылку данных, отправлять пакеты и т.п.
=== Немного про алгоритмы начала ===
Началось все с простого: перекрашенные в розовый цвет модели мобов, скрипт ищет точку на мониторе по цвету кликает в это место. Затем анализирует место, где должно находиться окошко с выбранным мобом и по цвету пикселей понимает, что моб-таки выбран. И бьет макросом из скиллов и пробелом. Как только окошко пропадает - значит моб труп и можно лутать.
Потом добавилось движение. Попиксельно определялись цвета в местах, где находятся цифры в уголке с мини-картой. Сравнивались с необходимыми. По перекрашенной модели мини-карты (спец. точка, показывающая север) определялось положение камеры, разницей между углов определялся угол, на который нужно повернуться и затем зажатиями стрелок вправо-влево за несколько этапов поворачилось примерно на нужный угол в пути. Все это пересчитывалось попутно движению, добавлялись корректировки и персонаж, болтаясь как пьяный, доходил до нужной точки.
Аналогичным образом определялась смерть и необходимость реснуться. Точка на экране в самой левой части хп красная - живой, черная - мертвый.
Но было палевно, бот не замечал врагов и, что еще хуже, не замечал ребят из той же расы. Поэтому пришлось добавить поиск пикселей на мини-карте, которые показывали наличие рядом врага или союзника.
Аналогичным макаром было сделано определение одетого оружия.
Работало это все на сервере x100 pvpwar в момент когда только появилась оо-броня и оружие в ЛП. Бот тихо мирно фармил берсом одиночных мобов на вампе, а когда появлялась гоп-компания нагибаторов, одевал щит, пил зеленку и убегал, наяривая огромные круги по всей карте, благо там было где разбежаться и вейпоинты были сделаны под огромные дистанции. Убегать под щитом его не утомляло, в отличие от нагибаторов. Затем возвращался к фарму. Потом я понял, что торговца можно взять в бинд и пробелами вызвать окошко торговли и тогда он стал еще и продавать лут сам. Затарился банками, зеленкой и можно на целый день уезжать.
Полагаю, что описанные выше подходы должны вызвать у системных программистов умиление) но мне этого хватало и это работало. К тому же, в архиве есть много старого кода, работающего на старых принципах и чтобы короче это не удивляло.
==== Принципы работы ====
Все очень сильно изменилось когда до меня дошло, что можно читать данные напрямую из памяти программы. Я опишу этот момент несколько подробно, потому что для меня, веб-разработчика это было вновинку, хотя если взять сам подход, то он предельно очевиден.
Итак, есть у нас, скажем, приложение, с главным классом, скажем App, объект которого загружается первым. Положим такой код на псевдокоде:
Class App {
protected int hp;
protected List debufs;
…
}
И сама программа, скажем,
App app = new App();
При таком раскладе получается, что поскольку память под данные выделяется последовательно, то адрес области памяти, выделяемой под первое поле (int hp) будет всегда одним и тем же относительно начала программы. Это позволяет через winapi читать данные прямо из этого адреса. Я использую библиотеку NomadMemory.au3 для этого дела.
Например,
Func sys_getSelectedName()
Local $name = _MemoryRead (0x020F8140, $PROCESS_MEMORY, "char[32]")
Return $name
EndFunc
По адресу 0x020F8140 всегда находится имя выделенного моба или персонажа. И это очень круто, когда адрес статический. Но вернемся к нашему примеру:
Class App {
protected int hp;
protected List debufs;
…
}
Если считать, что в поле debufs будет лежать список всех наложенных дебафов, то понятно, что список постоянно меняется. Старая память удаляется, новая выделяется. В этом случае в поле debufs будет находиться указатель на память, где этот список будет лежать. А памяти, находящейся по адресу из указателя, первым же байтом будет находиться, скажем, количество дебафов. И таким образом, по цепочке указателей можно выудить любые данные находящиеся в игре. Затея эта достаточно геморройная, хоть и реальная поскольку посмотреть на программный код клиента у нас нет никакого шанса и указатели нужно искать вручную. Я пользовался для этого artmoney, там можно искать указатели на память со смещением и даже указатели на указатели на память, в общем есть где разгуляться.
Как через artmoney искать адреса данных, как фильтровать и т.п. я описывать не буду, это есть в интернете.
Таким образом методом проб и ошибок удалось определить:
Имя персонажа
HP
Уровень
Угол повора камеры к горизонту
Зум камеры
Радиус видимости
Имя выделенного персонажа
Одет ли предмет, находящийся в слоте на панели
Есть ли откат в выбранном слоте (откат руны, например, или скилла)
Кол-во активных бафов, кол-во дебафов
Мобы, персонажи и NPC, находящиеся рядом
Видимость персонажей (да, программно невидимки видны, но у меня не получалось делать их видимыми), их раса и пол.
Текущие координаты персонажа в игровом понимании этого дела, т.е. Float-ы, в том числе и отрицательные, а не то, что показывается на мини-карте.
Название локации (важно для телепортов)
Кроме того, оказалось, что в память можно и писать. И в этом случае кое-то да сработает :)
Например,
Если запихнуть в память, отвечающую за бинды, например, бинд по кнопке 1, id моба или персонажа, то нажав программно эту кнопку его можно выделить. Так проблема выделения мобов или игроков испарилась.
Например, если запихнуть в адрес угла поворота камеры нужный угол, то персонажа можно моментально повернуть куда надо без танцев с бубном. Или тот же зум, например.
==== База кода ====
В архиве достаточно большое количество скриптов, отвечающих за разные фармосценарии. Важный момент в том, что я никогда не планировал сделать эдакий универсальный фреймворк, все писалось под конкретные задачи, а потом переписывалось. Поэтому в коде много вещей, учитывающих, например, необходимость одевать антигравы, мечики и бижу на бег на сервере PvPWaR или, скажем, псевдосмерть, когда я играл королучником. Не факт что скрипты будут рабочими.
Кроме того небольшая программа Alice, которая позволяла делать кое-что во время игры руками.
Думаю, стоит разобрать основную идею на примере скрипта. Возьмем, один из последних скрипт фарма деревьев и мотылей по квестам (да, да, привет из 2016 или когда это было :) ) kn-party.au3 и пройдемся по шагам по всем аспектам, чтобы было понятно.
вот так выглядела панелька бота для кача, бот качался на крите
Подрубаем скрипт в combinated-scenario.au3 и запускать будем этот файл. Там есть уже немного хардкода :)
Перед началом функции фарма задаем настройки. Многие настройки носят говорящие имена, вроде мобов для фарма, лутать или нет, количество скиллов и количество скиллов в пвп. Это разные настройки, потому что вы можете не захотеть использовать масс-скиллы на мобах, но захотите юзать их в пвп.
А да, бот умеет нападать на игроков. Вначале он убегал от них, но нападение оказалось более эффективной стратегией, так было значительно меньше вопросов. Про это я расскажу отдельно.
$FARM_LOOT - лутать ли или нет
$PLAYERS_RADAR_DISTANCE - насколько обращать внимание на игроков или же нет
$DOP_AFTER_MOBS = 3 - выпьет доп после 3 мобов
$BUFF_AFTER_MOBS = 100500 - никогда не бафнется, тут баф сделан иначе
$DISTANCE_MOBS = 900 - радиум фарма мобов, стоит ограничивать иногда, чтобы персонаж не убегал в ебеня
Еще немного пометок
Важный момент насчет тп через портал. AutoIT не может отправлять пакеты, поэтому лучшее, что можно сделать - это кликать по окошку. К сожалению, его приходится вырезать картинкой из скриншота :(
Ну а дальше бот бафается и бежит, видимо, через вк уже не помню как он там бегал к споту:
Важные настройки, например,
[15883.4475097656, 8407.89208984375, $accuracy, $doAtk, False, $agrRadius], _
Первые 2 цифры - это координаты. Их можно получить из скрипта scenario-debug-coords.au3 . Просто запускаем скрипт и нажимаем ctrl+1 (или shift+1) смотря в консоли координы. То есть очень удобно собирать вейпоинты. Советую собирать их с небольшим опозданием, потому что скрипт будет чуть раньше реагировать из-за $accuracy (ниже).
$accuracy - это то насколько бот будет точно следовать координатам. Если важно протиснуться в узкое место, $accuracy должно быть маленьким, но есть шанс что он будет слишком сильно дергаться.
$doAtk - атаковать ли мобов. Есть режим включен, то увидев в радиусе моба бот начнет его фармить. Собственно так и сделан фарм. В примере выше мы бежим на спот, поэтому там это не надо.
$flagTurnAtStart - стоит ли повернуться при попадании на координаты. Сразу поворачиват камеру, для прохождения узких мест
$agrRadius - радиус агрессии на персонажей других рас. В нашем текущем случае - 0, значит нападать ни на кого не будет, только бежать. Этот параметр при фарме позволяет фармить рядом с врагами мирно, пока они не подойдут слишком близко.
Ну дальше по коду более-менее ясно. В функции Func Kn_Do_Stigma() показан сложный пример, где бот тянет моба через дебафание и отбегание, а затем убивает его. Обычно сценарии проще - делаем координаты с флагом фармить и даем ему бегать по кругу.
Собственно все описание)
==== Пара советов по поведению бота ====
Не бегайте 100500 раз на один и тот же спот. Сделайте сразу 2-3 сценария и комбинируйте их. Будет палевно если вы подряд 20 раз тепнетесь на одно и то же место в толпу сидящих ланчей под лампами без задержки. Или бот будет прибегать на спот, замечать что он занят, тепаться в гш и снова прибегать через 2 минуты.
Делайте большие вейпоинты. Если вы ограничены, скажем, парой точек на споте, то бот будет бегать туда-сюда как долбанутый, а противники рядом будут стоять и смотреть на него с недоумением О_о
==== Пара забавных историй из жизни бота ====
Первая забавная история произошла когда бот фармил оо на этере на калинах королучником в крит сете с некоторым апдейтом агра на игроков. При появлении врага скрипт тут же переодевал персонажа на бег и он начинал убегать, делал он это быстро ибо лучник. За ним увязывались, переодеваясь также на бег. Но убегал он только до того момента, когда от фарма откатывались скиллы, потом он резко переодевался в атаку и с руной вампа после 3-го скилла в крит-сете влепливал все что у него было во врага. Падали лампы. Разок упал патр белок. Рядовые игроки тем более. У фармера было больше киллов, чем у меня :(
Вторая забавная история произошла, когда у бота завелся друг. Я зашел на него как обычно продать награбленное и тут парень спрашивает, пойду ли я фармить. Я немного офигел. Оказалось что он вместе с ботом регулярно фармили рядом и вместе воевали. Он думал, что персонаж молчаливый, зато не боится за пвп.
Моя история подошла к концу, аж взгрустнулось. Вот архив со всеми наработками. Если есть вопросы из серии объяснить что где по коду, готов ответить на умные вопросы.
Программировать не научу. Деньги ни за что не нужны, ничего не буду дорабатывать.
Ссылка:
Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 150 сообщение(ий)):
У вас нет прав чтобы видеть скрытый текст, содержащейся здесь.
Чтобы его прочитать, вы должны заработать сообщения. Как это сделать бесплатно, описано в правилах форума. Как купить доступ, описано в Платных услугах.
|