Создание автокликера для Lineage 2
-
0
-
7482
Никто из нас не любит использовать расходники в Lineage 2 ручками. Многие уже забыли о прямых пвп, когда дагер выходил без ацп. Пользуемся всякими утилитами по типу ACP, пилота, радара; делаем бинды на клавиши, кнопки, скролы мыши/клавиатуры. Но частенько на серверах запрещены использования пакето-зависимых программ, а кликеры и биндеры отслеживают по логам, донесениям и прочим тривиальным способам. В этом гайде я научу вас созданию более-менее умного кликера. Даже не научу, а задам направление для размышлений и разработки.
Нам потребуется
Для создания автокликера можно использовать практически любой язык программирования (Delphi и C++ Builder очень просты в изучении, да и потом они вам пригодятся), можно взять готовые кликеры или исполнители скриптов. Главное, чтобы в вашей среде можно было бы совершать следующие операции:
- определение цвета пиксела на экране
- команда создания случайного числа (random)
- команда задержки времени в милисекундах или более мелких единицах (delay)
- отправлять нажатия клавиш
Проектирование
Это самый сложный этап. На нём нужно разработать алгоритм - последовательность команд и действий, благодаря которой наш кликер будет функционировать. Давайте для примера определимся, что использовать мы будем Greater CP Potion. Соответственно цель восстановления - Combat Points (CP). По аналогии сделать под любой другой расходник сможет даже ребенок. Что нам известно?
- Восстанавливает CP (количество восстанавливаемых поинтов нас не интересует)
- Имеет откат 500мс (если путаю не бейте но это не суть важно)
Каким образом работает программа? Одна часть следит за количеством СР, посылая соответствующие сообщения другой. Вторая часть в зависимости от сообщений хавает или не хавает банки.
Прим. Я предпочитаю разделять эти две части на отдельные потоки (Windows Threads). Под каждый расходник - свой поток.
Рассмотрим проектирование каждой из частей.
1. Определяем когда включать автоюз банок. Очень не рекомендую начинать хавать банки при любом изменении показателя СР. Это палевно. Задавайте этот уровень на ваше усмотрение. Я ставлю обычно что-нибудь в районе 90%. Также для более реального человеческого фактора можно привязать включение автоюза к горячей клавише, а не к уровню СР. Выключаем автоюз по достижении полного количества шкалы, либо по факту смерти, либо при расходе всех банок. Как это реализуется, рассмотрим потом ниже.
2. Теперь нам нужно придумать как создать кликанье банок максимально приближенное к использованию банок человеком, а также максимально эффективное в этих ограничениях. Первое, что я советую сделать, это поклацать на слот ЦП банок в обычном бою и заметить, сколько раз в секунду вы нажимаете. Я, например, клацаю около трёх раз. Будем отталкиваться от этой цифры. Идеал робота - 2 раза в секунду (откат полсекунды). Следовательно, нам нужно произвести количество нажатий кратное двум. Я клацаю 3 раза. Думаю спокойно можно клацать и 4 раза. Поэтому остановимся на этой цифре. В идеальных условия, если программа производит 4 клика в секунду, выпивается максимально возможное количество банок, т.е. две штуки. Задержка между кликами получается 1000 / 4 = 250 (мс). Это максимальная эффективность. Естественно, в логах сервера это красиво отображается, и даже самый тупой админ хотя бы начнёт вас подозревать. А дальше доказать применение ПО автоматизации, как два пальца обасфальт. Посему введём человеческий фактор клика. Нам необходимо создавать задержки случайного значения между стандартно-отмеренными кликами с добавлением времени фиксированной задержки. Вы спросите, почему только добавляем время? Почему не отнимаем время, ведь мы можем клацнуть по клавиатуре и быстрее, чем обычно? Отвечаю, отнимание времени очень сильно понижает эффективность программы. Любое отнимание сопутствуется пропуском съедания одной банки. В логах только случайная прибавка времени будет выглядеть и так правдоподобнее некуда. Барьеры случайности увеличения задержек выбирайте сами. Помните, это палка о двух концах. С одной стороны - эффективность, с другой - реалистичность.
Реализация
Реализацию будем рассматривать также по двум частям.
1. Чтобы определить уровень СР, нам необходимо знать цвет пикселов полного СР. При этом учтите, На всей ширине полоски, цвета разные.
Не стоит привязываться к постоянным координатам и постоянным цветам, т.к. при следующем запуске клиента не факт, что окно не переместится, или вам вдруг захочется изменить гамму или вообще хуй его знает, что может случится. Поэтому необходимо определять цвет пиксела полного СР и его уровень при каждом запуске нашего автокликера. Я это делаю очень просто: необходимо подвести курсор к уровню СР, после пересечения, которого начинает работать автоюз, и нажать горячую клавишу. После нажатия программа запоминает координаты пиксела и его цвет.
Как только цвет пиксела по этим координатам изменился, значит нас пиздят, и надо хавать банки. Отправляется сообщение второй части программы: "поехали!". Как только цвет снова становится идентичным заданному, отправляется сообщение "всё, харе".
Небольшой пример реализации автокликера на С++, используя WinAPI:
POINT Cursor_Position; // Позиция пиксела
COLORREF CP_Color; //Цвет пиксела с заполненным СР
GetCursorPos(&Cursor_Position); //Определяем позицию пиксела по положению курсора
hdc = CreateDCA("DISPLAY",NULL,NULL,NULL); //получаем текущий контекст экрана
CP_Color=GetPixel(hdc, Cursor_Position.x, Cursor_Position.y); //Определяем цвет пиксела по позиции для текущего контекста экрана
bool AutoUse = false; //переменная, отвечающая за работу автоюза
while (!End) //цикл проверки цвета пиксела
{
Sleep(10); //задержка между проверками. 10 мс достаточно, чтобы не грузить комп hdc = CreateDCA("DISPLAY",NULL,NULL,NULL); if(GetPixel(hdc, Cursor_Position.x, Cursor_Position.y)!=CP_Color) ) //если цвет изменился, и автоюз выключен {
if (!AutoUse) {
SendMessage("начать автоюз"); //отдаем комманду AutoUse = true;
}
} else //если цвет равен заданному, и автоюз включен {
if(AutoUse) {
SendMessage("всё нормально, глуши мотор"); AutoUse = false;
}
}
}
Что то в таком духе...
2. Реализуем часть программы, которая долбит слот с банками. Работать начинает по приказу первой части, по нему же и заканчивает. Напишем реализацию на абстрактном коде. Зададим функции:
- Задержка( Время ); - выставляет задержку по параметру Время, который идёт в милисекундах (Например, Задержка(1500); - делает паузу на полторы секунды)
- Случайно( Предел ); - создаёт случайное число из диапазона 0 - Предел. (Например, Случайно(350); может быть равно 0, 12, 104... 350 )
- Нажать( Клавиша ); - делает виртуальное нажатие клавиши (Например, Нажать(Ф12); - клацает F12)
Сейчас я покажу простенький пример комбинирования нажатий с человеческим фактором. Оно идёт в цикле, условием выхода из которого является получение комманды остановки от первой части программы. Пусть слот с СР банками - 12
Задержка ( 250 + Случайно ( 200 + Случайно (200) ) );
Это простейшая хитрость. Придумывать и играться со случайными задержками можно много и долго. Создавать ветвистые алгоритмы, с формулами по расчету этих чисел. Я только лишь показал, как нужно делать, в какую сторону двигаться.
Мы рекомендуем Вам зарегистрироваться, либо войти на сайт под своим именем.