Что нового

[Drakensang-Online] Бот для игры

Автор
sebun

sebun

Знающий
Сообщения
81
Репутация
5
Всем доброго времени суток! Благодаря вашей помощи и поддержке я не только залепил этого бота, но и освоился с мазохистскими приемами поиска пикселя. Хотелось бы выразить благодарность всем участникам данной конференции за поддержку и понимание.

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

Долго размышлял, но все же решил задать еще один вопрос - по поводу работы со спрайтами, если можно так выразиться. Скажем имеется набор смайликов, штук 20. И имеется большая картинка, на которой эти рожицы нарисованы вперемешку. Нужно найти участок изображения по образцу. Может дадите совет?
 

bugaj

Знающий
Сообщения
140
Репутация
11
Долго размышлял, но все же решил задать еще один вопрос - по поводу работы со спрайтами, если можно так выразиться. Скажем имеется набор смайликов, штук 20. И имеется большая картинка, на которой эти рожицы нарисованы вперемешку. Нужно найти участок изображения по образцу. Может дадите совет?

создать базу шаблонов изображений и в нужный момент искать нужный шаблон(заданную последовательность пикселей). Если смайлики перемешиваются каждый раз или окно смещается, то искать в конкретном месте не вариант, нужно по всему окну, а если не двигаются то вариант. Других вариантов собственно и нет. :stars:
 

Dellroc

Осваивающий
Сообщения
151
Репутация
31
Русский в памяти отображается коряво [box title=TitleBox]РњРёРњРёРњРё[/box] кто знает как дешифровать?
Расскажите как сделать подбор предметов через память?
 
Автор
sebun

sebun

Знающий
Сообщения
81
Репутация
5
bugaj сказал(а):
создать базу шаблонов изображений и в нужный момент искать нужный шаблон(заданную последовательность пикселей).
Не вариант, к сожалению. Дело в том, что для определения предмета не совсем подходит попиксельное сравнение с шаблоном, так как предмет трехмерный и постоянно вращается. В принципе приблизительный анализ сделать можно, но это уже не мазохизм а извращение, имхо.

Dellroc сказал(а):
кто знает как дешифровать?
Могу предположить, что это не буквы, а коды символов для русского языка (в игре много языков, русский, английский, немецкий). Возможно, ты видишь в памяти содержимое константы, которая содержит не текст, а набор кодов для языкового пакета.

Dellroc, ты все ковыряешь память? С большим интересом слежу за тобой, так как сам не умею (ну, то что мне известно, скажем жизнь, манна, сила, опыт - это я нашел, а вот попытки найти карту, мобов - увы), а других способов приделать мобу глаза пока не знаю, если только наклепать скриншотов с наложенным фильтром и из них составить карту...
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Dellroc:
кто знает как дешифровать?


http://www.online-decoder.com/ru
 
Автор
sebun

sebun

Знающий
Сообщения
81
Репутация
5
Ну вот, все оказалось еще проще - кодировка текста игры - UTF-8, а СЕ показывает текст в Windows-1251, отсюда крякозябли.
 

Dellroc

Осваивающий
Сообщения
151
Репутация
31
Следующий вопрос: средствами autoit и СЕ - это как-то можно сделать?
Отвечаю на свой вопрос по AutoIt
Код:
#include <Encoding.au3>

Local $x = _Encoding_CyrillicTo1251("РњРёРњРёРњРё")
MsgBox(0, "StringIsASCII returns:", $x)


Добавляю адрес цели.
<?xml version="1.0"?>
<CheatTable>
<CheatEntries>
<CheatEntry>
<ID>25</ID>
<Description>"Target Name"</Description>
<Color>80000008</Color>
<VariableType>String</VariableType>
<Length>100</Length>
<Unicode>0</Unicode>
<ZeroTerminate>1</ZeroTerminate>
<Address>"drakensangonline.exe"+00A26C04</Address>
<Offsets>
<Offset>0</Offset>
<Offset>1C0</Offset>
<Offset>1C0</Offset>
<Offset>28</Offset>
<Offset>5A8</Offset>
</Offsets>
</CheatEntry>
</CheatEntries>
</CheatTable>
 

bugaj

