Что нового

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

Автор
sebun

sebun

Знающий
Сообщения
81
Репутация
5
Так же интересно, может кто разгадает тайну вот этого кода:

Код:
While 1
     $iCursorOld = _WinAPI_GetCursorInfo()
     ToolTip($iCursorOld[2],10,10)
     ConsoleWrite($iCursorOld[2]&@CRLF)
 WEnd


Вернее значения, которое он возвращает.


Добавлено:
Сообщение автоматически объединено:

dcfb18b3e7f5.gif


Я теряюсь в догадках, что это может быть... Вот кусок кода из SearchPortal():

Код:
Local $portalPos = FFNearestSpot($SizeSearch, $NbPixel, $PosX, $PosY, $Color, $ShadeVariation, $ForceNewSnap, $Left, $Top, $Right, $Bottom, $NoSnapShot, $WindowHandle)

			If Not @error Then
			
				Return $portalPos ; портал обнаружен!
				
			EndIf


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

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Строка 274 проверяете, если не массив то выполняются 2 функции, когда они выполнятся, скрипт продолжится со строки 279, где вы уже обращаетесь к переменной $PosPortalXY которая уже не массив. Отсюда и ошибка.
 
Автор
sebun

sebun

Знающий
Сообщения
81
Репутация
5
А я что делаю? В 274-й идет проверка "если не массив", в 276-й выдача окна и через 10 сек перезапуск бота и игры. Но все равно добирается до 279-ой. Значит это массив, он проходит условие.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Мы не знаем что ты делаешь. Код функции SearchPortal мы не видим.
Что она делает после приведённого тобой куска кода? Может она возвращает двумерный массив...
Ну и что что ты сделал проверку на массив/не массив. Откуда нам знать что делают функции Skill_Return и ErrorHandler? Может это просто заглушки...
:shaman_s_bubnom:
 
Автор
sebun

sebun

Знающий
Сообщения
81
Репутация
5
Я привел хвост функции SearchPortal(), что бы не перегружать форум ненужными данными. Там с помощью FastFind выполняется поиск нужной точки на экране. Приведенный код - хвост. То есть за этим кодом идет Return 0 и EndFunc. Эх, ладно, выложу целиком под спойлер:
Код:
Func SearchPortal($HWnd=0)

	If $HWnd = 0 Then $HWnd = WinGetHandle ("[TITLE:Drakensang Online: браузерная онлайн-игра в стиле фэнтези; CLASS:QWidget]")

	If Not $HWnd Then
		ErrorHandler(1, "Невозможно получить дескриптор окна клиента.")
	EndIf
	
	; Проверка активности окна
	If CheckWinActive($HWnd) = 0 Then
		ErrorHandler(1, "Невозможно активировать окно игры.", $HWnd)
	EndIf
	

	; Принцип поиска портала основан на том факте, что при наведении на него курсора он подсвечивается белым цветом.
	; Поиск портала заключается в следующем: рабочая зона разбивается на регионы, внутри которых передвигается
	; указатель мыши. В это время сканируется окно игры. Если под курсором есть белый квадрат, значит там портал!

	; делим область на части (сетка)
	$Rx = 15 ; размерность сетки по оси X
	$Ry = 10 ; размерность сетки по оси Y

	$clPos = WinGetClientSize($hWnd) ; получаем размер (W,H) клиентской части окна, то есть без учета хэдера и бордеров

	$blockX = Floor($clPos[0] / $Rx) ; ширина блока (по оси Х)
	$blockY = Floor($clPos[1] / $Ry) ; высота блока (по оси У)

	Local $blockXY[2] ; координаты текущего блока

	; Настройки сканирования
	FFSetDebugMode(0)
	FFsetWnd($hWnd)
	FFResetColors()
	FFResetExcludedAreas()

	Local $aColorArray[3] = [0xc4ffff, 0xb4f4ff, 0xabdeff]
	FFAddColor($aColorArray)

	;Parameters
	$SizeSearch = 20
	$NbPixel = 150
	$PosX = 445
	$PosY = 263
	$Color = -1
	$ShadeVariation = 40
	$ForceNewSnap = False

	$Left = 0
	$Top = 0
	$Right = 0
	$Bottom = 0

	$NoSnapShot = 0
	$WindowHandle = $hWnd


	; Запуск чтения
	For $iXbloc = 0 To $Rx - 1 Step 1
		For $iYbloc = 0 To $Ry - 1 Step 1
			
			$iX = $blockX * $iXbloc
			$iY = $blockY * $iYbloc
			
			$blockXY[0] = $iX + ($Rx / 2)
			$blockXY[1] = $iY + ($Ry / 2)
			
			MouseMove($blockXY[0], $blockXY[1], 0)
			
			FFSnapShot(2, 40, 890, 510) 
			FFKeepColor(-1, 20, False)
			Sleep(10)
			Local $portalPos = FFNearestSpot($SizeSearch, $NbPixel, $PosX, $PosY, $Color, $ShadeVariation, $ForceNewSnap, $Left, $Top, $Right, $Bottom, $NoSnapShot, $WindowHandle)

			If Not @error Then
			
				Return $portalPos ; портал обнаружен!
				
			EndIf
			
		Next
	Next
	
	Return 0 ; ничего не нашел

