-
Posts
829 -
Joined
-
Last visited
-
Days Won
7
Posts posted by kharlashkin
-
-
Попробовал поиграться параметрами... Сыпет кучу ошибок, бой не загружается...
Может кто разъяснить что делает вот это:
def makeVehicleMovementCommandByKeys(self, forceFlags = 204, forceMask = 0): cmdMap = CommandMapping.g_instance flags = 0 if self.__stopUntilFire: return flags if cmdMap.isActiveList((CommandMapping.CMD_MOVE_FORWARD, CommandMapping.CMD_MOVE_FORWARD_SPEC)): flags = 1 elif cmdMap.isActive(CommandMapping.CMD_MOVE_BACKWARD): flags = 2 else: if self.__cruiseControlMode >= _CRUISE_CONTROL_MODE.FWD25: flags = 1 elif self.__cruiseControlMode <= _CRUISE_CONTROL_MODE.BCKW50: flags = 2 isOn = self.__cruiseControlMode == _CRUISE_CONTROL_MODE.FWD50 or self.__cruiseControlMode == _CRUISE_CONTROL_MODE.BCKW50 if isOn: flags |= 16 elif self.__cruiseControlMode == _CRUISE_CONTROL_MODE.FWD25: flags |= 32 rotateLeftFlag = 4 rotateRightFlag = 8 if self.invRotationOnBackMovement and flags & 2 != 0: rotateLeftFlag, rotateRightFlag = rotateRightFlag, rotateLeftFlag if cmdMap.isActive(CommandMapping.CMD_ROTATE_LEFT): flags |= rotateLeftFlag if cmdMap.isActive(CommandMapping.CMD_ROTATE_RIGHT): flags |= rotateRightFlag flags |= forceMask & forceFlags flags &= ~forceMask | forceFlags return flags
-
Поищи в avatar.py все вхождения подстроки "_CRUISE_CONTROL_MODE".
Вы знали это и молчали?
class _CRUISE_CONTROL_MODE(): NONE = 0 FWD25 = 1 FWD50 = 2 FWD100 = 3 BCKW50 = -1 BCKW100 = -2
-
Так это то что надо! Значит надо искать, потому как я не попадал на неё в скриптах и именно поэтому и спрашивал на форуме - реально ли?В каком то скрипте из родных, я видел функцию для круиз контроля с обозначениями. Надо бы поискать ее и изменить, вдруг получится.
-
"Это личное видео"
Прошу прощения, не изменил настройки после редактора...
-
Итак, есть чем похвастаться ;)
Обновленный скрипт:
'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
-
Можно получать макс. скорость танка из ТТХ, высчитывать необходимые % от скорости, эмулировать нажатия W с такой частотой, чтобы поддерживать нужную скорость. Не самый простой метод...
По моему мнению, это не то чтобы "не простой", а "кривой" метод ;) Но спасибо за идею!
-
Вопрос по прежнему актуален. Неужели ни у кого нет никаких идей? Можно конечно написать алгоритм на AutoHotKey... Надо поразмышлять над этим.
-
Отличная работа
Спасибо за поддержку! Но ещё пилить и пилить скрипт, но начало положено ;)
-
Проблема оказалась в новой версии VDM, если устанавливаешь новую версию, то после перезагрузки ПК (и ноута тоже) сыпятся ошибки. Установил старую версию найденную на торрентах 2.7 - все работает и на ноуте и на ПК.
В целях эксперимента запустил 2 клиента на ПК - при минимальных настройках в обоих окнах более от 50 до 70 фпс - что есть хорошо.
- 1
-
Отлично, что еще нужно реализовать? Я так понимаю половина уже есть? (В танки сам сейчас не играю, появилось желание выучить скриптовый язык и порешать различные задачи)
Пришла беда откуда не ждали :(
Сегодня днем тестировал режим "разделенного экрана" на ноуте. Разделил с помощью 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, песочница завелась - теперь боюсь ставить обратно эту утилиту.
- 1
-
Теперь стоит задача в основном узнать от какого джойстика какому окну посылать. Сможет ли AutoHotKey все это сделать?
Да, сможет. Окно танков в песочнице имеет системное имя [#] WoT Client [#], геймпады также имеют свой системный номер, для определения есть специальный скрипт.
P.S. Мое 100-е сообщение было написано случайно с телефона. Вот он какой - научный прогресс ;)
-
Вчера копался в скриптах 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
-
Я особо не вчитывался в суть темы, но может пригодиться http://code.google.com/p/x360ce данная dll hook'ает интерфейс xinput(?world of tanks его воспринимает?), так вот, там есть ini файл в котором указывается pid устройсва(нашего джойстика), если запустить два клиента, но они буду запускаиться с разных дерикторий и со своими конф. файлам этой dll получим, что каждый джойстик подключиться к своему клиенту. Только я не проверял и не знаю, сможет ли принимать wot.
Как вариант написать dll на C++ которая будет принимать при помощи DirectInput команды с джойстика и отдавать их игре через WinApi. Но я жаль нечем помочь немогу, не силен в этой области, джойстики есть, может как-нибудь да покапаюсь.
Если в первом варианте я не уверен, то второй вполне возможен
Довольно давно видел этот эмулятор, насколько я понимаю, он предоставляет любой геймпад/джойстик как геймпад мелкомягких. Данная фича для игр понимающих геймпад. Танки же не видят геймпад никакой.
Вернее даже не так, с помощью отдельного мода, отображающего нажатия кнопок в игре было вычислено что все таки некоторые нажатия кнопок игра воспринимает, об этом есть в этом сообщении.
Почему я так зацепился за AotoHotKey - утилита может выступать эмулятором т.е. принимать нажатия кнопок/отклонения стиков и отправлять в игру непосредственно как нажатия клавиш клавиатуры/мыши (интересно с движениями мыши получиться ли).
К сожалению времени катастрофически мало досконально все изучить и попробовать, но я не теряю надежду :) К тому же отправка нажатий в неактивный экран танчиков получилась именно в тот момент, когда я в третий раз решил "забить" на это дело.
-
Вроде вчера ночью получилось у меня отправлять нажатия клавиш в неактивное окно 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
-
Нигде в скриптах не нашел сходу... Может не там искал или же данные команды обрабатываются не python, а самим worldoftanks.exe. Пичалька :(
Нет ни у кого никаких мыслей?
-
Как известно, управление в игре (а именно круиз-контроль), реализованы следующим образом - разделение максимального движения вперед/назад на части (равные или нет - другой вопрос).
Реально ли корректировать эти значения, например "первая скорость" - 20%, вторая - 70%? Можно ли попробовать добавить пару промежуточных скоростей, например 1-я 25%, 2-я 50%, 3-я 75% и 4-я 100%?
-
Мне кажется, что мою темку специально игнорируют из-за возможного использования данного функционала для "подставных боев"...
Может кто подсказать какие скрипты отвечают за оконный режим игры?
- 1
- 1
-
@kharlashkin, эх, читаю твою тему и хочется помочь, но не можется =(
Не прекращай попыток, может и найдётся какой-нибудь питонщик с геймпадом =)
Просто любители геймпадов среди танкистов это вообще большая редкость наверное =)
Спасибо за поддержку словом, иногда этого так не хватает! Я уже два раза думал бросить всерьез это дело (разделенный экран), но каждый раз вроде нахожу что-то, что может помочь в это деле. На следующей неделе вернусь с свою квартиру (сейчас ремонт и живу на съемной), хочу снять видео Split Screen WoT с виртуальными машинками. Так сказать для популяризации идеи ;)
AutoHotkey меня приблизил как нельзя сильно к реализации. Во-первых понимает безо всяких проблем геймпады, во вторых умеет отправлять нажатия клавиш в неактивные окна (ну WoT под большим вопросам), но большой проблемой является то, что сама игра не корректно принимает эмуляцию нажатий клавиш от AHK.
Идея какова - просто скрипт на AHK, который одновременно является и эмулятором (вместо Xpadder) и отправщиком команд в игру, дело только в том чтобы сделать мод который бы корректно принимал данные только от AHK в неактивном окне.
На официальном форуме, в моей темке, хоть голосование и очень вялотекущее, но пока большинство голосовавших уже играют в "пыщь-пыщь" на геймпадах.
- 1
- 1
-
Нагуглил вот такой скрипт, но почему то он у меня на завелся, думаю может из-за битности ОС (стоит 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, но пока не могу понять что он делает...
- 1
- 1
-
Ну незнаю =)
У меня онлайн сейчас 110000к пользователей, вроде не хромает =)
110 000 k если я правильно понимаю - 110 миллионов пользователей? :-0
-
-
С помощью AutoHotkey написан простенький скрипт (просьба тапками не кидать), который пробует отправлять в клиент WASD:
#SingleInstance #InstallKeybdHook SetControlDelay -1 w:: WinGet, wot, PID, WoT Client ControlSend,, {sc11 Down}, ahk_pid %wot% KeyWait, w ControlSend,, {sc11 Up}, ahk_pid %wot% Return a:: WinGet, wot, PID, WoT Client ControlSend,, {sc1E Down}, ahk_pid %wot% KeyWait, a ControlSend,, {sc1E Up}, ahk_pid %wot% Return s:: WinGet, wot, PID, WoT Client ControlSend,, {sc1F Down}, ahk_pid %wot% KeyWait, s ControlSend,, {sc1F Up}, ahk_pid %wot% Return d:: WinGet, wot, PID, WoT Client ControlSend,, {sc20 Down}, ahk_pid %wot% KeyWait, d ControlSend,, {sc20 Up}, ahk_pid %wot% Return
Результат работы скрипта:
1. В активном окне все отрабатывается как надо;
2. В неактивном ангаре жмакая по клавиатуре, нажатия принимаются все сразу, как только окно станет активным;
3. Если первый запуск скрипта и игры, в ангаре выбирается танк, нажимается "В бой!", и переключится в другое окно во время экрана загрузки боя, то после загрузки боя, танк ездит, т.е. игра принимает отправленную эмуляцию нажатий клавиш от утилиты в неактивном окне.
4. Переключаясь между окнами после первого боя, клиент танков перестает принимать эмуляцию от AutoHotkey.
-
Может кто прояснить, как принимает игра нажатия от клавиатуры?
- 1
- 1
-
Вроде прояснилась работа скрипта.
Запускаю скрипт, запускаю игру, захожу ангар, выбираю танк, нажимаю "в бой!". При экране загрузки боя выхожу из окна, в бою скрипт работает в неактивном окне.
Второй бой, перезапуск скрипта, любый другие действия - скрипт не работает. Даже не так, скрипт то работает - игра не принимает нажатия.
Буду пробовать ещё, больше информации - лучше.'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
- 1
- 1
[Заказ] Разделенный экран или Split screen
in Paid Work
Posted
Отыграли сегодня 3 боя с сыном, все хорошо, кроме управления камерой (стрелками) - очень плохо и не удобно. Так как на стрелки в скрипте назначены стики - было бы хорошо придумать что-то типа коэфициентов, например возьмем дополнительные стрелки на цифровой клавиатуре и запилить следующий алгоритм стрелка обычная коэфициент 0,5, стрелка на цифровом блоке коэфициент 1 и нажатые одновременно стрелки и там и там, коэфициент 2,5. Я в AHK смогу так назначить на стики отправку нажатий кнопок.
Подскажет кто - это реально?