kharlashkin Posted June 20, 2014 Author Share Posted June 20, 2014 (edited) Вроде доработал скрипт до более-менее играбельного состояния Приближение/отдаление работает в связке с левым стиком: курок + стик вверх - приближение, курок + стик вниз - отдаление. Выбор типа снарядов переключением - один раз нажал - 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 June 20, 2014 by kharlashkin 2 @ Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted June 24, 2014 Author Share Posted June 24, 2014 Представляю на суд общественности скрипт 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 Скрипт позволяет полноценно играть с геймпада в "танчиках". Ниже рисунок как назначены куда кнопки: Меню приказов - сочетание левого бампера и правого стика, лечение и ремонт кнопки "Х" и "В" в сочетании с левым стиком. Ниже рисунок для понятия работы: В принципе в скрипте можно переназначить отклонения стиков на кнопки как будет душе угодно, особенно это касается меню приказов. К тому же особенно проситься добавление мода "Редактируемое радиальное меню" - для расширения функционала.Расположение расходников в игре у меня назначено как 4-й слот - малый ремкомплект, 5-й - огнетушитель, 6-й малая аптечка. Осталось теперь собрать "до кучи" скрипты для первого и второго геймпада. Протестировать, отписать в первом сообщении полную инструкцию по настройке/эксплуатации и можно темку закрывать ;) 1 @ Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted June 25, 2014 Author Share Posted June 25, 2014 Вчера хотел тестировать скрипт на домашнем ПК и словил проблемку... Мелкософтовские геймпады как то неправильно распознаются в домашней системе, тот который на первом канале определяется AHK как #2, тот который на втором #1 (т.е. под неправильными номерами), при чем если принудительно в скрипте указывать 2Joy, утилита начинает есть много процессорного времени - 15%. Может кто сталкивался? Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted June 26, 2014 Author Share Posted June 26, 2014 Решил проблемку, в дебрях Windows нашел где выбрать "по-умолчанию" геймпад, У меня на домашнем ПК было "None". Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted June 26, 2014 Author Share Posted June 26, 2014 (edited) Итак, допилил до играбельного состояния режим "Разделенного экрана" для танчиков. '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 June 27, 2014 by kharlashkin 2 @ Link to comment Short link Share on other sites More sharing options...
Mr A Posted June 27, 2014 Share Posted June 27, 2014 @kharlashkin, осталось оформить все одним постом:) 2 @ Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted June 27, 2014 Author Share Posted June 27, 2014 (edited) @kharlashkin, осталось оформить все одним постом:) Да уже занимаюсь, но хочется красиво все описать из-за этого сообщения. К тому же данный функционал можно попробовать и к другим играм применять. Я как бы выкладывал тут свои мысли и черновые скрипты для надежды что какой-то сумашедший фанатик, типа меня, тоже попробует так поиграть. Соответственно может есть ошибки где, может не корректно работает что или появятся мысли как улучшить. Edited June 27, 2014 by kharlashkin Link to comment Short link Share on other sites More sharing options...
13 Posted June 27, 2014 Share Posted June 27, 2014 @kharlashkin, я был вынужден удалить ваш файл с вложением, поскольку он содержал программы для нелицензионной активации коммерческих продуктов. Более того, некоторые из них содержали троянские программы. Пожалуйста, обратите внимание: на форуме недопустима публикация пиратского ПО, также прошу с особым вниманием отнестись к безопасности публикуемых файлов. Вы можете поделиться результатами вашего труда не нарушая прав собственников используемого ПО. Спасибо. 1 @ Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted June 27, 2014 Author Share Posted June 27, 2014 @kharlashkin, я был вынужден удалить ваш файл с вложением, поскольку он содержал программы для нелицензионной активации коммерческих продуктов. Более того, некоторые из них содержали троянские программы. Пожалуйста, обратите внимание: на форуме недопустима публикация пиратского ПО, также прошу с особым вниманием отнестись к безопасности публикуемых файлов. Вы можете поделиться результатами вашего труда не нарушая прав собственников используемого ПО. Спасибо. Прошу огромнейше прощения, не подумал, каюсь... В принципе sandboxie для данного режима бесплатен, VDM только за денюжу... Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted July 1, 2014 Author Share Posted July 1, 2014 (edited) Доработал скрипт, получилось сделать безрамочные окна клиентов. ;;;;;;;;;;;;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 July 1, 2014 by kharlashkin Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted July 1, 2014 Author Share Posted July 1, 2014 (edited) Закрываю тему с какой-то печалью... Много времени ушло на этот разделенный экран, теперь какая-то пустота внутри - надо искать новые идеи чтобы ещё "запилить" ;) Мало бета-тестеров моей реализации splitscreen. Поиграл сам с собой на геймпадах в тренировочном бою и выявил две проблемы: 1. Нельзя в неактивное окно отправлять щелчки левой и правой кнопки мыши, иногда за счет отправки нажатия кнопки мыши окно становится активным. Вывод - нужно или переназначить кнопку выстрела/автоприцела в игре на другие клавиши, или добавить принудительную отправку сообщения о том что окно не активно. Первый вариант, наверное, предпочтительней. 2. Нужно в игровых скриптах python поменять файлик "X:\Games\World_of_Tanks\res\scripts\client\gui\graphicsresolutions.pyc" на модифицированный, так как в родном игровом стоят минимальные разрешения 1024х768. В этом и этом сообщении я об этом писал. Буду немного менять скрипт AHK. Так что темку закрою чуть позже ;) Edited July 1, 2014 by kharlashkin 1 @ Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted July 11, 2014 Author Share Posted July 11, 2014 Изменил скрипт 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. Первый геймпад управляет основным клиентов, второй "песочным". Появилась идея управлять интерфейсом в ангаре с помощью клавиш. Может подскажет кто, как попробовать реализовать? Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted July 14, 2014 Author Share Posted July 14, 2014 Закрывают тему, в принципе все вопросы решены, кому что будет непонятно или интересно - прошу в личку стучаться. Link to comment Short link Share on other sites More sharing options...
Recommended Posts