Мой 1-ый скрипт. Не могу автоматизировать Topic is solved

Помощь в написании скриптов
notek
Posts: 7
Joined: 01 May 2021, 12:18

Мой 1-ый скрипт. Не могу автоматизировать

Post by notek » 01 May 2021, 12:55

Здравствуйте! Это мой 1 скрипт, прошу помощи.
Я написал скрипт для рыбалки в ГТА 5. Хочу его автоматизировать, т.к. приходится все таки нажимать самому клавише *е* ну и не знаю как сделать чтоб работал в свернутом окне.
Сама суть скрипта:
После нажатия клавиши *е*, появляется мини-игра (на экране вылезает рисунок клавиш стрелок). Одна из клавиш зелёная а остальные белые, мне нужно нажать на ту стрелку которая зеленая. После этого зеленым гореть начинает либо другая стрела, либо та же. И так до того момента пока шкала не заполнится.

С помощью PixelGetColor я смог автоматически нажимать зеленые кнопки, но не знаю как добавить в скрипт клавише *е*, которая запускает саму мини-игру.
Проблема в том что процесс поиска зеленых клавиш должен повторятся, потому что в мини-игре рандомное количество нажатий и рандомная задержка до появления самих кнопок на экране после запуска. По этому я не могу вначале скрипта просто добавить Send, {e}, скрипт просто начинает нажимать быстро *е*, это перезапускает игру.

Сам скрипт, очень простенький т.к. сегодня первый день начал интересоваться)

Code: Select all

Numpad1::
Loop,
{
PixelGetColor, Color, 1077, 874
if Color = 0x00ff00
Send, {Down}
Sleep 200

PixelGetColor, Color, 1018, 871
if Color = 0x00ff00
Send, {Left}
Sleep 200

PixelGetColor, Color, 1142, 870
if Color = 0x00ff00
Send, {Right}
Sleep 200

PixelGetColor, Color, 1074, 828
if Color = 0x00ff00
Send, {Up}
Sleep 200
}
Numpad2::Pause
Image
Attachments
q1111111.jpg
q1111111.jpg (20.36 KiB) Viewed 239 times
mcl
Posts: 133
Joined: 04 May 2018, 16:35

Re: Мой 1-ый скрипт. Не могу автоматизировать

Post by mcl » 01 May 2021, 18:44

Предположу, что вы пробовали добавить Send {e} после Loop. Тогда скрипт действительно лупил бы по кнопке E. Попробуйте так:

Code: Select all

