Тема: Скрипт для разных игр
По сути это готовый скрипт для игр в которые я играл, может быть его фрагменты помогут кому либо, для чего либо
;==========Общие пути===========
fnPathUses()
{
global ;--Общесистемные пути
ProgSysPath32 := "C:\Program Files (x86)\"
ProgSysPath64 := "C:\Program Files\"
WindowsDir := "C:\Windows\"
;--Пути к AHK
PathAhkProg := ProgSysPath32 "AutoHotkey\"
PathAhk := "C:\AHK\"
PathAhkInclude := PathAhk "Include\"
PathAhkIcon := PathAhk "Icon\"
;--Escape-последовательности как константы для MsgBox, %
cEscCR := "`r"
cEscLF := "`n"
cEscTab := "`t"
cEscSps := " "
cEscPrc := "`%"
cEscQts := """"
cAscCR := Asc(cEscCR)
cAscLF := Asc(cEscLF)
cAscTab := Asc(cEscTab)
cAscSps := Asc(cEscSps)
cAscPrc := Asc(cEscPrc)
cAscQts := Asc(cEscQts)
cEsc2LF := cEscLF cEscLF
cEscCRLF := cEscCR cEscLF
return
}
fnOverallSection(){
global ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;===========Переменные,константы и некотрые функции для скрипта===================
;cName - константа
;iName - константа индекс в массиве
;vNane - переменная
;fnName - функция
;fName - флаг
;arName - массив
;+++++++++++++++++Константы функций вывода окна MsgBox+++++++++++++++++++++++++++++++++++++++++
сMsgOptionsEr :=0+8192+16 ;only an OK button + Task Modal + Icon Hand (stop/error)
сMsgOptionsOK :=0+8192+48 ;only an OK button + Task Modal + Icon Exclamation
сMsgOptionsDg :=4+8192+32 ;Yes/No button + Task Modal + Icon Question
сMsgOptionsInfo :=4+8192+64 ;Yes/No button + Task Modal + Icon Asterisk (info)
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+++++++++++++++++Пути к McAfee и некоторые переменные+++++++++++++++++++++++
mcPath := ProgSysPath32 "McAfee\"
mcVSE := mcPath "VirusScan Enterprise\"
mcCFW := mcPath "Common Framework\"
mcWinNameConsol := "Консоль VirusScan"
mcConsol := "mcconsol.exe"
mcKey1 := "/NOSPLAS"
;++++++++++++++++++++++++++++++++++++++++++
;+++++++++++++++++Переменные и константы для вызова консоли в контексте NetSh+++++++
cConsole := "cmd.exe"
cNameNet := "Internet"
cNetsh := "netsh interface ipv4 set address" cEscSps cEscQts cNameNet cEscQts cEscSps
cNetON := cNetsh "dhcp"
cNetOFF := cNetsh "static 1.0.0.0"
vNetOnOffHlp := "ON"
vInternetPID := false
arOut:=arInternet:=Object()
NetName :=1, NetDHCP :=2, NetIP :=3, NetGate :=4, NetState:=5, NetST:=1, FindKey :=2
Internet := [["","интерфейса" cNameNet], ["" ,"включен:"], ["" ,"IP-адрес"], ["" ,"шлюз:"], [false,false]]
;+++++++++++++++++
;++++++++++++++Для Skyrim
vDubKeys := 1
;++++
vGameKey := true ; On/Off игровых клавиш (при запуске ON)
fHelpKey := false ; для блокировки повторного запуска справки
fScVkCode := false ; Получение Sc/Vk-Code отключено.
fEventManager:=true ; блокиратор менеджера
;++++
;++++++++++++++Для Saints Row: The Third
fNumLock := false
vNumLock := false
fLockRShift := false
vDebugTHQ := false ;(true/false) ;If debugging is enabled, then output your data to control the correct operation (scope of - all script).
gosub lVarGameTHQ
;++++++++++++++
;++++++++++++++Для The Witcher 2 - Assassins of Kings Enhanced Edition
fWitcher:=false
;++++++++++++++
return
}
;***************BEGIN******************
GameKeyOnOff:
if (!vGameKey)
{
msgbox 1,Switching Game Keys,Игровые клавиши = OFF `n `nВКЛючить игровые клавиши? ,10
IfMsgBox, Cancel
return
else
vGameKey := true
}
else
{
msgbox 1,Switching Game Keys,Игровые клавиши = ON `n `nВЫКЛючить игровые клавиши?,10
IfMsgBox, Cancel
return
else
vGameKey := false
}
return
;------------------------- Подпрограмма счётчика нажатий
/*
;----- Пример для левой кнопки мыши ----
#UseHook, On
LButton:: Gosub, PressCount
LButton(1): ; Одиночный действует как и раньше (почти,
Click Down Left ; т.к. пауза иногда даёт о себе знать при
KeyWait, LButton ; перетаскивании правой кнопкой).
Click Up Left
Return
LButton(2):
ToolTip, Двойной правый щелчок.
Sleep, 1000
ToolTip
Return
#UseHook, Off
;-----------------------------------------
*/
PressCount:
Pause_= 300 ; Если пауза меньше этого количества миллисекунд, то нажатие
; двойное. Если больше, то оно расценивается как 2 одиночных.
If not Second
{
Second=1
SetTimer, DoublePress, -%Pause_%
}
Else
{
Second=0
SetTimer, %A_ThisHotkey%(2), -1
}
Return
DoublePress:
If not Second
Return
Second=0
SetTimer, %A_ThisHotkey%(1), -1
Return
/*
;-----BEGIN--Для The Witcher 2
#If vGameKey && WinActive("The Witcher 2")
SetTitleMatchMode, 2
Tab::
Send, {m Down}
sleep 25
Send, {m Down}
sleep 25
Send, {m Up}
return
#IfWinActive
;-----END--Для The Witcher 2
*/
;-----BEGIN--Для SIMS 3
#If vGameKey && WinActive("The Sims™ 3")
SetTitleMatchMode, 2
LShift & ESC::
Send {F5}
return
RShift & Enter::
Tab::
Send {n}
Enter::
MouseClick, right, 20, 910
MouseMove, 620, 475
Sleep, 700
MouseClick, WheelUp, , , 6
return
#IfWinActive
;-----END--Для SIMS 3
;-----BEGIN--Для Risen 2 - Dark Waters
#If vGameKey && WinActive("Risen")
SetTitleMatchMode, 2
Enter::
Send {8}
return
RShift::
Send {9}
return
RCtrl::
Send {0}
return
Numpad1::
Send {1}
return
Numpad2::
Send {2}
return
Numpad4::
Send {4}
return
Numpad5::
Send {5}
return
Numpad6::
Send {6}
return
Numpad7::
Send {7}
return
Numpad3::
Send {3}
return
#IfWinActive
;-----END--Для Risen 2 - Dark Waters
;-----BEGIN--Для Dragon Age
#If vGameKey && WinActive("Dragon Age: Начало")
SetTitleMatchMode, 2
RShift::
vk2D::
Numpad0::
Send, {Up Down}{Enter Down}
;{RButton Down}
KeyWait, % A_ThisHotkey
Send, {Up Up}{Enter Up}
;{RButton Up}
Return
#IfWinActive
;-----END Для Dragon Age
;-----BEGIN--Для Skyrim
#If vGameKey && WinExist("Skyrim")
SetTitleMatchMode, 2
#a:: ;Maximize Skyrim:
WinActivate
Sleep, 500
Send, {Escape}
return
#IfWinExist
#If vDubKeys && vGameKey && WinActive("Skyrim")
SetTitleMatchMode, 2
#UseHook, On
;----Дубликаты клавиш
vk2E::vk5D
return
PgDn::PgUp
return
Home::End
return
Ins::Del
return
BS::vk22 ;NumPad3
return
vkBF::vk49 ;i
return
#UseHook, Off
#IfWinActive
#If vGameKey && WinActive("Skyrim")
SetTitleMatchMode, 2
#z:: ;Minimize Skyrim
Send, {Escape}
Sleep, 500
WinMinimize, A
return
F1:: ; Основной батник
SetKeyDelay, 10, 10
Send {``}
Sleep 100
Send {Backspace}
Send bat 1
Sleep 100
Send {Enter}
Sleep 100
Send {``}
Sleep 1000
return
F2:: ; Сохранение в последний файл
F5::
vSave := fnMaxName()
vBat := "save " vSave "`r`n"
SetKeyDelay, 10, 10
Send {``}
Sleep 100
Send {Backspace}
Send %vBat%
Sleep 100
Send {Enter}
Sleep 100
Send {``}
Sleep 1000
return
^F2:: ; Сохранение в след. файл
vSave := fnMaxName() + 1
vBat := "save " vSave "`r`n"
SetKeyDelay, 10, 10
Send {``}
Sleep 100
Send {Backspace}
Send %vBat%
Sleep 100
Send {Enter}
Sleep 100
Send {``}
Sleep 1000
return
F3:: ; Загрузка из последнего файла
F6::
vSave := fnMaxName()
vBat := "load " vSave "`r`n"
SetKeyDelay, 10, 10
Send {``}
Sleep 100
Send {Backspace}
Send %vBat%
Sleep 100
Send {Enter}
Sleep 100
Send {``}
Sleep 1000
return
F4:: ; ON/OFF = пауза+свободная камера
vBat := "tfc 1"
SetKeyDelay, 10, 10
Send {``}
Sleep 100
Send {Backspace}
Send %vBat%
Sleep 100
Send {Enter}
Sleep 100
Send {``}
Sleep 1000
return
F10:: ; ON/OFF = клавиши дубликаты
if (vDubKeys = 0){
vDubKeys := 1
;SoundPlay ASOS_RES\ON.mp3, 1
SoundBeep, 750, 900
} else {
vDubKeys := 0
;SoundPlay ASOS_RES\OFF.mp3, 1
SoundBeep, 500, 300
SoundBeep, 500, 300
SoundBeep, 500, 300
}
return
F12:: ; Выход быстрый с записью
vSave := fnMaxName()
vBat := "save " vSave "`r`n"
SetKeyDelay, 10, 10
Send {``}
Sleep 100
Send {Backspace}
Send %vBat%
Sleep 100
Send {Enter}
Sleep 1000
vBat := "qqq"
Sleep 100
Send {Backspace}
Send %vBat%
Sleep 100
Send {Enter}
Send {``}
return
^F12:: ; Выход быстрый с без записи
vBat := "qqq"
SetKeyDelay, 10, 10
Send {``}
Sleep 100
Send {Backspace}
Send %vBat%
Sleep 100
Send {Enter}
Sleep 100
Send {``}
Sleep 1000
return
fnMaxName() {
vPathSave := "c:\Users\SASA\Documents\My Games\Skyrim\Saves\*.ess"
vNumberSave := 0
vNumberSaveTmp := vNumberSave
Loop, %vPathSave%, 0, 0
{
vNameSave := SubStr(A_LoopFileName, 1,StrLen(A_LoopFileName)-4) ;пишем только имя
vNumberSaveTmp := Abs(vNameSave)
if (vNumberSaveTmp>vNumberSave) {
vNumberSave := vNumberSaveTmp
}
}
return vNumberSave
}
#IfWinActive
;-----END--Для Skyrim
;-----BEGIN--Для Dungeon Siege II
;#IfWinActive ,Dungeon Siege II,
#If vGameKey && WinActive("Dungeon Siege II")
SetTitleMatchMode, 2
RShift::
LShift::
CapsLock::
Send, {RButton Down}
KeyWait, % A_ThisHotkey
Send, {RButton Up}
Return
RCtrl::
LCtrl::
Send, {LButton Down}
KeyWait, % A_ThisHotkey
Send, {LButton Up}
Return
F12::
vTxt := "opnauticus"
send {\}{vk08}
loop 100
{
Send, {vk6B}%vTxt%{ENTER}
sleep 50
}
sleep 50
Send, {ENTER}
return
#IfWinActive
;-----END Для Dungeon Siege II
;-----BEGIN--Для The Witcher 2 - Assassins of Kings
#If vGameKey && WinActive("The Witcher 2")
SetTitleMatchMode, 2
#UseHook, On
Tab:: ;карта
Send, {sc32 Down}
KeyWait, % A_ThisHotkey
Send, {sc32 Up}
return
F1::sc2e ;С - персонаж
return
F3::sc24 ;J - дневник (журнал заданий)
return
F4::sc17 ;I - рюкзак (инвентарь)
return
F8:: ; Сохранить
Send, {F5 Down}
KeyWait, % A_ThisHotkey
Send, {F5 Up}
return
F5:: ; Загрузить
Send, {F9 Down}
KeyWait, % A_ThisHotkey
Send, {F9 Up}
return
WheelUp:: ;Взять прицел
Send, {Home Down}
sleep 100
Send, {Home Up}
return
WheelDown::
return
#UseHook, Off
/*
; Массив подмены одной клавиши на три - одиночное/двойное нажатие и удержание.
; 1-й элемент. Клавиша реально нажимаемая (сочетания не работают).
; Если это cEndArr, то конец массива и стоп обработки.
; Если это cNone, то всё дальнейшее считается текстом и не обрабатывается функцией fnGetParamTrioKey, а так же должна заканчиваться cEndArr.
; Далее, при cEndArr, игнорируется дальнейшая запись и происходит переход к следующей записи (строке массива).
; 2-й элемент. 1-я виртуальная клавиша, посылается при одном нажатии реальной клавиши.
; 3-й элемент. 2-я виртуальная клавиша посылается при двух нажатиях реальной клавиши.
; 4-й элемент. 3-я виртуальная клавиша посылается при удержании реальной клавиши.
; 5-й элемент. Время определяющее одиночное/двойное нажатие, при больших значениях двойное нажатие может не произойти.
; 6-й элемент. Время ожидания в цикле определения удержания за каждый шаг, при больших значениях блокирует одиночное/двойное нажатие.
; 7-й элемент. Число шагов цикла для определения удержание клавиши/кнопки, при больших значениях блокирует одиночное/двойное нажатие.
; 8-й элемент. Время задержки между эмуляцией нажатия на клавиши/кнопки подмены реально нажатой клавишей/кнопкой.
; 9-й элемент. Автоповтор реально нажатой клавиши/кнопки - включён/выключен True/False.
;Этот массив разбирается один раз при иництализации скрипта и на его основе создаётся одномерный массив
; Индексы, хотя вроде все и не нужны, но описать нужно для функций обработки.
iTrioBaseKey:=1, iTrioAloneKey:=2, iTrioDoubleKey:=3, iTrioHoldingKey:=4, iTrioPause_PressKey:=5
,iTrioWaitHoldingBaseKey:=6, iTrioCountHoldingBaseKey:=7,iTrioWaitVirtualKey:=8, iTrioAutoRepeat:=9
,iTrioEnd ; Граничный индекс.
cEndArr := -1
arSetTrioKey := [[cNone] ;------------------>>> Для The Witcher 2 - Assassins of Kings <<<<-------------------------------------
,["RShift", "sc10", "sc11", "sc12" ;Вызов="RShift", Серебрянный меч="Q", Стальной меч="W", Убрать оружие="E"
,300],[2],[25],[10],[false],[cEndArr]
,["RCtrl", "sc10", "sc11", "sc12" ;Вызов="RShift", Серебрянный меч="Q", Стальной меч="W", Убрать оружие="E"
,300],[2],[25],[10],[false],[cEndArr]
,[cEndArr]]
; Фукцая первичного разбора массива, вход подаётся:
; 1-й параметр. UIA (The unique identifier for the application), который генерируется рандомно один раз при старте скрипта.
; 2-й параметр. HotKey клавиши по которой будет осуществляться обработка.
; Возврат. False - ошибка в массиве или входных параметрах иначе индекс для получения параметров из массива arSetTrioKey
sbGetParamTrioKey(iHoyKey)
{
; Общие константы переменные
Global arSetTrioKey, cNone, cEndArr
,сMsgOptionsEr, сMsgOptionsOK, сMsgOptionsDg, сMsgOptionsInfo
; Индексы в массиве arSetTrioKey
Global iTrioBaseKey, iTrioAloneKey, iTrioDoubleKey
,iTrioHoldingKey, iTrioPause_PressKey, iTrioWaitHoldingBaseKey
,iTrioCountHoldingBaseKey, iTrioWaitVirtualKey, iTrioAutoRepeat, iTrioEnd
; Переменные полученные из массива arSetTrioKey для подпрограммы sbTrioProcessingKeys
Global BaseKey, AloneKey, DoubleKey, iTrioHoldingKey, iTrioPause_PressKey
,iTrioWaitHoldingBaseKey, iTrioCountHoldingBaseKey
,iTrioWaitVirtualKey, iTrioAutoRepeat
vRet:=false
for i in arSetTrioKey
{
if (arSetTrioKey[i,iTrioBaseKey]=iHoyKey)
{
vRet:=true ; Нашли то что искали, будем считывать и проверять валидность.
Break
}
if (arSetTrioKey[i,iTrioBaseKey]=cEndArr)
{
vRet:=false ; Ничего не нашли, выход с ошибкой.
Break
}
if (arSetTrioKey[i,iTrioBaseKey]=cNone)
Continue ; Это пустая запись или заголовок.
}
if (!vRet)
Goto lErrArr
for j in arSetTrioKey[i]
{
vTmp:=arSetTrioKey[i,j]
if ((vTmp=cNone) || ((vTmp=cEndArr) && (i!=iTrioEnd)))
{
vRet:=false
Break
}
}
if ((!vRet) || (j<=iTrioEnd))
{}
lErrArr:
msgbox, % сMsgOptionsEr, Функция тройных клавиш, Ошибка в масссиве arSetTrioKey при поиске клавиши - %iHoyKey%, 50
return vRet
}
*/
Enter::
сBaseKey := "Enter"
cAloneKey := "Enter" ; Действия по Enter
cDoubleKey := "Space" ; Взять всё
cHoldingKey := "LButton"
сPause_PressKey := 300
cWaitHoldingBaseKey := 1
cCountHoldingBaseKey := 40
cWaitVirtualKey := 5
cWaitBaselKey := 10
fAutoRepeat := false
gosub sbTrioProcessingKeys
return
RCtrl::
сBaseKey := "RCtrl"
cAloneKey := "RCtrl" ;Следующий предмет
cDoubleKey := "End" ;Задействовать скилл "Изпользовать адреналин для массового уничтожения"
cHoldingKey := "RCtrl" ;Следующий предмет
сPause_PressKey := 300
cWaitHoldingBaseKey := 1
cCountHoldingBaseKey := 40
cWaitVirtualKey := 5
cWaitBaselKey := 10
fAutoRepeat := false
gosub sbTrioProcessingKeys
return
;Numpad0 - что бы всегда срабатывал Медальон, в игре проблема обработки, видимо задержка ожидания нажатия.
sc52::
сBaseKey := "sc52" ;Numpad0
cAloneKey := "sc52" ;Медальон
cDoubleKey := "sc52" ;Медальон
cHoldingKey := "sc52" ;Медальон
сPause_PressKey := 300
cWaitHoldingBaseKey := 1
cCountHoldingBaseKey := 40
cWaitVirtualKey := 5
cWaitBaselKey := 10
fAutoRepeat := false
gosub sbTrioProcessingKeys
return
RShift::
;if (!Witcher2_RShift)
; return
;a:=A_ThisHotkey
;b:=A_ThisLabel
сBaseKey := "RShift"
cAloneKey := "sc10" ;Q - Серебрянный меч
cDoubleKey := "sc11" ;W - Стальной меч
cHoldingKey := "sc12" ;E - Убрать оружие
сPause_PressKey := 300
cWaitHoldingBaseKey := 1
cCountHoldingBaseKey := 40
cWaitVirtualKey := 5
cWaitBaselKey := 10
fAutoRepeat := false
gosub sbTrioProcessingKeys
return
#IfWinActive
;-----END--Для The Witcher 2 - Assassins of Kings
;lActiveWitcher: ; Точка активации игры
;return
;lDeActiveWitcher: ; Точка деактивации игры
;msgbox, Точка деактивации игры Для The Witcher 2
;if (arProc[1,5]=0)
; gosub lExitProc
;return
;lPauseWitcher: ; Точка паузы игры
;return
;RShift::
;if (fWitcher)
;RCtrl
;return
;***************END******************
И концовка, т.е. начало
;-----Инициализация
; Скрипт не выгружается
#Persistent
; Запрет повторного запуска
#SingleInstance
OnExit, EndGames
fnPathUses() ;Иницализация путей
fnOverallSection() ;Иницализация блока переменных
return
;----------------------------
;---Точка выхода
EndGames:
ExitApp
;----------------------------
;Пишем модуль/скрипт путей
;Пишем модуль/скрипт переменных
;Пишем модуль/скрипт для игр
;Метка GameKeyOnOff служит для динамческого/принудительного отключения игровых клавишь без выгрузки скрипта
Удачи, может кому то я и помог.
OS Windows 10 x64 Pro(AutoHotkey v1.1.37.02)