본문으로 바로가기

오토핫키 디아블로용

category Programing 2018. 3. 2. 08:46

디아블로 악마사냥꾼 투검악사에 사용하던 오토핫키 스크립트를 공개합니다.


핫키를 함수기반으로 설정해서 사용할 수 있도록 일반화 시키고 한글변수나 함수명을 한글로 사용해서 쉽게 이해할 수 있도록 만들었습니다.


오토핫키는 매우 좋은 매크로 툴이지만 깊이 파고들지 못해 디아블로내에서의 키인식 문제와 키입력 쓰레드처리 문제등이 아직 남아있는 상태 입니다.

예를 들어 투검키가 눌려지지만 실지로는 투검이 실행되지 않는 경우, 스크립트 실행 및 종료를 마우스 휠로 처리하는 문제, 각각의 반복키별로 반복시간을 설정하는 문제...


이 스크립트를 기반으로 더 발전 시키면 좋은 스트립트가 만들어 질꺼라 생각합니다.


향후 시간이 된다면 좀더 완성도를 높일 생각입니다.


; 기본설정
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir ; Ensures a consistent starting directory.

; 사용자설정
#KeyHistory 0
SetBatchLines, -1
ListLines, Off
; SetDefaultMouseSpeed,0
; SetKeyDelay,-1
; SetMouseDelay,-1
; SetControlDelay,-1
; SetWinDelay,-1
#HotkeyInterval 2000 ; 이것이 기본값입니다 (밀리초).
#MaxHotkeysPerInterval 200

;---------------------------------------------------------------------------------------------------
; 사용되는 변수를 정의하는 부분
;---------------------------------------------------------------------------------------------------
global 반복여부 := false

global 기술1반복여부 := true
global 기술2반복여부 := false
global 기술3반복여부 := false
global 기술4반복여부 := false

global 어둠악사여부 := false ; 기본적으로 어둠악사가 아닌 것으로 설정
global 투검사용시간 := A_TickCount

;---------------------------------------------------------------------------------------------------
; 사용되는 핫키와 기능 연결 시작
;---------------------------------------------------------------------------------------------------
일반핫키함수등록("F12", "프로그램종료")

일반핫키함수등록("F2", "반복시작")
일반핫키함수등록("F3", "반복종료")

일반핫키함수등록("~T", "반복종료") ; 포털
일반핫키함수등록("~R", "반복종료") ; 귓말


일반핫키함수등록("F5", "기술반복토글", "기술1")
일반핫키함수등록("F6", "기술반복토글", "기술2")
일반핫키함수등록("F7", "기술반복토글", "기술3")
일반핫키함수등록("F8", "기술반복토글", "기술4")

; 어둠악사를 위한 설정들
일반핫키함수등록("RButton", "마우스오른쪽클릭") ; 투검사용 후 2초간 투검사용없이 도약
일반핫키함수등록("F10", "어둠악사여부토글")
일반핫키함수등록("$4", "투검사용시간저장") ; 4번기술에 투검을 등록하고 사용할때 마다 사용시간 등록 $는 원래의 4번키도 동작하면서 무한루프가 돌지 않도록 하는 설정

;---------------------------------------------------------------------------------------------------
어둠악사여부토글()
{
    어둠악사여부 :=   !어둠악사여부
}


투검사용시간저장()
{
    if (반복여부 and 어둠악사여부)
    {
        투검사용시간 := A_TickCount
    }
    SendInput, 4
}


기술반복토글(pKey)
{
    if ( pKey = "기술1" )
    {
        기술1반복여부 := !기술1반복여부
    }
    else if ( pKey = "기술2" )
    {
        기술2반복여부 := !기술2반복여부
    }
    else if ( pKey = "기술3" )
    {
        기술3반복여부 := !기술3반복여부
    }
    else if ( pKey = "기술4" )
    {
        기술4반복여부 := !기술4반복여부
    }
}

마우스오른쪽클릭()
{
    if (반복여부 and 어둠악사여부)
    {
        ; 어둠악사일 경우 "어둠의 굴레" 허리띠 효과로 2초가 절제를 사용하지 않으므로
        ; 투검을 사용하진 2초가 지난 경우라면 투검을 한번 사용하고 도약키(마우스오른쪽버튼)를 사용한다.

        투검사용후_경과시간 := A_TickCount - 투검사용시간

        ; 투검 사용 후 2초가 지났다면 투검을 사용하고 투검 시간을 기록한다.
        if ( 투검사용후_경과시간 >= 2000 )
        {
            SendInput, 4
            투검사용시간 := A_TickCount
        }
    }
    SendInput, {RButton}
}

반복시작()
{
    반복여부 := true
    반복함수()
}

반복종료()
{
    반복여부 := false
}

반복함수()
{
    While(반복여부)
    {
        반복기능_디아블로()
    }
}

반복기능_디아블로()
{
    if (기술1반복여부)
    {
        SendInput, 1
    }
    if (기술2반복여부)
    {
        SendInput, 2
    }
    if (기술3반복여부)
    {
        SendInput, 3
    }
    if (기술4반복여부)
    {
        SendInput, 4
    }
    sleep, 100
}


프로그램종료()
{
    ExitApp
}

;---------------------------------------------------------------------------------------------------------------------------------
일반핫키함수등록(등록키, 함수명, 파라미터*)
{
    Static 함수_리스트 := {}, 파라미터_리스트 := {}

    함수_리스트[등록키] := Func(함수명)
    파라미터_리스트[등록키] := 파라미터

    Hotkey, %등록키%, 핫키처리
    Return

핫키처리:
    함수_리스트[A_ThisHotkey].(파라미터_리스트[A_ThisHotkey]*)
    Return
}