Numpad1::
Send {e}  ; после хоткея, но перед Loop
Loop
{
...
Не знаком с ГТА5 и механикой этой мини-игры в частности. После заполнения шкалы стрелки пропадут и нужно снова нажать E, или новый раунд начинается автоматически?

Не уверен, что можно заставить AHK определять цвет пикселя в свёрнутом окне.
notek
Posts: 7
Joined: 01 May 2021, 12:18

Re: Мой 1-ый скрипт. Не могу автоматизировать

Post by notek » 02 May 2021, 06:55

mcl wrote:
01 May 2021, 18:44
Предположу, что вы пробовали добавить Send {e} после Loop. Тогда скрипт действительно лупил бы по кнопке E. Попробуйте так:

Code: Select all

Numpad1::
Send {e}  ; после хоткея, но перед Loop
Loop
{
...
Не знаком с ГТА5 и механикой этой мини-игры в частности. После заполнения шкалы стрелки пропадут и нужно снова нажать E, или новый раунд начинается автоматически?

Не уверен, что можно заставить AHK определять цвет пикселя в свёрнутом окне.
Пробовал и до и после.
После заполнения шкалы нужно снова на Е.

Мне сделал человек полностью бота, все работает на автомате и в свернутом виде. Но хотелось бы еще самому разобраться.
mcl
Posts: 133
Joined: 04 May 2018, 16:35

Re: Мой 1-ый скрипт. Не могу автоматизировать

Post by mcl » 02 May 2021, 13:21

Хм, вообще-то скрипт не должен давить на E больше одного раза, если только не продолжать давить Numpad1, перезапуская весь код с самого начала.

Я немного переделал ваш код, попробуйте.
1. В блоках с if у вас по условию выполнится только одна строка − нажатие кнопки, а задержки уже не относятся к if'ам − см. {Blocks}. Из-за этого все задержки складываются, и до нажатия Up может пройти больше полусекунды.
Я оставил одну задержку и перенёс её в начало цикла − так её и менять будет проще (если придётся).
2. У вас после найденной зелёной стрелки и нажатия клавиши проверки идут дальше, хотя двух зелёных стрелок быть не должно. Не страшно, но и пользы никакой.
В коде ниже после нажатия цикл сразу перезапускается заново. Если же ни одна зелёная стрелка не найдена − выполнение доходит до нажатия E, запуская игру; затем скрипт ждёт, пока появятся стрелки, проверяя пиксель одной из них, пока он не станет белым или зелёным.

В документации к PixelGetColor говорится, что пиксель должен быть виден („The pixel must be visible“), чтобы его цвет определялся. Если ваш человек написал бота, работающего со свёрнутым окном, на AHK − я бы, с вашего позволения, ознакомился.

Code: Select all

Numpad1::
	Loop {
		Sleep 200
		
		PixelGetColor, Color, 1077, 874
		If (Color == 0x00ff00) {
			Send {Down}
			Continue
		}
		
		PixelGetColor, Color, 1018, 871
		If (Color == 0x00ff00) {
			Send {Left}
			Continue
		}
		
		PixelGetColor, Color, 1142, 870
		If (Color == 0x00ff00) {
			Send {Right}
			Continue
		}
		
		PixelGetColor, Color, 1074, 828
		If (Color == 0x00ff00) {
			Send {Up}
			Continue
		}
		
		; Зелёные стрелки не найдены - жмём E и ждём появления стрелок
		Send {e}
		
		Loop {
			Sleep 200
			
			PixelGetColor, Color, 1077, 874
			If (Color == 0x00ff00) || (Color == 0xffffff)
				Break
		}
	}
	Return

Numpad2::Pause
notek
Posts: 7
Joined: 01 May 2021, 12:18

Re: Мой 1-ый скрипт. Не могу автоматизировать

Post by notek » 03 May 2021, 06:33

mcl wrote:
02 May 2021, 13:21
Хм, вообще-то скрипт не должен давить на E больше одного раза, если только не продолжать давить Numpad1, перезапуская весь код с самого начала.

Я немного переделал ваш код, попробуйте.
1. В блоках с if у вас по условию выполнится только одна строка − нажатие кнопки, а задержки уже не относятся к if'ам − см. {Blocks}. Из-за этого все задержки складываются, и до нажатия Up может пройти больше полусекунды.
Я оставил одну задержку и перенёс её в начало цикла − так её и менять будет проще (если придётся).
2. У вас после найденной зелёной стрелки и нажатия клавиши проверки идут дальше, хотя двух зелёных стрелок быть не должно. Не страшно, но и пользы никакой.
В коде ниже после нажатия цикл сразу перезапускается заново. Если же ни одна зелёная стрелка не найдена − выполнение доходит до нажатия E, запуская игру; затем скрипт ждёт, пока появятся стрелки, проверяя пиксель одной из них, пока он не станет белым или зелёным.

В документации к PixelGetColor говорится, что пиксель должен быть виден („The pixel must be visible“), чтобы его цвет определялся. Если ваш человек написал бота, работающего со свёрнутым окном, на AHK − я бы, с вашего позволения, ознакомился.

Code: Select all

Numpad1::
	Loop {
		Sleep 200
		
		PixelGetColor, Color, 1077, 874
		If (Color == 0x00ff00) {
			Send {Down}
			Continue
		}
		
		PixelGetColor, Color, 1018, 871
		If (Color == 0x00ff00) {
			Send {Left}
			Continue
		}
		
		PixelGetColor, Color, 1142, 870
		If (Color == 0x00ff00) {
			Send {Right}
			Continue
		}
		
		PixelGetColor, Color, 1074, 828
		If (Color == 0x00ff00) {
			Send {Up}
			Continue
		}
		
		; Зелёные стрелки не найдены - жмём E и ждём появления стрелок
		Send {e}
		
		Loop {
			Sleep 200
			
			PixelGetColor, Color, 1077, 874
			If (Color == 0x00ff00) || (Color == 0xffffff)
				Break
		}
	}
	Return

Numpad2::Pause
К сожалению не ищет зеленые кнопки ваш код( Нажимает Е, запускается игра и дальше нету действий, даже игра не перезапускается.
Автор бота не даёт исходник. Сам хотел посмотреть реализацию.
mcl
Posts: 133
Joined: 04 May 2018, 16:35

Re: Мой 1-ый скрипт. Не могу автоматизировать  Topic is solved

Post by mcl » 03 May 2021, 08:09

notek wrote:
03 May 2021, 06:33
К сожалению не ищет зеленые кнопки ваш код( Нажимает Е, запускается игра и дальше нету действий, даже игра не перезапускается.
Похоже, белый цвет на стрелках недостаточно белый − попробуйте в строке 36 заменить 0xffffff на 0xeeeeee.
notek
Posts: 7
Joined: 01 May 2021, 12:18

Re: Мой 1-ый скрипт. Не могу автоматизировать

Post by notek » 04 May 2021, 07:38

mcl wrote:
03 May 2021, 08:09
notek wrote:
03 May 2021, 06:33
К сожалению не ищет зеленые кнопки ваш код( Нажимает Е, запускается игра и дальше нету действий, даже игра не перезапускается.
Похоже, белый цвет на стрелках недостаточно белый − попробуйте в строке 36 заменить 0xffffff на 0xeeeeee.
Спасибо) В принципе работает но как то через раз. Думаю если еще немного посидеть то все как по маслу пойдет.
notek
Posts: 7
Joined: 01 May 2021, 12:18

Re: Мой 1-ый скрипт. Не могу автоматизировать

Post by notek » 04 May 2021, 12:36

mcl wrote:
03 May 2021, 08:09
notek wrote:
03 May 2021, 06:33
К сожалению не ищет зеленые кнопки ваш код( Нажимает Е, запускается игра и дальше нету действий, даже игра не перезапускается.
Похоже, белый цвет на стрелках недостаточно белый − попробуйте в строке 36 заменить 0xffffff на 0xeeeeee.
Все получилось, работает хорошо. Еще раз спасибо.
Не подскажите, как сделать чтоб этот бот работал в свернутом окне?
mcl
Posts: 133
Joined: 04 May 2018, 16:35

Re: Мой 1-ый скрипт. Не могу автоматизировать

Post by mcl » 04 May 2021, 14:47

notek wrote:
04 May 2021, 12:36
Не подскажете, как сделать, чтоб этот бот работал в свернутом окне?
Увы, нет. Повторюсь: пиксель должен быть виден, чтобы PixelGetColor срабатывал. Для свёрнутого окна потребуются другие, нештатные методы, вроде захвата Direct3DSurface или чтения памяти напрямую, в которых у меня нет опыта.
notek
Posts: 7
Joined: 01 May 2021, 12:18

Re: Мой 1-ый скрипт. Не могу автоматизировать

Post by notek » 04 May 2021, 14:53

mcl wrote:
04 May 2021, 14:47
notek wrote:
04 May 2021, 12:36
Не подскажете, как сделать, чтоб этот бот работал в свернутом окне?
Увы, нет. Повторюсь: пиксель должен быть виден, чтобы PixelGetColor срабатывал. Для свёрнутого окна потребуются другие, нештатные методы, вроде захвата Direct3DSurface или чтения памяти напрямую, в которых у меня нет опыта.
Спасибо)
notek
Posts: 7
Joined: 01 May 2021, 12:18

Re: Мой 1-ый скрипт. Не могу автоматизировать

Post by notek » 05 May 2021, 09:57

@mcl
Не подскажите в чем проблема? Самый простенький скрипт, но в нем не работает кнопка Enter. Пробовал ставить другие кнопки, они работают. Не работает так же NumpudEnter. Не пойму в чем проблема :headwall:

Code: Select all

Numpad1::

Loop
{
Send {e}
Sleep 13000	
Send {Enter}
Sleep 5000
Break
}
Return
mcl
Posts: 133
Joined: 04 May 2018, 16:35

Re: Мой 1-ый скрипт. Не могу автоматизировать

Post by mcl » 05 May 2021, 15:46

notek wrote:
05 May 2021, 09:57
не работает кнопка Enter
Гм, у меня работает как положено. Это весь скрипт? Другие скрипты не запущены? На Enter никаких команд не навешено? #If-директивы не мешают?
Попробуйте добавить KeyHistory перед Return и посмотреть, отправляется ли нажатие Enter. У меня выглядит примерно так:

Code: Select all

VK  SC   Type  Up/Dn  Elapsed  Key      Window
---------------------------------------------
61  04F        d      1.43     Numpad1  
45  012  i     d      0.00     e        
45  012  i     u      0.00     e        
61  04F        u      0.09     Numpad1  
0D  01C  i     d      1.90     Enter    
0D  01C  i     u      0.00     Enter    
Post Reply

Return to “Помощь”