EndFunc   ;==>SearchPortal

Далее. Skill_Return применяет скилл возврата в город. Просто наводит мышку на кнопку, нажимает ее, ждет 12 сек. и Return.
Код:
Func Skill_Return()

	; Проверка активности окна
	If CheckWinActive($HWnd) = 0 Then
		ErrorHandler(1, "Невозможно активировать окно игры.", $HWnd)
	EndIf
	
	$return_button_X = Random(105, 135, 1)
	$return_button_Y = Random(528, 555, 1)
	
	MouseMove($return_button_X, $return_button_Y)
	MouseClick("left", $return_button_X, $return_button_Y)
	Sleep(12000)
	
EndFunc      ;==>Skill_Return

По поводу обработчика ошибок, да, это типа заглушки:
Код:
Func ErrorHandler($errType=0, $errMessage=0, $HWnd=0)

	; Самое распространенное событие в игре - сброс авторизации. Поэтому первым делом выполняется
	; проверка на присутствие окна авторизации. Если такое окно есть, запускаем процесс авторизации,
	; уведомив об этом пользователя (окно уведомления автоматически закрывается через N секунд).
	
	If $errType <> 0 And $errType <> 1 And $errType <> 2 Then $errType = 0 ; проверяем тип
	If Not IsString($botName) Then $botName = ""                           ; проверяем название бота, это у меня константа, в другом файле
	
	Local $magAddition = "" ; сообщение, которое добавляется к $errMessage
	
	Select                  ; текст, который будет добавлен к сообщению
		Case $errType = 0
			$msgFlag     = 16
			$msgWinName  = $botName & ": КРИТИЧЕСКАЯ ОШИБКА"
			$magAddition = "ERROR HANDLER: Бот будет остановлен через 10 сек."
			$msgTimeOut  = 10
		Case $errType = 1
			$msgFlag     = 16
			$msgWinName  = $botName & ": ОШИБКА"
			$magAddition = "ERROR HANDLER: Бот будет перезапущен через 10 сек."
			$msgTimeOut  = 10
		Case $errType = 2
			$msgFlag     = 48
			$msgWinName  = $botName & ": ВНИМАНИЕ"
			$magAddition = "ERROR HANDLER: Бот продолжит работу через 10 сек."
			$msgTimeOut  = 10
	EndSelect
	
	
	; Подготавливаем сообщение
	If Not IsString($errMessage) Then $errMessage = "ОШИБКА: отсутствует текст сообщения"
	$msgMessage = $errMessage & @LF & @LF & $magAddition
	
	
	; Если ошибка критическая, немедленно завершить работу бота:
	if $errType = 0 Then
		MsgBox( $msgFlag, $msgWinName, $msgMessage, $msgTimeOut)
		Exit
	EndIf
	
	
	; Проверяем систему и определяем дальнейшую работу бота:
	If Not ProcessExists('drakensangonline.exe') Then ; проверяем, запущен ли процесс игры
		If Not ProcessExists('thinclient.exe') Then ; проверяем, запущен ли сам клиент игры
			MsgBox( $msgFlag, $msgWinName, $msgMessage, $msgTimeOut)
			RestartGame() ; не найдены ни игра, ни клиент, выполняем запуск игры повторно
		Else
			MsgBox( $msgFlag, $msgWinName, $msgMessage, $msgTimeOut)
			AuthThinClient() ; клиент thinclient.exe запущен, выполняем авторизацию
		EndIf
	Else
		MsgBox( $msgFlag, $msgWinName, $msgMessage, $msgTimeOut)
		If $errType <> 2 Then Return 1 ; игра запущена, выполняем возврат к скрипту
	EndIf
	