Знающий
Сообщения
140
Репутация
11
Не вариант, к сожалению. Дело в том, что для определения предмета не совсем подходит попиксельное сравнение с шаблоном, так как предмет трехмерный и постоянно вращается. В принципе приблизительный анализ сделать можно, но это уже не мазохизм а извращение, имхо.

ну методом анализа графики подругому никак. Память тогда читай. Или можно найти кружок смайлика и чисто в кружке в цикле искать шаблон ) если время от времени находится, значит оно )) и так перебирать все кружки ) с существующими тут скоростями поиска пикселей это конечно бред...
 
Автор
sebun

sebun

Знающий
Сообщения
81
Репутация
5
Dellroc сказал(а):
Добавляю адрес цели.
Что то этот адрес у меня вопросики выдает.

Я все же решил приделать боту глаза путем чтения миникарты. Саму миникарту читает и определяет координаты перса на этой миникарте. Теперь, зная размеры миникарты, размеры окна игры и координаты перса, пытался сложить это в одно целое. Но, к сожалению, кроме поинтов ничего не придумал. Получается следующее:
15cf710db2b9.gif
Карта, как ее видит бот, массив поинтов-точек на ней. Логика следующая: определяем направление, в котором находится следующий поинт, выполняем наведение мыши в этом направлении и жмем "бежать". Во время бега по карте проверяется, дошел перс до поинта или еще бежит. Как только добежал, стоп. Следующий поинт. Таким образом, даже если перс уйдет в сторону, собирая дроп, он всегда вернется в нужное место и не заблудится. Но вот вопрос - как расчитать положение мыши, направление? Пока из вариантов - зная координаты перса и координаты поинта на миникарте попробовать расчитать угол между ними по оси Х, а потом этот угол приложить к направлению движения. Но в этом случае дополнительно придется масштабировать координатную сетку. В принципе, вопроса в этом посте нет, и завтра я попробую данный алгоритм реализовать. Но, если у кого то будут предложения, буду рад!
 

Dellroc

Осваивающий
Сообщения
151
Репутация
31
Что то этот адрес у меня вопросики выдает.
Есть такое. С этим пока облом.
Добавляю ХП моба и активность таргета, т.е. если цель есть то -1, а если нет то 0.
ХП моба слегка глючит, т.к. если не вы добили моба ХП не обнуляется.
<?xml version="1.0"?>
<CheatTable>
<CheatEntries>
<CheatEntry>
<ID>39</ID>
<Description>"HPTarget"</Description>
<Color>80000008</Color>
<VariableType>Float</VariableType>
<Address>"drakensangonline.exe"+00A26C04</Address>
<Offsets>
<Offset>1C8</Offset>
<Offset>24</Offset>
<Offset>24</Offset>
<Offset>88</Offset>
<Offset>52C</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>38</ID>
<Description>"Target"</Description>
<Color>80000008</Color>
<VariableType>Float</VariableType>
<Address>"drakensangonline.exe"+00A2B498</Address>
<Offsets>
<Offset>598</Offset>
<Offset>28</Offset>
<Offset>30</Offset>
<Offset>348</Offset>
<Offset>7B0</Offset>
</Offsets>
</CheatEntry>
</CheatEntries>
</CheatTable>
 

Dellroc

Осваивающий
Сообщения
151
Репутация
31
Я все же решил приделать боту глаза путем чтения миникарты. Саму миникарту читает и определяет координаты перса на этой миникарте. Теперь, зная размеры миникарты, размеры окна игры и координаты перса, пытался сложить это в одно целое. Но, к сожалению, кроме поинтов ничего не придумал. Получается следующее:


Карта, как ее видит бот, массив поинтов-точек на ней. Логика следующая: определяем направление, в котором находится следующий поинт, выполняем наведение мыши в этом направлении и жмем "бежать". Во время бега по карте проверяется, дошел перс до поинта или еще бежит. Как только добежал, стоп. Следующий поинт. Таким образом, даже если перс уйдет в сторону, собирая дроп, он всегда вернется в нужное место и не заблудится. Но вот вопрос - как расчитать положение мыши, направление? Пока из вариантов - зная координаты перса и координаты поинта на миникарте попробовать расчитать угол между ними по оси Х, а потом этот угол приложить к направлению движения. Но в этом случае дополнительно придется масштабировать координатную сетку. В принципе, вопроса в этом посте нет, и завтра я попробую данный алгоритм реализовать. Но, если у кого то будут предложения, буду рад!
Поделитесь скриптом для получения монохромной карты. OCR скрипт есть в наличии?
 
