Jump to content
Korean Random

kharlashkin

User
  • Posts

    829
  • Joined

  • Last visited

  • Days Won

    7

Posts posted by kharlashkin

  1. Как вариант - декомпильнуть дефолтный прицел в Sothink, найти пнг-шку или спрайт с точкой (в дефолте присутствует)    и намалевать чего то своё

    Не-не-не, мне не нужна картинка :) Нужно поведение прицела, как для консольных игр. Я наверное не совсем внятно описал что к чему.

     

    Есть так называемый круг сведения, т.е. случайным образом снаряд летит в любую точку внутри этого круга.

    Есть так называемый прицел, который по сути является точкой по середине экрана.

    Существуют формулы полета снаряда, и если прицел наведен на танк и танк подсвечен - в формулу добавляется расстояние до цели.

     

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

     

    Учитывая клиент-серверную архитектуру игры, наверное это невозможно, но я - я ж просто спрашиваю.

  2. Доброе время суток всем форумчанам и гостям!

     

    Интересуюсь следующей возможностью (может кто встречал или подскажет направление) - хочется для более комфортной стрельбы геймпадом увеличить точку прицела в игре до "пятна", например как в Crysis.

    post-19155-0-79926100-1404905117_thumb.jpg

     

    P.S. Требуется вот для чего, на любой дистанции если нет "подсветки" контура врага/союзника, расчет выстрела снаряда делается отдельной формулой (может я не прав - поправьте меня). В случае пятна прицела (не точки) танк будет подсвечиваться даже когда край пятна попадет на контуры, соответственно формула полета снаряда применяется, соответственно будет проще попадать, как бонус можно попробовать сделать автодоводку прицела ;)

  3. Не хочу начинать новую темку, может кто сталкивался. Нет ли какого расширения захвата врага в автоприцел? Т.е. не точкой навести нужно, а например некоторым кругом в 100-200 пикселей?

    Буду свою тему создавать...

  4. Не хочу начинать новую темку, может кто сталкивался. Нет ли какого расширения захвата врага в автоприцел? Т.е. не точкой навести нужно, а например некоторым кругом в 100-200 пикселей?

  5. Закрываю тему с какой-то печалью... Много времени ушло на этот разделенный экран, теперь какая-то пустота внутри - надо искать новые идеи чтобы ещё "запилить" ;)


    Мало бета-тестеров моей реализации splitscreen. Поиграл сам с собой на геймпадах в тренировочном бою и выявил две проблемы:

    1. Нельзя в неактивное окно отправлять щелчки левой и правой кнопки мыши, иногда за счет отправки нажатия кнопки мыши окно становится активным. Вывод - нужно или переназначить кнопку выстрела/автоприцела в игре на другие клавиши, или добавить принудительную отправку сообщения о том что окно не активно. Первый вариант, наверное, предпочтительней.

    2. Нужно в игровых скриптах python поменять файлик "X:\Games\World_of_Tanks\res\scripts\client\gui\graphicsresolutions.pyc" на модифицированный, так как в родном игровом стоят минимальные разрешения 1024х768. В этом и этом сообщении я об этом писал.

     

    Буду немного менять скрипт AHK. Так что темку закрою чуть позже ;)

    • Upvote 1
  6. Доработал скрипт, получилось сделать безрамочные окна клиентов.

    post-19155-0-51482800-1404210907_thumb.jpg

    ;;;;;;;;;;;;SplitScreen
    
    LWIN & LButton::
    {
    WinWait, WoT Client
    WinSet, Style, -0xC40000
    WinMove, WoT Client,,841 ,0 , 840 ,1050
    WinWait, [#] WoT Client [#]
    WinSet, Style, -0xC40000
    WinMove, [#] WoT Client [#],,0 ,0 , 840 ,1050
    }
    return
    

    Для разрешения 1680х1050.

     

    Ушел на главную страницу ветки форума описывать все и вся.

  7. @kharlashkin, я был вынужден удалить ваш файл с вложением, поскольку он содержал программы для нелицензионной активации коммерческих продуктов. Более того, некоторые из них содержали троянские программы. Пожалуйста, обратите внимание: на форуме недопустима публикация пиратского ПО, также прошу с особым вниманием отнестись к безопасности публикуемых файлов. Вы можете поделиться результатами вашего труда не нарушая прав собственников используемого ПО. Спасибо.

    Прошу огромнейше прощения, не подумал, каюсь...

    В принципе sandboxie для данного режима бесплатен, VDM только за денюжу...

  8. @kharlashkin, осталось оформить все одним постом:) 

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

     

    Я как бы выкладывал тут свои мысли и черновые скрипты для надежды что какой-то сумашедший фанатик, типа меня, тоже попробует так поиграть. Соответственно может есть ошибки где, может не корректно работает что или появятся мысли как улучшить.

  9. Итак, допилил до играбельного состояния режим "Разделенного экрана" для танчиков.

    'wotsplitscreen'

    JoyMultiplier = 5
    JoyThreshold = 5
    JoyThresholdUpper := 50 + JoyThreshold
    JoyThresholdLower := 50 - JoyThreshold
    #Persistent
    SetTimer, WatchAxisFirstJoyMoveForwardAndZoom, 10
    SetTimer, WatchAxisFirstJoyMoveRotate, 10
    SetTimer, WatchAxisFirstJoyCameraRotateVert, 10
    SetTimer, WatchAxisFirstJoyCameraRotateHoriz, 10
    SetTimer, WatchAxisFirstJoyShoot, 10
    SetTimer, WatchFirstJoyPOV, 10
    SetTimer, WatchAxisSecondJoyMoveForwardAndZoom, 10
    SetTimer, WatchAxisSecondJoyMoveRotate, 10
    SetTimer, WatchAxisSecondJoyCameraRotate, 10
    SetTimer, WatchAxisSecondJoyShoot, 10
    SetTimer, WatchSecondJoyPOV, 10
    return
    
    ;;;;;;;;;;;;убираем загловок окон
    
    ^!+s::
    WinWait, WoT Client
    WinSet, Style, -0xC00000
    WinWait, [#] WoT Client [#]
    WinSet, Style, -0xC00000
    return
    
    ;;;;;;;;;;;;первый геймпад движение вперед/назад в неактивном окне и зум
    
    WatchAxisFirstJoyMoveForwardAndZoom:
    GetKeyState, 1JoyY, 1JoyY
    GetKeyState, 1JoyZ, 1JoyZ
    GetKeyState, 1Joy2, 1Joy2
    GetKeyState, 1Joy3, 1Joy3
    FirstJoyMoveForwardAndZoomPrev = %FirstJoyMoveForwardAndZoom%
    
    if 1Joy2 = D
        GoSub, FirstJoyConsumables
    else if 1Joy3 = D
        GoSub, FirstJoyConsumables
    else 
    {
    if 1JoyZ > 70
        {
        if 1JoyY < 30
            FirstJoyMoveForwardAndZoom = PgDn
        else if 1JoyY > 70
            FirstJoyMoveForwardAndZoom = PgUp
        else
            FirstJoyMoveForwardAndZoom =
        }
    else if 1JoyY < 30
        FirstJoyMoveForwardAndZoom = vk57
    else if 1JoyY > 70 
        FirstJoyMoveForwardAndZoom = vk53
    else
        FirstJoyMoveForwardAndZoom =
    }
    
    if FirstJoyMoveForwardAndZoom = %FirstJoyMoveForwardAndZoomPrev%
        return
    
    SetKeyDelay -1
    if FirstJoyMoveForwardAndZoom
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyMoveForwardAndZoom% down}, WoT Client
        }
    }
    if FirstJoyMoveForwardAndZoomPrev
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyMoveForwardAndZoomPrev% up}, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;первый геймпад движение влево/вправо в неактивном окне
    
    WatchAxisFirstJoyMoveRotate:
    GetKeyState, 1JoyX, 1JoyX
    GetKeyState, 1Joy2, 1Joy2
    GetKeyState, 1Joy3, 1Joy3
    FirstJoyMoveRotatePrev = %FirstJoyMoveRotate%
    
    if 1Joy2 = D
        GoSub, SecondJoyConsumables
    else if 1Joy3 = D
        GoSub, SecondJoyConsumables
    else
    {
    if 1JoyX > 80
        FirstJoyMoveRotate = vk44
    else if 1JoyX < 20
        FirstJoyMoveRotate = vk41
    else
        FirstJoyMoveRotate =
    }
    
    if FirstJoyMoveRotate = %FirstJoyMoveRotatePrev%
        return
    
    SetKeyDelay -1
    if FirstJoyMoveRotate
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyMoveRotate% down}, WoT Client
        }
    }
    if FirstJoyMoveRotatePrev
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyMoveRotatePrev% up}, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;первый геймпад меню расходников в неактивном окне
    
    FirstJoyConsumables:
    FirstJoyConsumablesPrev = %FirstJoyConsumables%
    
    if 1JoyX < 20
        {
        if 1JoyY < 20
        FirstJoyConsumables = vk38
        else if 1JoyY between 40 and 60
        FirstJoyConsumables = vk37
        else if 1JoyY > 80
        FirstJoyConsumables = vk36
        else FirstJoyConsumables =
        }
    else if 1JoyX between 40 and 60
        {
        if 1JoyY < 10
        FirstJoyConsumables = vk31
        else if 1JoyY > 90
        FirstJoyConsumables = vk35
        else FirstJoyConsumables =     
        }
    else if 1JoyX > 80
        {
        if 1JoyY < 20
        FirstJoyConsumables = vk32
        else if 1JoyY between 40 and 60
        FirstJoyConsumables = vk33
        else if 1JoyY > 80
        FirstJoyConsumables = vk34
        else FirstJoyConsumables =
        }
    else FirstJoyConsumables =
    
    if FirstJoyConsumables = %SFirstJoyConsumablesPrev%
    return
    
    SetKeyDelay -1
    if FirstJoyConsumables
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyConsumables% down}, WoT Client
        } 
    }
    if FirstJoyConsumablesPrev
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyConsumablesPrev% up}, WoT Client
        } 
    }
    return
    
    ;;;;;;;;;;;;первый геймпад обзор влево/вправо в неактивном окне
    
    WatchAxisFirstJoyCameraRotateVert:
    GetKeyState, 1JoyU, 1JoyU
    GetKeyState, 1Joy5, 1Joy5
    FirstJoyCameraRotateVertPrev = %FirstJoyCameraRotateVert%
    
    if 1Joy5 = D
        GoSub, FirstJoyCommandMenu
    else
    {
    if 1JoyU > 70
        FirstJoyCameraRotateVert = Right
    else if 1JoyU < 30
        FirstJoyCameraRotateVert = Left
    else
        FirstJoyCameraRotateVert =
    }
    
    if FirstJoyCameraRotateVert = %FirstJoyCameraRotateVertPrev%
        return
    
    SetKeyDelay -1
    if FirstJoyCameraRotateVert
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyCameraRotateVert% down}, WoT Client
        }
    }
    if FirstJoyCameraRotateVertPrev
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyCameraRotateVertPrev% up}, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;первый геймпад обзор вверх/вниз в неактивном окне
    
    WatchAxisFirstJoyCameraRotateHoriz:
    GetKeyState, 1JoyR, 1JoyR
    GetKeyState, 1Joy5, 1Joy5
    FirstJoyCameraRotateHorizPrev = %FirstJoyCameraRotateHoriz%
    
    if 1Joy5 = D
        GoSub, FirstJoyCommandMenu
    else
    {
    if 1JoyR > 70
        FirstJoyCameraRotateHoriz = Down
    else if 1JoyR < 30
        FirstJoyCameraRotateHoriz = Up
    else
        FirstJoyCameraRotateHoriz =
    }
    
    if FirstJoyCameraRotateHoriz = %FirstJoyCameraRotateHorizPrev%
        return
    
    SetKeyDelay -1
    if FirstJoyCameraRotateHoriz
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyCameraRotateHoriz% down}, WoT Client
        }
    }
    if FirstJoyCameraRotateHorizPrev
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyCameraRotateHorizPrev% up}, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;первый геймпад меню приказов
    
    FirstJoyCommandMenu:
    FirstJoyCommandMenuPrev = %FirstJoyCommandMenu%
    
    if 1JoyU < 20
        {
        if 1JoyR < 20
        FirstJoyCommandMenu = Numpad8
        else if 1JoyR between 40 and 60
        FirstJoyCommandMenu = Numpad7
        else if 1JoyR > 80
        FirstJoyCommandMenu = Numpad6
        else FirstJoyCommandMenu =
        }
    else if 1JoyU between 40 and 60
        {
        if 1JoyR < 10
        FirstJoyCommandMenu = vk54
        else if 1JoyR > 90
        FirstJoyCommandMenu = Numpad5
        else FirstJoyCommandMenu =     
        }
    else if 1JoyU > 80
        {
        if 1JoyR < 20
        FirstJoyCommandMenu = Numpad2
        else if 1JoyR between 40 and 60
        FirstJoyCommandMenu = Numpad3
        else if 1JoyR > 80
        FirstJoyCommandMenu = Numpad4
        else FirstJoyCommandMenu =
        }
    else FirstJoyCommandMenu =
    
    if FirstJoyCommandMenu = %FirstJoyCommandMenuPrev%
    return
    
    SetKeyDelay -1
    if FirstJoyCommandMenu
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyCommandMenu% down}, WoT Client
        } 
    }
    if FirstJoyCommandMenuPrev
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyCommandMenuPrev% up}, WoT Client
        } 
    }
    return
    
    ;;;;;;;;;;;;первый геймпад выстрел в неактивном окне
    
    WatchAxisFirstJoyShoot:
    GetKeyState, 1JoyZ, 1JoyZ
    FirstJoyShootPrev = %FirstJoyShoot%
    
    if 1JoyZ < 30
        FirstJoyShoot = LButton
    else
        FirstJoyShoot =
    
    if FirstJoyShoot = %FirstJoyShootPrev%
        return
    
    SetKeyDelay -1
    if FirstJoyShoot
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x201,,,, WoT Client
        }
    }
    if FirstJoyShootPrev
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x202,,,, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;;первый геймпад крестовина в неактивном окне
    
    WatchFirstJoyPOV:
    GetKeyState, 1JoyPOV, 1JoyPOV
    FirstJoyPOVPrev = %FirstJoyPOV%
    
     if 1JoyPOV = 0
        FirstJoyPOV = vk52
    else if 1JoyPOV = 18000
        FirstJoyPOV = vk46
    else if 1JoyPOV = 27000
        FirstJoyPOV = vk58
    else if 1JoyPOV = 9000
        FirstJoyPOV = vk43
    else FirstJoyPOV = 
    
    if FirstJoyPOV = %FirstJoyPOVPrev%
    return
    
    SetKeyDelay -1
    if FirstJoyPOV
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyPOV% down}, WoT Client
        }
    }
    if FirstJoyPOVPrev
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyPOVprev% up}, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;первый геймпад LShift в неактивном окне
    
    1Joy10::
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vkA0 Down}, WoT Client
        KeyWait, 1Joy10
        ControlSend,, {vkA0 Up}, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;первый геймпад Space в неактивном окне
    
    1Joy9::
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk20 Down}, WoT Client
        KeyWait, 1Joy9
        ControlSend,, {vk20 Up}, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;первый геймпад выбор снарядов в неактивном окне
    
    1Joy1::
    Gosub, FirstSubToggle
    Return
    
    FirstSubToggle:
    FirstToggle++
    If FirstToggle = 1
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk31 down}, WoT Client
        Sleep, 10
        ControlSend,, {vk31 up}, WoT Client
        Sleep, 10
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk31 down}, WoT Client
        Sleep, 10
        ControlSend,, {vk31 up}, WoT Client    
        }
    }
    If FirstToggle = 2
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk32 down}, WoT Client
        Sleep, 10
        ControlSend,, {vk32 up}, WoT Client
        Sleep, 10
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk32 down}, WoT Client
        Sleep, 10
        ControlSend,, {vk32 up}, WoT Client    
        }
    }
    If FirstToggle = 3
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk33 down}, WoT Client
        Sleep, 10
        ControlSend,, {vk33 up}, WoT Client
        Sleep, 10
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk33 down}, WoT Client
        Sleep, 10
        ControlSend,, {vk33 up}, WoT Client    
        }
    FirstToggle = 0
    }
    return
    
    ;;;;;;;;;;;;первый геймпад огнетушитель в неактивном окне
    
    1Joy4::
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk35 Down}, WoT Client
        KeyWait, 1Joy4
        ControlSend,, {vk35 Up}, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;первый геймпад автоприцел в неактивном окне
    
    1Joy6::
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x204, 1,,, WoT Client
        KeyWait, 1Joy6
        SendMessage, 0x205, 1,,, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;первый геймпад меню в неактивном окне
    
    1Joy8::
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk1B Down}, WoT Client
        KeyWait, 1Joy8
        ControlSend,, {vk1B Up}, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;первый геймпад скрыть мини карту в неактивном окне
    
    1Joy7::
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk4D Down}, WoT Client
        KeyWait, 1Joy7
        ControlSend,, {vk4D Up}, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;первый геймпад ремонт в неактивном окне
    
    1Joy3::
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk34 Down}, WoT Client
        KeyWait, 1Joy3
        ControlSend,, {vk34 Up}, WoT Client
        }   
    }
    return
    
    ;;;;;;;;;;;;первый геймпад лечение в неактивном окне
    
    1Joy2::
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk36 Down}, WoT Client
        KeyWait, 1Joy2
        ControlSend,, {vk36 Up}, WoT Client
        }    
    }
    return
    
    ;;;;;;;;;;;;второй геймпад
    
    ;;;;;;;;;;;;второй геймпад движение вперед/назад в активном окне и зум
    
    WatchAxisSecondJoyMoveForwardAndZoom:
    GetKeyState, 2JoyY, 2JoyY
    GetKeyState, 2JoyZ, 2JoyZ
    GetKeyState, 2Joy2, 2Joy2
    GetKeyState, 2Joy3, 2Joy3
    SecondJoyMoveForwardAndZoomPrev = %SecondJoyMoveForwardAndZoom%
    
    if 2Joy2 = D
        GoSub, SecondJoyConsumables
    else if 2Joy3 = D
        GoSub, SecondJoyConsumables
    else 
    {
    if 2JoyZ > 70
        {
        if 2JoyY < 30
            SecondJoyMoveForwardAndZoom = PgDn
        else if 2JoyY > 70
            SecondJoyMoveForwardAndZoom = PgUp
        else
            SecondJoyMoveForwardAndZoom =
        }
    else if 2JoyY < 30
        SecondJoyMoveForwardAndZoom = vk57
    else if 2JoyY > 70 
        SecondJoyMoveForwardAndZoom = vk53
    else
        SecondJoyMoveForwardAndZoom =
    }
    
    if SecondJoyMoveForwardAndZoom = %SecondJoyMoveForwardAndZoomPrev%
        return
    
    SetKeyDelay -1
    if SecondJoyMoveForwardAndZoom
    {
        ControlSend,, {%SecondJoyMoveForwardAndZoom% down}, [#] WoT Client [#]
    }
    if SecondJoyMoveForwardAndZoomPrev
    {
        ControlSend,, {%SecondJoyMoveForwardAndZoomPrev% up}, [#] WoT Client [#]
    }
    return
    
    ;;;;;;;;;;;;второй геймпад движение влево/вправо в активном окне
    
    WatchAxisSecondJoyMoveRotate:
    GetKeyState, 2JoyX, 2JoyX
    GetKeyState, 2Joy2, 2Joy2
    GetKeyState, 2Joy3, 2Joy3
    SecondJoyMoveRotatePrev = %SecondJoyMoveRotate%
    
    if 2Joy2 = D
        GoSub, SecondJoyConsumables
    else if 2Joy3 = D
        GoSub, SecondJoyConsumables
    else
    {
    if 2JoyX > 80
        SecondJoyMoveRotate = vk44
    else if 2JoyX < 20
        SecondJoyMoveRotate = vk41
    else
        SecondJoyMoveRotate =
    }
    
    if SecondJoyMoveRotate = %SecondJoyMoveRotatePrev%
        return
    
    SetKeyDelay -1
    if SecondJoyMoveRotate
    {
        ControlSend,, {%SecondJoyMoveRotate% down}, [#] WoT Client [#]
    }
    if SecondJoyMoveRotatePrev
    {
        ControlSend,, {%SecondJoyMoveRotatePrev% up}, [#] WoT Client [#]
    }
    return
    
    ;;;;;;;;;;;;второй геймпад меню расходников
    
    SecondJoyConsumables:
    SecondJoyConsumablesPrev = %SecondJoyConsumables%
    
    if 2JoyX < 20
        {
        if 2JoyY < 20
        SecondJoyConsumables = vk38
        else if 2JoyY between 40 and 60
        SecondJoyConsumables = vk37
        else if 2JoyY > 80
        SecondJoyConsumables = vk36
        else SecondJoyConsumables =
        }
    else if 2JoyX between 40 and 60
        {
        if 2JoyY < 10
        SecondJoyConsumables = vk31
        else if 2JoyY > 90
        SecondJoyConsumables = vk35
        else SecondJoyConsumables =     
        }
    else if 2JoyX > 80
        {
        if 2JoyY < 20
        SecondJoyConsumables = vk32
        else if 2JoyY between 40 and 60
        SecondJoyConsumables = vk33
        else if 2JoyY > 80
        SecondJoyConsumables = vk34
        else SecondJoyConsumables =
        }
    else SecondJoyConsumables =
    
    if SecondJoyConsumables = %SecondJoyConsumablesPrev%
    return
    
    SetKeyDelay -1
    if SecondJoyConsumables
    {
        ControlSend,, {%SecondJoyConsumables% down}, [#] WoT Client [#]
    }
    if SecondJoyConsumablesPrev
    {
        ControlSend,, {%SecondJoyConsumablesPrev% up}, [#] WoT Client [#] 
    }
    return
    
    ;;;;;;;;;;;;второй геймпад обзор и мышь в активном окне
    
    WatchAxisSecondJoyCameraRotate:
    MouseNeedsToBeMoved := false
    SetFormat, float, 03
    GetKeyState, 2JoyU, 2JoyU
    GetKeyState, 2JoyR, 2JoyR
    GetKeyState, 2Joy5, 2Joy5
    
    if 2Joy5 = D
        GoSub, SecondJoyCommandMenu
    else if 2Joy5 = U
    {
    if 2JoyU > %JoyThresholdUpper%
    {
    	MouseNeedsToBeMoved := true
    	DeltaU := 2JoyU - JoyThresholdUpper
    }
    else if 2JoyU < %JoyThresholdLower%
    {
    	MouseNeedsToBeMoved := true
    	DeltaU := 2JoyU - JoyThresholdLower
    }
    else
    	DeltaU = 0
    if 2JoyR > %JoyThresholdUpper%
    {
    	MouseNeedsToBeMoved := true
    	DeltaR := 2JoyR - JoyThresholdUpper
    }
    else if 2JoyR < %JoyThresholdLower%
    {
    	MouseNeedsToBeMoved := true
    	DeltaR := 2JoyR - JoyThresholdLower
    }
    else
    	DeltaR = 0
    }
    
    SetKeyDelay -1
    if MouseNeedsToBeMoved
    {
            SetMouseDelay, -1  ; Makes movement smoother 
    	x := (DeltaU/30) * (ABS(DeltaU)/30) * JoyMultiplier
            y := (DeltaR/30) * (ABS(DeltaR)/30) * JoyMultiplier 
            DllCall("mouse_event", uint, 1, int, x, int, y, uint, 0, int, 0)
    }
    return
    
    ;;;;;;;;;;;;второй геймпад меню приказов
    
    SecondJoyCommandMenu:
    SecondJoyCommandMenuPrev = %SecondJoyCommandMenu%
    
    if 2JoyU < 20
        {
        if 2JoyR < 20
        SecondJoyCommandMenu = Numpad8
        else if 2JoyR between 40 and 60
        SecondJoyCommandMenu = Numpad7
        else if 2JoyR > 80
        SecondJoyCommandMenu = Numpad6
        else SecondJoyCommandMenu =
        }
    else if 2JoyU between 40 and 60
        {
        if 2JoyR < 10
        SecondJoyCommandMenu = vk54
        else if 2JoyR > 90
        SecondJoyCommandMenu = Numpad5
        else SecondJoyCommandMenu =     
        }
    else if 2JoyU > 80
        {
        if 2JoyR < 20
        SecondJoyCommandMenu = Numpad2
        else if 2JoyR between 40 and 60
        SecondJoyCommandMenu = Numpad3
        else if 2JoyR > 80
        SecondJoyCommandMenu = Numpad4
        else SecondJoyCommandMenu =
        }
    else SecondJoyCommandMenu =
    
    if SecondJoyCommandMenu = %SecondJoyCommandMenuPrev%
    return
    
    SetKeyDelay -1
    if SecondJoyCommandMenu
    {
        ControlSend,, {%SecondJoyCommandMenu% down}, [#] WoT Client [#]
    }
    if SecondJoyCommandMenuPrev
    {
        ControlSend,, {%SecondJoyCommandMenuPrev% up}, [#] WoT Client [#] 
    }
    return
    
    ;;;;;;;;;;;;второй геймпад выстрел в активном окне
    
    WatchAxisSecondJoyShoot:
    GetKeyState, 2JoyZ, 2JoyZ
    SecondJoyShootPrev = %SecondJoyShoot%
    
    if 2JoyZ < 30
        SecondJoyShoot = LButton
    else
        SecondJoyShoot =
    
    if SecondJoyShoot = %SecondJoyShootPrev%
        return
    
    SetKeyDelay -1
    if SecondJoyShoot
    {
        Send, {%SecondJoyShoot% down} 
    }
    if SecondJoyShootPrev
    {
        Send, {%SecondJoyShootPrev% up} 
    }
    return
    
    ;;;;;;;;;;;;;второй геймпад крестовина в активном окне
    
    WatchSecondJoyPOV:
    GetKeyState, 2JoyPOV, 2JoyPOV
    SecondJoyPOVPrev = %SecondJoyPOV%
    
    if 2JoyPOV = 0
        SecondJoyPOV = vk52
    else if 2JoyPOV = 18000
        SecondJoyPOV = vk46
    else if 2JoyPOV = 27000
        SecondJoyPOV = vk58
    else if 2JoyPOV = 9000
        SecondJoyPOV = vk43
    else SecondJoyPOV = 
    
    if SecondJoyPOV = %SecondJoyPOVPrev%
    return
    
    SetKeyDelay -1
    if SecondJoyPOV
    {
        ControlSend,, {%SecondJoyPOV% down}, [#] WoT Client [#]
    }
    if SecondJoyPOVPrev
    {
        ControlSend,, {%SecondJoyPOVprev% up}, [#] WoT Client [#]
    }
    return
    
    ;;;;;;;;;;;;второй геймпад LShift в активном окне
    
    2Joy10::
    {
        ControlSend,, {vkA0 Down}, [#] WoT Client [#]
        KeyWait, 2Joy10
        ControlSend,, {vkA0 Up}, [#] WoT Client [#]
    }
    return
    
    ;;;;;;;;;;;;второй геймпад Space в активном окне
    
    2Joy9::
    {
        ControlSend,, {vk20 Down}, [#] WoT Client [#]
        KeyWait, 2Joy9
        ControlSend,, {vk20 Up}, [#] WoT Client [#]
    }
    return
    
    ;;;;;;;;;;;;второй геймпад выбор снарядов в неактивном окне
    
    2Joy1::
    Gosub, SecondSubToggle
    Return
    
    SecondSubToggle:
    SecondToggle++
    If SecondToggle = 1
    {
        ControlSend,, {vk31 down}, [#] WoT Client [#]
        Sleep, 10
        ControlSend,, {vk31 up}, [#] WoT Client [#]
        Sleep, 10
        ControlSend,, {vk31 down}, [#] WoT Client [#]
        Sleep, 10
        ControlSend,, {vk31 up}, [#] WoT Client [#]
    }
    If SecondToggle = 2
    {
        ControlSend,, {vk32 down}, [#] WoT Client [#]
        Sleep, 10
        ControlSend,, {vk32 up}, [#] WoT Client [#]
        Sleep, 10
        ControlSend,, {vk32 down}, [#] WoT Client [#] 
        Sleep, 10
        ControlSend,, {vk32 up}, [#] WoT Client [#]
    }
    If SecondToggle = 3
    {
        ControlSend,, {vk33 down}, [#] WoT Client [#]
        Sleep, 10
        ControlSend,, {vk33 up}, [#] WoT Client [#]
        Sleep, 10
        ControlSend,, {vk33 down}, [#] WoT Client [#]
        Sleep, 10
        ControlSend,, {vk33 up}, [#] WoT Client [#]
        SecondToggle = 0
    }
    return
    
    ;;;;;;;;;;;;второй геймпад огнетушитель в активном окне
    
    2Joy4::
    {
        ControlSend,, {vk35 Down}, [#] WoT Client [#]
        KeyWait, 2Joy4
        ControlSend,, {vk35 Up}, W[#] WoT Client [#]
    }
    return
    
    ;;;;;;;;;;;;второй геймпад автоприцел в активном окне
    
    2Joy6::
    {
        Send, {RButton Down}
        KeyWait, 2Joy6
        Send, {RButton up}
    }
    return
    
    ;;;;;;;;;;;;второй геймпад меню в неактивном окне
    
    2Joy8::
    {
        ControlSend,, {vk1B Down}, [#] WoT Client [#]
        KeyWait, 2Joy8
        ControlSend,, {vk1B Up}, [#] WoT Client [#]
    }
    return
    
    ;;;;;;;;;;;;второй геймпад скрыть мини карту в активном окне
    
    2Joy7::
    {
        ControlSend,, {vk4D Down}, [#] WoT Client [#]
        KeyWait, 2Joy7
        ControlSend,, {vk4D Up}, [#] WoT Client [#]    
    }
    return
    
    ;;;;;;;;;;;;второй геймпад скрыть мини карту в активном окне
    
    2Joy5::
    {
        ControlSend,, {vk5A Down}, [#] WoT Client [#]
        KeyWait, 2Joy5
        ControlSend,, {vk5A Up}, [#] WoT Client [#]    
    }
    return
    
    ;;;;;;;;;;;;второй геймпад ремонт
    
    2Joy3::
    {
        ControlSend,, {vk34 Down}, [#] WoT Client [#]
        KeyWait, 2Joy3
        ControlSend,, {vk34 Up}, [#] WoT Client [#]   
    }
    return
    
    ;;;;;;;;;;;;второй геймпад лечение
    
    2Joy2::
    {
        ControlSend,, {vk36 Down}, [#] WoT Client [#]
        KeyWait, 2Joy2
        ControlSend,, {vk36 Up}, [#] WoT Client [#]    
    }
    return 

     

    Для игры в этом режиме нужно установить VDM и SandBoxie, настроить отображение на экране ТВ/монитора 1/2, запустить два клиента WoT, обычно и в песочнице, запустить скрипт AutoHotKey (или скомпилированный), с помощью нажатия сочетания Ctrl+Alt+Shift+s перевести оба окна в режим без заголовка и играть.

     

    Для использования вибраций в геймпадах от Xbox360, нужно настроить вибрацию согласно теме, скопировать полностью папку с python в "песочницу", второй клиент запускать из полной копии папки с игрой. Вибромоды прилагаю.

    • Upvote 2
  10. Вчера хотел тестировать скрипт на домашнем ПК и словил проблемку... Мелкософтовские геймпады как то неправильно распознаются в домашней системе, тот который на первом канале определяется AHK как #2, тот который на втором #1 (т.е. под неправильными номерами), при чем если принудительно в скрипте указывать 2Joy, утилита начинает есть много процессорного времени - 15%.

    Может кто сталкивался?

  11. Представляю на суд общественности скрипт AutoHotKey для игры с ремонтом, лечением и меню приказов.

    'WoTGamepad'

    JoyMultiplier = 5
    JoyThreshold = 5
    JoyThresholdUpper := 50 + JoyThreshold
    JoyThresholdLower := 50 - JoyThreshold
    #Persistent
    SetTimer, WatchAxisSecondJoyMoveForwardAndZoom, 10
    SetTimer, WatchAxisSecondJoyMoveRotate, 10
    SetTimer, WatchAxisSecondJoyCameraRotate, 10
    SetTimer, WatchAxisSecondJoyShoot, 10
    SetTimer, WatchSecondJoyPOV, 10
    return
    
    ;;;;;;;;;;;;второй геймпад движение вперед/назад в активном окне и зум
    
    WatchAxisSecondJoyMoveForwardAndZoom:
    GetKeyState, 1JoyY, 1JoyY
    GetKeyState, 1JoyZ, 1JoyZ
    GetKeyState, 1Joy2, 1Joy2
    GetKeyState, 1Joy3, 1Joy3
    SecondJoyMoveForwardAndZoomPrev = %SecondJoyMoveForwardAndZoom%
    
    if 1Joy2 = D
        GoSub, SecondJoyConsumables
    else if 1Joy3 = D
        GoSub, SecondJoyConsumables
    else 
    {
    if 1JoyZ > 70
        {
        if 1JoyY < 30
            SecondJoyMoveForwardAndZoom = PgDn
        else if 1JoyY > 70
            SecondJoyMoveForwardAndZoom = PgUp
        else
            SecondJoyMoveForwardAndZoom =
        }
    else if 1JoyY < 30
        SecondJoyMoveForwardAndZoom = vk57
    else if 1JoyY > 70 
        SecondJoyMoveForwardAndZoom = vk53
    else
        SecondJoyMoveForwardAndZoom =
    }
    
    if SecondJoyMoveForwardAndZoom = %SecondJoyMoveForwardAndZoomPrev%
        return
    
    SetKeyDelay -1
    if SecondJoyMoveForwardAndZoom
    {
        ControlSend,, {%SecondJoyMoveForwardAndZoom% down}, WoT Client
    }
    if SecondJoyMoveForwardAndZoomPrev
    {
        ControlSend,, {%SecondJoyMoveForwardAndZoomPrev% up}, WoT Client
    }
    return
    
    ;;;;;;;;;;;;второй геймпад движение влево/вправо в активном окне
    
    WatchAxisSecondJoyMoveRotate:
    GetKeyState, 1JoyX, 1JoyX
    GetKeyState, 1Joy2, 1Joy2
    GetKeyState, 1Joy3, 1Joy3
    SecondJoyMoveRotatePrev = %SecondJoyMoveRotate%
    
    if 1Joy2 = D
        GoSub, SecondJoyConsumables
    else if 1Joy3 = D
        GoSub, SecondJoyConsumables
    else
    {
    if 1JoyX > 80
        SecondJoyMoveRotate = vk44
    else if 1JoyX < 20
        SecondJoyMoveRotate = vk41
    else
        SecondJoyMoveRotate =
    }
    
    if SecondJoyMoveRotate = %SecondJoyMoveRotatePrev%
        return
    
    SetKeyDelay -1
    if SecondJoyMoveRotate
    {
        ControlSend,, {%SecondJoyMoveRotate% down}, WoT Client
    }
    if SecondJoyMoveRotatePrev
    {
        ControlSend,, {%SecondJoyMoveRotatePrev% up}, WoT Client
    }
    return
    
    ;;;;;;;;;;;;второй геймпад меню расходников
    
    SecondJoyConsumables:
    SecondJoyConsumablesPrev = %SecondJoyConsumables%
    
    if 1JoyX < 20
        {
        if 1JoyY < 20
        SecondJoyConsumables = vk38
        else if 1JoyY between 40 and 60
        SecondJoyConsumables = vk37
        else if 1JoyY > 80
        SecondJoyConsumables = vk36
        else SecondJoyConsumables =
        }
    else if 1JoyX between 40 and 60
        {
        if 1JoyY < 10
        SecondJoyConsumables = vk31
        else if 1JoyY > 90
        SecondJoyConsumables = vk35
        else SecondJoyConsumables =     
        }
    else if 1JoyX > 80
        {
        if 1JoyY < 20
        SecondJoyConsumables = vk32
        else if 1JoyY between 40 and 60
        SecondJoyConsumables = vk33
        else if 1JoyY > 80
        SecondJoyConsumables = vk34
        else SecondJoyConsumables =
        }
    else SecondJoyConsumables =
    
    if SecondJoyConsumables = %SecondJoyConsumablesPrev%
    return
    
    SetKeyDelay -1
    if SecondJoyConsumables
    {
        ControlSend,, {%SecondJoyConsumables% down}, WoT Client 
    }
    if SecondJoyConsumablesPrev
    {
        ControlSend,, {%SecondJoyConsumablesPrev% up}, WoT Client 
    }
    return
    
    ;;;;;;;;;;;;второй геймпад обзор и мышь в активном окне
    
    WatchAxisSecondJoyCameraRotate:
    MouseNeedsToBeMoved := false
    SetFormat, float, 03
    GetKeyState, 1JoyU, 1JoyU
    GetKeyState, 1JoyR, 1JoyR
    GetKeyState, 1Joy5, 1Joy5
    
    if 1Joy5 = D
        GoSub, SecondJoyCommandMenu
    else if 1Joy5 = U
    {
    if 1JoyU > %JoyThresholdUpper%
    {
    	MouseNeedsToBeMoved := true
    	DeltaU := 1JoyU - JoyThresholdUpper
    }
    else if 1JoyU < %JoyThresholdLower%
    {
    	MouseNeedsToBeMoved := true
    	DeltaU := 1JoyU - JoyThresholdLower
    }
    else
    	DeltaU = 0
    if 1JoyR > %JoyThresholdUpper%
    {
    	MouseNeedsToBeMoved := true
    	DeltaR := 1JoyR - JoyThresholdUpper
    }
    else if 1JoyR < %JoyThresholdLower%
    {
    	MouseNeedsToBeMoved := true
    	DeltaR := 1JoyR - JoyThresholdLower
    }
    else
    	DeltaR = 0
    }
    
    SetKeyDelay -1
    if MouseNeedsToBeMoved
    {
            SetMouseDelay, -1  ; Makes movement smoother 
    	x := (DeltaU/30) * (ABS(DeltaU)/30) * JoyMultiplier
            y := (DeltaR/30) * (ABS(DeltaR)/30) * JoyMultiplier 
            DllCall("mouse_event", uint, 1, int, x, int, y, uint, 0, int, 0)
    }
    return
    
    ;;;;;;;;;;;;второй геймпад меню приказов
    
    SecondJoyCommandMenu:
    SecondJoyCommandMenuPrev = %SecondJoyCommandMenu%
    
    if 1JoyU < 20
        {
        if 1JoyR < 20
        SecondJoyCommandMenu = vk77
        else if 1JoyR between 40 and 60
        SecondJoyCommandMenu = vk76
        else if 1JoyR > 80
        SecondJoyCommandMenu = vk75
        else SecondJoyCommandMenu =
        }
    else if 1JoyU between 40 and 60
        {
        if 1JoyR < 10
        SecondJoyCommandMenu = vk70
        else if 1JoyR > 90
        SecondJoyCommandMenu = vk74
        else SecondJoyCommandMenu =     
        }
    else if 1JoyU > 80
        {
        if 1JoyR < 20
        SecondJoyCommandMenu = vk71
        else if 1JoyR between 40 and 60
        SecondJoyCommandMenu = vk72
        else if 1JoyR > 80
        SecondJoyCommandMenu = vk73
        else SecondJoyCommandMenu =
        }
    else SecondJoyCommandMenu =
    
    if SecondJoyCommandMenu = %SecondJoyCommandMenuPrev%
    return
    
    SetKeyDelay -1
    if SecondJoyCommandMenu
    {
        ControlSend,, {%SecondJoyCommandMenu% down}, WoT Client 
    }
    if SecondJoyCommandMenuPrev
    {
        ControlSend,, {%SecondJoyCommandMenuPrev% up}, WoT Client 
    }
    return
    
    ;;;;;;;;;;;;второй геймпад выстрел в активном окне
    
    WatchAxisSecondJoyShoot:
    GetKeyState, 1JoyZ, 1JoyZ
    SecondJoyShootPrev = %SecondJoyShoot%
    
    if 1JoyZ < 30
        SecondJoyShoot = LButton
    else
        SecondJoyShoot =
    
    if SecondJoyShoot = %SecondJoyShootPrev%
        return
    
    SetKeyDelay -1
    if SecondJoyShoot
    {
        Send, {%SecondJoyShoot% down} 
    }
    if SecondJoyShootPrev
    {
        Send, {%SecondJoyShootPrev% up} 
    }
    return
    
    ;;;;;;;;;;;;;второй геймпад крестовина в активном окне
    
    WatchSecondJoyPOV:
    GetKeyState, 1JoyPOV, 1JoyPOV
    SecondJoyPOVPrev = %SecondJoyPOV%
    
    if 1JoyPOV = 0
        SecondJoyPOV = vk52
    else if 1JoyPOV = 18000
        SecondJoyPOV = vk46
    else if 1JoyPOV = 27000
        SecondJoyPOV = vk58
    else if 1JoyPOV = 9000
        SecondJoyPOV = vk43
    else SecondJoyPOV = 
    
    if SecondJoyPOV = %SecondJoyPOVPrev%
    return
    
    SetKeyDelay -1
    if SecondJoyPOV
    {
        ControlSend,, {%SecondJoyPOV% down}, WoT Client
    }
    if SecondJoyPOVPrev
    {
        ControlSend,, {%SecondJoyPOVprev% up}, WoT Client
    }
    return
    
    ;;;;;;;;;;;;второй геймпад LShift в активном окне
    
    1Joy10::
    {
        ControlSend,, {vkA0 Down}, WoT Client
        KeyWait, 1Joy10
        ControlSend,, {vkA0 Up}, WoT Client
    }
    return
    
    ;;;;;;;;;;;;второй геймпад Space в активном окне
    
    1Joy9::
    {
        ControlSend,, {vk20 Down}, WoT Client
        KeyWait, 1Joy9
        ControlSend,, {vk20 Up}, WoT Client
    }
    return
    
    ;;;;;;;;;;;;второй геймпад выбор снарядов в неактивном окне
    
    1Joy1::
    Gosub, SecondSubToggle
    Return
    
    SecondSubToggle:
    SecondToggle++
    If SecondToggle = 1
    {
        ControlSend,, {vk31 down}, WoT Client
        Sleep, 10
        ControlSend,, {vk31 up}, WoT Client
        Sleep, 10
        ControlSend,, {vk31 down}, WoT Client
        Sleep, 10
        ControlSend,, {vk31 up}, WoT Client
    }
    If SecondToggle = 2
    {
        ControlSend,, {vk32 down}, WoT Client
        Sleep, 10
        ControlSend,, {vk32 up}, WoT Client
        Sleep, 10
        ControlSend,, {vk32 down}, WoT Client 
        Sleep, 10
        ControlSend,, {vk32 up}, WoT Client
    }
    If SecondToggle = 3
    {
        ControlSend,, {vk33 down}, WoT Client
        Sleep, 10
        ControlSend,, {vk33 up}, WoT Client
        Sleep, 10
        ControlSend,, {vk33 down}, WoT Client
        Sleep, 10
        ControlSend,, {vk33 up}, WoT Client
        SecondToggle = 0
    }
    return
    
    ;;;;;;;;;;;;второй геймпад огнетушитель в активном окне
    
    1Joy4::
    {
        ControlSend,, {vk35 Down}, WoT Client
        KeyWait, 1Joy4
        ControlSend,, {vk35 Up}, WoT Client
    }
    return
    
    ;;;;;;;;;;;;второй геймпад автоприцел в активном окне
    
    1Joy6::
    {
        Send, {RButton Down}
        KeyWait, 1Joy6
        Send, {RButton up}
    }
    return
    
    ;;;;;;;;;;;;второй геймпад меню в неактивном окне
    
    1Joy8::
    {
        ControlSend,, {vk1B Down}, WoT Client
        KeyWait, 1Joy8
        ControlSend,, {vk1B Up}, WoT Client
    }
    return
    
    ;;;;;;;;;;;;второй геймпад скрыть мини карту в активном окне
    
    1Joy7::
    {
        ControlSend,, {vk4D Down}, WoT Client
        KeyWait, 1Joy7
        ControlSend,, {vk4D Up}, WoT Client    
    }
    return
    
    ;;;;;;;;;;;;второй геймпад скрыть мини карту в активном окне
    
    1Joy5::
    {
        ControlSend,, {vk5A Down}, WoT Client
        KeyWait, 1Joy5
        ControlSend,, {vk5A Up}, WoT Client    
    }
    return
    
    ;;;;;;;;;;;;второй геймпад ремонт
    
    1Joy3::
    {
        ControlSend,, {vk34 Down}, WoT Client
        KeyWait, 1Joy3
        ControlSend,, {vk34 Up}, WoT Client    
    }
    return
    
    ;;;;;;;;;;;;второй геймпад лечение
    
    1Joy2::
    {
        ControlSend,, {vk36 Down}, WoT Client
        KeyWait, 1Joy2
        ControlSend,, {vk36 Up}, WoT Client    
    }
    return 

    Скрипт позволяет полноценно играть с геймпада в "танчиках". Ниже рисунок как назначены куда кнопки:

    post-19155-0-46320000-1403621551_thumb.jpg

    Меню приказов - сочетание левого бампера и правого стика, лечение и ремонт кнопки "Х" и "В" в сочетании с левым стиком. Ниже рисунок для понятия работы:

    post-19155-0-16188200-1403621546_thumb.jpg

    В принципе в скрипте можно переназначить отклонения стиков на кнопки как будет душе угодно, особенно это касается меню приказов. К тому же особенно проситься добавление мода "Редактируемое радиальное меню" - для расширения функционала.
    Расположение расходников в игре у меня назначено как 4-й слот - малый ремкомплект, 5-й - огнетушитель, 6-й малая аптечка.


    Осталось теперь собрать "до кучи" скрипты для первого и второго геймпада. Протестировать, отписать в первом сообщении полную инструкцию по настройке/эксплуатации и можно темку закрывать ;)

    • Upvote 1
  12. Вроде доработал скрипт до более-менее играбельного состояния

    post-19155-0-84405600-1403257739_thumb.jpg

    Приближение/отдаление работает в связке с левым стиком: курок + стик вверх - приближение, курок + стик вниз - отдаление.

    Выбор типа снарядов переключением - один раз нажал - 1-й тип, второй - 2-й, третий - третий и сброс в начало (1-2-3). снаряды применяются сразу - AHK отдает двукратное нажатие в игру.

     

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

     

    На втором геймпаде правый стик работает как мышь, правый курок как левая кнопка и правый бампер как правая кнопка в любом окне.

    'Собственно сам скрипт'

    JoyMultiplier = 5
    JoyThreshold = 5
    JoyThresholdUpper := 50 + JoyThreshold
    JoyThresholdLower := 50 - JoyThreshold
    #Persistent
    SetTimer, WatchAxisFirstJoyMoveForwardAndZoom, 10
    SetTimer, WatchAxisFirstJoyMoveRotate, 10
    SetTimer, WatchAxisFirstJoyCameraRotateVert, 10
    SetTimer, WatchAxisFirstJoyCameraRotateHoriz, 10
    SetTimer, WatchAxisFirstJoyShoot, 10
    SetTimer, WatchFirstJoyPOV, 10
    SetTimer, WatchAxisSecondJoyMoveForwardAndZoom, 10
    SetTimer, WatchAxisSecondJoyMoveRotate, 10
    SetTimer, WatchAxisSecondJoyCameraRotate, 10
    SetTimer, WatchAxisSecondJoyShoot, 10
    SetTimer, WatchSecondJoyPOV, 10
    return
    
    
    ;;;;;;;;;;;;первый геймпад движение вперед/назад в неактивном окне и зум
    
    WatchAxisFirstJoyMoveForwardAndZoom:
    GetKeyState, 1JoyY, 1JoyY
    GetKeyState, 1JoyZ, 1JoyZ
    FirstJoyMoveForwardAndZoomPrev = %FirstJoyMoveForwardAndZoom%
    
    if 1JoyZ > 70
        {
        if 1JoyY < 30
            FirstJoyMoveForwardAndZoom = PgDn
        else if 1JoyY > 70
            FirstJoyMoveForwardAndZoom = PgUp
        else
            FirstJoyMoveForwardAndZoom =
        }
    else if 1JoyY < 30
        FirstJoyMoveForwardAndZoom = vk57
    else if 1JoyY > 70 
        FirstJoyMoveForwardAndZoom = vk53
    else
        FirstJoyMoveForwardAndZoom =
    
    if FirstJoyMoveForwardAndZoom = %FirstJoyMoveForwardAndZoomPrev%
        return
    
    SetKeyDelay -1
    if FirstJoyMoveForwardAndZoom
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyMoveForwardAndZoom% down}, WoT Client
        }
    }
    if FirstJoyMoveForwardAndZoomPrev
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyMoveForwardAndZoomPrev% up}, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;первый геймпад движение влево/вправо в неактивном окне
    
    WatchAxisFirstJoyMoveRotate:
    GetKeyState, 1JoyX, 1JoyX
    FirstJoyMoveRotatePrev = %FirstJoyMoveRotate%
    
    if 1JoyX > 80
        FirstJoyMoveRotate = vk44
    else if 1JoyX < 20
        FirstJoyMoveRotate = vk41
    else
        FirstJoyMoveRotate =
    
    if FirstJoyMoveRotate = %FirstJoyMoveRotatePrev%
        return
    
    SetKeyDelay -1
    if FirstJoyMoveRotate
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyMoveRotate% down}, WoT Client
        }
    }
    if FirstJoyMoveRotatePrev
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyMoveRotatePrev% up}, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;первый геймпад обзор влево/вправо в неактивном окне
    
    WatchAxisFirstJoyCameraRotateVert:
    GetKeyState, 1JoyU, 1JoyU
    FirstJoyCameraRotateVertPrev = %FirstJoyCameraRotateVert%
    
    if 1JoyU > 70
        FirstJoyCameraRotateVert = Right
    else if 1JoyU < 30
        FirstJoyCameraRotateVert = Left
    else
        FirstJoyCameraRotateVert =
    
    if FirstJoyCameraRotateVert = %FirstJoyCameraRotateVertPrev%
        return
    
    SetKeyDelay -1
    if FirstJoyCameraRotateVert
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyCameraRotateVert% down}, WoT Client
        }
    }
    if FirstJoyCameraRotateVertPrev
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyCameraRotateVertPrev% up}, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;первый геймпад обзор вверх/вниз в неактивном окне
    
    WatchAxisFirstJoyCameraRotateHoriz:
    GetKeyState, 1JoyR, 1JoyR
    FirstJoyCameraRotateHorizPrev = %FirstJoyCameraRotateHoriz%
    
    if 1JoyR > 70
        FirstJoyCameraRotateHoriz = Down
    else if 1JoyR < 30
        FirstJoyCameraRotateHoriz = Up
    else
        FirstJoyCameraRotateHoriz =
    
    if FirstJoyCameraRotateHoriz = %FirstJoyCameraRotateHorizPrev%
        return
    
    SetKeyDelay -1
    if FirstJoyCameraRotateHoriz
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyCameraRotateHoriz% down}, WoT Client
        }
    }
    if FirstJoyCameraRotateHorizPrev
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyCameraRotateHorizPrev% up}, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;первый геймпад выстрел в неактивном окне
    
    WatchAxisFirstJoyShoot:
    GetKeyState, 1JoyZ, 1JoyZ
    FirstJoyShootPrev = %FirstJoyShoot%
    
    if 1JoyZ < 30
        FirstJoyShoot = LButton
    else
        FirstJoyShoot =
    
    if FirstJoyShoot = %FirstJoyShootPrev%
        return
    
    SetKeyDelay -1
    if FirstJoyShoot
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x201,,,, WoT Client
        }
    }
    if FirstJoyShootPrev
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x202,,,, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;;первый геймпад крестовина в неактивном окне
    
    WatchFirstJoyPOV:
    GetKeyState, 1JoyPOV, 1JoyPOV
    FirstJoyPOVPrev = %FirstJoyPOV%
    
     if 1JoyPOV = 0
        FirstJoyPOV = vk52
    else if 1JoyPOV = 18000
        FirstJoyPOV = vk46
    else if 1JoyPOV = 27000
        FirstJoyPOV = vk58
    else if 1JoyPOV = 9000
        FirstJoyPOV = vk43
    else FirstJoyPOV = 
    
    if FirstJoyPOV = %FirstJoyPOVPrev%
    return
    
    SetKeyDelay -1
    if FirstJoyPOV
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyPOV% down}, WoT Client
        }
    }
    if FirstJoyPOVPrev
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyPOVprev% up}, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;первый геймпад LShift в неактивном окне
    
    1Joy10::
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vkA0 Down}, WoT Client
        KeyWait, 1Joy10
        ControlSend,, {vkA0 Up}, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;первый геймпад Space в неактивном окне
    
    1Joy9::
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk20 Down}, WoT Client
        KeyWait, 1Joy9
        ControlSend,, {vk20 Up}, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;первый геймпад выбор снарядов в неактивном окне
    
    1Joy1::
    Gosub, FirstSubToggle
    Return
    
    FirstSubToggle:
    FirstToggle++
    If FirstToggle = 1
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk31 down}, WoT Client
        Sleep, 10
        ControlSend,, {vk31 up}, WoT Client
        Sleep, 10
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk31 down}, WoT Client
        Sleep, 10
        ControlSend,, {vk31 up}, WoT Client    
        }
    }
    If FirstToggle = 2
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk32 down}, WoT Client
        Sleep, 10
        ControlSend,, {vk32 up}, WoT Client
        Sleep, 10
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk32 down}, WoT Client
        Sleep, 10
        ControlSend,, {vk32 up}, WoT Client    
        }
    }
    If FirstToggle = 3
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk33 down}, WoT Client
        Sleep, 10
        ControlSend,, {vk33 up}, WoT Client
        Sleep, 10
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk33 down}, WoT Client
        Sleep, 10
        ControlSend,, {vk33 up}, WoT Client    
        }
    FirstToggle = 0
    }
    return
    
    ;;;;;;;;;;;;первый геймпад огнетушитель в неактивном окне
    
    1Joy3::
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk35 Down}, WoT Client
        KeyWait, 1Joy3
        ControlSend,, {vk35 Up}, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;первый геймпад автоприцел в неактивном окне
    
    1Joy6::
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x204, 1,,, WoT Client
        KeyWait, 1Joy6
        SendMessage, 0x205, 1,,, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;первый геймпад меню в неактивном окне
    
    1Joy8::
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk1B Down}, WoT Client
        KeyWait, 1Joy8
        ControlSend,, {vk1B Up}, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;первый геймпад сркыть мини карту в неактивном окне
    
    1Joy7::
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk4D Down}, WoT Client
        KeyWait, 1Joy7
        ControlSend,, {vk4D Up}, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;второй геймпад
    
    ;;;;;;;;;;;;второй геймпад движение вперед/назад в активном окне и зум
    
    WatchAxisSecondJoyMoveForwardAndZoom:
    GetKeyState, 2JoyY, 2JoyY
    GetKeyState, 2JoyZ, 2JoyZ
    SecondJoyMoveForwardAndZoomPrev = %SecondJoyMoveForwardAndZoom%
    
    if 2JoyZ > 70
        {
        if 2JoyY < 30
            SecondJoyMoveForwardAndZoom = PgDn
        else if 2JoyY > 70
            SecondJoyMoveForwardAndZoom = PgUp
        else
            SecondJoyMoveForwardAndZoom =
        }
    else if 2JoyY < 30
        SecondJoyMoveForwardAndZoom = vk57
    else if 2JoyY > 70 
        SecondJoyMoveForwardAndZoom = vk53
    else
        SecondJoyMoveForwardAndZoom =
    
    if SecondJoyMoveForwardAndZoom = %SecondJoyMoveForwardAndZoomPrev%
        return
    
    SetKeyDelay -1
    if SecondJoyMoveForwardAndZoom
    {
        ControlSend,, {%SecondJoyMoveForwardAndZoom% down}, [#] WoT Client [#]
    }
    if SecondJoyMoveForwardAndZoomPrev
    {
        ControlSend,, {%SecondJoyMoveForwardAndZoomPrev% up}, [#] WoT Client [#]
    }
    return
    
    ;;;;;;;;;;;;второй геймпад движение влево/вправо в активном окне
    
    WatchAxisSecondJoyMoveRotate:
    GetKeyState, 2JoyX, 2JoyX
    SecondJoyMoveRotatePrev = %SecondJoyMoveRotate%
    
    if 2JoyX > 80
        SecondJoyMoveRotate = vk44
    else if 2JoyX < 20
        SecondJoyMoveRotate = vk41
    else
        SecondJoyMoveRotate =
    
    if SecondJoyMoveRotate = %SecondJoyMoveRotatePrev%
        return
    
    SetKeyDelay -1
    if SecondJoyMoveRotate
    {
        ControlSend,, {%SecondJoyMoveRotate% down}, [#] WoT Client [#]
    }
    if SecondJoyMoveRotatePrev
    {
        ControlSend,, {%SecondJoyMoveRotatePrev% up}, [#] WoT Client [#]
    }
    return
    
    ;;;;;;;;;;;;второй геймпад обзор и мышь в активном окне
    
    WatchAxisSecondJoyCameraRotate:
    MouseNeedsToBeMoved := false
    SetFormat, float, 03
    GetKeyState, 2JoyU, 2JoyU
    GetKeyState, 2JoyR, 2JoyR
    if 2JoyU > %JoyThresholdUpper%
    {
    	MouseNeedsToBeMoved := true
    	DeltaU := 2JoyU - JoyThresholdUpper
    }
    else if 2JoyU < %JoyThresholdLower%
    {
    	MouseNeedsToBeMoved := true
    	DeltaU := 2JoyU - JoyThresholdLower
    }
    else
    	DeltaU = 0
    if 2JoyR > %JoyThresholdUpper%
    {
    	MouseNeedsToBeMoved := true
    	DeltaR := 2JoyR - JoyThresholdUpper
    }
    else if 2JoyR < %JoyThresholdLower%
    {
    	MouseNeedsToBeMoved := true
    	DeltaR := 2JoyR - JoyThresholdLower
    }
    else
    	DeltaR = 0
    
    if MouseNeedsToBeMoved
    {
            SetMouseDelay, -1  ; Makes movement smoother 
    	x := (DeltaU/30) * (ABS(DeltaU)/30) * JoyMultiplier
            y := (DeltaR/30) * (ABS(DeltaR)/30) * JoyMultiplier 
            DllCall("mouse_event", uint, 1, int, x, int, y, uint, 0, int, 0)
    }
    return
    
    ;;;;;;;;;;;;второй геймпад выстрел в активном окне
    
    WatchAxisSecondJoyShoot:
    GetKeyState, 2JoyZ, 2JoyZ
    SecondJoyShootPrev = %SecondJoyShoot%
    
    if 2JoyZ < 30
        SecondJoyShoot = LButton
    else
        SecondJoyShoot =
    
    if SecondJoyShoot = %SecondJoyShootPrev%
        return
    
    SetKeyDelay -1
    if SecondJoyShoot
    {
        Send, {%SecondJoyShoot% down} 
    }
    if SecondJoyShootPrev
    {
        Send, {%SecondJoyShootPrev% up} 
    }
    return
    
    ;;;;;;;;;;;;;второй геймпад крестовина в активном окне
    
    WatchSecondJoyPOV:
    GetKeyState, 2JoyPOV, 2JoyPOV
    SecondJoyPOVPrev = %SecondJoyPOV%
    
    if 2JoyPOV = 0
        SecondJoyPOV = vk52
    else if 2JoyPOV = 18000
        SecondJoyPOV = vk46
    else if 2JoyPOV = 27000
        SecondJoyPOV = vk58
    else if 2JoyPOV = 9000
        SecondJoyPOV = vk43
    else SecondJoyPOV = 
    
    if SecondJoyPOV = %SecondJoyPOVPrev%
    return
    
    SetKeyDelay -1
    if SecondJoyPOV
    {
        ControlSend,, {%SecondJoyPOV% down}, [#] WoT Client [#]
    }
    if SecondJoyPOVPrev
    {
        ControlSend,, {%SecondJoyPOVprev% up}, [#] WoT Client [#]
    }
    return
    
    ;;;;;;;;;;;;второй геймпад LShift в активном окне
    
    2Joy10::
    {
        ControlSend,, {vkA0 Down}, [#] WoT Client [#]
        KeyWait, 2Joy10
        ControlSend,, {vkA0 Up}, [#] WoT Client [#]
    }
    return
    
    ;;;;;;;;;;;;второй геймпад Space в активном окне
    
    2Joy9::
    {
        ControlSend,, {vk20 Down}, [#] WoT Client [#]
        KeyWait, 2Joy9
        ControlSend,, {vk20 Up}, [#] WoT Client [#]
    }
    return
    
    ;;;;;;;;;;;;второй геймпад выбор снарядов в неактивном окне
    
    2Joy1::
    Gosub, SecondSubToggle
    Return
    
    SecondSubToggle:
    SecondToggle++
    If SecondToggle = 1
    {
        ControlSend,, {vk31 down}, [#] WoT Client [#]
        Sleep, 10
        ControlSend,, {vk31 up}, [#] WoT Client [#]
        Sleep, 10
        ControlSend,, {vk31 down}, [#] WoT Client [#]
        Sleep, 10
        ControlSend,, {vk31 up}, [#] WoT Client [#]
    }
    If SecondToggle = 2
    {
        ControlSend,, {vk32 down}, [#] WoT Client [#] 
        Sleep, 10
        ControlSend,, {vk32 up}, [#] WoT Client [#]
        Sleep, 10
        ControlSend,, {vk32 down}, [#] WoT Client [#] 
        Sleep, 10
        ControlSend,, {vk32 up}, [#] WoT Client [#]
    }
    If SecondToggle = 3
    {
        ControlSend,, {vk33 down}, [#] WoT Client [#]
        Sleep, 10
        ControlSend,, {vk33 up}, [#] WoT Client [#]
        Sleep, 10
        ControlSend,, {vk33 down}, [#] WoT Client [#]
        Sleep, 10
        ControlSend,, {vk33 up}, [#] WoT Client [#]
        SecondToggle = 0
    }
    return
    
    ;;;;;;;;;;;;второй геймпад огнетушитель в активном окне
    
    2Joy3::
    {
        ControlSend,, {vk35 Down}, [#] WoT Client [#]
        KeyWait, 2Joy3
        ControlSend,, {vk35 Up}, [#] WoT Client [#]
    }
    return
    
    ;;;;;;;;;;;;второй геймпад автоприцел в активном окне
    
    2Joy6::
    {
        Send, {RButton Down}
        KeyWait, 2Joy6
        Send, {RButton up}
    }
    return
    
    ;;;;;;;;;;;;второй геймпад меню в неактивном окне
    
    2Joy8::
    {
        ControlSend,, {vk1B Down}, [#] WoT Client [#]
        KeyWait, 2Joy8
        ControlSend,, {vk1B Up}, [#] WoT Client [#]
    }
    return
    
    ;;;;;;;;;;;;второй геймпад сркыть мини карту в неактивном окне
    
    2Joy7::
    {
        ControlSend,, {vk4D Down}, [#] WoT Client [#]
        KeyWait, 2Joy7
        ControlSend,, {vk4D Up}, [#] WoT Client [#]
    }
    return 

     

    Как видно из скрипта - второй геймпад предназначен для игры в активном окне клиента в песочнице :)

    • Upvote 2
  13. Доработал немного скрипт:

    'wotsplitscreen.ahk'

    #Persistent
    SetTimer, WatchAxisFirstJoyMoveForward, 10
    SetTimer, WatchAxisFirstJoyMoveRotate, 10
    SetTimer, WatchAxisFirstJoyCameraRotateVert, 10
    SetTimer, WatchAxisFirstJoyCameraRotateHoriz, 10
    SetTimer, WatchAxisFirstJoyShoot, 10
    SetTimer, WatchFirstJoyPOV, 10
    return
    
    ;;;;;;;;;;;;
    
    WatchAxisFirstJoyMoveForward:
    GetKeyState, 1JoyY, 1JoyY
    FirstJoyMoveForwardPrev = %FirstJoyMoveForward%
    
    if 1JoyY > 70
        FirstJoyMoveForward = vk53
    else if 1JoyY < 30
        FirstJoyMoveForward = vk57
    else
        FirstJoyMoveForward =
    
    if FirstJoyMoveForward = %FirstJoyMoveForwardPrev%
        return
    
    SetKeyDelay -1
    if FirstJoyMoveForward
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyMoveForward% down}, WoT Client
        }
    }
    if FirstJoyMoveForwardPrev
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyMoveForwardPrev% up}, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;
    
    WatchAxisFirstJoyMoveRotate:
    GetKeyState, 1JoyX, 1JoyX
    FirstJoyMoveRotatePrev = %FirstJoyMoveRotate%
    
    if 1JoyX > 80
        FirstJoyMoveRotate = vk44
    else if 1JoyX < 20
        FirstJoyMoveRotate = vk41
    else
        FirstJoyMoveRotate =
    
    if FirstJoyMoveRotate = %FirstJoyMoveRotatePrev%
        return
    
    SetKeyDelay -1
    if FirstJoyMoveRotate
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyMoveRotate% down}, WoT Client
        }
    }
    if FirstJoyMoveRotatePrev
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyMoveRotatePrev% up}, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;
    
    WatchAxisFirstJoyCameraRotateVert:
    GetKeyState, 1JoyU, 1JoyU
    FirstJoyCameraRotateVertPrev = %FirstJoyCameraRotateVert%
    
    if 1JoyU > 70
        FirstJoyCameraRotateVert = Right
    else if 1JoyU < 30
        FirstJoyCameraRotateVert = Left
    else
        FirstJoyCameraRotateVert =
    
    if FirstJoyCameraRotateVert = %FirstJoyCameraRotateVertPrev%
        return
    
    SetKeyDelay -1
    if FirstJoyCameraRotateVert
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyCameraRotateVert% down}, WoT Client
        }
    }
    if FirstJoyCameraRotateVertPrev
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyCameraRotateVertPrev% up}, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;
    
    WatchAxisFirstJoyCameraRotateHoriz:
    GetKeyState, 1JoyR, 1JoyR
    FirstJoyCameraRotateHorizPrev = %FirstJoyCameraRotateHoriz%
    
    if 1JoyR > 70
        FirstJoyCameraRotateHoriz = Down
    else if 1JoyR < 30
        FirstJoyCameraRotateHoriz = Up
    else
        FirstJoyCameraRotateHoriz =
    
    if FirstJoyCameraRotateHoriz = %FirstJoyCameraRotateHorizPrev%
        return
    
    SetKeyDelay -1
    if FirstJoyCameraRotateHoriz
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyCameraRotateHoriz% down}, WoT Client
        }
    }
    if FirstJoyCameraRotateHorizPrev
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyCameraRotateHorizPrev% up}, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;
    
    WatchAxisFirstJoyShoot:
    GetKeyState, 1JoyZ, 1JoyZ
    FirstJoyShootPrev = %FirstJoyShoot%
    
    if 1JoyZ < 30
        FirstJoyShoot = vk01
    else
        FirstJoyShoot =
    
    if FirstJoyShoot = %FirstJoyShootPrev%
        return
    
    SetKeyDelay -1
    if FirstJoyShoot
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x201,,,, WoT Client
        }
    }
    if FirstJoyShootPrev
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x202,,,, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;;
    
    WatchFirstJoyPOV:
    GetKeyState, 1JoyPOV, 1JoyPOV
    FirstJoyPOVPrev = %FirstJoyPOV%
    
    if 1JoyPOV = 0
        FirstJoyPOV = vk52
    else if 1JoyPOV = 18000
        FirstJoyPOV = vk46
    else if 1JoyPOV = 27000
        FirstJoyPOV = vk58
    else if 1JoyPOV = 9000
        FirstJoyPOV = vk43
    else FirstJoyPOV = 
    
    
    if FirstJoyPOV = %FirstJoyPOVPrev%
    return
    
    SetKeyDelay -1
    if FirstJoyPOV
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyPOV% down}, WoT Client
        }
    }
    if FirstJoyPOVPrev
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {%FirstJoyPOVprev% up}, WoT Client
        }
    }
    return
    
    ;;;;;;;;;;;;
    
    1Joy10::
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vkA0 Down}, WoT Client
        KeyWait, 1Joy10
        ControlSend,, {vkA0 Up}, WoT Client
        }
    }
    Return
    
    ;;;;;;;;;;;;
    
    1Joy9::
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk20 Down}, WoT Client
        KeyWait, 1Joy9
        ControlSend,, {vk20 Up}, WoT Client
        }
    }
    Return
    
    ;;;;;;;;;;;;
    
    1Joy1::
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk54 Down}, WoT Client
        KeyWait, 1Joy1
        ControlSend,, {vk54 Up}, WoT Client
        }
    }
    Return
    
    ;;;;;;;;;;;;
    
    1Joy3::
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk31 Down}, WoT Client
        KeyWait, 1Joy3
        ControlSend,, {vk31 Up}, WoT Client
        }
    }
    Return
    
    ;;;;;;;;;;;;
    
    1Joy4::
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk32 Down}, WoT Client
        KeyWait, 1Joy4
        ControlSend,, {vk32 Up}, WoT Client
        }
    }
    Return
    
    ;;;;;;;;;;;;
    
    1Joy2::
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk33 Down}, WoT Client
        KeyWait, 1Joy2
        ControlSend,, {vk33 Up}, WoT Client
        }
    }
    Return
    
    ;;;;;;;;;;;;
    
    1Joy6::
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x204, 1,,, WoT Client
        KeyWait, 1Joy6
        SendMessage, 0x205, 1,,, WoT Client
        }
    }
    Return
    
    ;;;;;;;;;;;;
    
    1Joy8::
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk1B Down}, WoT Client
        KeyWait, 1Joy8
        ControlSend,, {vk1B Up}, WoT Client
        }
    }
    Return
    
    ;;;;;;;;;;;;
    
    1Joy7::
    {
    IfWinNotActive, WoT Client
        {
        SendMessage, 0x06, 1,,, WoT Client
        ControlSend,, {vk4D Down}, WoT Client
        KeyWait, 1Joy7
        ControlSend,, {vk4D Up}, WoT Client
        }
    }
    Return 

    За основу взял управление WoT Xbox360:

    fb

     

    Добавил обработчик, так как если скрипт предназначенный для неактивного окна, работает в активном окне - вешается игра.

    • Upvote 1
  14.  

     

    Стрелки же для движения камеры имеют заданный коэффициент в игре, соответственно нет возможности быстрее или медленнее двигать камерой. Вот и думаю добавить отдельный обработчик в игру, например кнопка влево - коэффициент 0,5 (сейчас в игре 1), кнопка влево на цифровой клавиатуре (NumpadLeft) - коэффициент 1. нажатые одновременно (Left + NumpadLeft) - коэффициент 2,5.
     

    Если не получиться с мышей - это реально сделать?


    Есть в Windows функция - управление курсором с помощью цифрового блока клавиатуры, нельзя ли эту функцию запилить на python и добавить в игру? Таким образом можно попробовать реализовать 2-х ступенчатое управление курсором/камерой в игре.

  15. Помогли мне со скриптом, который рисует в Paint, но блин в танки не отправляются движения мыши...

    If !WinExist("ahk_class MSPaintApp")
       Run, mspaint.exe
    WinWait, ahk_class MSPaintApp
    WinGet, List, ControlList
    Loop, parse, List, `n
       if RegExMatch(A_LoopField, "i)^Afx:[0-9A-F]+:8\d", Found)
          break
    
    x := 10, y := 200
    PostMessage, WM_LBUTTONDOWN := 0x201,, x|(y<<16), % Found
    Loop 30
    {
       x += A_Index
       PostMessage, WM_MOUSEMOVE := 0x200,, x|(y<<16), % Found
       Sleep, 10
    }
    PostMessage, WM_LBUTTONUP := 0x202,, x|(y<<16), % Found
    

    Кнопки нажатия мыши отправляются, а вот движения нет. Может кто знает ещё какой способ?

  16. Насколько мне известно что Autolt, что AHK выросли из одного проекта и имеют одинаковый функционал. Компилятор кода AHK так же выдает ошибки. На оф. форуме AHK подсказали что не так: "#Persistent", теперь скрипт не вылетает но и сообщения в окошко танков не приходят.


     

     

    /del
     

    Блин, а какой же хорошей шпаргалкой был пост.

  17. А ошибки выдает интерпритатор?

    В том то и дело что не выдает - тупо валится.

     

     

    А также необходимо передавать координаты, тоесть получить при помощи GetCursorPos координаты мыши, прибавить к ним DeltaX, DeltaY и уже перемещать

    А вот это имеет смысл, может поэтому и валится - нет начальных координат для функции.

     

    P.S. Таак стоять, отредактированный скрипт перемещений стиком мыши так же валится без ошибок.

  18. "Вылюбил" себе мозг, но не могу понять почему скрипт даже не запускается:

    'testmouse.ahk'

    #SingleInstance
    SetTimer, WatchJoystick, 10
    
    JoyThresholdUpper := 50 + JoyThreshold
    JoyThresholdLower := 50 - JoyThreshold
    JoyMultiplier = 0.30
    JoyThreshold = 3
    InvertYAxis := false
    
    if InvertYAxis
        YAxisMultiplier = -1
    else
        YAxisMultiplier = 1
    
    WatchJoystick:
    MouseNeedsToBeMoved := false
    SetFormat, float, 03
    GetKeyState, joyx, 1JoyX
    GetKeyState, joyy, 1JoyY
    if joyx > %JoyThresholdUpper%
    {
        MouseNeedsToBeMoved := true
        DeltaX := joyx - JoyThresholdUpper
    }
    else if joyx < %JoyThresholdLower%
    {
        MouseNeedsToBeMoved := true
        DeltaX := joyx - JoyThresholdLower
    }
    else
        DeltaX = 0
    if joyy > %JoyThresholdUpper%
    {
        MouseNeedsToBeMoved := true
        DeltaY := joyy - JoyThresholdUpper
    }
    else if joyy < %JoyThresholdLower%
    {
        MouseNeedsToBeMoved := true
        DeltaY := joyy - JoyThresholdLower
    }
    else
        DeltaY = 0
    
    if MouseNeedsToBeMoved
    {
    MakeLong( LoWord, HiWord ) {
     return (HiWord << 16) | (LoWord & 0xffff)
    }
    
    lParam := MakeLong( DeltaX * JoyMultiplier, DeltaY * JoyMultiplier * YAxisMultiplier )
    SendMessage, 0x200, 0, %lParam%,, WoT Client
    }
    return 

  19. Дело в том, что сам курсор мыши не двигается, мышь лишь эмулируем его плавные движения, последовательно передавая окну мол вот курсор бежит, обработай сообщение

    Ага, так это то что надо!!! Буду пробовать, огромное спасибо Вам!!!

  20. Итак, тестил на Painte =D.

     

    Так а курсор при выполнении скрипта где. т.е. реальная мышь? Очень-очень интересен Ваш опыт, чуть позже обязательно попробую в танки отправлять отклонения стиков как перемещения мыши в неактивное окно.

     

    Я кстати эту функцию "WM_MOUSEMOVE" уже встречал, но так как обещал сыну на выходных "танчики в разделенном экране", отложил на потом изучение данного вопроса. Если получиться - это будет супер :)

  21. Несовсем понятно. Можно поподробнее?

    Дело в том что в неактивное окно нет возможности отправлять перемещения мыши, а геймпады танки не понимают.

    Стрелки же для движения камеры имеют заданный коэффициент в игре, соответственно нет возможности быстрее или медленнее двигать камерой. Вот и думаю добавить отдельный обработчик в игру, например кнопка влево - коэффициент 0,5 (сейчас в игре 1), кнопка влево на цифровой клавиатуре (NumpadLeft) - коэффициент 1. нажатые одновременно (Left + NumpadLeft) - коэффициент 2,5.

     

    Не могу по-быстрому найти в каком из родных скриптов я видел коэффициенты.

     

    Вот что-то похожее:

    'control_modes.pyc'

            elif cmdMap.isFiredList((CommandMapping.CMD_CM_CAMERA_ROTATE_LEFT,
             CommandMapping.CMD_CM_CAMERA_ROTATE_RIGHT,
             CommandMapping.CMD_CM_CAMERA_ROTATE_UP,
             CommandMapping.CMD_CM_CAMERA_ROTATE_DOWN,
             CommandMapping.CMD_CM_INCREASE_ZOOM,
             CommandMapping.CMD_CM_DECREASE_ZOOM), key):
                dx = dy = dz = 0.0
                if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_LEFT):
                    dx = -1.0
                if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_RIGHT):
                    dx = 1.0
                if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_UP):
                    dy = -1.0
                if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_DOWN):
                    dy = 1.0
                if cmdMap.isActive(CommandMapping.CMD_CM_INCREASE_ZOOM):
                    dz = 1.0
                if cmdMap.isActive(CommandMapping.CMD_CM_DECREASE_ZOOM):
                    dz = -1.0
                self.__cam.update(dx, dy, dz, True, True, False if dx == dy == dz == 0.0 else True)
                return True 

×
×
  • Create New...