EndFunc

Ну и кусок кода, в котором ошибка:
Код:
While 1
    ;bla bla bla... длинный код движения по поинтам

GUICtrlSetData($lblStatus, "Статус: движемся в сторону портала...")
	GoPoint(209, 228)

	GUICtrlSetData($lblStatus, "Статус: подходим ближе...")
	GoPoint(214, 234)

	$PosPortalXY = SearchPortal() ; выполняем поиск портала в регионе Собор Тегана
	If Not IsArray($PosPortalXY) OR Not IsNumber ($PosPortalXY[0]) OR  Not IsNumber ($PosPortalXY[1]) Then
		Skill_Return()  ;портал не найден, возврат
		RestartGame()
		Exit
	EndIf

	MouseMove($PosPortalXY[0], $PosPortalXY[1]) ; навести мышь на портал
	MouseClick("left", $PosPortalXY[0], $PosPortalXY[1], 1) ; входим в Крепость Тегансуол

	GUICtrlSetData($lblStatus, "Статус: переход в локацию Крепость Тегансуол...")
	Sleep(8000) ; тут у меня ожидание прогрузки следующей локации
	
        ; вышли в другую локацию, рядом с персом портал обратно, ищем его и заходим, начинаем фарм заново
	$PosPortalXY = SearchPortal() ; выполняем поиск портала в регионе Крепость Тегансуол
	
	If Not IsArray($PosPortalXY) OR Not IsNumber ($PosPortalXY[0]) OR  Not IsNumber ($PosPortalXY[1]) Then ;портал не найден
		Skill_Return()
		ErrorHandler(1, "Не удалось обнаружить портал в Собор Тегана.")
	EndIf

	Sleep(500)
	MouseMove($PosPortalXY[0], $PosPortalXY[1]) ; навести мышь на портал
	MouseClick("left", $PosPortalXY[0], $PosPortalXY[1], 1) ; входим в Собор Тегана

	GUICtrlSetData($lblStatus, "Статус: входим в Собор Тегана") ; сообщаем о входе в локацию
	Sleep(8000) ; ждем загрузки локации

       ; ну а тут цикл возвращается в начало и снова бег по поинтам

WEnd

Вот собственно и все. Кстати, все это дело работает, ошибки изредка. Ну может несколько раз в сутки. Заметил еще такую странность - возвращаюсь с работы, ноут в отрубе, включение показывает, что был вылет с синим экраном смерти. Уже неделю так. Иногда дотягивает до вечера. Есть пока одно предположение - в некорректной работе FF-библиотеки, что то где то переполняется. Еще заметил, что логика работы сбивается, то есть функцию SearchPortal() автоит даже не запускает. Так же замечал, что иногда как бы блокируется рабочий стол, то есть все элементы становятся недоступны, кнопки не работают. Приходится посылать его на три... клавиши. После запуска taskmgr работоспособность восстанавливается.

