Здравствуйте.
К сожалению, авторы игр борются с автоматизацией рутинных действий. Одним из способов для того, чтобы узнать, использовались ли инструменты автоматизации во время игры является оценка движений мышки пользователя по их внутренним критериям. Возможно предположить, что по этим критериям быстрые и прямолинейные движения могут оцениваться как автоматические, ненатуральные. В этом есть своя правда, рукой сделать прямые быстрые точные до пикселя движения мышкой практически невозможно. Хоть подобного рода перемещения и являют собой наиболее простые и лаконичные движения, из - за того, что они могут послужить поводом до вероятных санкций со стороны администраторов игры, при создании скрипта автоматизации их следует избегать. Для этого придумано много вариантов движений, некоторые из них читатель может найти по этой ссылке:
http://crapware.aidf.org/forum/index.php?topic=2112.0Ниже я предлагаю свой вариант движения.
Кривые Безье, как говорит Википедия, являются частным случаем многочленов Бернштейна. С теорией и практикой реализации алгоритмов можно ознакомиться по следующим ссылкам:
https://habr.com/ru/post/344814/https://habr.com/ru/post/249103/https://www.cat-in-web.ru/bezier-curves/Для построения кривых Безье обычно используется рекурсивный алгоритм де Кастельжо. К сожалению из - за ограничений скриптового языка Кликермэнна, непосредственное применение этого алгоритма в нём невозможно. В настоящей реализации я изменил алгоритм де Кастельжо убрав из него рекурсию и адаптировав его к потребностям автоматизации рутинных действий.
К сожалению, алгоритм кривых Безье требует некоторых вычислительных мощностей, что может привести Кликермэнн, не страдающий быстродействием, в некоторое замешательство. Для увеличения быстродействия может быть полезно написать код в другом, более быстром, языке программирования и подключать его внешней скомпилированной библиотекой.
Также замечу, что алгоритм всегда передвигает мышку точно в назначенное ему место, и, если это требуется, необходимо решить проблему размытия координат внешне.
// Алгоритм передвижения мышки по траекториям Безье.
// На вход подаются координаты конца пути,
// алгоритм осуществляет движение.
// Алгоритм полностью настраиваемый.
// При большом сглаживании может работать медленно.
// Характер кривых подобран так, чтобы
// основные изменения кривизны происходили
// в самом начале пути. Это отображает
// неосознанные движения пользователя мышкой
// в тот момент, когда он ещё только ищет глазами
// элемент, на который надо нажать.
// Автор реализации алгоритма Kashey.
#name "Bezier_move"
// ================ Глобальные переменные
// Количество отрезков, на которое делится путь передвижения. От этого параметра зависит порядок функции Безье и количество петель передвижения. Сильно влияет на производительность.
$steps = 5
// Фактор отклонения отрезков от прямой линии пути. Этот параметр влияет на то, насколько сильно полученный путь будет не похож на прямой отрезок.
$noise = 1
// шаг в расчёте кривых Безье. От этого параметра зависит то, насколько сглаженная будет конечная кривая.
$bezierStep = 2
// Служебные
$tempX = 0
$tempY = 0
// ================ Подпрограммы
// Расчёт точки на отрезке со смещением ptime.
SUB(pointsCalc, $x1, $y1, $x2, $y2, $rx, $ry, $ptime)
setvar($rx, ($x2-$x1)*($ptime/100)+$x1)
setvar($ry, ($y2-$y1)*($ptime/100)+$y1)
END_SUB
// Алгоритм передвижения по кривым Безье
SUB(bezier_move,$_X,$_Y)
// Расчёт длины одного отрезка.
$snipX = ($_X - $_xmouse)/$steps
$snipY = ($_Y - $_ymouse)/$steps
// Расчёт отклонения отрезка.
$divX = INT(ABS($_xmouse - $_X) * $noise)
$divY = INT(ABS($_ymouse - $_Y) * $noise)
// Копирование координат мышки.
$tempX = $_xmouse
$tempY = $_ymouse
// Инициализация массивов с концами отрезков.
$pointsX[0] = $_xmouse
$pointsY[0] = $_ymouse
// Расчёт и запись координат концов отрезков.
FOR($a=0, $a < $steps)
$pointsX[$a+1] = $tempX + $snipX + RND(-$divX, $divX)
$pointsY[$a+1] = $tempY + $snipY + RND(-$divY, $divY)
// Здесь можно подключить свой алгоритм движения. Но тогда алгоритм Безье надо выключить.
// MOVE($tempX + RND(-$divX, $divX), $tempY + RND(-$divY, $divY))
END_CYC
$pointsX[$steps+1] = $_X
$pointsY[$steps+1] = $_Y
// Инициализация вспомогательного массива для временного содержания найденных отрезков Безье.
$arrX[0] = 0
$arrY[0] = 0
// Начало алгоритма кривых Безье.
for($time = $bezierStep, $time < 101, $bezierStep)
// Иницилизируем основной массив концов отрезков, с которым будем работать. $tempPointsX - основной массив, $pointsX - образец.
for($i = 0, $i < arrsize($pointsX))
$tempPointsX[$i] = $pointsX[$i]
$tempPointsY[$i] = $pointsY[$i]
END_CYC
// повторяем до тех пор, пока не останется только Один отрезок.
WHILE(arrsize($tempPointsX) > 2)
For ($i = 0, $i < (arrsize($tempPointsX) - 1))
// Выбираем по два конца отрезков и считаем среднюю точку.
pointsCalc($tempPointsX[$i], $tempPointsY[$i], $tempPointsX[$i + 1], $tempPointsY[$i + 1], "$tempX", "$tempY", $time)
// Складываем во вспомогательный массив.
$arrX[$i] = $tempX
$arrY[$i] = $tempY
END_CYC
// Переписываем точки из вспомогательного массива в основной.
For ($i = 0, $i < (arrsize($tempPointsX) - 1))
$tempPointsX[$i] = $arrX[$i]
$tempPointsY[$i] = $arrY[$i]
END_CYC
// Значений в мвссиве стало на один меньше, удаляем ненужный элемент.
$i = arrpop($tempPointsX)
$i = arrpop($tempPointsY)
END_CYC
// Остался только один отрезок, считаем на нём точку.
pointsCalc($tempPointsX[0], $tempPointsY[0], $tempPointsX[1], $tempPointsY[1], "$tempX", "$tempY", $time)
// Мы получили точку кривой Безье.
$arrX[0] = $tempX
$arrY[0] = $tempY
// Передвигаем в неё мышку.
move(ROUND($arrX[0], 0),ROUND($arrY[0], 0))
// Если вдруг понадобится дополнительно замедлить алгоритм, то в этом месте можно добавить соответствующую команду ожидания.
END_CYC
END_SUB
// Эта часть не является частью алгоритма, написана только с целью демонстрации его работы.
LDOWN($_xmouse,$_ymouse)
$x = $_xmouse
$y = $_ymouse
Bezier_move($x + 500, $y + 500)
LUP($_xmouse,$_ymouse)