Forgotten Heaven - Пособие по ботоводству в игре EVE Online
Пособие по ботоводству в игре EVE Online


UOpilot EVE online

EVE Online – массовая многопользовательская онлайн-игра с элементами ролевой игры, стратегии и космического симулятора.

Как известно – "голактеко жыстока", и данный ресурс призван помочь всем страждущим, исходившим интернет вдоль и поперёк в поисках вожделенного "бесплатный бот для EVE online".

Нет, я не раздаю бесплатных ботов. Я предлагаю вам, затратив минимум усилий написать такого бота самим. Бота, который будет заточен именно под ваши нужды, которого вы сможете сами откорректировать под выходящие обновления игры, и который, разумеется, будет полностью бесплатным.

Его написание не потребует от вас никаких специальных навыков или знаний. Немного свободного времени вкупе с элементарной логикой и азами работы с компьютером смогут скрасить ваше пребывание среди звёзд, избавив от монотонности процесса игры.

Решившимся перейти на тёмную сторону "EVE online" предлагаю начать с основ ботоводства.

Введение

Прежде всего необходимо помнить, что ботоводство и макросерство в EVE находятся по ту сторону закона и караются баном, в том числе и перманентным. Поэтому запуская бота вы должны быть готовы к тому, что в один далеко не прекрасный день ваша учётка может оказаться заблокирована, а баланс на валлете загнан в минус.

Итак, чтобы максимально обезопасить себя от этих неприятностей, необходимо определиться с основными правилами ботовода. Особенно актуальны они для тех, кто собирается использовать бота-фармера. Следовать всем этим правилам, или не следовать ни одному – ваш личный выбор. Каждый сам для себя определяет допустимые риски. Моё дело – предупредить.

  1. Ставится отдельный компьютер со своим отдельным каналом интернет, на котором будет запускаться бот;
  2. Никаких виртуальных машин, т.к. клиент игры при запуске отправляет сведения об аппаратной части компьютера разработчикам;
  3. Регистрируется новая учётная запись на новый, никак не связанный с основным персонажем адрес электронной почты;
  4. Никакого обмена или торговли предметами и тем более исками между основным персонажем и ботом происходить не должно;
  5. Бот запускается через несколько часов после даунтайма, и не более чем на 6-8 часов в день;
  6. По возможности необходимо следить за ботом – отвечать на конво и в локале. Петиции ведь никто не отменял;
  7. Всё, что делает бот должно быть максимально рандомно.
UOpilot Теперь необходимо решить, в какой программе мы будем писать своих ботов. На мой взгляд, по соотношению простота/функциональность наиболее интересным является автокликер "UOpilot 2.31". И пусть вас не смущает, что он написан для игры "Ultima Online". Да – большинством его функций мы воспользоваться не сможем, но тех, что работают, нам вполне хватит для написания бота на выполнение курьерских миссий или на копку астероидов.
Скачать саму программу и получить ответы на все интересующие вас вопросы по ней вы сможете на официальном сайте.
Здесь же я хочу остановиться на особенностях использования "UOpilot 2.31" в игре "EVE online".

Если вам лень идти на официальный сайт или настраивать "UOpilot 2.31", то можете скачать всё необходимое одним архивом: "UOpilot_2.31.rar"

Подготовка к работе

  1. Ищем папку "CCP". Стандартный путь до неё в зависимости от операционной системы "c:\Program Files (x86)\CCP" или "c:\Program Files\CCP";
  2. Распаковываем скаченный по ссылке выше архив в неё. В папке "CCP" у вас должна появиться папка "UOpilot 2.31". В ней находится исполняемый файл "uopilot.exe", файл настроек "uopilot.ini", аудио файл "achtung.wav" и пустая папка для скриптов "Scripts";
  3. Для удобства создаём на рабочем столе ярлык на "uopilot.exe".
Основные понятия

С помощью чего наш бот будет "общаться" с игрой? Клик левой/правой кнопкой мыши по координатам, drag&drop из одних координат в другие, чтение цвета пикселя по координатам, нажатие определённой кнопки, задержка на выполнение команды, привязка к игровому окну. Всё.

Пример 1: Вы хотите привязать бота к окну игры.

set #HandleWindow findwindow (EVE) // присваиваем переменной #HandleWindow хендл окна EVE 
set workwindow #HandleWindow       // активируем окно с хендлом из переменной #HandleWindow
showwindow                         // вызываем рабочее окно на передний план
UOpilot