Автор
sebun

sebun

Знающий
Сообщения
81
Репутация
5
Поделитесь скриптом для получения монохромной карты. OCR скрипт есть в наличии?
Код:
Local $posWin = WinGameXY($hWnd)      ; получаем координаты рабочей области относительно экрана (461,145,1350,714)
   Local $posMap[4] = [60, 90, 237, 256] ; координаты карты относительно окна (при нажатии I открывается рюкзак и карта засвечивается)
   
   ; Рассчитываем положение карты относительно экрана(521,235,698,401)
   Local $posMapWin[4]
   $posMapWin[0] = $posWin[0]+$posMap[0]
   $posMapWin[1] = $posWin[1]+$posMap[1]
   $posMapWin[2] = $posWin[0]+$posMap[2]
   $posMapWin[3] = $posWin[1]+$posMap[3]
   
   ; Подготовка к сканированию   
   FFSetDebugMode(1)      ; режим отладки
   FFsetWnd($hwnd)        ; какое окно будем считывать (дескриптор)
   FFResetColors()        ; очистить список цветов  (удаляет массив из FFAddColor)
   FFResetExcludedAreas() ; удалить зоны исключения (удаляет зоны из FFAddExcludedArea)
   
   Local $aColorArray[3] = [0x999999, 0x6a6b6b, 0x6ae359]      ; массив цветов, которые будем искать (два цвета карты и зеленый кружок)
   
   FFAddColor($aColorArray)                                    ; Добавляем указанные в массиве цвета в список тех, что будут отфильтрованы
   
   FFSnapShot($posMap[0],$posMap[1],$posMap[2],$posMap[3])     ; Захватываем участок экрана заданных параметров (координаты относительно окна)
   FFKeepColor(-1, 21, False)                                  ; Оставляем только нужные цвета
   
   FFSaveBMP( "Minimap_" & @HOUR & @MIN & @SEC, False )

Но вопрос с определением мобов пока открыт. Примерно такая же функция, какую я сделал для карты, работает внутри двух вложенных циклов, которые гоняют курсор по всему экрану (при наведении мыши на моба он засвечивается красным и именно этот цвет считывается). Пробовал определять движение на экране, но, к сожалению, в dll нужного функционала нет. А мне нужна мгновенная реакция на события. Пытался найти про многопоточность, но понял, что ее Автоит до сих пор не поддерживает. Задумался про интеракцию (обмен сообщениями между процессами), но как она на процессоре скажется, еще вопрос...

Dellroc, как у тебя дела? Удалось что нибудь накопать?
 

Dellroc

Осваивающий
Сообщения
151
Репутация
31
Всё никак времени не могу найти начать писать движение, да и сервер стал часто обновляться и данные в памяти меняют место. Основная идея научить двигаться бота в слепую и делать геодату самому. Лень картами пользоваться, да и функция получится универсальной. Докачался до 21 лвла :smile:
Про несколько процессов для многопоточности - в принципе я это пробовал для другой игры и хорошо работало, но проц конечно грузило нормально. Хотя возможно проца было мало CoreDuo.
 
Автор
sebun

sebun

Знающий
Сообщения
81
Репутация
5
да и сервер стал часто обновляться и данные в памяти меняют место
Вот как раз еще одна из причин, почему я и не хотел лезть в память. Обновления там почти каждый месяц. Про слепое движение - это я уже реализовал, сбивается с курса периодически. Сегодня-завтра закончу с движением по поинтам и чтение миникарты, посмотрим что получиться.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Дак это, изменения в памяти имеют статичный характер в 99% случаев. То есть если вы имеете сотню адресов, и после патча они изменили своё положение, в 99% случаев вам достаточно найти один новый изменившийся адрес и в CE есть такая штука как "пересчитать адреса", тоесть вы нашли один адрес, указали CE на его старый адрес и добавили остальные адреса довеском, и CE пересчитает все новые адреса.
 
Автор
sebun

sebun

