kharlashkin Posted May 1, 2014 Author Share Posted May 1, 2014 (edited) Вроде прояснилась работа скрипта.Запускаю скрипт, запускаю игру, захожу ангар, выбираю танк, нажимаю "в бой!". При экране загрузки боя выхожу из окна, в бою скрипт работает в неактивном окне.Второй бой, перезапуск скрипта, любый другие действия - скрипт не работает. Даже не так, скрипт то работает - игра не принимает нажатия.Буду пробовать ещё, больше информации - лучше. 'test2.ahk' #InstallKeybdHook w:: WinGet, wot, PID, WoT Client ControlSend,, {sc11 Down}, ahk_pid %wot% KeyWait, w ControlSend,, {sc11 Up}, ahk_pid %wot% Return a:: WinGet, wot, PID, WoT Client ControlSend,, {sc1E Down}, ahk_pid %wot% KeyWait, a ControlSend,, {sc1E Up}, ahk_pid %wot% Return s:: WinGet, wot, PID, WoT Client ControlSend,, {sc1F Down}, ahk_pid %wot% KeyWait, s ControlSend,, {sc1F Up}, ahk_pid %wot% Return d:: WinGet, wot, PID, WoT Client ControlSend,, {sc20 Down}, ahk_pid %wot% KeyWait, d ControlSend,, {sc20 Up}, ahk_pid %wot% Return Edited May 1, 2014 by kharlashkin 1 1 @ Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted May 2, 2014 Author Share Posted May 2, 2014 Может кто прояснить, как принимает игра нажатия от клавиатуры? 1 1 @ Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted May 6, 2014 Author Share Posted May 6, 2014 (edited) Нагуглил вот такой скрипт, но почему то он у меня на завелся, думаю может из-за битности ОС (стоит Win7 Prof 64). Скрипт вроде должен отправлять нажатия клавиш в неактивное окно. import ctypes, time, win32con, win32api, win32gui PBYTE256 = ctypes.c_ubyte * 256 _user32 = ctypes.WinDLL("user32") GetKeyboardState = _user32.GetKeyboardState SetKeyboardState = _user32.SetKeyboardState PostMessage = win32api.PostMessage SendMessage = win32gui.SendMessage FindWindow = win32gui.FindWindow IsWindow = win32gui.IsWindow GetCurrentThreadId = win32api.GetCurrentThreadId GetWindowThreadProcessId = _user32.GetWindowThreadProcessId #очень важно брать функцию из dll, т.к. питоновский враппер (win32process.GetWindowThreadProcessId) выдаёт неправильные значения AttachThreadInput = _user32.AttachThreadInput MapVirtualKeyA = _user32.MapVirtualKeyA MapVirtualKeyW = _user32.MapVirtualKeyW MakeLong = win32api.MAKELONG w = win32con #так короче запись def PostKeyEx( hwnd, key, shift, specialkey): if IsWindow(hwnd): ThreadId = GetWindowThreadProcessId(hwnd, None) lparam = MakeLong(0, MapVirtualKeyA(key, 0)) msg_down=w.WM_KEYDOWN msg_up=w.WM_KEYUP if specialkey: lparam = lparam | 0x1000000 if len(shift) > 0: #Если есть модификаторы - используем PostMessage и AttachThreadInput pKeyBuffers = PBYTE256() pKeyBuffers_old = PBYTE256() SendMessage(hwnd, w.WM_ACTIVATE, w.WA_ACTIVE, 0) AttachThreadInput(GetCurrentThreadId(), ThreadId, True) GetKeyboardState( ctypes.byref(pKeyBuffers_old )) for modkey in shift: if modkey == w.VK_MENU: lparam = lparam | 0x20000000 msg_down=w.WM_SYSKEYDOWN msg_up=w.WM_SYSKEYUP pKeyBuffers[modkey] |= 128 SetKeyboardState( ctypes.byref(pKeyBuffers) ) time.sleep(0.01) PostMessage( hwnd, msg_down, key, lparam) time.sleep(0.01) PostMessage( hwnd, msg_up, key, lparam | 0xC0000000) time.sleep(0.01) SetKeyboardState( ctypes.byref(pKeyBuffers_old) ) time.sleep(0.01) AttachThreadInput(GetCurrentThreadId(), ThreadId, False) else: #Если нету модификаторов - используем SendMessage SendMessage( hwnd, msg_down, key, lparam) SendMessage( hwnd, msg_up, key, lparam | 0xC0000000) hwnd=FindWindow("Notepad", None) PostKeyEx(hwnd,ord('A'),[w.VK_CONTROL],False) Может кто кто рассказать что к чему? Разобрался, нужно было установить Python for Windows extensions, но пока не могу понять что он делает... Edited May 6, 2014 by kharlashkin 1 1 @ Link to comment Short link Share on other sites More sharing options...
Uti-Puti Posted May 6, 2014 Share Posted May 6, 2014 (edited) @kharlashkin, эх, читаю твою тему и хочется помочь, но не можется =( Не прекращай попыток, может и найдётся какой-нибудь питонщик с геймпадом =) Просто любители геймпадов среди танкистов это вообще большая редкость наверное =) Edited May 6, 2014 by Krab Age 2 @ Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted May 7, 2014 Author Share Posted May 7, 2014 @kharlashkin, эх, читаю твою тему и хочется помочь, но не можется =( Не прекращай попыток, может и найдётся какой-нибудь питонщик с геймпадом =) Просто любители геймпадов среди танкистов это вообще большая редкость наверное =) Спасибо за поддержку словом, иногда этого так не хватает! Я уже два раза думал бросить всерьез это дело (разделенный экран), но каждый раз вроде нахожу что-то, что может помочь в это деле. На следующей неделе вернусь с свою квартиру (сейчас ремонт и живу на съемной), хочу снять видео Split Screen WoT с виртуальными машинками. Так сказать для популяризации идеи ;) AutoHotkey меня приблизил как нельзя сильно к реализации. Во-первых понимает безо всяких проблем геймпады, во вторых умеет отправлять нажатия клавиш в неактивные окна (ну WoT под большим вопросам), но большой проблемой является то, что сама игра не корректно принимает эмуляцию нажатий клавиш от AHK. Идея какова - просто скрипт на AHK, который одновременно является и эмулятором (вместо Xpadder) и отправщиком команд в игру, дело только в том чтобы сделать мод который бы корректно принимал данные только от AHK в неактивном окне. На официальном форуме, в моей темке, хоть голосование и очень вялотекущее, но пока большинство голосовавших уже играют в "пыщь-пыщь" на геймпадах. 1 1 @ Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted May 13, 2014 Author Share Posted May 13, 2014 (edited) Мне кажется, что мою темку специально игнорируют из-за возможного использования данного функционала для "подставных боев"... Может кто подсказать какие скрипты отвечают за оконный режим игры? Edited May 13, 2014 by kharlashkin 1 1 @ Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted June 3, 2014 Author Share Posted June 3, 2014 Вроде вчера ночью получилось у меня отправлять нажатия клавиш в неактивное окно WoT. Скрипт отправляет стрелки, WASD и пробел (переназначить на выстрел в игре) в неактивное окно. Для тестирования так же прилагаю скомпилированный скрипт. 'test.ahk' #SingleInstance #InstallKeybdHook SetControlDelay -1 vk49:: SendMessage, 0x06, 1,,, WoT Client ControlSend,, {vk57 Down}, WoT Client KeyWait, vk49 ControlSend,, {vk57 Up}, WoT Client Return vk4A:: SendMessage, 0x06, 1,,, WoT Client ControlSend,, {vk41 Down}, WoT Client KeyWait, vk4A ControlSend,, {vk41 Up}, WoT Client Return vk4B:: SendMessage, 0x06, 1,,, WoT Client ControlSend,, {vk53 Down}, WoT Client KeyWait, vk4B ControlSend,, {vk53 Up}, WoT Client Return vk4C:: SendMessage, 0x06, 1,,, WoT Client ControlSend,, {vk44 Down}, WoT Client KeyWait, vk4C ControlSend,, {vk44 Up}, WoT Client Return numpadup:: SendMessage, 0x06, 1,,, WoT Client ControlSend,, {up Down}, WoT Client KeyWait, numpadup ControlSend,, {up Up}, WoT Client Return numpaddown:: SendMessage, 0x06, 1,,, WoT Client ControlSend,, {down Down}, WoT Client KeyWait, numpaddown ControlSend,, {down Up}, WoT Client Return numpadleft:: SendMessage, 0x06, 1,,, WoT Client ControlSend,, {left Down}, WoT Client KeyWait, numpadleft ControlSend,, {left Up}, WoT Client Return numpadright:: SendMessage, 0x06, 1,,, WoT Client ControlSend,, {right Down}, WoT Client KeyWait, numpadright ControlSend,, {right Up}, WoT Client Return NumpadEnter:: SendMessage, 0x06, 1,,, WoT Client ControlSend,, {vk20 Down}, WoT Client KeyWait, NumpadEnter ControlSend,, {vk20 Up}, WoT Client Return 1 1 @ Link to comment Short link Share on other sites More sharing options...
PinkElfant Posted June 3, 2014 Share Posted June 3, 2014 (edited) Я особо не вчитывался в суть темы, но может пригодиться http://code.google.com/p/x360ce данная dll hook'ает интерфейс xinput(?world of tanks его воспринимает?), так вот, там есть ini файл в котором указывается pid устройсва(нашего джойстика), если запустить два клиента, но они буду запускаиться с разных дерикторий и со своими конф. файлам этой dll получим, что каждый джойстик подключиться к своему клиенту. Только я не проверял и не знаю, сможет ли принимать wot. Как вариант написать dll на C++ которая будет принимать при помощи DirectInput команды с джойстика и отдавать их игре через WinApi. Но я жаль нечем помочь немогу, не силен в этой области, джойстики есть, может как-нибудь да покапаюсь. Если в первом варианте я не уверен, то второй вполне возможен Edited June 3, 2014 by cep62rus Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted June 3, 2014 Author Share Posted June 3, 2014 Я особо не вчитывался в суть темы, но может пригодиться http://code.google.com/p/x360ce данная dll hook'ает интерфейс xinput(?world of tanks его воспринимает?), так вот, там есть ini файл в котором указывается pid устройсва(нашего джойстика), если запустить два клиента, но они буду запускаиться с разных дерикторий и со своими конф. файлам этой dll получим, что каждый джойстик подключиться к своему клиенту. Только я не проверял и не знаю, сможет ли принимать wot. Как вариант написать dll на C++ которая будет принимать при помощи DirectInput команды с джойстика и отдавать их игре через WinApi. Но я жаль нечем помочь немогу, не силен в этой области, джойстики есть, может как-нибудь да покапаюсь. Если в первом варианте я не уверен, то второй вполне возможен Довольно давно видел этот эмулятор, насколько я понимаю, он предоставляет любой геймпад/джойстик как геймпад мелкомягких. Данная фича для игр понимающих геймпад. Танки же не видят геймпад никакой. Вернее даже не так, с помощью отдельного мода, отображающего нажатия кнопок в игре было вычислено что все таки некоторые нажатия кнопок игра воспринимает, об этом есть в этом сообщении. Почему я так зацепился за AotoHotKey - утилита может выступать эмулятором т.е. принимать нажатия кнопок/отклонения стиков и отправлять в игру непосредственно как нажатия клавиш клавиатуры/мыши (интересно с движениями мыши получиться ли). К сожалению времени катастрофически мало досконально все изучить и попробовать, но я не теряю надежду :) К тому же отправка нажатий в неактивный экран танчиков получилась именно в тот момент, когда я в третий раз решил "забить" на это дело. Link to comment Short link Share on other sites More sharing options...
PinkElfant Posted June 5, 2014 Share Posted June 5, 2014 (edited) Выше. Как вариант использовать AutoIt, там можно также принимать нажатия с джоя, и запрограмировать откланения двух осей управлевния(?стиков) в движение мыши. Upd.05.06.2014 16.14 Тот же AutoHotKey. Движение мышью(левый стик), скрол Up - Down, и клики кнопками лев., прав. - b, y соответственно ; Increase the following value to make the mouse cursor move faster: JoyMultiplier = 0.30 ; Decrease the following value to require less joystick displacement-from-center ; to start moving the mouse. However, you may need to calibrate your joystick ; -- ensuring it's properly centered -- to avoid cursor drift. A perfectly tight ; and centered joystick could use a value of 1: JoyThreshold = 3 ; Change the following to true to invert the Y-axis, which causes the mouse to ; move vertically in the direction opposite the stick: InvertYAxis := false ; Change these values to use joystick button numbers other than 1, 2, and 3 for ; the left, right, and middle mouse buttons. Available numbers are 1 through 32. ; Use the Joystick Test Script to find out your joystick's numbers more easily. ButtonLeft = 1 ButtonRight = 2 ButtonMiddle = 3 ; If your joystick has a POV control, you can use it as a mouse wheel. The ; following value is the number of milliseconds between turns of the wheel. ; Decrease it to have the wheel turn faster: WheelDelay = 250 ; If your system has more than one joystick, increase this value to use a joystick ; other than the first: JoystickNumber = 1 ; END OF CONFIG SECTION -- Don't change anything below this point unless you want ; to alter the basic nature of the script. #SingleInstance JoystickPrefix = %JoystickNumber%Joy Hotkey, %JoystickPrefix%%ButtonLeft%, ButtonLeft Hotkey, %JoystickPrefix%%ButtonRight%, ButtonRight Hotkey, %JoystickPrefix%%ButtonMiddle%, ButtonMiddle ; Calculate the axis displacements that are needed to start moving the cursor: JoyThresholdUpper := 50 + JoyThreshold JoyThresholdLower := 50 - JoyThreshold if InvertYAxis YAxisMultiplier = -1 else YAxisMultiplier = 1 SetTimer, WatchJoystick, 10 ; Monitor the movement of the joystick. GetKeyState, JoyInfo, %JoystickNumber%JoyInfo IfInString, JoyInfo, P ; Joystick has POV control, so use it as a mouse wheel. SetTimer, MouseWheel, %WheelDelay% return ; End of auto-execute section. ; The subroutines below do not use KeyWait because that would sometimes trap the ; WatchJoystick quasi-thread beneath the wait-for-button-up thread, which would ; effectively prevent mouse-dragging with the joystick. ButtonLeft: SetMouseDelay, -1 ; Makes movement smoother. MouseClick, left,,, 1, 0, D ; Hold down the left mouse button. SetTimer, WaitForLeftButtonUp, 10 return ButtonRight: SetMouseDelay, -1 ; Makes movement smoother. MouseClick, right,,, 1, 0, D ; Hold down the right mouse button. SetTimer, WaitForRightButtonUp, 10 return ButtonMiddle: SetMouseDelay, -1 ; Makes movement smoother. MouseClick, middle,,, 1, 0, D ; Hold down the right mouse button. SetTimer, WaitForMiddleButtonUp, 10 return WaitForLeftButtonUp: if GetKeyState(JoystickPrefix . ButtonLeft) return ; The button is still, down, so keep waiting. ; Otherwise, the button has been released. SetTimer, WaitForLeftButtonUp, off SetMouseDelay, -1 ; Makes movement smoother. MouseClick, left,,, 1, 0, U ; Release the mouse button. return WaitForRightButtonUp: if GetKeyState(JoystickPrefix . ButtonRight) return ; The button is still, down, so keep waiting. ; Otherwise, the button has been released. SetTimer, WaitForRightButtonUp, off MouseClick, right,,, 1, 0, U ; Release the mouse button. return WaitForMiddleButtonUp: if GetKeyState(JoystickPrefix . ButtonMiddle) return ; The button is still, down, so keep waiting. ; Otherwise, the button has been released. SetTimer, WaitForMiddleButtonUp, off MouseClick, middle,,, 1, 0, U ; Release the mouse button. return WatchJoystick: MouseNeedsToBeMoved := false ; Set default. SetFormat, float, 03 GetKeyState, joyx, %JoystickNumber%JoyX GetKeyState, joyy, %JoystickNumber%JoyY if joyx > %JoyThresholdUpper% { MouseNeedsToBeMoved := true DeltaX := joyx - JoyThresholdUpper } else if joyx < %JoyThresholdLower% { MouseNeedsToBeMoved := true DeltaX := joyx - JoyThresholdLower } else DeltaX = 0 if joyy > %JoyThresholdUpper% { MouseNeedsToBeMoved := true DeltaY := joyy - JoyThresholdUpper } else if joyy < %JoyThresholdLower% { MouseNeedsToBeMoved := true DeltaY := joyy - JoyThresholdLower } else DeltaY = 0 if MouseNeedsToBeMoved { SetMouseDelay, -1 ; Makes movement smoother. MouseMove, DeltaX * JoyMultiplier, DeltaY * JoyMultiplier * YAxisMultiplier, 0, R } return MouseWheel: GetKeyState, JoyPOV, %JoystickNumber%JoyPOV if JoyPOV = -1 ; No angle. return if (JoyPOV > 31500 or JoyPOV < 4500) ; Forward Send {WheelUp} else if JoyPOV between 13500 and 22500 ; Back Send {WheelDown} return Источник: http://autohotkey.com/docs/scripts/JoystickMouse.htm Edited June 5, 2014 by cep62rus Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted June 6, 2014 Author Share Posted June 6, 2014 (edited) Вчера копался в скриптах AHK, получилось пока вот это: 'gamepad.ahk' #Persistent SetTimer, WatchAxis, 10 return WatchAxis: GetKeyState, JoyX, JoyX GetKeyState, JoyY, JoyY GetKeyState, JoyZ, JoyZ GetKeyState, JoyR, JoyR CameraRotatePrev = %CameraRotate% MovePrev = %Move% if JoyZ > 70 CameraRotate = Right else if JoyZ < 30 CameraRotate = Left else if JoyR > 70 CameraRotate = Down else if JoyR < 30 CameraRotate = Up else CameraRotate = if JoyY > 70 Move = s else if JoyY < 30 Move = w else if JoyX > 70 Move = d else if JoyX < 30 Move = a else Move = if Move = %MovePrev% if CameraRotate = %CameraRotatePrev% return SetKeyDelay -1 if CameraRotate { SendMessage, 0x06, 1,,, WoT Client ControlSend,, {%CameraRotate% down}, WoT Client } if CameraRotatePrev { SendMessage, 0x06, 1,,, WoT Client ControlSend,, {%CameraRotatePrev% up}, WoT Client } if Move { SendMessage, 0x06, 1,,, WoT Client ControlSend,, {%Move% down}, WoT Client } if MovePrev { SendMessage, 0x06, 1,,, WoT Client ControlSend,, {%MovePrev% up}, WoT Client } return Joy12:: SendMessage, 0x06, 1,,, WoT Client ControlSend,, {LShift Down}, WoT Client KeyWait, Joy12 ControlSend,, {LShift Up}, WoT Client Return Joy8:: SendMessage, 0x06, 1,,, WoT Client ControlSend,, {Space Down}, WoT Client KeyWait, Joy8 ControlSend,, {Space Up}, WoT Client Return Скрипт позволяет ездить левым стиком, крутить башней правым, есть так же снайперский режим и выстрел. Это все в неактивном окне игры:) Что нужно ещё добавить - нет смешивания клавиш (т.е. я не могу ехать вперед и поворачивать или крутить камеру вверх и вправо), стики надо разнести отдельно, так как при езде и повороте башни танк останавливается или поворот башни и езда перестает крутить онной. Доработал скрипт: 'gamepad.ahk' #Persistent SetTimer, WatchAxisMoveForward, 10 SetTimer, WatchAxisMoveRotate, 10 SetTimer, WatchAxisCameraRotateVert, 10 SetTimer, WatchAxisCameraRotateHoriz, 10 return WatchAxisMoveForward: GetKeyState, JoyY, JoyY MoveForwardPrev = %MoveForward% if JoyY > 70 MoveForward = s else if JoyY < 30 MoveForward = w else MoveForward = if MoveForward = %MoveForwardPrev% return SetKeyDelay -1 if MoveForward { SendMessage, 0x06, 1,,, WoT Client ControlSend,, {%MoveForward% down}, WoT Client } if MoveForwardPrev { SendMessage, 0x06, 1,,, WoT Client ControlSend,, {%MoveForwardPrev% up}, WoT Client } return WatchAxisMoveRotate: GetKeyState, JoyX, JoyX MoveRotatePrev = %MoveRotate% if JoyX > 70 MoveRotate = d else if JoyX < 30 MoveRotate = a else MoveRotate = if MoveRotate = %MoveRotatePrev% return SetKeyDelay -1 if MoveRotate { SendMessage, 0x06, 1,,, WoT Client ControlSend,, {%MoveRotate% down}, WoT Client } if MoveRotatePrev { SendMessage, 0x06, 1,,, WoT Client ControlSend,, {%MoveRotatePrev% up}, WoT Client } return WatchAxisCameraRotateVert: GetKeyState, JoyR, JoyR CameraRotateVertPrev = %CameraRotateVert% if JoyR > 70 CameraRotateVert = Down else if JoyR < 30 CameraRotateVert = Up else CameraRotateVert = if CameraRotateVert = %CameraRotateVertPrev% return SetKeyDelay -1 if CameraRotateVert { SendMessage, 0x06, 1,,, WoT Client ControlSend,, {%CameraRotateVert% down}, WoT Client } if CameraRotateVertPrev { SendMessage, 0x06, 1,,, WoT Client ControlSend,, {%CameraRotateVertPrev% up}, WoT Client } return WatchAxisCameraRotateHoriz: GetKeyState, JoyZ, JoyZ CameraRotateHorizPrev = %CameraRotateHoriz% if JoyZ > 70 CameraRotateHoriz = Right else if JoyZ < 30 CameraRotateHoriz = Left else CameraRotateHoriz = if CameraRotateHoriz = %CameraRotateHorizPrev% return SetKeyDelay -1 if CameraRotateHoriz { SendMessage, 0x06, 1,,, WoT Client ControlSend,, {%CameraRotateHoriz% down}, WoT Client } if CameraRotateHorizPrev { SendMessage, 0x06, 1,,, WoT Client ControlSend,, {%CameraRotateHorizPrev% up}, WoT Client } return Joy12:: SendMessage, 0x06, 1,,, WoT Client ControlSend,, {LShift Down}, WoT Client KeyWait, Joy12 ControlSend,, {LShift Up}, WoT Client Return Joy8:: SendMessage, 0x06, 1,,, WoT Client ControlSend,, {Space Down}, WoT Client KeyWait, Joy8 ControlSend,, {Space Up}, WoT Client Return Edited June 6, 2014 by kharlashkin Link to comment Short link Share on other sites More sharing options...
PinkElfant Posted June 6, 2014 Share Posted June 6, 2014 (edited) Теперь стоит задача в основном узнать от какого джойстика какому окну посылать. Сможет ли AutoHotKey все это сделать? Edited June 6, 2014 by cep62rus Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted June 6, 2014 Author Share Posted June 6, 2014 (edited) Теперь стоит задача в основном узнать от какого джойстика какому окну посылать. Сможет ли AutoHotKey все это сделать? Да, сможет. Окно танков в песочнице имеет системное имя [#] WoT Client [#], геймпады также имеют свой системный номер, для определения есть специальный скрипт. P.S. Мое 100-е сообщение было написано случайно с телефона. Вот он какой - научный прогресс ;) Edited June 6, 2014 by kharlashkin Link to comment Short link Share on other sites More sharing options...
PinkElfant Posted June 6, 2014 Share Posted June 6, 2014 (edited) Да, сможет. Окно танков в песочнице имеет системное имя [#] WoT Client [#], геймпады также имеют свой системный номер, для определения есть специальный скрипт. Отлично, что еще нужно реализовать? Я так понимаю половина уже есть? (В танки сам сейчас не играю, появилось желание выучить скриптовый язык и порешать различные задачи) Edited June 6, 2014 by cep62rus Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted June 6, 2014 Author Share Posted June 6, 2014 (edited) Отлично, что еще нужно реализовать? Я так понимаю половина уже есть? (В танки сам сейчас не играю, появилось желание выучить скриптовый язык и порешать различные задачи) Пришла беда откуда не ждали :( Сегодня днем тестировал режим "разделенного экрана" на ноуте. Разделил с помощью VDM экран на две части, запустил два клиента, разместил их как положено, запустил скрипт AHK, убрал рамки, и откатали один бой (я на геймпаде со скриптом выше, товарищ на клаве/мыше). Настройки в минимум - оба клиента держали около 8-13 фпс. Обрадовался, думал приду домой на более мощном железе получу играбельный SplitScreen. Но блин падает "песочница" на домашнем ПК - при чем выдает такие ошибки каких нет на оф страничке. SBIE2336 Error in GUI server: [67 / 000000AA] SBIE2336 Error in GUI server: [22 / 77000001] SBIE2335 Initialization failed for process Start.exe [88 / 0] SBIE2337 Failed to start program: [55 / 1067] Пичалька... Снёс VDM, песочница завелась - теперь боюсь ставить обратно эту утилиту. Edited June 6, 2014 by kharlashkin 1 @ Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted June 7, 2014 Author Share Posted June 7, 2014 Проблема оказалась в новой версии VDM, если устанавливаешь новую версию, то после перезагрузки ПК (и ноута тоже) сыпятся ошибки. Установил старую версию найденную на торрентах 2.7 - все работает и на ноуте и на ПК. В целях эксперимента запустил 2 клиента на ПК - при минимальных настройках в обоих окнах более от 50 до 70 фпс - что есть хорошо. 1 @ Link to comment Short link Share on other sites More sharing options...
PinkElfant Posted June 7, 2014 Share Posted June 7, 2014 Отличная работа Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted June 7, 2014 Author Share Posted June 7, 2014 Отличная работа Спасибо за поддержку! Но ещё пилить и пилить скрипт, но начало положено ;) Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted June 7, 2014 Author Share Posted June 7, 2014 Итак, есть чем похвастаться ;) Обновленный скрипт: 'TestSplitScreen.ahk' #Persistent SetTimer, WatchAxisFirstJoyMoveForward, 10 SetTimer, WatchAxisFirstJoyMoveRotate, 10 SetTimer, WatchAxisFirstJoyCameraRotateVert, 10 SetTimer, WatchAxisFirstJoyCameraRotateHoriz, 10 SetTimer, WatchAxisFirstJoyShoot, 10 SetTimer, WatchAxisSecondJoyMoveForward, 10 SetTimer, WatchAxisSecondJoyMoveRotate, 10 SetTimer, WatchAxisSecondJoyCameraRotateVert, 10 SetTimer, WatchAxisSecondJoyCameraRotateHoriz, 10 SetTimer, WatchAxisSecondJoyShoot, 10 return ^1Joy1:: WinWait, WoT Client WinSet, Style, -0xC00000 return ^2Joy1:: WinWait, [#] WoT Client [#] WinSet, Style, -0xC00000 return ;;;;;;;;;;;; WatchAxisFirstJoyMoveForward: GetKeyState, 1JoyY, 1JoyY FirstJoyMoveForwardPrev = %FirstJoyMoveForward% if 1JoyY > 70 FirstJoyMoveForward = s else if 1JoyY < 30 FirstJoyMoveForward = w else FirstJoyMoveForward = if FirstJoyMoveForward = %FirstJoyMoveForwardPrev% return SetKeyDelay -1 if FirstJoyMoveForward { SendMessage, 0x06, 1,,, WoT Client ControlSend,, {%FirstJoyMoveForward% down}, WoT Client } if FirstJoyMoveForwardPrev { SendMessage, 0x06, 1,,, WoT Client ControlSend,, {%FirstJoyMoveForwardPrev% up}, WoT Client } return ;;;;;;;;;;;; WatchAxisFirstJoyMoveRotate: GetKeyState, 1JoyX, 1JoyX FirstJoyMoveRotatePrev = %FirstJoyMoveRotate% if 1JoyX > 70 FirstJoyMoveRotate = d else if 1JoyX < 30 FirstJoyMoveRotate = a else FirstJoyMoveRotate = if FirstJoyMoveRotate = %FirstJoyMoveRotatePrev% return SetKeyDelay -1 if FirstJoyMoveRotate { SendMessage, 0x06, 1,,, WoT Client ControlSend,, {%FirstJoyMoveRotate% down}, WoT Client } if FirstJoyMoveRotatePrev { SendMessage, 0x06, 1,,, WoT Client ControlSend,, {%FirstJoyMoveRotatePrev% up}, WoT Client } return ;;;;;;;;;;;; WatchAxisFirstJoyCameraRotateVert: GetKeyState, 1JoyU, 1JoyU FirstJoyCameraRotateVertPrev = %FirstJoyCameraRotateVert% if 1JoyU > 70 FirstJoyCameraRotateVert = Down else if 1JoyU < 30 FirstJoyCameraRotateVert = Up else FirstJoyCameraRotateVert = if FirstJoyCameraRotateVert = %FirstJoyCameraRotateVertPrev% return SetKeyDelay -1 if FirstJoyCameraRotateVert { SendMessage, 0x06, 1,,, WoT Client ControlSend,, {%FirstJoyCameraRotateVert% down}, WoT Client } if FirstJoyCameraRotateVertPrev { SendMessage, 0x06, 1,,, WoT Client ControlSend,, {%FirstJoyCameraRotateVertPrev% up}, WoT Client } return ;;;;;;;;;;;; WatchAxisFirstJoyCameraRotateHoriz: GetKeyState, 1JoyR, 1JoyR FirstJoyCameraRotateHorizPrev = %FirstJoyCameraRotateHoriz% if 1JoyR > 70 FirstJoyCameraRotateHoriz = Right else if 1JoyR < 30 FirstJoyCameraRotateHoriz = Left else FirstJoyCameraRotateHoriz = if FirstJoyCameraRotateHoriz = %FirstJoyCameraRotateHorizPrev% return SetKeyDelay -1 if FirstJoyCameraRotateHoriz { SendMessage, 0x06, 1,,, WoT Client ControlSend,, {%FirstJoyCameraRotateHoriz% down}, WoT Client } if FirstJoyCameraRotateHorizPrev { SendMessage, 0x06, 1,,, WoT Client ControlSend,, {%FirstJoyCameraRotateHorizPrev% up}, WoT Client } return ;;;;;;;;;;;; WatchAxisFirstJoyShoot: GetKeyState, 1JoyZ, 1JoyZ FirstJoyShootPrev = %FirstJoyShoot% if 1JoyZ < 30 FirstJoyShoot = Space else FirstJoyShoot = if FirstJoyShoot = %FirstJoyShootPrev% return SetKeyDelay -1 if FirstJoyShoot { SendMessage, 0x06, 1,,, WoT Client ControlSend,, {%FirstJoyShoot% down}, WoT Client } if FirstJoyShootPrev { SendMessage, 0x06, 1,,, WoT Client ControlSend,, {%FirstJoyShootPrev% up}, WoT Client } return ;;;;;;;;;;;; WatchAxisSecondJoyMoveForward: GetKeyState, 2JoyY, 2JoyY SecondJoyMoveForwardPrev = %SecondJoyMoveForward% if 2JoyY > 70 SecondJoyMoveForward = s else if 2JoyY < 30 SecondJoyMoveForward = w else SecondJoyMoveForward = if SecondJoyMoveForward = %SecondJoyMoveForwardPrev% return SetKeyDelay -1 if SecondJoyMoveForward { ControlSend,, {%SecondJoyMoveForward% down}, [#] WoT Client [#] } if SecondJoyMoveForwardPrev { ControlSend,, {%SecondJoyMoveForwardPrev% up}, [#] WoT Client [#] } return ;;;;;;;;;;;; WatchAxisSecondJoyMoveRotate: GetKeyState, 2JoyX, 2JoyX SecondJoyMoveRotatePrev = %SecondJoyMoveRotate% if 2JoyX > 70 SecondJoyMoveRotate = d else if 2JoyX < 30 SecondJoyMoveRotate = a else SecondJoyMoveRotate = if SecondJoyMoveRotate = %SecondJoyMoveRotatePrev% return SetKeyDelay -1 if SecondJoyMoveRotate { ControlSend,, {%SecondJoyMoveRotate% down}, [#] WoT Client [#] } if SecondJoyMoveRotatePrev { ControlSend,, {%SecondJoyMoveRotatePrev% up}, [#] WoT Client [#] } return ;;;;;;;;;;;; WatchAxisSecondJoyCameraRotateVert: GetKeyState, 2JoyU, 2JoyU SecondJoyCameraRotateVertPrev = %SecondJoyCameraRotateVert% if 2JoyU > 70 SecondJoyCameraRotateVert = Down else if 2JoyU < 30 SecondJoyCameraRotateVert = Up else SecondJoyCameraRotateVert = if SecondJoyCameraRotateVert = %SecondJoyCameraRotateVertPrev% return SetKeyDelay -1 if SecondJoyCameraRotateVert { ControlSend,, {%SecondJoyCameraRotateVert% down}, [#] WoT Client [#] } if SecondJoyCameraRotateVertPrev { ControlSend,, {%SecondJoyCameraRotateVertPrev% up}, [#] WoT Client [#] } return ;;;;;;;;;;;; WatchAxisSecondJoyCameraRotateHoriz: GetKeyState, 2JoyR, 2JoyR SecondJoyCameraRotateHorizPrev = %SecondJoyCameraRotateHoriz% if 2JoyR > 70 SecondJoyCameraRotateHoriz = Right else if 2JoyR < 30 SecondJoyCameraRotateHoriz = Left else SecondJoyCameraRotateHoriz = if SecondJoyCameraRotateHoriz = %SecondJoyCameraRotateHorizPrev% return SetKeyDelay -1 if SecondtJoyCameraRotateHoriz { ControlSend,, {%SecondJoyCameraRotateHoriz% down}, [#] WoT Client [#] } if SecondJoyCameraRotateHorizPrev { ControlSend,, {%SecondJoyCameraRotateHorizPrev% up}, [#] WoT Client [#] } return ;;;;;;;;;;;; WatchAxisSecondJoyShoot: GetKeyState, 2JoyZ, 2JoyZ SecondJoyShootPrev = %SecondJoyShoot% if 2JoyZ > 70 SecondJoyShoot = Space else SecondJoyShoot = if SecondJoyShoot = %SecondJoyShootPrev% return SetKeyDelay -1 if SecondJoyShoot { ControlSend,, {%SecondJoyShoot% down}, [#] WoT Client [#] } if SecondJoyShootPrev { ControlSend,, {%SecondJoyShootPrev% up}, [#] WoT Client [#] } return ;;;;;;;;;;;; 1Joy10:: SendMessage, 0x06, 1,,, WoT Client ControlSend,, {LShift Down}, WoT Client KeyWait, 1Joy10 ControlSend,, {LShift Up}, WoT Client Return 2Joy10:: ControlSend,, {LShift Down}, [#] WoT Client [#] KeyWait, 2Joy10 ControlSend,, {LShift Up}, [#] WoT Client [#] Return Видео геймплея: 2 @ Link to comment Short link Share on other sites More sharing options...
Azbuka Posted June 7, 2014 Share Posted June 7, 2014 Видео геймплея: "Это личное видео" Link to comment Short link Share on other sites More sharing options...
Recommended Posts