Jump to content
Korean Random

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


kharlashkin

Recommended Posts

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

'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 by kharlashkin
  • Upvote 1
  • Downvote 1
Link to comment
Short link
Share on other sites

Нагуглил вот такой скрипт, но почему то он у меня на завелся, думаю может из-за битности ОС (стоит 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 by kharlashkin
  • Upvote 1
  • Downvote 1
Link to comment
Short link
Share on other sites

@kharlashkin, эх, читаю твою тему и хочется помочь, но не можется =(

 

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

 

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

Edited by Krab Age
  • Upvote 2
Link to comment
Short link
Share on other sites

@kharlashkin, эх, читаю твою тему и хочется помочь, но не можется =(

 

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

 

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

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

 

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

 

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

 

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

  • Upvote 1
  • Downvote 1
Link to comment
Short link
Share on other sites

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

 

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

Edited by kharlashkin
  • Upvote 1
  • Downvote 1
Link to comment
Short link
Share on other sites

  • 3 weeks later...

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

'test.ahk'

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

  • Upvote 1
  • Downvote 1
Link to comment
Short link
Share on other sites

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

 

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

 

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

Edited by cep62rus
Link to comment
Short link
Share on other sites

Я особо не вчитывался в суть темы, но может пригодиться 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

Выше.

Как вариант использовать 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 by cep62rus
Link to comment
Short link
Share on other sites

Вчера копался в скриптах 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 by kharlashkin
Link to comment
Short link
Share on other sites

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

Edited by cep62rus
Link to comment
Short link
Share on other sites

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

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

 

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

Edited by kharlashkin
Link to comment
Short link
Share on other sites

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

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

Edited by cep62rus
Link to comment
Short link
Share on other sites

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

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

 

Сегодня днем тестировал режим "разделенного экрана" на ноуте. Разделил с помощью 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 by kharlashkin
  • Upvote 1
Link to comment
Short link
Share on other sites

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

 

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

  • Upvote 1
Link to comment
Short link
Share on other sites

Итак, есть чем похвастаться ;)

 

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

'TestSplitScreen.ahk'

#Persistent
SetTimer, WatchAxisFirstJoyMoveForward, 10
SetTimer, WatchAxisFirstJoyMoveRotate, 10
SetTimer, WatchAxisFirstJoyCameraRotateVert, 10
SetTimer, WatchAxisFirstJoyCameraRotateHoriz, 10
SetTimer, WatchAxisFirstJoyShoot, 10
SetTimer, WatchAxisSecondJoyMoveForward, 10
SetTimer, WatchAxisSecondJoyMoveRotate, 10
SetTimer, WatchAxisSecondJoyCameraRotateVert, 10
SetTimer, WatchAxisSecondJoyCameraRotateHoriz, 10
SetTimer, WatchAxisSecondJoyShoot, 10
return

^1Joy1::
WinWait, WoT Client
WinSet, Style, -0xC00000
return

^2Joy1::
WinWait, [#] WoT Client [#]
WinSet, Style, -0xC00000
return

;;;;;;;;;;;;

WatchAxisFirstJoyMoveForward:
GetKeyState, 1JoyY, 1JoyY
FirstJoyMoveForwardPrev = %FirstJoyMoveForward%

if 1JoyY > 70
    FirstJoyMoveForward = s
else if 1JoyY < 30
    FirstJoyMoveForward = w
else
    FirstJoyMoveForward =

if FirstJoyMoveForward = %FirstJoyMoveForwardPrev%
    return

SetKeyDelay -1
if FirstJoyMoveForward
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%FirstJoyMoveForward% down}, WoT Client
}
if FirstJoyMoveForwardPrev
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%FirstJoyMoveForwardPrev% up}, WoT Client
}
return

;;;;;;;;;;;;

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

if 1JoyX > 70
    FirstJoyMoveRotate = d
else if 1JoyX < 30
    FirstJoyMoveRotate = a
else
    FirstJoyMoveRotate =

if FirstJoyMoveRotate = %FirstJoyMoveRotatePrev%
    return

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

;;;;;;;;;;;;

WatchAxisFirstJoyCameraRotateVert:
GetKeyState, 1JoyU, 1JoyU
FirstJoyCameraRotateVertPrev = %FirstJoyCameraRotateVert%

if 1JoyU > 70
    FirstJoyCameraRotateVert = Down
else if 1JoyU < 30
    FirstJoyCameraRotateVert = Up
else
    FirstJoyCameraRotateVert =

if FirstJoyCameraRotateVert = %FirstJoyCameraRotateVertPrev%
    return

SetKeyDelay -1
if FirstJoyCameraRotateVert
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%FirstJoyCameraRotateVert% down}, WoT Client
}
if FirstJoyCameraRotateVertPrev
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%FirstJoyCameraRotateVertPrev% up}, WoT Client
}
return

;;;;;;;;;;;;