C2H5OH сказал(а):
Ну и что что ты сделал проверку на массив/не массив.
Чет мне как то не по себе от второй строки в твоей подписи... Уж не в эту ли лужу я попал? :-[
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Код:
If $errType <> 2 Then Return 1 ; игра запущена, выполняем возврат к скрипту


Вот здесь функция возвращается в скрипт и на строке 274 вываливается с ошибкой.
 
Автор
sebun

sebun

Знающий
Сообщения
81
Репутация
5
И? Здесь вначале проверяется наличие процесса игры и, если процесс присутствует, а параметр $errType не равен 2, то возврат. Возврат... Возврат... Твою мать! ВОЗВРАТ!!! :Virus:


Добавлено:
Сообщение автоматически объединено:

Спасибо! Элементарной вещи не заметил. Исправил. Сегодня на ночь запущу.
 

Dellroc

Осваивающий
Сообщения
151
Репутация
31
Лично у меня FF вообще корректно не работает. То не видит свою библиотеку в папке со скриптом, то вываливается с крашем. В 2.0 FFLocalizeChanges ещё хоть как-то работает (если FF увидит всё же свою библиотеку), а в 2.2 и эта функция не робит, т.к. после неё в краш опять же уходит. Зато в 2.2 нет проблем с подгрузкой библиотеки :smile:
Сырая либка ещё.
 
Автор
sebun

sebun

Знающий
Сообщения
81
Репутация
5
Ну а что делать, я альтернатив пока не знаю.
 
Автор
sebun

sebun

Знающий
Сообщения
81
Репутация
5
Возник еще такой вопрос: необходимо определить цвет надписи на картинке и потом распознать, что на ней написано. Понимаю, что звучит туповато, но... Вот картинка:
302c0c6bab99.png


Надпись на ней может быть шести разных цветов. Работаю с FastFind 2.2. Картинку получает функция FFSnapShot, после чего к ней применяется фильтр FFKeepColor, в наборе которого такой массив цветов:

Код:
Local $aColorWhite[3]  = [0xf7f7f7, 0xc7c7c7, 0x9a9a9a] ; белый цвет
Local $aColorGreen[3]  = [0x26e400, 0x22cb00, 0x188e01] ; зеленый цвет
Local $aColorBlue[3]   = [0x006de8, 0x0066d8, 0x00499b] ; синий цвет
Local $aColorPurple[3] = [0xef16ef, 0xd115d1, 0xbb14ba] ; фиолетовый цвет
Local $aColorOrange[3] = [0xf76900, 0xd85c02, 0xb54e04] ; оранжевый цвет
Local $aColorYellow[3] = [0xebca11, 0xc4a910, 0xbda310] ; желтый цвет


На выходе получаю только надпись на черном фоне, как показано на изображении.

Задача первая - определить, к какому из массивов относится найденный цвет, если ShadeVariation = 30? Надпись может располагаться в любом месте картинки но всегда по центру. Решил использовать функцию FFGetPixel, которая в цикле читает картинку слева направо. Находим цвет, отличный от черного. Дальше мои действия?

С распознаванием текста проблем не возникло, а вот с определением цветового диапазона начал тупить... Воспользовался функцией FFNearestPixel и задачу решил, но она вызывается шесть раз, а это лишние вычисления и время. Поиск по форуму...хм..признаться, я весь форум так и не перелопатил, так как очень много мусора от новичков, сопровождающихся напоминанием правил от Belfigora ;)

Ну и попутно второй вопрос. Задача - преобразовать все пиксели в один цвет, ну скажем в красный. Задачу так же решил - цикл читает все пиксели на картинке и, если пиксель не черный, применяет к нему FFSetPixel. Таким образом перед распознаванием я привожу все градации цветов к одному виду. Вопрос: есть ли решение проще и, желательно, средствами FastFind, так как я не знаю, как с помощью функций других библиотек прочитать пиксель с картинки, записанной в память с помощью FF.
 
Автор
sebun

sebun

Знающий
Сообщения
81
Репутация
5
Молчит народ...

Вопрос исключительно по AutoIT:

Код:
Select
    Case $FarmLocation = 'Собор Тегана'
        If Not FileExists("./location/sobor_tegana.au3") Then ErrorHandler(0, "Не найден файл локации.")
		#include "./location/sobor_tegana.au3"
		
    Case $FarmLocation = 'Ашрайя'
		If Not FileExists("./location/ashraiya.au3") Then ErrorHandler(0, "Не найден файл локации.")
		#include "./location/ashraiya.au3"
		
	Case $FarmLocation = 'Средоточие храмов'
        If Not FileExists("./location/sredotochie_hramov.au3") Then ErrorHandler(0, "Не найден файл локации.")
		#include "./location/sredotochie_hramov.au3"
		
    Case Else
        ErrorHandler(0, "Неверно задано название локации.")

EndSelect

