[중급] [v1.1] 자동기원과 철갑마

오호 09.24 00:12 조회 256 댓글 0



'자동기원'과 '철갑마' 이 둘을 Toggle하다 보면

굉장히 거슬리는 부분이 하나 생깁니다.


 


'철갑마'를 탈 때마다 끊임없이 이어지는 이 문구


너무나 거슬리는데 그렇다고 말 탈 때마다


'자동기원' 끄고

말 타고

이동하고

말 내리고

'자동기원' 켜고


를 끊임없이 반복하려니 상당히 귀찮고 손이 꼬입니다.



이것도 깔끔하게 만들고 싶습니다.



자동기원 X -> 철갑마 On -> 철갑마 Off -> 자동기원 X

자동기원 O -> 철갑마 On -> 철갑마 Off -> 자동기원 O


그저 말에서 내릴 때마다 '자동기원'을 켜주는 것이 아닌

말 타기 전에 '자동기원' 중이었을 경우에'만'

'자동기원'을 다시 켜주는 것이 목표입니다.




위의 경우를 살펴보면 철갑마 Off 할 때 2가지 경우가 생깁니다.



그러기에 여기서 변수 하나가 더 필요합니다.

말을 타면서 말 타기 전에 '자동기원'중이었는지 상태를 저장할 변수입니다.

PrevHealState


그리고 PrevHealState를 사용할 함수 2개가 필요합니다.



- StoreHealState : 현재 '자동기원' 상태를 저장하는 함수

- RestoreHealState : 말 타기 전의 '자동기원' 상태를 복구하는 함수


앞에서

- HorseOn ( 말 타는 함수 )

- HorseOff ( 말 내리는 함수 )

만들었던 것과 마찬가지로 


자동기원도

- HealStart ( 자동기원 시작 함수 )

- HealStop ( 자동기원 중지 함수 )

이렇게 만들어 두겠습니다.




[v1.1]


; ------- Global variables ( 맨 위에 선언해주세요 )
isRiding      := False ; 말을 타고 있는지 아닌지 상태 저장
isHealing     := False ; 자동기원 중인지 여부 저장,
PrevHealState := False ; 말 타기 전에 자동기원 중이었는지 상태 저장

#Include ../lib/script_control_v1.ahk
#Include ../lib/common_func_v1.ahk
; ----------- Heal -------------------------------------
자동기원() {
    SendInput {5} ; 자동기원이 'e'에 있을 때
    return
}
HealStart() {                ; 자동기원 시작 함수
    global                   ; isHealing, PrevState 둘 다 global 변수임을 표시
    SetTimer, 자동기원, 140   ; 자동기원 반복
    isHealing := True        ; 이제 자동기원 중
    PrevHealState := False   ; 자동기원 시작했으므로 이전 값은 초기화
    return
}
HealStop() {                 ; 자동기원 중지 함수
    global
    SetTimer, 자동기원, off   ; 자동기원 반복 종료
    isHealing := False       ; 이제 자동기원 안하고 있음
    return
}
ToggleHeal() {
    global isHealing         ; global 변수인 isHealing을 사용하겠다는 의미
    if isHealing {           ; 지금이 자동기원 중이면
        HealStop()           ; 자동기원 중지
    } else {                 ; 자동기원 하고 있지 않으면
        HealStart()          ; 자동기원 시작
    }
    return
}

StoreHealState() {             ; 자동기원 상태 저장 함수
    global
    PrevHealState := isHealing ; 현재 자동기원 상태를 저장
    if isHealing {             ; 자동기원 중이면
        HealStop()             ; 자동기원 중지
    }
    return
}
RestoreHealState() {        ; 자동기원 상태 복구 함수
    global
    if PrevHealState {      ; 이전 상태가 자동기원 중이었으면
        HealStart()         ; 다시 자동기원 시작
    }
    return
}

; ----------- Horse -------------------------------------
HorseOn() {                 ; 말 타기
    global isRiding         ; global 변수인 isRiding을 사용하겠다는 의미
    UseItem("d")            ; 철갑마 사용 (철갑마가 'd'에 있을 때)
    isRiding := True        ; 이제 말 타고 있음
    return
}
HorseOff() {                ; 말 내리기
    global isRiding         ; global 변수인 isRiding을 사용하겠다는 의미
    SendInput {r}           ; 말 내리기
    isRiding := False       ; 이제 말 안 타고 있음
    return
}
ToggleHorse() {             ; 말 타고/ 내리기
    global isRiding         ; global 변수인 isRiding을 사용하겠다는 의미
    if isRiding {           ; 말을 타고 있으면
        HorseOff()          ; 말 내리기
        RestoreHealState()  ; 자동기원 상태 복구
    } else {                ; 말을 안 타고 있으면
        StoreHealState()    ; 자동기원 상태 저장
        HorseOn()           ; 말 타기
    }
    return
}

#IfWinActive ahk_class Nexon.NWind ; 바람의나라 창이 활성화 상태일 때만
NumPad5::ToggleHeal() ; NumPad5 Key 누르면 on/off 반전됨
End::ToggleHorse()                    ; 말 Toggle
#IfWinActive
 


구현한 함수는 많지만 정작 HotKey에 사용할 함수는 2개 뿐입니다.


이제 ToggleHeal() ToggleHorse()를 HotKey에 지정해두고 사용하면 이렇게 됩니다.

 




굳이 이렇게 구현하지 않아도 큰 지장은 없지만

조금 더 깔끔하게 하고자 한다면 이렇게도 할 수 있습니다.


한번 시도해보세요.





댓글 0