Знающий
Сообщения
81
Репутация
5
Да, это так. Но в этом случае нужно писать для бота какой то сканер памяти, не знаю, реально ли это на автоите, я еще не со всеми его функциями знаком. В противном случае после каждого патча придется обновлять всех ботов. Лично я пока упор делаю на графике и работе с ней. Получается сейчас нормально, шустренько, если не считать функцию поиска моба. Попробую ее оптимизировать, например, сделать скриншот с цветами, которые имеют мобы, после этого уже тыкать туда мышкой и смотреть, не засветился ли. Бегают мобы быстро, в некоторых даже попадать не успеваю, некоторых вообще не видно, в частности боссов, но работа идет. Быть может сваяем с помощью Dellrokа какой то гибрид, а может я его научу определять траекторию полета "снаряда" и мочить ту точку, откуда он прилетел... Время покажет.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Не свояете. Дельрок и тк видно в какую сферу тебя тянет. Ну небывает "графопамятичных" ботов. Точнее бывает. В музеях. Ты покажи исходник, и тогда, возможно даже я, укажу путь развития и подскажу вектор [sansei_smile]
 
Автор
sebun

sebun

Знающий
Сообщения
81
Репутация
5
Ну небывает "графопамятичных" ботов. Точнее бывает. В музеях.
Ну почему же. Напимер, характеристики перса мне удобнее доставать из памяти, чем писать скрипт распознавания, скажем, ХП, по картинке. А поскольку позиции мобов мне неизвестны, ищу их с помощью графики. То есть, есть задача, ее нужно решить. И часто мы их решаем самыми простыми способами. Код? Я уже писал, но выложу еще раз. Первая функция - поиск координат моба на карте:
Код:
Func SearchMob()
   
   Local $Win[4] = [462, 190, 1350, 635] ; координаты сканируемой области
   
   ; Принцип поиска мобов основан на том факте, что при наведении на моба он подсвечивается красным цветом.
   ; Поиск моба заключается в следующем: рабочая зона разбивается на регионы, внутри которых передвигается
   ; указатель мыши. В это время сканируется окно игры. Если цвет есть, значит по координатам мыши моб!
   
   ; делим область на части (сетка)
   $Rx = 12 ; размерность сетки по оси X
   $Ry = 7 ; размерность сетки по оси Y
   
   $clPos = WinGetClientSize($hWnd) ; получаем размер (W,H) клиентской части окна, то есть без учета хэдера и бордеров
   
   $blockX = Floor($clPos[0]/$Rx) ; ширина блока (по оси Х)
   $blockY = Floor($clPos[1]/$Ry) ; высота блока (по оси У)
   
   ; Расчет блоков на экране и поиск пикселей заданного цвета
   Local $blockXY[2] ; координаты текущего блока
   
   For $iXbloc = 0 To $Rx-1 Step 1
	  For $iYbloc = 0 To $Ry-1 Step 1
		 
		 $iX = $Win[0] + ($blockX * $iXbloc) ; положение блока по оси Х
		 $iY = $Win[1] + ($blockY * $iYbloc) ; положение блока по оси Y
		 
		 $blockXY[0] = $iX+($Rx/2)
		 $blockXY[1] = $iY+($Ry/2)
		 
		 MouseMove ( $blockXY[0], $blockXY[1], 0 ) ; навести мышь на центр региона
		 
		 $mobPos = ScanMob() ; сканируем на предмет наличия моба
		
		 If $mobPos<>0 Then
			Local $MobXY[2]
			$MobXY[0] = $mobPos[0] + 453 ; коррекция координаты относительно экрана, а не окна
			$MobXY[1] = $mobPos[1] + 115
			Return $MobXY ; моб обнаружен!
		 EndIf
		 
	  Next
   Next
   	
   Return 0 ; ничего не нашел
   
EndFunc