В данном коде по идее должен подключиться файл с одной единственной функцией, имеющей во всех файлах одинаковое название, но разное содержимое. Вначале бот определяет, где находится, а потом включает логику прохождения данной локации. Что бы не писать все в один файл, решил разбить на несколько, так как объем довольно большой. Но возникло две проблемы. Первая - автоит сам проверяет подключаемые файлы и выдает ошибку, если их нет. То есть If Not FileExists здесь нафик не нужно, а хотелось бы самостоятельно контролировать этот процесс. Думаю где то должна быть соответствующая настройка. Второй вопрос собственно по конструкции. Применять переменные в инклюде нельзя, а в случае с селектом выползает сообщение, что оператор селект не закрыт, то есть подключенный код, содержащий внутри Func...EndFunc ломает структуру. Есть ли варианты?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
По поводу определения цвета. Вопрос зачем? Если у тебя есть черный фон, и на нём какой-то цвет, то не проще ли распознать находящийся на нём текст по параметру "Не черный"? Я только так и делаю, отбрасываю лишние цвета, остается черный фон и другие цвета, и с ними я уже работаю просто как с "не черными". Грубо говоря моему боту без разницы какой там цвет, после отбрасывания ненужных цветов - там в любом случае остался именно тот который мне нужен.
 
Автор
sebun

sebun

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

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Ну тогда просто после отсеивания ненужных цветов, то есть на черном фоне останется один из нужных цветов, придется в цикле по горизонтальной линии, например по середине области проверить наличие каждого нужного цвета, и какой сработал, того шаблон и выбираем.


Добавлено:
Сообщение автоматически объединено:

Я бы воспользовался чем-то вроде этого:
Код:
Local $aColor[24]  = ['White', 0xf7f7f7, 0xc7c7c7, 0x9a9a9a, 'Green', 0x26e400, 0x22cb00, 0x188e01, 'Blue', 0x006de8, 0x0066d8, 0x00499b, 'Purple', 0xef16ef, 0xd115d1, 0xbb14ba, 'Orange', 0xf76900, 0xd85c02, 0xb54e04, 'Yellow', 0xebca11, 0xc4a910, 0xbda310]
Local $sCurColor = "null"
For $i = 0 To UBound($aColor, 1) - 1 Step 1
   If IsString($aColor[$i]) Then 
	  $sCurColor = $aColor[$i]
   Else
	  For $x = 0 To $x = 100 Step 1 ;Ищем от начала вооражаемой области и до конца, координата y известна заранее.
		 ;Тут выполняется какая-то проверка, непомню название, допустим FFGetPixel(x,y) и в случае успеха она возвращает цвет в текущих координатах в виде 0xFFFFFF
		 If 0xd85c02 = $aColor[$i] Then MsgBox(0,0,"Found group: "&$sCurColor)
	  Next
   EndIf
Next


Код:
If 0xd85c02 = $aColor[$i] Then MsgBox(0,0,"Found group: "&$sCurColor)

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

sebun

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