Пример 2: У вас на складе лежит предмет, который вы хотите выбрать, кликнув по нему левой кнопкой мыши. Увы, но просто использовать команду "left" не получится. Для начала необходимо переместить курсор в интересующую нас точку. Сперва наводим курсор на центр предмета и определяем его координаты. К примеру: "r.235,280".

move 235, 280                      // курсор перемещается в координаты 235, 280
wait 250                           // задержка 250мс, чтобы перемещение отработало корректно
left 235, 280                      // нажимается левая кнопка мыши по координатам 235, 280
wait 250                           // задержка 250мс, чтобы нажатие отработало корректно
UOpilot

Пример 3: Вы хотите вызвать контекстное меню предмета из второго примера. Оно вызывается правой кнопкой мыши. Но для того, чтобы вызвать меню, предмет должен быть выбран. Это относится ко всем объектам – предметам, букмаркам, ссылкам и т.п.

move 235, 280                      // курсор перемещается в координаты 235, 280
wait 250                           // задержка 250мс, чтобы перемещение отработало корректно
left 235, 280                      // нажимается левая кнопка мыши по координатам 235, 280
wait 250                           // задержка 250мс, чтобы нажатие отработало корректно
right 235, 280                     // нажимается правая кнопка мыши по координатам 235, 280
wait 250                           // задержка 250мс, чтобы нажатие отработало корректно
UOpilot

Пример 4: Вы хотите переместить всё тот же предмет с одного места на другое. К сожалению, команда "drag" отрабатывается в "EVE online" некорректно, и даже может привести к зависанию игры. (Например, использование команды "drag" для переноса вещей на станции может привести к невозможности андока. Это лечится входом/выходом в личную каюту). Поэтому приходится выкручиваться. Координаты текущего местоположения предмета мы уже знаем, определяем координаты места назначения. К примеру: "r.310,390".

move 235, 280                      // курсор перемещается в координаты 235, 280
wait 250                           // задержка 250мс, чтобы перемещение отработало корректно
left 235, 280                      // нажимается левая кнопка мыши по координатам 235, 280
wait 250                           // задержка 250мс, чтобы нажатие отработало корректно
left_down 235, 280                 // зажали левую кнопку по координатам 235, 280
wait 250                           // задержка 250мс, чтобы зажатие отработало корректно
move 310, 390                      // курсор перемещается в координаты 310, 390
wait 250                           // задержка 250мс, чтобы перемещение отработало корректно
left 310, 390                      // нажимается левая кнопка мыши по координатам 310, 390
wait 250                           // задержка 250мс, чтобы нажатие отработало корректно
left_up 310, 390                   // отпускается левая кнопка по координатам 310, 390
wait 250                           // задержка 250мс, чтобы отжатие отработало корректно
UOpilot

Пример 5: Вы хотите написать в локале "Привет". Определяем координаты центра окна локала. К примеру: "r.140,655".

move 140, 655                      // курсор перемещается в координаты 140, 655
wait 250                           // задержка 250мс, чтобы перемещение отработало корректно
left 140, 655                      // нажимается левая кнопка мыши по координатам 140, 655
wait 250                           // задержка 250мс, чтобы нажатие отработало корректно
send217 Привет                     // пишется сообщение "Привет"
wait 250                           // задержка 250мс, чтобы написание отработало корректно
send217 [Enter]                    // нажимается кнопка "ввод"
wait 250                           // задержка 250мс, чтобы нажатие отработало корректно
UOpilot

Вот собственно говоря и всё. Все основные моменты рассмотрены.
А теперь нас ждут практические занятия.

UOpilot Вводная

Вы шахтёр-маньяк. Вы копали, копали, и накопали на целый трюм фрейтера. В доке у вас стоит забитый под завязку "Charon", и всё что вам осталось, это долететь до "Jita". Но вот незадача – между системой, в которой вы копали и "Jita" 42 прыжка по империи. Конечно, никто вам не запрещает использовать автопилот. Однако, недостатки такого решения известны всем. Ещё можно сидеть и тыкать в кнопку активации гейта. Долго тыкать. "Charon" он медленный... Очень долго... А можно написать простенького бота, запустить его, и уйти заниматься своими делами.
Вот именно о таком боте и пойдёт речь ниже.

