Что нового

[Автоматизация] Входа в игру

Drontus

Новичок
Сообщения
9
Репутация
1
Итак, нужен скрипт, который:
1. Запускает WoW (5 окон)
2. Переназывает окна (WoW1,...,WoW5)
2. Расставляет их на экране размером 300х300 друг за другом
3. Автоматически вводит логины и пароли во всех окнах (логины разные)
4. В определённых окнах нажимает стрелку вниз (для выбора аккаунта)
5. Жмёт энтер.
[6. Скорей всего не осуществимо, но: выбирает сервер и нужного персонажа и входит в игру.]
7. Запускает одну и туже программу 5 раз.

Ничего подобого, за иключением для 1 акканта, не видел. Пробовал осуществить сие чудо в AHK, но застрял на воде пароля, он вообще его невводил. Тут вроде посерьёзней продукт. Готов заплатить за исходники с комментариями и собственно самой программой.
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
Вам скорее сюда: http://autoit-script.ru/index.php?board=20.0
+Какова цена вопроса?

6. в WoW не играл... но если там нет циклической прокрутки, то должно быть довольно просто... :smile:
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Просто из любопытства, это для Иннер Спейс бота?
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
При первом запуске в папке со скриптом создаст ini-файл в которые вбиваются настройки (Логин/Пасс/Путь к WoW/Титул окна).
Отдельно есть настроики начальной позиции окна. И размер окон. (читать коменты в коде)
Основную часть скрипта взял из http://autoit-script.ru/index.php?topic=4555.msg32879#msg32879 и немного доработал.

Код:
AutoItSetOption("WinTitleMatchMode", 4)
;AutoItSetOption("ExpandVarStrings", 0)
AutoItSetOption("SendKeyDelay", 20)
AutoItSetOption("SendKeyDownDelay", 20)
#include <EditConstants.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>

Opt("GUIOnEventMode", 1)
Opt("TrayAutoPause", 0)
Opt("TrayOnEventMode",1)

HotKeySet("^{F9}", "_PauseScript") 		; Пауза Ctrl+F9
HotKeySet("^{F10}", "_quit") 			; Выход Ctrl+F10

Global $posX=0					;Начальная позиция 1-го окна X
Global $posY=0 					;Начальная позиция 1-го окна Y
Global $RazmerX=300 			;Размер в пикселях X
Global $RazmerY=300 			;Размер в пикселях Y
Global $iPaused 				;состояние паузы
Global $AllAcc=5				;Количество Акков WoW
DIM $acc[$AllAcc+1], $pass[$AllAcc+1], $browse_wow[$AllAcc+1], $winname[$AllAcc+1] ;Создаются масивы для работы с Акками

TraySetOnEvent($TRAY_EVENT_PRIMARYDOUBLE,"Show")
TraySetClick (8)

$settings_ini = @ScriptDir & "\Settings.ini" ;Путь сохранения настроек. По умолчанию в тойже папке где скрипт

For $Winindex=1 to $ALLAcc ;Цикл в котором идет работа с ini-файлом... присвоение настроек если уже есть. иначе создает новый ini.
$acc[$Winindex] = IniRead($settings_ini, "", "$acc" & $Winindex, "Логин не найден")
$pass[$Winindex] = IniRead($settings_ini, "", "$pass" & $Winindex, "Пароль не найден")
$browse_wow[$Winindex] = IniRead($settings_ini, "", "$browse_wow" & $Winindex, "Путь к WoW не найден")
$winname[$WinIndex] = IniRead($settings_ini, "", "$winname" & $Winindex, "WoW" & $Winindex)
IniWrite($settings_ini, "", "$acc" & $Winindex, $acc[$Winindex])
IniWrite($settings_ini, "", "$pass" & $Winindex, $pass[$Winindex])
IniWrite($settings_ini, "", "$browse_wow" & $Winindex, $browse_wow[$Winindex])
IniWrite($settings_ini, "", "$winname" & $Winindex, $winname[$Winindex])
;MsgBox(0,"",$acc[$Winindex] & @CRLF & $pass[$Winindex] & @CRLF & $browse_wow[$Winindex] & @CRLF & $winname[$Winindex])
next

;~ While 1
;~ 	sleep(100)
;~ WEnd


Login()

; Функция выхода
Func _quit()
	Exit
EndFunc
; функция паузы
Func _PauseScript()
    $iPaused = Not $iPaused
EndFunc
; проверка на паузу
Func _CheckPause()
    While $iPaused
        Sleep(100)
    WEnd
EndFunc
; Основная функция
Func Login()
    For $WinIndex=1 to 5
    Run($browse_wow[$WinIndex])
    WinWait("World of Warcraft")
;~     WinWait("Безымянный — Блокнот")
	_CheckPause()
    Sleep(Random(10000, 20000))
    WinSetTitle("World of Warcraft", "", $winname[$WinIndex])