Функцию сканирования я частично выкладывал, выложу полностью:
Код:
Func ScanMob($PosZone=0)
   
   FFSetDebugMode(0)      ; режим отладки
   FFsetWnd($hwnd)        ; какое окно будем считывать (дескриптор)
   FFResetColors()        ; очистить список цветов  (удаляет массив из FFAddColor)
   FFResetExcludedAreas() ; удалить зоны исключения (удаляет зоны из FFAddExcludedArea)
   
   Local $aColorArray[3] = [0x7e1616, 0xbe1914, 0xb7120d] ; массив цветов, которые будем искать
   
   FFAddColor($aColorArray)                                    ; Добавляем указанные в массиве цвета в список тех, что будут отфильтрованы
   
   FFSnapShot(2,47,890,490)                                    ; Захватываем участок экрана заданных параметров (координаты относительно окна)
   FFKeepColor(-1, 20, False)                                  ; Оставляем только нужные цвета
   
   ;FFSaveBMP( "Minimap_" & @HOUR & @MIN & @SEC, False )
   
   ;-------------- ИЩЕМ ОБЪЕКТ --------------
   FFAddExcludedArea(352, 69, 540, 85)   ; исключаем полоску жизни из поиска (координаты относительно окна)
   FFAddExcludedArea(435, 203, 462, 250) ; исключаем самого персонажа
   FFAddExcludedArea(618, 464, 654, 505) ; исключаем значек огня (появляется, когда перс горит)


   ;Parameters ( FFNearestSpot должна вернуть координаты участка относительно окна, содержащего группу пикселей )
   $SizeSearch = 30      ; Ширина и высота области для поиска. Это размер сторон "квадрата". Функция будет искать область $SizeSearch на $SizeSearch пикселей, которые отвечают критериям цвета. 
   $NbPixel = 200        ; Минимальное количество пикселей в области. Функция ищет места, содержащие $NbPixel с подходящими цветами. 
   $PosX = 442           ; X координата ближайшей позиции. (поиск вернет координаты, расположенные наиболее близко к этой точке) задал координаты перса относительно рабочей области
   $PosY = 240           ; Y координата ближайшей позиции. (поиск вернет координаты, расположенные наиболее близко к этой точке)
   $Color = -1           ; Цвет, который я хочу найти (или -1 для использования списка цветов FastFind вместо одного цвета) 
   $ShadeVariation = 20  ; Значение вариаций (от 0 до 255) каждого компонента цвета, который я ищу, если основной цвет не найден
   $ForceNewSnap = False ; Если это True, будет сделан новый снимок, и поиск будет сделан на нем. По умолчанию True. Если я поставлю False, то снимок должен быть сделан заранее. 
      
   If IsArray($PosZone) Then
	  ; переданы координаты сканируемой области (относительно окна).
	  $Left   = $PosZone[0] ; Координата X (область поиска).
	  $Top    = $PosZone[1] ; Координата Y (область поиска).
	  $Right  = $PosZone[2] ; Правая координата (область поиска).
	  $Bottom = $PosZone[3] ; Нижняя координата (область поиска).
   Else
	  $Left = 0   ; Координата X (область поиска). По умолчанию 0.
	  $Top  = 0   ; Координата Y (область поиска). По умолчанию 0.
	  $Right = 0  ; Правая координата (область поиска). По умолчанию 0.
	  $Bottom = 0 ; Нижняя координата (область поиска). По умолчанию 0.
   EndIf
   
   $NoSnapShot = 0        ; Это номер слота для снимка, который я делаю. Я могу хранить до 1024 различных снимков в памяти. Оставить значение по умолчанию, если не нужно держать более одного снимка в памяти. 
   $WindowHandle = $hwnd  ; Дескриптор окна, с которым будем работать

   Local $aCoords = FFNearestSpot( $SizeSearch, $NbPixel, $PosX, $PosY, $Color, $ShadeVariation, $ForceNewSnap, $Left, $Top, $Right, $Bottom, $NoSnapShot, $WindowHandle )

	If Not @error Then	   
	   Return $aCoords ; возвращаются координаты относительно рабочей области окна
   EndIf
   	
   Return 0 ; ничего не нашел
   
EndFunc

Вот такой у меня сейчас поиск. Не айс, но работает. К статичным цифрам прошу не придираться, перед запуском бот сворачивает окно до минимально возможных размеров и помещает его в угол экрана. Координаты всегда фиксированные.
 

Dellroc

Осваивающий
Сообщения
151
Репутация
31
Зачётная тема про ирис онлайн, но с её написания прошло много времени. Может выложишь гайды по пакетному уровню или ASM инжектам? Так как вся остальная информация в этой теме не несёт полезной нагрузки.
 
Верх