Jump to content
Korean Random

kharlashkin

User
  • Posts

    829
  • Joined

  • Last visited

  • Days Won

    7

Posts posted by kharlashkin

  1. Отыграли сегодня 3 боя с сыном, все хорошо, кроме управления камерой (стрелками) - очень плохо и не удобно. Так как на стрелки в скрипте назначены стики - было бы хорошо придумать что-то типа коэфициентов, например возьмем дополнительные стрелки на цифровой клавиатуре и запилить следующий алгоритм стрелка обычная коэфициент 0,5, стрелка на цифровом блоке коэфициент 1 и нажатые одновременно стрелки и там и там, коэфициент 2,5. Я в AHK смогу так назначить на стики отправку нажатий кнопок.

     

    Подскажет кто - это реально?

  2. Попробовал поиграться параметрами... Сыпет кучу ошибок, бой не загружается...

    Может кто разъяснить что делает вот это:

        def makeVehicleMovementCommandByKeys(self, forceFlags = 204, forceMask = 0):
            cmdMap = CommandMapping.g_instance
            flags = 0
            if self.__stopUntilFire:
                return flags
            if cmdMap.isActiveList((CommandMapping.CMD_MOVE_FORWARD, CommandMapping.CMD_MOVE_FORWARD_SPEC)):
                flags = 1
            elif cmdMap.isActive(CommandMapping.CMD_MOVE_BACKWARD):
                flags = 2
            else:
                if self.__cruiseControlMode >= _CRUISE_CONTROL_MODE.FWD25:
                    flags = 1
                elif self.__cruiseControlMode <= _CRUISE_CONTROL_MODE.BCKW50:
                    flags = 2
                isOn = self.__cruiseControlMode == _CRUISE_CONTROL_MODE.FWD50 or self.__cruiseControlMode == _CRUISE_CONTROL_MODE.BCKW50
                if isOn:
                    flags |= 16
                elif self.__cruiseControlMode == _CRUISE_CONTROL_MODE.FWD25:
                    flags |= 32
            rotateLeftFlag = 4
            rotateRightFlag = 8
            if self.invRotationOnBackMovement and flags & 2 != 0:
                rotateLeftFlag, rotateRightFlag = rotateRightFlag, rotateLeftFlag
            if cmdMap.isActive(CommandMapping.CMD_ROTATE_LEFT):
                flags |= rotateLeftFlag
            if cmdMap.isActive(CommandMapping.CMD_ROTATE_RIGHT):
                flags |= rotateRightFlag
            flags |= forceMask & forceFlags
            flags &= ~forceMask | forceFlags
            return flags
    
  3. В каком то скрипте из родных, я видел функцию для круиз контроля с обозначениями. Надо бы поискать ее и изменить, вдруг получится.

    Так это то что надо! Значит надо искать, потому как я не попадал на неё в скриптах и именно поэтому и спрашивал на форуме - реально ли?
  4. Итак, есть чем похвастаться ;)

     

    Обновленный скрипт:

    'TestSplitScreen.ahk'

    #Persistent
    SetTimer, WatchAxisFirstJoyMoveForward, 10
    SetTimer, WatchAxisFirstJoyMoveRotate, 10
    SetTimer, WatchAxisFirstJoyCameraRotateVert, 10
    SetTimer, WatchAxisFirstJoyCameraRotateHoriz, 10
    SetTimer, WatchAxisFirstJoyShoot, 10
    SetTimer, WatchAxisSecondJoyMoveForward, 10
    SetTimer, WatchAxisSecondJoyMoveRotate, 10
    SetTimer, WatchAxisSecondJoyCameraRotateVert, 10
    SetTimer, WatchAxisSecondJoyCameraRotateHoriz, 10
    SetTimer, WatchAxisSecondJoyShoot, 10
    return
    
    ^1Joy1::
    WinWait, WoT Client
    WinSet, Style, -0xC00000
    return
    
    ^2Joy1::
    WinWait, [#] WoT Client [#]
    WinSet, Style, -0xC00000
    return
    
    ;;;;;;;;;;;;
    
    WatchAxisFirstJoyMoveForward:
    GetKeyState, 1JoyY, 1JoyY
    FirstJoyMoveForwardPrev = %FirstJoyMoveForward%
    
    if 1JoyY > 70
        FirstJoyMoveForward = s
    else if 1JoyY < 30
        FirstJoyMoveForward = w
    else
        FirstJoyMoveForward =
    
    if FirstJoyMoveForward = %FirstJoyMoveForwardPrev%
        return
    
    SetKeyDelay -1
    if FirstJoyMoveForward
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyMoveForward% down}, WoT Client
    }
    if FirstJoyMoveForwardPrev
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyMoveForwardPrev% up}, WoT Client
    }
    return
    
    ;;;;;;;;;;;;
    
    WatchAxisFirstJoyMoveRotate:
    GetKeyState, 1JoyX, 1JoyX
    FirstJoyMoveRotatePrev = %FirstJoyMoveRotate%
    
    if 1JoyX > 70
        FirstJoyMoveRotate = d
    else if 1JoyX < 30
        FirstJoyMoveRotate = a
    else
        FirstJoyMoveRotate =
    
    if FirstJoyMoveRotate = %FirstJoyMoveRotatePrev%
        return
    
    SetKeyDelay -1
    if FirstJoyMoveRotate
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyMoveRotate% down}, WoT Client
    }
    if FirstJoyMoveRotatePrev
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyMoveRotatePrev% up}, WoT Client
    }
    return
    
    ;;;;;;;;;;;;
    
    WatchAxisFirstJoyCameraRotateVert:
    GetKeyState, 1JoyU, 1JoyU
    FirstJoyCameraRotateVertPrev = %FirstJoyCameraRotateVert%
    
    if 1JoyU > 70
        FirstJoyCameraRotateVert = Down
    else if 1JoyU < 30
        FirstJoyCameraRotateVert = Up
    else
        FirstJoyCameraRotateVert =
    
    if FirstJoyCameraRotateVert = %FirstJoyCameraRotateVertPrev%
        return
    
    SetKeyDelay -1
    if FirstJoyCameraRotateVert
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyCameraRotateVert% down}, WoT Client
    }
    if FirstJoyCameraRotateVertPrev
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyCameraRotateVertPrev% up}, WoT Client
    }
    return
    
    ;;;;;;;;;;;;
    
    WatchAxisFirstJoyCameraRotateHoriz:
    GetKeyState, 1JoyR, 1JoyR
    FirstJoyCameraRotateHorizPrev = %FirstJoyCameraRotateHoriz%
    
    if 1JoyR > 70
        FirstJoyCameraRotateHoriz = Right
    else if 1JoyR < 30
        FirstJoyCameraRotateHoriz = Left
    else
        FirstJoyCameraRotateHoriz =
    
    if FirstJoyCameraRotateHoriz = %FirstJoyCameraRotateHorizPrev%
        return
    
    SetKeyDelay -1
    if FirstJoyCameraRotateHoriz
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyCameraRotateHoriz% down}, WoT Client
    }
    if FirstJoyCameraRotateHorizPrev
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyCameraRotateHorizPrev% up}, WoT Client
    }
    return
    
    ;;;;;;;;;;;;
    
    WatchAxisFirstJoyShoot:
    GetKeyState, 1JoyZ, 1JoyZ
    FirstJoyShootPrev = %FirstJoyShoot%
    
    if 1JoyZ < 30
        FirstJoyShoot = Space
    else
        FirstJoyShoot =
    
    if FirstJoyShoot = %FirstJoyShootPrev%
        return
    
    SetKeyDelay -1
    if FirstJoyShoot
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyShoot% down}, WoT Client
    }
    if FirstJoyShootPrev
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyShootPrev% up}, WoT Client
    }
    return
    
    ;;;;;;;;;;;;
    
    WatchAxisSecondJoyMoveForward:
    GetKeyState, 2JoyY, 2JoyY
    SecondJoyMoveForwardPrev = %SecondJoyMoveForward%
    
    if 2JoyY > 70
        SecondJoyMoveForward = s
    else if 2JoyY < 30
        SecondJoyMoveForward = w
    else
        SecondJoyMoveForward =
    
    if SecondJoyMoveForward = %SecondJoyMoveForwardPrev%
        return
    
    SetKeyDelay -1
    if SecondJoyMoveForward
    {
    ControlSend,, {%SecondJoyMoveForward% down}, [#] WoT Client [#]
    }
    if SecondJoyMoveForwardPrev
    {
    ControlSend,, {%SecondJoyMoveForwardPrev% up}, [#] WoT Client [#]
    }
    return
    
    ;;;;;;;;;;;;
    
    WatchAxisSecondJoyMoveRotate:
    GetKeyState, 2JoyX, 2JoyX
    SecondJoyMoveRotatePrev = %SecondJoyMoveRotate%
    
    if 2JoyX > 70
        SecondJoyMoveRotate = d
    else if 2JoyX < 30
        SecondJoyMoveRotate = a
    else
        SecondJoyMoveRotate =
    
    if SecondJoyMoveRotate = %SecondJoyMoveRotatePrev%
        return
    
    SetKeyDelay -1
    if SecondJoyMoveRotate
    {
    ControlSend,, {%SecondJoyMoveRotate% down}, [#] WoT Client [#]
    }
    if SecondJoyMoveRotatePrev
    {
    ControlSend,, {%SecondJoyMoveRotatePrev% up}, [#] WoT Client [#]
    }
    return
    
    ;;;;;;;;;;;;
    
    WatchAxisSecondJoyCameraRotateVert:
    GetKeyState, 2JoyU, 2JoyU
    SecondJoyCameraRotateVertPrev = %SecondJoyCameraRotateVert%
    
    if 2JoyU > 70
        SecondJoyCameraRotateVert = Down
    else if 2JoyU < 30
        SecondJoyCameraRotateVert = Up
    else
        SecondJoyCameraRotateVert =
    
    if SecondJoyCameraRotateVert = %SecondJoyCameraRotateVertPrev%
        return
    
    SetKeyDelay -1
    if SecondJoyCameraRotateVert
    {
    ControlSend,, {%SecondJoyCameraRotateVert% down}, [#] WoT Client [#]
    }
    if SecondJoyCameraRotateVertPrev
    {
    ControlSend,, {%SecondJoyCameraRotateVertPrev% up}, [#] WoT Client [#]
    }
    return
    
    ;;;;;;;;;;;;
    
    WatchAxisSecondJoyCameraRotateHoriz:
    GetKeyState, 2JoyR, 2JoyR
    SecondJoyCameraRotateHorizPrev = %SecondJoyCameraRotateHoriz%
    
    if 2JoyR > 70
        SecondJoyCameraRotateHoriz = Right
    else if 2JoyR < 30
        SecondJoyCameraRotateHoriz = Left
    else
        SecondJoyCameraRotateHoriz =
    
    if SecondJoyCameraRotateHoriz = %SecondJoyCameraRotateHorizPrev%
        return
    
    SetKeyDelay -1
    if SecondtJoyCameraRotateHoriz
    {
    ControlSend,, {%SecondJoyCameraRotateHoriz% down}, [#] WoT Client [#]
    }
    if SecondJoyCameraRotateHorizPrev
    {
    ControlSend,, {%SecondJoyCameraRotateHorizPrev% up}, [#] WoT Client [#]
    }
    return
    
    ;;;;;;;;;;;;
    
    WatchAxisSecondJoyShoot:
    GetKeyState, 2JoyZ, 2JoyZ
    SecondJoyShootPrev = %SecondJoyShoot%
    
    if 2JoyZ > 70
        SecondJoyShoot = Space
    else
        SecondJoyShoot =
    
    if SecondJoyShoot = %SecondJoyShootPrev%
        return
    
    SetKeyDelay -1
    if SecondJoyShoot
    {
    ControlSend,, {%SecondJoyShoot% down}, [#] WoT Client [#]
    }
    if SecondJoyShootPrev
    {
    ControlSend,, {%SecondJoyShootPrev% up}, [#] WoT Client [#]
    }
    return
    
    ;;;;;;;;;;;;
    
    1Joy10::
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {LShift Down}, WoT Client
    KeyWait, 1Joy10
    ControlSend,, {LShift Up}, WoT Client
    Return
    
    2Joy10::
    ControlSend,, {LShift Down}, [#] WoT Client [#]
    KeyWait, 2Joy10
    ControlSend,, {LShift Up}, [#] WoT Client [#]
    Return 

     

    Видео геймплея:

    • Upvote 2
  5. Можно получать макс. скорость танка из ТТХ, высчитывать необходимые % от скорости, эмулировать нажатия W с такой частотой, чтобы поддерживать нужную скорость. Не самый простой метод...

    По моему мнению, это не то чтобы "не простой", а "кривой" метод ;) Но спасибо за идею!

  6. Проблема оказалась в новой версии VDM, если устанавливаешь новую версию, то после перезагрузки ПК (и ноута тоже) сыпятся ошибки. Установил старую версию найденную на торрентах 2.7 - все работает и на ноуте и на ПК.

     

    В целях эксперимента запустил 2 клиента на ПК - при минимальных настройках в обоих окнах более от 50 до 70 фпс - что есть хорошо.

    • Upvote 1
  7. Отлично, что еще нужно реализовать? Я так понимаю половина уже есть? (В танки сам сейчас не играю, появилось желание выучить скриптовый язык и порешать различные задачи)

    Пришла беда откуда не ждали :(

     

    Сегодня днем тестировал режим "разделенного экрана" на ноуте. Разделил с помощью VDM экран на две части, запустил два клиента, разместил их как положено, запустил скрипт AHK, убрал рамки, и откатали один бой (я на геймпаде со скриптом выше, товарищ на клаве/мыше).

     

    Настройки в минимум - оба клиента держали около 8-13 фпс. Обрадовался, думал приду домой на более мощном железе получу играбельный SplitScreen. Но блин падает "песочница" на домашнем ПК - при чем выдает такие ошибки каких нет на оф страничке.

    SBIE2336 Error in GUI server:  [67 / 000000AA]
    SBIE2336 Error in GUI server:  [22 / 77000001]
    SBIE2335 Initialization failed for process Start.exe [88 / 0]
    SBIE2337 Failed to start program:  [55 / 1067]
    

    Пичалька...

     

    Снёс VDM, песочница завелась - теперь боюсь ставить обратно эту утилиту.

    • Upvote 1
  8. Теперь стоит задача в основном узнать от какого джойстика какому окну посылать. Сможет ли AutoHotKey все это сделать?

    Да, сможет. Окно танков в песочнице имеет системное имя [#] WoT Client [#], геймпады также имеют свой системный номер, для определения есть специальный скрипт.

     

    P.S. Мое 100-е сообщение было написано случайно с телефона. Вот он какой - научный прогресс ;)

  9. Вчера копался в скриптах AHK, получилось пока вот это:

    'gamepad.ahk'

    #Persistent
    SetTimer, WatchAxis, 10
    return
    
    WatchAxis:
    GetKeyState, JoyX, JoyX
    GetKeyState, JoyY, JoyY
    GetKeyState, JoyZ, JoyZ
    GetKeyState, JoyR, JoyR
    CameraRotatePrev = %CameraRotate%
    MovePrev = %Move%
    
    if JoyZ > 70
        CameraRotate = Right
    else if JoyZ < 30
        CameraRotate = Left
    else if JoyR > 70
        CameraRotate = Down
    else if JoyR < 30
        CameraRotate = Up
    else
        CameraRotate =
    
    if JoyY > 70
        Move = s
    else if JoyY < 30
        Move = w
    else if JoyX > 70
        Move = d
    else if JoyX < 30
        Move = a
    else
        Move =
    
    if Move = %MovePrev%
    
    if CameraRotate = %CameraRotatePrev%
        
        return
    
    SetKeyDelay -1
    if CameraRotate
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%CameraRotate% down}, WoT Client
    }
    if CameraRotatePrev
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%CameraRotatePrev% up}, WoT Client
    }
    if Move
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%Move% down}, WoT Client
    }
    if MovePrev
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%MovePrev% up}, WoT Client
    }
    return
    
    Joy12::
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {LShift Down}, WoT Client
    KeyWait, Joy12
    ControlSend,, {LShift Up}, WoT Client
    Return
    
    Joy8::
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {Space Down}, WoT Client
    KeyWait, Joy8
    ControlSend,, {Space Up}, WoT Client
    Return 

    Скрипт позволяет ездить левым стиком, крутить башней правым, есть так же снайперский режим и выстрел. Это все в неактивном окне игры:)

     

    Что нужно ещё добавить - нет смешивания клавиш (т.е. я не могу ехать вперед и поворачивать или крутить камеру вверх и вправо), стики надо разнести отдельно, так как при езде и повороте башни танк останавливается или поворот башни и езда перестает крутить онной.


    Доработал скрипт:

    'gamepad.ahk'

    #Persistent
    SetTimer, WatchAxisMoveForward, 10
    SetTimer, WatchAxisMoveRotate, 10
    SetTimer, WatchAxisCameraRotateVert, 10
    SetTimer, WatchAxisCameraRotateHoriz, 10
    return
    
    WatchAxisMoveForward:
    GetKeyState, JoyY, JoyY
    MoveForwardPrev = %MoveForward%
    
    if JoyY > 70
        MoveForward = s
    else if JoyY < 30
        MoveForward = w
    else
        MoveForward =
    
    if MoveForward = %MoveForwardPrev%
        return
    
    SetKeyDelay -1
    if MoveForward
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%MoveForward% down}, WoT Client
    }
    if MoveForwardPrev
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%MoveForwardPrev% up}, WoT Client
    }
    return
    
    WatchAxisMoveRotate:
    GetKeyState, JoyX, JoyX
    MoveRotatePrev = %MoveRotate%
    
    if JoyX > 70
        MoveRotate = d
    else if JoyX < 30
        MoveRotate = a
    else
        MoveRotate =
    
    if MoveRotate = %MoveRotatePrev%
        return
    
    SetKeyDelay -1
    if MoveRotate
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%MoveRotate% down}, WoT Client
    }
    if MoveRotatePrev
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%MoveRotatePrev% up}, WoT Client
    }
    return
    
    WatchAxisCameraRotateVert:
    GetKeyState, JoyR, JoyR
    CameraRotateVertPrev = %CameraRotateVert%
    
    if JoyR > 70
        CameraRotateVert = Down
    else if JoyR < 30
        CameraRotateVert = Up
    else
        CameraRotateVert =
    
    if CameraRotateVert = %CameraRotateVertPrev%
        return
    
    SetKeyDelay -1
    if CameraRotateVert
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%CameraRotateVert% down}, WoT Client
    }
    if CameraRotateVertPrev
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%CameraRotateVertPrev% up}, WoT Client
    }
    return
    
    WatchAxisCameraRotateHoriz:
    GetKeyState, JoyZ, JoyZ
    CameraRotateHorizPrev = %CameraRotateHoriz%
    
    if JoyZ > 70
        CameraRotateHoriz = Right
    else if JoyZ < 30
        CameraRotateHoriz = Left
    else
        CameraRotateHoriz =
    
    if CameraRotateHoriz = %CameraRotateHorizPrev%
        return
    
    SetKeyDelay -1
    if CameraRotateHoriz
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%CameraRotateHoriz% down}, WoT Client
    }
    if CameraRotateHorizPrev
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%CameraRotateHorizPrev% up}, WoT Client
    }
    return
    
    Joy12::
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {LShift Down}, WoT Client
    KeyWait, Joy12
    ControlSend,, {LShift Up}, WoT Client
    Return
    
    Joy8::
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {Space Down}, WoT Client
    KeyWait, Joy8
    ControlSend,, {Space Up}, WoT Client
    Return 

  10. Я особо не вчитывался в суть темы, но может пригодиться http://code.google.com/p/x360ce данная dll hook'ает интерфейс xinput(?world of tanks его воспринимает?), так вот, там есть ini файл в котором указывается pid устройсва(нашего джойстика), если запустить два клиента, но они буду запускаиться с разных дерикторий и со своими конф. файлам этой dll получим, что каждый джойстик подключиться к своему клиенту. Только я не проверял и не знаю, сможет ли принимать wot.

     

    Как вариант написать dll на C++ которая будет принимать при помощи DirectInput команды с джойстика и отдавать их игре через WinApi. Но я жаль нечем помочь немогу, не силен в этой области, джойстики есть, может как-нибудь да покапаюсь.

     

    Если в первом варианте я не уверен, то второй вполне возможен

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

     

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

     

    Почему я так зацепился за AotoHotKey - утилита может выступать эмулятором т.е. принимать нажатия кнопок/отклонения стиков и отправлять в игру непосредственно как нажатия клавиш клавиатуры/мыши (интересно с движениями мыши получиться ли).

     

    К сожалению времени катастрофически мало досконально все изучить и попробовать, но я не теряю надежду :) К тому же отправка нажатий в неактивный экран танчиков получилась именно в тот момент, когда я в третий раз решил "забить" на это дело.

  11. Вроде вчера ночью получилось у меня отправлять нажатия клавиш в неактивное окно WoT. Скрипт отправляет стрелки, WASD и пробел (переназначить на выстрел в игре) в неактивное окно. Для тестирования так же прилагаю скомпилированный скрипт.

    'test.ahk'

    #SingleInstance
    #InstallKeybdHook
    SetControlDelay -1
    vk49::
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {vk57 Down}, WoT Client
    KeyWait, vk49
    ControlSend,, {vk57 Up}, WoT Client
    Return
    vk4A::
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {vk41 Down}, WoT Client
    KeyWait, vk4A
    ControlSend,, {vk41 Up}, WoT Client
    Return
    vk4B::
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {vk53 Down}, WoT Client
    KeyWait, vk4B
    ControlSend,, {vk53 Up}, WoT Client
    Return
    vk4C::
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {vk44 Down}, WoT Client
    KeyWait, vk4C
    ControlSend,, {vk44 Up}, WoT Client
    Return
    numpadup::
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {up Down}, WoT Client
    KeyWait, numpadup
    ControlSend,, {up Up}, WoT Client
    Return
    numpaddown::
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {down Down}, WoT Client
    KeyWait, numpaddown
    ControlSend,, {down Up}, WoT Client
    Return
    numpadleft::
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {left Down}, WoT Client
    KeyWait, numpadleft
    ControlSend,, {left Up}, WoT Client
    Return
    numpadright::
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {right Down}, WoT Client
    KeyWait, numpadright
    ControlSend,, {right Up}, WoT Client
    Return
    NumpadEnter::
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {vk20 Down}, WoT Client
    KeyWait, NumpadEnter
    ControlSend,, {vk20 Up}, WoT Client
    Return 

    • Upvote 1
    • Downvote 1
  12. Как известно, управление в игре (а именно круиз-контроль), реализованы следующим образом - разделение максимального движения вперед/назад на части (равные или нет - другой вопрос).

     

    Реально ли корректировать эти значения, например "первая скорость" - 20%, вторая - 70%? Можно ли попробовать добавить пару промежуточных скоростей, например 1-я 25%, 2-я 50%, 3-я 75% и 4-я 100%?

  13. Мне кажется, что мою темку специально игнорируют из-за возможного использования данного функционала для "подставных боев"...

     

    Может кто подсказать какие скрипты отвечают за оконный режим игры?

    • Upvote 1
    • Downvote 1
  14. @kharlashkin, эх, читаю твою тему и хочется помочь, но не можется =(

     

    Не прекращай попыток, может и найдётся какой-нибудь питонщик с геймпадом =)

     

    Просто любители геймпадов среди танкистов это вообще большая редкость наверное =)

    Спасибо за поддержку словом, иногда этого так не хватает! Я уже два раза думал бросить всерьез это дело (разделенный экран), но каждый раз вроде нахожу что-то, что может помочь в это деле. На следующей неделе вернусь с свою квартиру (сейчас ремонт и живу на съемной), хочу снять видео Split Screen WoT с виртуальными машинками. Так сказать для популяризации идеи ;)

     

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

     

    Идея какова - просто скрипт на AHK, который одновременно является и эмулятором (вместо Xpadder) и отправщиком команд в игру, дело только в том чтобы сделать мод который бы корректно принимал данные только от AHK в неактивном окне.

     

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

    • Upvote 1
    • Downvote 1
  15. Нагуглил вот такой скрипт, но почему то он у меня на завелся, думаю может из-за битности ОС (стоит Win7 Prof 64). Скрипт вроде должен отправлять нажатия клавиш в неактивное окно.

    import ctypes, time, win32con, win32api, win32gui
    
    PBYTE256 = ctypes.c_ubyte * 256
    _user32 = ctypes.WinDLL("user32")
    GetKeyboardState = _user32.GetKeyboardState
    SetKeyboardState = _user32.SetKeyboardState
    PostMessage = win32api.PostMessage
    SendMessage = win32gui.SendMessage
    FindWindow = win32gui.FindWindow
    IsWindow = win32gui.IsWindow
    GetCurrentThreadId = win32api.GetCurrentThreadId
    GetWindowThreadProcessId = _user32.GetWindowThreadProcessId #очень важно брать функцию из dll, т.к. питоновский враппер (win32process.GetWindowThreadProcessId) выдаёт неправильные значения
    AttachThreadInput = _user32.AttachThreadInput
    
    MapVirtualKeyA = _user32.MapVirtualKeyA
    MapVirtualKeyW = _user32.MapVirtualKeyW
    
    MakeLong = win32api.MAKELONG
    w = win32con #так короче запись
    
    def PostKeyEx( hwnd, key, shift, specialkey):
        if IsWindow(hwnd):
            
            ThreadId = GetWindowThreadProcessId(hwnd, None)
            
            lparam = MakeLong(0, MapVirtualKeyA(key, 0))
            msg_down=w.WM_KEYDOWN
            msg_up=w.WM_KEYUP
            
            if specialkey:
                lparam = lparam | 0x1000000
                
            if len(shift) > 0: #Если есть модификаторы - используем PostMessage и AttachThreadInput
                pKeyBuffers = PBYTE256()
                pKeyBuffers_old = PBYTE256()
                
                SendMessage(hwnd, w.WM_ACTIVATE, w.WA_ACTIVE, 0)
                AttachThreadInput(GetCurrentThreadId(), ThreadId, True)
                GetKeyboardState( ctypes.byref(pKeyBuffers_old ))
                
                for modkey in shift:
                    if modkey == w.VK_MENU:
                        lparam = lparam | 0x20000000
                        msg_down=w.WM_SYSKEYDOWN
                        msg_up=w.WM_SYSKEYUP
                    pKeyBuffers[modkey] |= 128
        
                SetKeyboardState( ctypes.byref(pKeyBuffers) )
                time.sleep(0.01)
                PostMessage( hwnd, msg_down, key, lparam)
                time.sleep(0.01)
                PostMessage( hwnd, msg_up, key, lparam | 0xC0000000)
                time.sleep(0.01)
                SetKeyboardState( ctypes.byref(pKeyBuffers_old) )
                time.sleep(0.01)
                AttachThreadInput(GetCurrentThreadId(), ThreadId, False)
                
            else: #Если нету модификаторов - используем SendMessage
                SendMessage( hwnd, msg_down, key, lparam)
                SendMessage( hwnd, msg_up, key, lparam | 0xC0000000)
        
    hwnd=FindWindow("Notepad", None)
    PostKeyEx(hwnd,ord('A'),[w.VK_CONTROL],False)
    

    Может кто кто рассказать что к чему?


    Разобрался, нужно было установить Python for Windows extensions, но пока не могу понять что он делает...

    • Upvote 1
    • Downvote 1
  16. С помощью AutoHotkey написан простенький скрипт (просьба тапками не кидать), который пробует отправлять в клиент WASD:

    #SingleInstance
    #InstallKeybdHook
    SetControlDelay -1
    w:: 
    WinGet, wot, PID, WoT Client
    ControlSend,, {sc11 Down}, ahk_pid %wot%
    KeyWait, w
    ControlSend,, {sc11 Up}, ahk_pid %wot%
    Return
    a:: 
    WinGet, wot, PID, WoT Client
    ControlSend,, {sc1E Down}, ahk_pid %wot%
    KeyWait, a
    ControlSend,, {sc1E Up}, ahk_pid %wot%
    Return
    s:: 
    WinGet, wot, PID, WoT Client
    ControlSend,, {sc1F Down}, ahk_pid %wot%
    KeyWait, s
    ControlSend,, {sc1F Up}, ahk_pid %wot%
    Return
    d:: 
    WinGet, wot, PID, WoT Client
    ControlSend,, {sc20 Down}, ahk_pid %wot%
    KeyWait, d
    ControlSend,, {sc20 Up}, ahk_pid %wot%
    Return
    

    Результат работы скрипта:

    1. В активном окне все отрабатывается как надо;

    2. В неактивном ангаре жмакая по клавиатуре, нажатия принимаются все сразу, как только окно станет активным;

    3. Если первый запуск скрипта и игры, в ангаре выбирается танк, нажимается "В бой!", и переключится в другое окно во время экрана загрузки боя, то после загрузки боя, танк ездит, т.е. игра принимает отправленную эмуляцию нажатий клавиш от утилиты в неактивном окне.

    4. Переключаясь между окнами после первого боя, клиент танков перестает принимать эмуляцию от AutoHotkey.

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

    'test2.ahk'

    #InstallKeybdHook
    w:: 
    WinGet, wot, PID, WoT Client
    ControlSend,, {sc11 Down}, ahk_pid %wot%
    KeyWait, w
    ControlSend,, {sc11 Up}, ahk_pid %wot%
    Return
    a:: 
    WinGet, wot, PID, WoT Client
    ControlSend,, {sc1E Down}, ahk_pid %wot%
    KeyWait, a
    ControlSend,, {sc1E Up}, ahk_pid %wot%
    Return
    s:: 
    WinGet, wot, PID, WoT Client
    ControlSend,, {sc1F Down}, ahk_pid %wot%
    KeyWait, s
    ControlSend,, {sc1F Up}, ahk_pid %wot%
    Return
    d:: 
    WinGet, wot, PID, WoT Client
    ControlSend,, {sc20 Down}, ahk_pid %wot%
    KeyWait, d
    ControlSend,, {sc20 Up}, ahk_pid %wot%
    Return 

    • Upvote 1
    • Downvote 1
×
×
  • Create New...