Jump to content
Korean Random
kharlashkin

[Заказ] Разделенный экран или Split screen

Recommended Posts

Вроде доработал скрипт до более-менее играбельного состояния

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 

 

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

Edited by kharlashkin
  • Upvote 2

Share this post


Link to post

Short link
Share on other sites

Представляю на суд общественности скрипт 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

Share this post


Link to post

Short link
Share on other sites

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

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

Share this post


Link to post

Short link
Share on other sites

Решил проблемку, в дебрях Windows нашел где выбрать "по-умолчанию" геймпад, У меня на домашнем ПК было "None".

Share this post


Link to post

Short link
Share on other sites

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

'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 в "песочницу", второй клиент запускать из полной копии папки с игрой. Вибромоды прилагаю.

Edited by kharlashkin
  • Upvote 2

Share this post


Link to post

Short link
Share on other sites

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

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

 

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

Edited by kharlashkin

Share this post


Link to post

Short link
Share on other sites

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

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

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

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

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

Share this post


Link to post

Short link
Share on other sites

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

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.

 

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

Edited by kharlashkin

Share this post


Link to post

Short link
Share on other sites

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


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

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

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

 

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

Edited by kharlashkin
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Изменил скрипт AHK.

'wotss'

#Persistent
JoyMultiplier = 5
JoyThreshold = 5
JoyThresholdUpper := 50 + JoyThreshold
JoyThresholdLower := 50 - JoyThreshold
SetTimer, WatchAxisSecondJoyMoveForwardAndZoom, 10
SetTimer, WatchAxisSecondJoyMoveRotate, 10
SetTimer, WatchAxisSecondJoyCameraRotateVert, 10
SetTimer, WatchAxisSecondJoyCameraRotateHoriz, 10
SetTimer, WatchAxisSecondJoyShoot, 10
SetTimer, WatchSecondJoyPOV, 10
SetTimer, WatchAxisFirstJoyMoveForwardAndZoom, 10
SetTimer, WatchAxisFirstJoyMoveRotate, 10
SetTimer, WatchAxisFirstJoyCameraRotate, 10
SetTimer, WatchAxisFirstJoyShoot, 10
SetTimer, WatchFirstJoyPOV, 10
return

;;;;;;;;;;;;SplitScreen
w = 683
h = 768

LWIN & LButton::
SetTitleMatchMode, 2

WinGet Style, Style, WoT Client
if(Style & 0xC40000) 
{
    WinGetPos, X, Y, Width, Height, WoT Client
    WinSet, Style, -0xC40000, WoT Client
    WinMove, WoT Client,, 0, 0, w, h
} 
else 
{
    WinSet, Style, +0xC40000, WoT Client
    WinMove, WoT Client,, %X%, %Y%, %Width%, %Height%
}
return

LWIN & RButton::
SetTitleMatchMode, 2