Что надо настроить в самой игре?

  1. Задаём маршрут и выходим из дока;
  2. Cоздаём вкладку в овервью, в которой будут отображаться только гейты и станции;
  3. Метод сортировки овервью задаём по иконкам. Тогда подсвеченные жёлтым гейты или станция назначения окажутся первыми в списке.
Написание программы

Привязываем бота:

set #HandleWindow findwindow (EVE) // присваиваем переменной #HandleWindow хендл окна EVE
set workwindow #HandleWindow       // активируем окно с хендлом из переменной #HandleWindow
showwindow                         // вызываем рабочее окно на передний план
Указываем метку начала исполнительной части программы:

:BEGIN                             // метка начала исполнительной части программы
Выбираем первый в списке овервью объект (тот что подсвечен жёлтым):

move 100, 480                      // перемещаем курсор на объект
wait 500                           // задержка
left 100, 480                      // нажимаем на объект
wait 500                           // задержка
Нажимаем кнопку прохождения гейта/захода в док:

move 120, 335                      // перемещаем курсор на кнопку
wait 500                           // задержка
left 120, 335                      // нажимаем на кнопку
wait 500                           // задержка
Ждём одну секунду:

wait 1000                          // задержка
Возвращаемся к началу исполнительной части программы:

GOTO BEGIN                         // возврат к началу исполнительной части программы
Всё. Этого достаточно для того, чтобы корабль пролетел по заданному маршруту без вашего участия.

Теперь проанализируем нашу программу. Да – она работает. И это хорошо. Плохо то, что если мы передвинем овервью или кнопку активации гейта, то нам придётся переписывать её значительную часть. Чтобы это исправить зададим координаты переменными. Это позволит нам изменять наши координаты только один раз в описательной части, а не искать их по всему телу программы.

set #HandleWindow findwindow (EVE) // присваиваем переменной #HandleWindow хендл окна EVE
set workwindow #HandleWindow       // активируем окно с хендлом из переменной #HandleWindow
showwindow                         // вызываем рабочее окно на передний план
set #GateX 100                     // координаты врат/станции по X
set #GateY 480                     // координаты врат/станции по Y
set #ButtonX 120                   // координаты кнопки по X
set #ButtonY 335                   // координаты кнопки по Y

:BEGIN                             // метка начала исполнительной части программы
move #GateX, #GateY                // перемещаем курсор на объект
wait 500                           // задержка
left #GateX, #GateY                // нажимаем на объект
wait 500                           // задержка
move #ButtonX, #ButtonY            // перемещаем курсор на кнопку
wait 500                           // задержка
left #ButtonX, #ButtonY            // нажимаем на кнопку
wait 500                           // задержка
wait 1000                          // задержка
GOTO BEGIN                         // возврат к началу исполнительной части программы
Уже лучше. Но мы видим, что любое нажатие левой кнопки мыши занимает целых четыре строчки. Единственное, что при этом меняется – координаты точки. Поэтому будет логичным написать процедуру клика. Впоследствии эта процедура нам ещё очень пригодится при рандомизации кликов.

set #HandleWindow findwindow (EVE) // присваиваем переменной #HandleWindow хендл окна EVE
set workwindow #HandleWindow       // активируем окно с хендлом из переменной #HandleWindow
showwindow                         // вызываем рабочее окно на передний план
set #GateX 100                     // координаты врат/станции по X
set #GateY 480                     // координаты врат/станции по Y
set #ButtonX 120                   // координаты кнопки по X
set #ButtonY 335                   // координаты кнопки по Y

:BEGIN                             // метка начала исполнительной части программы
call LСlick #GateX, #GateY         // кликаем на врата/станцию
call LСlick #ButtonX, #ButtonY     // кликаем на кнопку
wait 1000                          // задержка
GOTO BEGIN                         // возврат к началу исполнительной части программы

proc LСlick #LCX #LCY
move #LCX, #LCY                    // перемещаем курсор
wait 500                           // задержка
left #LCX, #LCY                    // нажатие кнопки
wait 500                           // задержка
end_proc                           // конец процедуры клика левой кнопкой
Теперь чтобы кликнуть мышью нам достаточно будет написать всего одну строчку.
Также было бы неплохо, чтобы кликало на активацию гейта не каждую секунду, а только тогда, когда мы пролетели через предыдущий гейт. Смотрим – что меняется в интерфейсе когда мы пропрыгнули? Правильно! Пропадает аватарка гейта над кнопками. Таким образом кликать на кнопку прыжка надо только после того, как она пропадёт. В этом нам поможет команда "get color" и условный оператор "while". Не забываем указать в описательной части программы координаты нашей аватарки, и обнулить исходный цвет проверяемого пикселя.

