Created
July 1, 2024 13:26
-
-
Save ZerothAngel/4f54c776fe22e551d86b7dfe145eb6db to your computer and use it in GitHub Desktop.
Generic mouse look/action camera AutoHotkey (v2) script. As-is, it's configured to work with FFXIV.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#Requires AutoHotKey v2.0 | |
#SingleInstance Force | |
SendMode "Input" | |
;;; Generic mouse look script, aka action camera | |
;;; * Should work on any game that requires you to hold down a key (such as | |
;;; the right mouse button) to move the camera | |
;;; * By default, caps lock will toggle mouse look mode on or off | |
;;; * When mouse look is enabled, you can press RMB to temporarily release | |
;;; mouse look and get your cursor back. Great for mouseover targeting! | |
;;; * Whenever mouse look is engaged, you can have it center the mouse cursor | |
;;; before it holds down the RMB. | |
;;; * See below if you want to reconfigure things. You might want the AHKv2 | |
;;; docs nearby for key names, etc. | |
;;; | |
;;; - ZerothAngel | |
; Keybinds | |
MouseLook := "RButton" ; Key to hold down for mouse look. Typically right mouse button (RButton) | |
MouseLookToggle := "CapsLock" ; Key to toggle mouse look mode (when on, RMB is inverted) | |
AutoCenterToggle := "AppsKey" ; Key to toggle auto-center (auto-centering only happens right before mouse look is toggled on) | |
; Config | |
GameWindow := "ahk_class FFXIVGAME" ; How the game window is identified. Use AHK's Window Spy | |
AutoCenterState := true ; Current state of auto-center. Nowadays, I like it on by default. Set to false if you don't. | |
CenterOffsetX := 100 ; Horizontal pixel offset when centering, positive is toward right | |
CenterOffsetY := 200 ; Vertical pixel offset when centering, positive is toward bottom | |
; Note: Whatever offsets you choose above, if you actually do use auto-centering, make sure you can still move the camera | |
; with whatever is under the mouse at that point, i.e. don't choose offsets that place the mouse pointer over UI elements | |
; State | |
MouseLookState := false ; true if RMB is currently inverted | |
PhysicalMouseLookState := false ; For keeping track of physical RMB state (when not inverted) | |
MouseLookCounter := 0 ; Send RMB down on 0 -> 1 only, similarly RMB up on 1 -> 0 only | |
; Hotkeys | |
HotIfWinActive GameWindow | |
Hotkey AutoCenterToggle, ToggleAutoCenter | |
Hotkey MouseLook, PhysicalMouseLookDown | |
Hotkey MouseLook " Up", PhysicalMouseLookUp | |
Hotkey MouseLookToggle, ToggleMouseLook | |
; Functions | |
ToggleAutoCenter(ThisHotKey) { | |
global AutoCenterState | |
AutoCenterState := !AutoCenterState | |
} | |
ToggleMouseLook(ThisHotKey) { | |
global MouseLookState | |
if (MouseLookState) { | |
SendMouseLookUp() | |
} else { | |
CenterMouse() | |
SendMouseLookDown() | |
} | |
MouseLookState := !MouseLookState | |
SetCapsLockState false | |
} | |
CenterMouse() { | |
if (AutoCenterState && !PhysicalMouseLookState) { | |
BlockInput "MouseMove" | |
WinGetPos ,,&WinWidth,&WinHeight,GameWindow | |
MouseMove CenterOffsetX+WinWidth/2, CenterOffsetY+WinHeight/2, 1 | |
BlockInput "MouseMoveOff" | |
} | |
} | |
PhysicalMouseLookDown(ThisHotKey) { | |
global PhysicalMouseLookState | |
if (MouseLookState) { | |
; Currently inverted, so "release" mouselook | |
SendMouseLookUp() | |
} else { | |
; Not currently inverted, just behave normally | |
SendMouseLookDown() | |
; But also keep track of this click | |
PhysicalMouseLookState := true | |
} | |
} | |
PhysicalMouseLookUp(ThisHotKey) { | |
global PhysicalMouseLookState | |
if (MouseLookState) { | |
CenterMouse() | |
; Currently inverted, re-enable mouselook | |
SendMouseLookDown() | |
} else { | |
; Not currently inverted, just behave normally | |
SendMouseLookUp() | |
} | |
PhysicalMouseLookState := false | |
} | |
SendMouseLookDown() { | |
global MouseLookCounter | |
; Send only on edge between 0 -> 1 | |
if (++MouseLookCounter == 1) { | |
Send "{" MouseLook " down}" | |
} | |
MouseLookCounter := Min(MouseLookCounter, 1) ; Saturate at 1 | |
} | |
SendMouseLookUp() { | |
global MouseLookCounter | |
; Send only on edge between 1 -> 0 | |
if (--MouseLookCounter == 0) { | |
Send "{" MouseLook " up}" | |
} | |
MouseLookCounter := Max(MouseLookCounter, 0) ; Sanity | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
https://gist.github.com/ZerothAngel/03469595da8616bc76871448038ce022 for the original AHK v1 version.