WinGet Style, Style, [#] WoT Client [#]
if(Style & 0xC40000) 
{
    WinGetPos, X, Y, Width, Height, [#] WoT Client [#]
    WinSet, Style, -0xC40000, [#] WoT Client [#]
    WinMove,[#] WoT Client [#],, 684, 0, w, h
} 
else 
{
    WinSet, Style, +0xC40000, [#] WoT Client [#]
    WinMove, [#] WoT Client [#],, %X%, %Y%, %Width%, %Height%
}
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
{
IfWinNotActive, [#] WoT Client [#]
    {
    SendMessage, 0x06, 1,,, [#] WoT Client [#]
    ControlSend,, {%SecondJoyMoveForwardAndZoom% down}, [#] WoT Client [#]
    }
}
if SecondJoyMoveForwardAndZoomPrev
{
IfWinNotActive, [#] WoT Client [#]
    {
    SendMessage, 0x06, 1,,, [#] WoT Client [#]
    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
{
IfWinNotActive, [#] WoT Client [#]
    {
    SendMessage, 0x06, 1,,, [#] WoT Client [#]
    ControlSend,, {%SecondJoyMoveRotate% down}, [#] WoT Client [#]
    }
}
if SecondJoyMoveRotatePrev
{
IfWinNotActive, [#] WoT Client [#]
    {
    SendMessage, 0x06, 1,,, [#] WoT Client [#]
    ControlSend,, {%SecondJoyMoveRotatePrev% up}, [#] WoT Client [#]
    }
}
return

;;;;;;;;;;;;меню расходников в неактивном окне

SecondJoyConsumables:
GetKeyState, 2JoyX, 2JoyX
GetKeyState, 2JoyY, 2JoyY
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
{
IfWinNotActive, [#] WoT Client [#]
    {
    SendMessage, 0x06, 1,,, [#] WoT Client [#]
    ControlSend,, {%SecondJoyConsumables% down}, [#] WoT Client [#]
    } 
}
if SecondJoyConsumablesPrev
{
IfWinNotActive, [#] WoT Client [#]
    {
    SendMessage, 0x06, 1,,, [#] WoT Client [#]
    ControlSend,, {%SecondJoyConsumablesPrev% up}, [#] WoT Client [#]
    } 
}
return

;;;;;;;;;;;;обзор влево/вправо в неактивном окне

WatchAxisSecondJoyCameraRotateVert:
GetKeyState, 2JoyU, 2JoyU
GetKeyState, 2Joy5, 2Joy5
SecondJoyCameraRotateVertPrev = %SecondJoyCameraRotateVert%

if 2Joy5 = D
    GoSub, SecondJoyCommandMenu
else
{
if 2JoyU > 70
    SecondJoyCameraRotateVert = Right
else if 2JoyU < 30
    SecondJoyCameraRotateVert = Left
else
    SecondJoyCameraRotateVert =
}

if SecondJoyCameraRotateVert = %SecondJoyCameraRotateVertPrev%
    return

SetKeyDelay -1
if SecondJoyCameraRotateVert
{
IfWinNotActive, [#] WoT Client [#]
    {
    SendMessage, 0x06, 1,,, [#] WoT Client [#]
    ControlSend,, {%SecondJoyCameraRotateVert% down}, [#] WoT Client [#]
    }
}
if SecondJoyCameraRotateVertPrev
{
IfWinNotActive, [#] WoT Client [#]
    {
    SendMessage, 0x06, 1,,, [#] WoT Client [#]
    ControlSend,, {%SecondJoyCameraRotateVertPrev% up}, [#] WoT Client [#]
    }
}
return

;;;;;;;;;;;;обзор вверх/вниз в неактивном окне

WatchAxisSecondJoyCameraRotateHoriz:
GetKeyState, 2JoyR, 2JoyR
GetKeyState, 2Joy5, 2Joy5
SecondJoyCameraRotateHorizPrev = %SecondJoyCameraRotateHoriz%

if 2Joy5 = D
    GoSub, SecondJoyCommandMenu
else
{
if 2JoyR > 70
    SecondJoyCameraRotateHoriz = Down
else if 2JoyR < 30
    SecondJoyCameraRotateHoriz = Up
else
    SecondJoyCameraRotateHoriz =
}

if SecondJoyCameraRotateHoriz = %SecondJoyCameraRotateHorizPrev%
    return

SetKeyDelay -1
if SecondJoyCameraRotateHoriz
{
IfWinNotActive, [#] WoT Client [#]
    {
    SendMessage, 0x06, 1,,, [#] WoT Client [#]
    ControlSend,, {%SecondJoyCameraRotateHoriz% down}, [#] WoT Client [#]
    }
}
if SecondJoyCameraRotateHorizPrev
{
IfWinNotActive, [#] WoT Client [#]
    {
    SendMessage, 0x06, 1,,, [#] WoT Client [#]
    ControlSend,, {%SecondJoyCameraRotateHorizPrev% up}, [#] WoT Client [#]
    }
}
return

;;;;;;;;;;;;меню приказов в неактивном окне

SecondJoyCommandMenu:
GetKeyState, 2JoyU, 2JoyU
GetKeyState, 2JoyR, 2JoyR
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
{
IfWinNotActive, [#] WoT Client [#]
    {
    SendMessage, 0x06, 1,,, [#] WoT Client [#]
    ControlSend,, {%SecondJoyCommandMenu% down}, [#] WoT Client [#]
    } 
}
if SecondJoyCommandMenuPrev
{
IfWinNotActive, [#] WoT Client [#]
    {
    SendMessage, 0x06, 1,,, [#] WoT Client [#]
    ControlSend,, {%SecondJoyCommandMenuPrev% up}, [#] WoT Client [#]
    } 
}
return

;;;;;;;;;;;;выстрел в неактивном окне

WatchAxisSecondJoyShoot:
GetKeyState, 2JoyZ, 2JoyZ
SecondJoyShootPrev = %SecondJoyShoot%

if 2JoyZ < 30
    SecondJoyShoot = vk4C
else
    SecondJoyShoot =

if SecondJoyShoot = %SecondJoyShootPrev%
    return

SetKeyDelay -1
if SecondJoyShoot
{
IfWinNotActive, [#] WoT Client [#]
    {
    SendMessage, 0x06, 1,,, [#] WoT Client [#]
    ControlSend,, {%SecondJoyShoot% Down}, [#] WoT Client [#]
    }
}
if SecondJoyShootPrev
{
IfWinNotActive, [#] WoT Client [#]
    {
    SendMessage, 0x06, 1,,, [#] WoT Client [#]
    ControlSend,, {%SecondJoyShootPrev% Up}, [#] WoT Client [#]
    }
}
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
{
IfWinNotActive, [#] WoT Client [#]
    {
    SendMessage, 0x06, 1,,, [#] WoT Client [#]
    ControlSend,, {%SecondJoyPOV% down}, [#] WoT Client [#]
    }
}
if SecondJoyPOVPrev
{
IfWinNotActive, [#] WoT Client [#]
    {
    SendMessage, 0x06, 1,,, [#] WoT Client [#]
    ControlSend,, {%SecondJoyPOVprev% up}, [#] WoT Client [#]
    }
}
return

;;;;;;;;;;;;LShift в неактивном окне

2Joy10::
{
IfWinNotActive, [#] WoT Client [#]
    {
    SendMessage, 0x06, 1,,, [#] WoT Client [#]
    ControlSend,, {vkA0 Down}, [#] WoT Client [#]
    KeyWait, 2Joy10
    ControlSend,, {vkA0 Up}, [#] WoT Client [#]
    }
}
return

;;;;;;;;;;;;Space в неактивном окне

2Joy9::
{
IfWinNotActive, [#] WoT Client [#]
    {
    SendMessage, 0x06, 1,,, [#] WoT Client [#]
    ControlSend,, {vk20 Down}, [#] WoT Client [#]
    KeyWait, 2Joy9
    ControlSend,, {vk20 Up}, [#] WoT Client [#]
    }
}
return

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

2Joy1::
Gosub, SecondSubToggle
Return

SecondSubToggle:
SecondToggle++
If SecondToggle = 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 SecondToggle = 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 SecondToggle = 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 [#]    
    }
SecondToggle = 0
}
return

;;;;;;;;;;;;огнетушитель в неактивном окне

2Joy4::
{
IfWinNotActive, [#] WoT Client [#]
    {
    SendMessage, 0x06, 1,,, [#] WoT Client [#]
    ControlSend,, {vk35 Down}, [#] WoT Client [#]
    KeyWait, 2Joy4
    ControlSend,, {vk35 Up}, [#] WoT Client [#]
    }
}
return

;;;;;;;;;;;;автоприцел в неактивном окне

2Joy6::
{
IfWinNotActive, [#] WoT Client [#]
    {
    SendMessage, 0x06, 1,,, [#] WoT Client [#]
    ControlSend,, {vk50 Down}, [#] WoT Client [#]
    KeyWait, 2Joy6
    ControlSend,, {vk50 Up}, [#] WoT Client [#]
    }
}
return

;;;;;;;;;;;;меню в неактивном окне

2Joy8::
{
IfWinNotActive, [#] WoT Client [#]
    {
    SendMessage, 0x06, 1,,, [#] WoT Client [#]
    ControlSend,, {vk1B Down}, [#] WoT Client [#]
    KeyWait, 2Joy8
    ControlSend,, {vk1B Up}, [#] WoT Client [#]
    }
}
return

;;;;;;;;;;;;скрыть мини карту в неактивном окне

2Joy7::
{
IfWinNotActive, [#] WoT Client [#]
    {
    SendMessage, 0x06, 1,,, [#] WoT Client [#]
    ControlSend,, {vk4D Down}, [#] WoT Client [#]
    KeyWait, 2Joy7
    ControlSend,, {vk4D Up}, [#] WoT Client [#]
    }
}
return

;;;;;;;;;;;;меню приказов в неактивном окне

2Joy5::
{
IfWinNotActive, [#] WoT Client [#]
    {
    SendMessage, 0x06, 1,,, [#] WoT Client [#]
    ControlSend,, {vk5A Down}, [#] WoT Client [#]
    KeyWait, 2Joy5
    ControlSend,, {vk5A Up}, [#] WoT Client [#]
    }
}
return


;;;;;;;;;;;;ремонт в неактивном окне

2Joy3::
{
IfWinNotActive, [#] WoT Client [#]
    {
    SendMessage, 0x06, 1,,, [#] WoT Client [#]
    ControlSend,, {vk34 Down}, [#] WoT Client [#]
    KeyWait, 2Joy3
    ControlSend,, {vk34 Up}, [#] WoT Client [#]
    }   
}
return

;;;;;;;;;;;;лечение в неактивном окне

2Joy2::
{
IfWinNotActive, [#] WoT Client [#]
    {
    SendMessage, 0x06, 1,,, [#] WoT Client [#]
    ControlSend,, {vk36 Down}, [#] WoT Client [#]
    KeyWait, 2Joy2
    ControlSend,, {vk36 Up}, [#] WoT Client [#]
    }    
}
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
{
    ControlSend,, {%FirstJoyMoveForwardAndZoom% down}, WoT Client
}
if FirstJoyMoveForwardAndZoomPrev
{
    ControlSend,, {%FirstJoyMoveForwardAndZoomPrev% up}, WoT Client
}
return

;;;;;;;;;;;;движение влево/вправо в активном окне

WatchAxisFirstJoyMoveRotate:
GetKeyState, 1JoyX, 1JoyX
GetKeyState, 1Joy2, 1Joy2
GetKeyState, 1Joy3, 1Joy3
FirstJoyMoveRotatePrev = %FirstJoyMoveRotate%

if 1Joy2 = D
    GoSub, FirstJoyConsumables
else if 1Joy3 = D
    GoSub, FirstJoyConsumables
else
{
if 1JoyX > 80
    FirstJoyMoveRotate = vk44
else if 1JoyX < 20
    FirstJoyMoveRotate = vk41
else
    FirstJoyMoveRotate =
}

if FirstJoyMoveRotate = %FirstJoyMoveRotatePrev%
    return

SetKeyDelay -1
if FirstJoyMoveRotate
{
    ControlSend,, {%FirstJoyMoveRotate% down}, WoT Client
}
if FirstJoyMoveRotatePrev
{
    ControlSend,, {%FirstJoyMoveRotatePrev% up}, WoT Client
}
return

;;;;;;;;;;;;меню расходников

FirstJoyConsumables:
GetKeyState, 1JoyX, 1JoyX
GetKeyState, 1JoyY, 1JoyY
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 = %FirstJoyConsumablesPrev%
return

SetKeyDelay -1
if FirstJoyConsumables
{
    ControlSend,, {%FirstJoyConsumables% down}, WoT Client
}
if FirstJoyConsumablesPrev
{
    ControlSend,, {%FirstJoyConsumablesPrev% up}, WoT Client
}
return

;;;;;;;;;;;;обзор и мышь в активном окне

WatchAxisFirstJoyCameraRotate:
MouseNeedsToBeMoved := false
SetFormat, float, 03
GetKeyState, 1JoyU, 1JoyU
GetKeyState, 1JoyR, 1JoyR
GetKeyState, 1Joy5, 1Joy5

if 1Joy5 = D
    GoSub, FirstJoyCommandMenu
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

;;;;;;;;;;;;меню приказов

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
{
    ControlSend,, {%FirstJoyCommandMenu% down}, WoT Client
}
if FirstJoyCommandMenuPrev
{
    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
{
    Send, {%FirstJoyShoot% down} 
}
if FirstJoyShootPrev
{
    Send, {%FirstJoyShootPrev% up} 
}
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
{
    ControlSend,, {%FirstJoyPOV% down}, WoT Client
}
if FirstJoyPOVPrev
{
    ControlSend,, {%FirstJoyPOVprev% 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, FirstSubToggle
Return

FirstSubToggle:
FirstToggle++
If FirstToggle = 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 FirstToggle = 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 Clien
}
If FirstToggle = 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
    FirstToggle = 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 

 

На что следует обратить внимание:

1. Разрешение монитора и указание размера безрамочного окна.

2. Безрамочное окно создается когда оба клиента уже в ангаре, окна перемещены с помощью "Win+Left", "Win+Right, сочетанием "LWin+LButton", "LWin+RButton".

3. Основное окно клиента располагается слева на экране, "песочный клиент" справа.

4. Первый геймпад управляет основным клиентов, второй "песочным".


Появилась идея управлять интерфейсом в ангаре с помощью клавиш. Может подскажет кто, как попробовать реализовать?

Share this post


Link to post

Short link
Share on other sites

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

Share this post


Link to post

Short link
Share on other sites
Guest
This topic is now closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...