;~ 	WinSetTitle("Безымянный — Блокнот", "", $winname[$WinIndex])
    Sleep(100)
    WinMove($winname[$WinIndex], "", $posX+($WinIndex-1)*300, $posY, $RazmerX, $RazmerY)
    _CheckPause()
    Sleep(5000)
    _CheckPause()
    Sleep(Random(1000, 5000))
    $temp = ClipGet()
    ClipPut($acc[$WinIndex])
    Sleep(100)
    ControlSend($winname[$WinIndex], "", 0, "{CTRLDOWN}v{CTRLUP}")
    ClipPut($temp)
    _CheckPause()
    Sleep(1000)
    ControlSend($winname[$WinIndex], "", "", "{TAB}")
    _CheckPause()
    Sleep(1000)
    ClipPut($pass[$WinIndex])
    _CheckPause()
    Sleep(500)
    ControlSend($winname[$WinIndex], "", 0, "{CTRLDOWN}v{CTRLUP}")
    ClipPut($temp)
    _CheckPause()
    Sleep(1000)
    ControlSend($winname[$WinIndex], "", "", "{ENTER}")
    _CheckPause()
    Sleep(3000)
        If $WinIndex = 1 Then
            ControlSend($winname[$WinIndex], "", "", "{ENTER}")
            _CheckPause()
            Sleep(3000)
        ElseIf $WinIndex = 2 Then
            ControlSend($winname[$WinIndex], "", "", "{DOWN}")
            _CheckPause()
            Sleep(1000)
            ControlSend($winname[$WinIndex], "", "", "{ENTER}")
        ElseIf $WinIndex = 3 Then
            ControlSend($winname[$WinIndex], "", "", "{DOWN 2}")
            _CheckPause()
            Sleep(1000)
            ControlSend($winname[$WinIndex], "", "", "{ENTER}")
        ElseIf $WinIndex = 4 Then
            ControlSend($winname[$WinIndex], "", "", "{DOWN 3}")
            _CheckPause()
            Sleep(1000)
            ControlSend($winname[$WinIndex], "", "", "{ENTER}")
        ElseIf $WinIndex = 5 Then
            ControlSend($winname[$WinIndex], "", "", "{DOWN 4}")
            _CheckPause()
            Sleep(1000)
            ControlSend($winname[$WinIndex], "", "", "{ENTER}")
        EndIf
    _CheckPause()
	Next
EndFunc
 
Автор
D

Drontus

Новичок
Сообщения
9
Репутация
1
отлично, всё работает, единственное что, в настройках указывается начальная координата первого окна (0,0), как сделать чтобы он по высоте экрана выстраивал?
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
:smoking:
После того, как указывается сколько всего будет окон и т.д. Смотрит какая высота экрана и распределяет координаты окон.. пробовал на 50 блокнотах с разным разрешением... :smile: Работает... :smile:
Код:
AutoItSetOption("WinTitleMatchMode", 4)
;AutoItSetOption("ExpandVarStrings", 0)
AutoItSetOption("SendKeyDelay", 20)
AutoItSetOption("SendKeyDownDelay", 20)
#include <EditConstants.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>

Opt("GUIOnEventMode", 1)
Opt("TrayAutoPause", 0)
Opt("TrayOnEventMode",1)

HotKeySet("^{F9}", "_PauseScript")      ; Пауза Ctrl+F9
HotKeySet("^{F10}", "_quit")            ; Выход Ctrl+F10

Global $posX=0                  ;Начальная позиция 1-го окна X
Global $posY=0                  ;Начальная позиция 1-го окна Y
Global $RazmerX=300             ;Размер в пикселях X
Global $RazmerY=300             ;Размер в пикселях Y
Global $iPaused                 ;состояние паузы
Global $AllAcc=5                ;Количество Акков WoW
DIM $acc[$AllAcc+1], $pass[$AllAcc+1], $browse_wow[$AllAcc+1], $winname[$AllAcc+1] ;Создаются масивы для работы с Акками

Dim $Pos[$AllAcc+1][2]
$yMax=Floor(@DesktopHeight/$RazmerY)
For $WinIndex=1 to $AllAcc
If $WinIndex<=$yMax Then
	$Pos[$WinIndex][0]=$posX
	$Pos[$WinIndex][1]=$posY+$RazmerY*($WinIndex - 1)
Else
	If Floor($WinIndex/$yMax)=$WinIndex/$yMax Then
		$posK=Floor($WinIndex/$yMax)-1
	Else
		$posK=Floor($WinIndex/$yMax)
	EndIf
	$Pos[$WinIndex][0]=$posX+$RazmerX*($posK)
	$Pos[$WinIndex][1]=$posY+$RazmerY*($WinIndex - 1 - $yMax * $posK)