Ты не поверишь, но именно так я и сделал, правда напихал туда кучу лишнего.
Код:
Local $aColorWhite[3]  = [0xf7f7f7, 0xc7c7c7, 0x9a9a9a] ; белый цвет
			Local $aColorGreen[3]  = [0x26e400, 0x22cb00, 0x188e01] ; зеленый цвет
			Local $aColorBlue[3]   = [0x006de8, 0x0066d8, 0x00499b] ; синий цвет
			Local $aColorPurple[3] = [0xf816f8, 0xc712c7, 0xa40fa4] ; фиолетовый цвет
			Local $aColorOrange[3] = [0xf76900, 0xd85c02, 0xb54e04] ; оранжевый цвет
			Local $aColorYellow[3] = [0xebca11, 0xc4a910, 0xbda310] ; желтый цвет
			
			FFAddColor($aColorWhite) ; Добавляем цвета в фильтр
			FFAddColor($aColorGreen)
			FFAddColor($aColorBlue)
			FFAddColor($aColorPurple)
			FFAddColor($aColorOrange)
			FFAddColor($aColorYellow)

			;тут у меня снапшот и кипколор...
			
			For $i = 1 To 6 Step 1 ; перебираем возможные цвета, поочередно загружая их в массив.
			
				FFResetColors() ; очистить список цветов  (удаляет массив из FFAddColor)
				
				Select ; загружаем в массив нужный цвет
					Case $i = 1
						FFAddColor($aColorWhite) ; Добавляем цвета в фильтр
						$colorName = "white"
					Case $i = 2
						FFAddColor($aColorGreen)
						$colorName = "green"
					Case $i = 3
						FFAddColor($aColorBlue)
						$colorName = "blue"
					Case $i = 4
						FFAddColor($aColorPurple)
						$colorName = "purple"
					Case $i = 5
						FFAddColor($aColorOrange)
						$colorName = "orange"
					Case $i = 6
						FFAddColor($aColorYellow)
						$colorName = "yellow"
				EndSelect
				
				; Преобразуем все пиксели на картинке в белые и черные и определяем позицию Х начала и конца надписи:
				$xStart = 0 ; начало надписи
				$xEnd   = 0 ; конец надписи
				
				For $rX = $ntX To $ntW-1 Step 1
					For $rY = $ntY To $ntH Step 1					
						$cP = FFGetPixel ( $rX, $rY, 1 )						
						If $cP <> 0 Then
							FFSetPixel ( $rX, $rY, dec("ffffff"), 1 ) ; красим
							If $xStart = 0 Then                       ; и запоминаем координаты
								$xStart = $rX
							Else
								$xEnd = $rX
							EndIf
							
						EndIf					
					Next
				Next
;ну и так далее в том же духе ))

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

А что по поводу ответа (то есть вопроса) #110, я так и не нашел описания проблемы?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Для перехвата ошибок есть что-то вроде OnAutoitErrorRegisterMessage или как-то так, не помню. А что мешает заменить Select на кучу Ifок? :smile:
 
Автор
sebun

sebun

Знающий
Сообщения
81
Репутация
5
Ифок говоришь? Получается, что у меня, как и в любом ЯП, внутрь селекта вставился код с моей функцией, что и вызывало ругань компилятора на незакрытый селект, точно так же должен ругаться на незакрытый иф. Но попробую модифицировать код, уверен, что получиться.

Только вот чем дальше в лес тем больше дров. Это мой первый бот и, продолжая работу над ним я стал понимать, что изначально этот путь (работа исключительно с графикой) оправдывает себя лишь отчасти. Так, что бы реализовать более менее высокую скорость реакции на события, тактику ведения боя и так далее, мне нужно четко знать, что на карте в данный момент находится, какой моб, какого лвл и т.д. Есть ведь мобы, которые после смерти взрываются, нанося охрененный урон, есть те, которые применяют разные скиллы, и нужно успеть отскочить. И вот тут доходит, что FF-детская забава. И нужно либо лезть в память, либо лезть в пакеты. Думаю пока начать с первого, но я не умею потрошить память. Не нужно давать ссылку на пост "Потрошим память игры" от Belfigor-а, там половины материала нет. Пока пытаюсь освоить Cheat Engine. Буду рад любым советам на данную тему.
 
Автор
sebun

sebun

Знающий
Сообщения
81
Репутация
5
В каком смысле? И как я мог быть конкурентом, если это был единичный заказ, заточенный исключительно под мага и исключительно под несколько локаций высокого уровня? Я не ставил цели написать мегасуперкомбайн для всех. Свою задачу я выполнил. Клиент сейчас недоволен только тем, что иноманты, для добычи которых и писался бот, урезали. Теперь клиент требует фарм новых локаций, в принципе там только поинты расставить за 50 баксов ) Но если продолжать тему монетизации, то назревает желание все же расширить возможности бота. Причем все пишут ботов под конкретные задачи, конкретные приложения, и нет никакой универсальности. А я как раз думал о том, что, однажды создав свой функционал, его можно будет с легкостью портировать на любую игру с похожими возможностями. Халявку то у нас все любят. Но боюсь, что проще начать писать игру, чем такого универсального бота...
 

bugaj

Знающий
Сообщения
140
Репутация
11
вон смотри на белфигора, молчит как рыба об лед, значит уже почти написал) с минуты на минуту монетизировать начнет :smile:
-1 ботовод же.
 
Верх