WatchAxisFirstJoyCameraRotateHoriz:
GetKeyState, 1JoyR, 1JoyR
FirstJoyCameraRotateHorizPrev = %FirstJoyCameraRotateHoriz%

if 1JoyR > 70
    FirstJoyCameraRotateHoriz = Right
else if 1JoyR < 30
    FirstJoyCameraRotateHoriz = Left
else
    FirstJoyCameraRotateHoriz =

if FirstJoyCameraRotateHoriz = %FirstJoyCameraRotateHorizPrev%
    return

SetKeyDelay -1
if FirstJoyCameraRotateHoriz
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%FirstJoyCameraRotateHoriz% down}, WoT Client
}
if FirstJoyCameraRotateHorizPrev
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%FirstJoyCameraRotateHorizPrev% up}, WoT Client
}
return

;;;;;;;;;;;;

WatchAxisFirstJoyShoot:
GetKeyState, 1JoyZ, 1JoyZ
FirstJoyShootPrev = %FirstJoyShoot%

if 1JoyZ < 30
    FirstJoyShoot = Space
else
    FirstJoyShoot =

if FirstJoyShoot = %FirstJoyShootPrev%
    return

SetKeyDelay -1
if FirstJoyShoot
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%FirstJoyShoot% down}, WoT Client
}
if FirstJoyShootPrev
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%FirstJoyShootPrev% up}, WoT Client
}
return

;;;;;;;;;;;;

WatchAxisSecondJoyMoveForward:
GetKeyState, 2JoyY, 2JoyY
SecondJoyMoveForwardPrev = %SecondJoyMoveForward%

if 2JoyY > 70
    SecondJoyMoveForward = s
else if 2JoyY < 30
    SecondJoyMoveForward = w
else
    SecondJoyMoveForward =

if SecondJoyMoveForward = %SecondJoyMoveForwardPrev%
    return

SetKeyDelay -1
if SecondJoyMoveForward
{
ControlSend,, {%SecondJoyMoveForward% down}, [#] WoT Client [#]
}
if SecondJoyMoveForwardPrev
{
ControlSend,, {%SecondJoyMoveForwardPrev% up}, [#] WoT Client [#]
}
return

;;;;;;;;;;;;

WatchAxisSecondJoyMoveRotate:
GetKeyState, 2JoyX, 2JoyX
SecondJoyMoveRotatePrev = %SecondJoyMoveRotate%

if 2JoyX > 70
    SecondJoyMoveRotate = d
else if 2JoyX < 30
    SecondJoyMoveRotate = a
else
    SecondJoyMoveRotate =

if SecondJoyMoveRotate = %SecondJoyMoveRotatePrev%
    return

SetKeyDelay -1
if SecondJoyMoveRotate
{
ControlSend,, {%SecondJoyMoveRotate% down}, [#] WoT Client [#]
}
if SecondJoyMoveRotatePrev
{
ControlSend,, {%SecondJoyMoveRotatePrev% up}, [#] WoT Client [#]
}
return

;;;;;;;;;;;;

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

if 2JoyU > 70
    SecondJoyCameraRotateVert = Down
else if 2JoyU < 30
    SecondJoyCameraRotateVert = Up
else
    SecondJoyCameraRotateVert =

if SecondJoyCameraRotateVert = %SecondJoyCameraRotateVertPrev%
    return

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

;;;;;;;;;;;;

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

if 2JoyR > 70
    SecondJoyCameraRotateHoriz = Right
else if 2JoyR < 30
    SecondJoyCameraRotateHoriz = Left
else
    SecondJoyCameraRotateHoriz =

if SecondJoyCameraRotateHoriz = %SecondJoyCameraRotateHorizPrev%
    return

SetKeyDelay -1
if SecondtJoyCameraRotateHoriz
{
ControlSend,, {%SecondJoyCameraRotateHoriz% down}, [#] WoT Client [#]
}
if SecondJoyCameraRotateHorizPrev
{
ControlSend,, {%SecondJoyCameraRotateHorizPrev% up}, [#] WoT Client [#]
}
return

;;;;;;;;;;;;

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

if 2JoyZ > 70
    SecondJoyShoot = Space
else
    SecondJoyShoot =

if SecondJoyShoot = %SecondJoyShootPrev%
    return

SetKeyDelay -1
if SecondJoyShoot
{
ControlSend,, {%SecondJoyShoot% down}, [#] WoT Client [#]
}
if SecondJoyShootPrev
{
ControlSend,, {%SecondJoyShootPrev% up}, [#] WoT Client [#]
}
return

;;;;;;;;;;;;

1Joy10::
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {LShift Down}, WoT Client
KeyWait, 1Joy10
ControlSend,, {LShift Up}, WoT Client
Return

2Joy10::
ControlSend,, {LShift Down}, [#] WoT Client [#]
KeyWait, 2Joy10
ControlSend,, {LShift Up}, [#] WoT Client [#]
Return 

 

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

  • Upvote 2
Link to comment
Short link
Share on other sites

Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...