set #HandleWindow findwindow (EVE) // присваиваем переменной #HandleWindow хендл окна EVE
set workwindow #HandleWindow       // активируем окно с хендлом из переменной #HandleWindow
showwindow                         // вызываем рабочее окно на передний план
set #GateX 100                     // координаты врат/станции по X
set #GateY 480                     // координаты врат/станции по Y
set #ButtonX 120                   // координаты кнопки по X
set #ButtonY 335                   // координаты кнопки по Y
set #GateAvaX 55                   // положение аватарки станции/врат по X
set #GateAvaY 300                  // положение аватарки станции/врат по Y
set #GateAvaC1 0                   // обнуляем первичный цвет аватарки станции/врат

:BEGIN                             // метка начала исполнительной части программы
get color #GateAvaC2 #GateAvaX #GateAvaY // получаем текущий цвет аватарки
while #GateAvaC2 = #GateAvaC1      // пока картинка аватарки не изменится...
get color #GateAvaC2 #GateAvaX #GateAvaY // получаем текущий цвет аватарки
end_while                          // повторяем проверку
wait 5000                          // задержка на прорисовку космоса после пропрыга
call LСlick #GateX, #GateY         // кликаем на врата/станцию
call LСlick #ButtonX, #ButtonY     // кликаем на кнопку
wait 1000                          // задержка
get color #GateAvaC1 #GateAvaX #GateAvaY // получаем первичный цвет аватарки
GOTO BEGIN                         // возврат к началу исполнительной части программы

proc LСlick #LCX #LCY
move #LCX, #LCY                    // перемещаем курсор
wait 500                           // задержка
left #LCX, #LCY                    // нажатие кнопки
wait 500                           // задержка
end_proc                           // конец процедуры клика левой кнопкой
Понемногу приближаемся к идеалу :) Теперь бот постоянно наблюдает за цветом пикселя на аватарке гейта. И начинает выбирать гейт и нажимать кнопку только после того, как цвет поменялся, т.е. корабль пропрыгнул и аватарка пропала. Следующий шаг – научить его определять заход в док. При этом было бы неплохо, чтобы раздавался привлекающий внимание звуковой сигнал. Используем условный оператор "if". В качестве "маркера" однозначно определяющего, что корабль прибыл на станцию удобно выбрать синий цвет на информационной иконке станции.

set #HandleWindow findwindow (EVE) // присваиваем переменной #HandleWindow хендл окна EVE
set workwindow #HandleWindow       // активируем окно с хендлом из переменной #HandleWindow
showwindow                         // вызываем рабочее окно на передний план
set #GateX 100                     // координаты врат/станции по X
set #GateY 480                     // координаты врат/станции по Y
set #ButtonX 120                   // координаты кнопки по X
set #ButtonY 335                   // координаты кнопки по Y
set #GateAvaX 55                   // положение аватарки станции/врат по X
set #GateAvaY 300                  // положение аватарки станции/врат по Y
set #GateAvaC1 0                   // обнуляем первичный цвет аватарки станции/врат
set #StCheckX 1015                 // координаты значка информации станции по X
set #StCheckY 31                   // координаты значка информации станции по Y
set #StCheckC 12542775             // цвет пикселя значка информации станции

:BEGIN                             // метка начала исполнительной части программы
get color #GateAvaC2 #GateAvaX #GateAvaY // получаем текущий цвет аватарки
while #GateAvaC2 = #GateAvaC1      // пока картинка аватарки не изменится...
get color #GateAvaC2 #GateAvaX #GateAvaY // получаем текущий цвет аватарки
end_while                          // повторяем проверку
wait 5000                          // задержка на прорисовку космоса после пропрыга
if #StCheckX, #StCheckY #StCheckC  // если цвет пикселя совпадает с цветом иконки информации станции...
  repeat 3                         // повторять сигнализацию
  alarm achtung.wav                // звуковой сигнал
  end_repeat                       // конец повтора
  end_script                       // конец скрипта
end_if                             // конец условия прилёта на станцию
call LСlick #GateX, #GateY         // кликаем на врата/станцию
call LСlick #ButtonX, #ButtonY     // кликаем на кнопку
wait 1000                          // задержка
get color #GateAvaC1 #GateAvaX #GateAvaY // получаем первичный цвет аватарки
GOTO BEGIN                         // возврат к началу исполнительной части программы