EndIf
Next



TraySetOnEvent($TRAY_EVENT_PRIMARYDOUBLE,"Show")
TraySetClick (8)

$settings_ini = @ScriptDir & "\Settings.ini" ;Путь сохранения настроек. По умолчанию в тойже папке где скрипт

For $Winindex=1 to $ALLAcc ;Цикл в котором идет работа с ini-файлом... присвоение настроек если уже есть. иначе создает новый ini.
$acc[$Winindex] = IniRead($settings_ini, "", "$acc" & $Winindex, "Логин не найден")
$pass[$Winindex] = IniRead($settings_ini, "", "$pass" & $Winindex, "Пароль не найден")
$browse_wow[$Winindex] = IniRead($settings_ini, "", "$browse_wow" & $Winindex, "Путь к WoW не найден")
$winname[$WinIndex] = IniRead($settings_ini, "", "$winname" & $Winindex, "WoW" & $Winindex)
IniWrite($settings_ini, "", "$acc" & $Winindex, $acc[$Winindex])
IniWrite($settings_ini, "", "$pass" & $Winindex, $pass[$Winindex])
IniWrite($settings_ini, "", "$browse_wow" & $Winindex, $browse_wow[$Winindex])
IniWrite($settings_ini, "", "$winname" & $Winindex, $winname[$Winindex])
;MsgBox(0,"",$acc[$Winindex] & @CRLF & $pass[$Winindex] & @CRLF & $browse_wow[$Winindex] & @CRLF & $winname[$Winindex])
next

;~ While 1
;~  sleep(100)
;~ WEnd


Login()

; Функция выхода
Func _quit()
    Exit
EndFunc
; функция паузы
Func _PauseScript()
    $iPaused = Not $iPaused
EndFunc
; проверка на паузу
Func _CheckPause()
    While $iPaused
        Sleep(100)
    WEnd
EndFunc
; Основная функция
Func Login()
    For $WinIndex=1 to 5
    Run($browse_wow[$WinIndex])
    WinWait("World of Warcraft")
;~     WinWait("Безымянный — Блокнот")
    _CheckPause()
    Sleep(Random(10000, 20000))
    WinSetTitle("World of Warcraft", "", $winname[$WinIndex])
;~  WinSetTitle("Безымянный — Блокнот", "", $winname[$WinIndex])
    Sleep(100)
;~ 	@DesktopHeight/
    WinMove($winname[$WinIndex], "", $pos[$WinIndex][0], $pos[$WinIndex][1], $RazmerX, $RazmerY)
    _CheckPause()
    Sleep(5000)
    _CheckPause()
    Sleep(Random(1000, 5000))
    $temp = ClipGet()
    ClipPut($acc[$WinIndex])
    Sleep(100)
    ControlSend($winname[$WinIndex], "", 0, "{CTRLDOWN}v{CTRLUP}")
    ClipPut($temp)
    _CheckPause()
    Sleep(1000)
    ControlSend($winname[$WinIndex], "", "", "{TAB}")
    _CheckPause()
    Sleep(1000)
    ClipPut($pass[$WinIndex])
    _CheckPause()
    Sleep(500)
    ControlSend($winname[$WinIndex], "", 0, "{CTRLDOWN}v{CTRLUP}")
    ClipPut($temp)
    _CheckPause()
    Sleep(1000)
    ControlSend($winname[$WinIndex], "", "", "{ENTER}")
    _CheckPause()
    Sleep(3000)
        If $WinIndex = 1 Then
            ControlSend($winname[$WinIndex], "", "", "{ENTER}")
            _CheckPause()
            Sleep(3000)
        ElseIf $WinIndex = 2 Then
            ControlSend($winname[$WinIndex], "", "", "{DOWN}")
            _CheckPause()
            Sleep(1000)
            ControlSend($winname[$WinIndex], "", "", "{ENTER}")
        ElseIf $WinIndex = 3 Then
            ControlSend($winname[$WinIndex], "", "", "{DOWN 2}")
            _CheckPause()
            Sleep(1000)
            ControlSend($winname[$WinIndex], "", "", "{ENTER}")
        ElseIf $WinIndex = 4 Then
            ControlSend($winname[$WinIndex], "", "", "{DOWN 3}")
            _CheckPause()
            Sleep(1000)
            ControlSend($winname[$WinIndex], "", "", "{ENTER}")
        ElseIf $WinIndex = 5 Then
            ControlSend($winname[$WinIndex], "", "", "{DOWN 4}")
            _CheckPause()
            Sleep(1000)
            ControlSend($winname[$WinIndex], "", "", "{ENTER}")
        EndIf
    _CheckPause()
    Next
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Drontus
Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Как правильно называть темы

"[Автоматизация] Входа в игру" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, Администратор форума.
 
Верх