Что нового

[Автоматизация] Имитация анти-отдачи в функции с PixelSearch (автокликер)

TheAwesomeNoob

Новичок
Сообщения
6
Репутация
0
Здравствуйте. Есть скрипт с несколькими функциями переключаемыми по хот-клавише, каждая отвечает за свой стиль игры и переключается по ходу. Возникла необходимость сделать имитацию анти-отдачи в функции после PixelSearch, т.е. чтобы при нахождении нужного цвета, кликер делал выстрел и перемещал не курсор, а "центр экрана" вниз на несколько точек если была кликнута/зажата ЛКМ. Знаю, что нужно использовать нечто на подобие:

Код:
while(_ispressed(01)
$pos = mousegetpos()
mousemove($pos[0], $pos[1]-5)
wend


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

Код:
#include <WinAPIEx.au3>
#include <misc.au3>

Global $Paused
Global $refreshRate = Floor(1000/@DesktopRefresh)
HotKeySet("{F2}", "Semi")
HotKeySet("{F7}", "togglestate")

While 1
Semi()
Wend

Func Semi()
$var = 1
while $var = 1
    ToolTip('Semi', 0, 0)
    PixelSearch(@DesktopWidth/2-25,@DesktopHeight/2-25,@DesktopWidth/2+25,@DesktopHeight/2+25, 0xD61317, 10 )
   If Not @error Then
        MouseClick("Left")
        Sleep(100)
   ElseIf @error Then
        Sleep($refreshRate)
   EndIf
wend
EndFunc


Примерно так. Хотя бы подтолкните в нужном направлении, а то я совсем нуб еще, все текущие попытки приводят к тому, что в окружении рабочего стола все работает, а в игре нет. Спасибо.

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

В общем туплю, решение было под носом - решил проблему при помощи
Код:
If _WinAPI_GetAsyncKeyState


Код:
Func Semi()
$var = 1
while $var = 1
    ToolTip('Semi', 0, 0)
    PixelSearch(@DesktopWidth/2-25,@DesktopHeight/2-25,@DesktopWidth/2+25,@DesktopHeight/2+25, 0xED1C24, 10)
If Not @error Then
        MouseClick("Left")
         $pos = MouseGetPos()
         $ypos = $pos[0]
         $xpos = $pos[1]
    If _WinAPI_GetAsyncKeyState(0x01) = True Then
        MouseMove($ypos, $xpos+50)
        Sleep(100)
EndIf
    EndIf
Wend
EndFunc



А вот переместить относительно центра текущего окна не выходит (т.е. переместить непосредственно сам "центр экрана"), упирается в пол, пробовал по разному (вычисление центра от @DesktopWidth и @DesktopHeight /2 например) вроде:

Код:
$iWidth = @DesktopWidth
$iHeight = @DesktopHeight

$iX = $iWidth / 2
$iY = $iHeight / 2

MouseMove($iX, $iY+50)


Есть способ решить такую проблему? Чтобы курсор улетал не относительно своего текущего положения, а улетал в центр и оттуда на указанное значение пикселей в сторону?
 

sync777

Новичок
Сообщения
17
Репутация
0
а что не работает ?
вроде бы всё так
ведь положение курсора в шутерах вроде бы всегда в центре
можно весь скрипт посмотреть ?
 
Автор
TheAwesomeNoob

TheAwesomeNoob

Новичок
Сообщения
6
Репутация
0
Так там и так практически весь скрипт. Остальной код - это дубль функций и пауза скрипта + хоткеи, просто вырезал, чтобы букав много не было. В пайнте все работает как надо, курсор от центра не оторвать, он всегда туда возвращается + N пикселей вниз смещается, если ставлю скажем 100 пикселей, то карандаш свободно тыкает на 100 пикселей ниже центра, куда курсор не тащи. А вот в игре используется три оси, вместо двух (X,Y,Z), для описания трехмерного пространства, по этому курсор и прицел там не связаны (если сделать простой скрипт на трекинг курсора, то видно будет, что он далеко от центра, а точнее где-нибудь в углу), по этому то мне и нужно, чтобы "Курсор возвращался в центр экрана, когда пикселсирч обнаружил цвет, делал клик ЛКМ и смещался на N точек ниже центра". Короче говоря, чтобы не городить огород с осями в 3Д, а просто обойти эту канитель, потому, что прицел всегда в центре экрана, вот только курсор туда нужно подогнать за ранее. Пока же, он улетает в небо или в пол, когда пикселсирч находит нужный пиксель.
 

sync777

Новичок
Сообщения
17
Репутация
0
Так ведь когда нужный пиксель найден и произведён клик этот пиксель наверное остаётся на экране какое то время.
Паузу наверное надо добавить побольше между повторами поиска пикселя.
Всё же скрипт дай посмотреть.
http://vk.com/sync_777
 
Автор
TheAwesomeNoob

TheAwesomeNoob

Новичок
Сообщения
6
Репутация
0
Код:
#include <WinAPIEx.au3>
#include <misc.au3>

Local $hDLL = DllOpen("user32.dll")
Global $Paused
Global $refreshRate = Floor(1000/@DesktopRefresh)
HotKeySet("{F5}", "Spam")
HotKeySet("{F4}", "Snip")
HotKeySet("{F3}", "Chop")
HotKeySet("{F2}", "Semi")
HotKeySet("{F8}", "Assault")
HotKeySet("{F7}", "togglestate")

$iWidth = @DesktopWidth
$iHeight = @DesktopHeight

$iX = $iWidth / 2
$iY = $iHeight / 2

While 1
Semi()
Wend

Func Semi()
$var = 1
while $var = 1
   ToolTip('SemiMode', 0, 0)
    PixelSearch(@DesktopWidth/2-25,@DesktopHeight/2-25,@DesktopWidth/2+25,@DesktopHeight/2+25, 0xD61317, 10)
    If Not @error Then
	    MouseClick("Left")
     If _WinAPI_GetAsyncKeyState(0x01) = True Then
        MouseMove($iX, $iY+8)
        Sleep(160)
		ElseIf @error Then
        Sleep($refreshRate)
	 Endif
    EndIf
  wend
EndFunc

DllClose($hDLL)

Func Chop()
$var = 1
while $var = 1
   ToolTip('Chop', 0, 0)
    PixelSearch(@DesktopWidth/2-30,@DesktopHeight/2-30,@DesktopWidth/2+30,@DesktopHeight/2+30, 0xD61317, 10 )
    If Not @error Then
        MouseClick("Left")
        Sleep(150)
    ElseIf @error Then
        Sleep($refreshRate)
    Endif
wend
EndFunc

Func Snip()
$var = 1
while $var = 1
   ToolTip('Snip', 0, 0)
  If _WinAPI_GetAsyncKeyState(0x02) = True Then
    PixelSearch(@DesktopWidth/2-15,@DesktopHeight/2-15,@DesktopWidth/2+15,@DesktopHeight/2+15, 0xD61317, 10 )
 If Not @error Then
		MouseClick("Left")
        Sleep(200)
    ElseIf @error Then
        Sleep($refreshRate)
  EndIf
 EndIf
wend
EndFunc

Func Spam()
$var = 1
while $var = 1
   ToolTip('Spam', 0, 0)
    PixelSearch(@DesktopWidth/2-50,@DesktopHeight/2-50,@DesktopWidth/2+50,@DesktopHeight/2+50, 0xD61317, 10 )
    If Not @error Then
		MouseDown("Left")
        Sleep(50)
    ElseIf @error Then
        MouseUp("Left")
    EndIf
wend
EndFunc

Func Assault()
$var = 1
while $var = 1
   ToolTip('Assault', 0, 0)
  If _WinAPI_GetAsyncKeyState(0x02) = True Then
    PixelSearch(@DesktopWidth/2-20,@DesktopHeight/2-20,@DesktopWidth/2+20,@DesktopHeight/2+20, 0xD61317, 10 )
  If Not @error Then
		MouseClick("Left")
		$pos = MouseGetPos()
        $ypos = $pos[0]
        $xpos = $pos[1]
   If _WinAPI_GetAsyncKeyState(0x01) = True Then
        MouseMove($ypos, $xpos+8)
        Sleep(164)
    ElseIf @error Then
        Sleep($refreshRate)
   EndIf
  EndIf
 EndIf
wend
EndFunc

DllClose($hDLL)

Func togglestate()
    $Paused = Not $Paused
    While $Paused
        Sleep(1000)
        ToolTip('Standby', 0, 0)
    WEnd
    ToolTip("")
EndFunc


Черновой в принципе, т.к. постоянно подгоняется что-то. Улетает в пол после первого выстрела, да и цвет тестовый пробовал разный, красный/желтый, чтоб наверняка. Функция ассаулт пробовалась с другими осями, по этому только Semi на данный момент используется для работы


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

Прицел отрисовать по центру проще, чтобы он вместе с центром двигался, т.к. он в 2д накладывается, а вот как переместить "центр экрана" на несколько точек относительно него же, я что-то не догоняю.

Вот такой делал динамический прицел с обновлением фрейма, чтобы не пропадал в фуллскрине (простой только в оконном режиме работает)

https://www.youtube.com/watch?v=oCVBmNjn6Gs

Там проблем не было, рисовало просто в центре, да и не перемещался он, а просто брал текущую позицию центра экрана и рендерился
 

sync777

Новичок
Сообщения
17
Репутация
0
Как тебе в vk написать ?
Как ты написал курсор в углу где то находится, а ты его сдвигаешь на полкрана вверх.
Ты пробовал сдвигать его относительно его настоящего положения
Т.е. получить координаты курсора и относительно их сдвинуть.
 
Автор
TheAwesomeNoob

TheAwesomeNoob

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

В какой-нибудь Кол оф Дути все было бы ок, т.к. там используется аппаратный курсор и он с центром экрана не расходится. Проблема в том, что в большинстве 3д шутанов их открепляют, потому что аппаратный курсор зависит от установок виндовс, т.е. наведение указателя может быть не точным, плюс внутриигровые настройки чувствительности могут отличаться. Есть вариант попробовать пикселсирч по битмапу, т.е. переводить текущий фрейм в битмап, искать пиксель, возвращать значение и оттуда плясать, но успех сомнителен + это будет очень медленно по отношению к игре. Выходит засада. Он раньше там был в настройках (hardware cursor), но его убрали после обновления scaleform.

Зачем тебе контакт? Так мб кто еще дельное предложит чего. Например - забыть и запить :D
 

sync777

Новичок
Сообщения
17
Репутация
0
Так ты пробовал сдвигать относительно реальных координат курсора ?
И зачем считать центр экрана через переменные ведь ты знаешь какое разрешение выставлено в настройках игры (кстати а оно совпадает с разрешением в винде, может в этом проблема)?
 
Автор
TheAwesomeNoob

TheAwesomeNoob

Новичок
Сообщения
6
Репутация
0
Центр экрана считается, чтобы при смене разрешения не править скрипт. К тому же в фуллскрин скрипт не работает, а в окне разрешение чуть другое. Хотя и с окном под разрешение раб. стола тоже самое. Сдвигать относительно курсора не имеет смысла, потому что курсор всегда находится не там, где центр экрана или прицел проще говоря и скорость перемещения у них разная. Я же говорю, нужно курсор подгонять к центру до того, как переместить, но если его подгонять то и в процессе прицел переместится тоже, в связи с чем, получается замкнутый круг.
 

sync777

Новичок
Сообщения
17
Репутация
0
Так и не получится их совместить.
Надо просто высчитать соотношение между перемещением курсоров и заложить в скрипт.
И двигать курсор относительно его реального положения.
 
Автор
TheAwesomeNoob

TheAwesomeNoob

Новичок
Сообщения
6
Репутация
0
sync777 сказал(а):
Так и не получится их совместить.
Надо просто высчитать соотношение между перемещением курсоров и заложить в скрипт.
И двигать курсор относительно его реального положения.

Вариант конечно, только как их вычислить, плюс сам по себе скрипт часто втыкает на пикселсирче, могут расходиться данные.
 

sync777

Новичок
Сообщения
17
Репутация
0
Методом научного тыка ;D
В каком смысле втыкает ? Ложные срабатывания ?
Убавь последний параметр (вместо 10 поставь 5) – мне помогло !
P.s. можно и выяснить насколько надо сдвигать
Например так :
1. Написать скрипт который выводит координаты реального курсора
2. Записать координаты
3. Выстрелить и записать координаты
4. Высчитать разницу
5. Указать разницу в скрипте
 

nowost

Знающий
Сообщения
178
Репутация
17
Поройся в разделе, тут была подобная тема, даже не одна. Ли много расписывал на счет 3д шутеров и координат. В прошлый раз пришли к тому вроде бы что фрост блочил скрипт )
 
Верх