proc LСlick #LCX #LCY
move #LCX, #LCY                    // перемещаем курсор
wait 500                           // задержка
left #LCX, #LCY                    // нажатие кнопки
wait 500                           // задержка
end_proc                           // конец процедуры клика левой кнопкой
Что мы имеем. На данный момент наш бот умеет определять момент пропрыга в гейт. Выбирать следующие врата или станцию и нажимать кнопку пропрыга/захода в док. Определять момент прилёта на станцию и оповещать о заходе в док троекратным звуковым сигналом. После чего бот отключается. Кроме того – при перемещении окон бот легко корректируется изменением переменных в описательной части программы. Чего ещё желать? Однако седьмой пункт правил ботовода гласит: "бот должен быть максимально рандомным".

Сначала сделаем рандомными все задержки. Величину рандома лучше назначить в размере 10% от основной задержки. Далее сделаем рандомными продолжительность клика левой кнопкой мыши и места кликов в пределах от -3 до +3 пикселя. Заодно добавим проверку на зависание нашего бота. Сигнализация будет срабатывать, если по прошествии трёх минут после нажатия кнопки корабль так и не пропрыгнул в гейт. А блок сигнализации выведем в отдельную подпрограмму.

set #HandleWindow findwindow (EVE) // присваиваем переменной #HandleWindow хендл окна EVE
set workwindow #HandleWindow       // активируем окно с хендлом из переменной #HandleWindow
showwindow                         // вызываем рабочее окно на передний план
set #GateX 100                     // координаты врат/станции по X
set #GateY 480                     // координаты врат/станции по Y
set #ButtonX 120                   // координаты кнопки по X
set #ButtonY 335                   // координаты кнопки по Y
set #GateAvaX 55                   // положение аватарки станции/врат по X
set #GateAvaY 300                  // положение аватарки станции/врат по Y
set #GateAvaC1 0                   // обнуляем первичный цвет аватарки станции/врат
set #StCheckX 1015                 // координаты значка информации станции по X
set #StCheckY 31                   // координаты значка информации станции по Y
set #StCheckC 12542775             // цвет пикселя значка информации станции

:BEGIN                             // метка начала исполнительной части программы
get color #GateAvaC2 #GateAvaX #GateAvaY // получаем текущий цвет аватарки
set timer 0                        // обнуляем таймер проверки
while #GateAvaC2 = #GateAvaC1      // пока картинка аватарки не изменится...
get color #GateAvaC2 #GateAvaX #GateAvaY // получаем текущий цвет аватарки
if timer > 180000                  // проверка на зависание скрипта
  gosub Achtung                    // вызов подпрограммы сигнализации
end_if                             // конец проверки на зависание скрипта
end_while                          // повторяем проверку
wait 5000 + random (500)           // задержка на прорисовку космоса после пропрыга
if #StCheckX, #StCheckY #StCheckC  // если цвет пикселя совпадает с цветом иконки информации станции...
  gosub Achtung                    // вызов подпрограммы сигнализации
end_if                             // конец условия прилёта на станцию
call LСlick #GateX, #GateY         // кликаем на врата/станцию
call LСlick #ButtonX, #ButtonY     // кликаем на кнопку
wait 1000 + random (100)           // задержка
get color #GateAvaC1 #GateAvaX #GateAvaY // получаем первичный цвет аватарки
GOTO BEGIN                         // возврат к началу исполнительной части программы

proc LСlick #LCX #LCY
set #LCX #LCX + (-3 + random (7))  // рандомизируем координату по X
set #LCY #LCY + (-3 + random (7))  // рандомизируем координату по Y
move #LCX, #LCY                    // перемещаем курсор
wait 500 + random (50)             // задержка
left_down #LCX, #LCY               // зажатие кнопки
wait 2 + random (1)                // задержка
left_up #LCX, #LCY                 // отпускание кнопки
wait 500 + random (50)             // задержка
end_proc                           // конец процедуры клика левой кнопкой

:Achtung                           // подпрограмма сигнализации
repeat 3                           // повторять сигнализацию
alarm achtung.wav                  // звуковой сигнал
end_repeat                         // конец повтора
end_script                         // конец скрипта
return                             // возврат
UOpilot

Поздравляю! Мы с вами только что написали бот-автопилот для полётов по империи :)



© KMK, 2004—
Яндекс.Метрика