Skip to content

Commit

Permalink
more fixes, added README.MD
Browse files Browse the repository at this point in the history
  • Loading branch information
Be Ko committed Jul 31, 2023
1 parent 10e97e1 commit ce3700d
Show file tree
Hide file tree
Showing 9 changed files with 591 additions and 187 deletions.
373 changes: 212 additions & 161 deletions D4WeakAura.ahk

Large diffs are not rendered by default.

69 changes: 69 additions & 0 deletions README.MD
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# D4 "WeakAura"

## Prerequisited
- Get Autohotkey V1 -> https://www.autohotkey.com/ -> Download v1.1
## How to start
- Double click on D4WeakAura.ahk
- Loads settings from settings-{ScreenWidth}x{ScreenHeight}.ini
- This starts the overlay
- Configured with basic Overlay
- Healthbar
- Resourcebar
- Trigger-Pixel (resposible for showing/hiding the UI)
- UI is hidden when Map is visible
- Press F4 to toggle UI
- Press F5 to show help and debug view
- in debug mode you can see the rectangles that are captured and where they are displayed, indicated by a line of the same color

![](./images/Setup_Debug_Help.gif)

----------------------------------------

## How to configure
### Rectangle Clone Mode
![](./images/Setup_new_Overlay.gif)

- Used for Cooldowns or healthbar/resourcebar
- Press F1 to starting point for new rectangle
- Rectangle is drawn from starting point to current mouse position
- Press F1 again to stop drawing the rectangle
- Configuration window pops up
- set a unique identifier (e.g. "skill1")
- set transparency for the overlay
- set rotation for the overlay
- Press Okay
- The new overlay is immediatly added

### Edit Rectangle Clone
![](./images/F3_Edit_Mode.gif)

- Mouse over overlay
- Press F3
- Overlay moves to mouseposition
- scrollwheel changes transparency
- ctrl+scrollwheel changes scale
- Press F3 again to save

### Delete Rectangle Clone

- Mouse over overlay
- Press ctrl+F3

### Pixel Clone Mode
- Useful for cooldowns in peripheral vision
- Press F2 to select a pixel on the screen
- The position and color of this pixel is saved
- Configuration window pops up
- set a unique identifier (e.g. "skill1")
- "Where to display"
- the Pixel Clone Mode takes the color value of the selected pixel
- displays it at the borders of the screen (Top/Left/Right/Full)
- set transparency for the overlay (doesn't work for now)

### Vibrate Mode
- Useful for cooldowns
- Setup the same as Pixel Clone Mode
- Select Vibrate for "Where to display"
- Configure the vibration strength in the Modifier input
- Start the "Rumber.ahk" script to enable the rumble
- This sends the rumble to the first connected XInput Gamepad
32 changes: 32 additions & 0 deletions Rumbler.ahk
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#SingleInstance
#Include XInput.ahk

XInput_Init()
global vibrationEnabled := True

OnMessage(0x004A, "Receive_WM_COPYDATA") ; 0x004A is WM_COPYDATA
return

Receive_WM_COPYDATA(wParam, lParam)
{
StringAddress := NumGet(lParam + 2*A_PtrSize) ; Retrieves the CopyDataStruct's lpData member.
CopyOfData := StrGet(StringAddress) ; Copy the string out of the structure.
; Show it with ToolTip vs. MsgBox so we can return in a timely fashion:
params := StrSplit(CopyOfData, "|")
Rumble(params[1], params[2], params[3])
return true ; Returning 1 (true) is the traditional way to acknowledge this message.
}

Rumble(rumbleStrength, rumbleLength, rumbleRepeats) {
if(vibrationEnabled) {

Loop, % rumbleRepeats
{
argh := XInput_SetState(0, 0*257, rumbleStrength*257)
Sleep, rumbleLength
argh := XInput_SetState(0, 0*257, 0*257)
}
}
argh := XInput_SetState(0, 0*257, 0*257)
return
}
223 changes: 223 additions & 0 deletions XInput.ahk
Original file line number Diff line number Diff line change
@@ -0,0 +1,223 @@
/* XInput by Lexikos
* Requires AutoHotkey 1.1+.
*/

/*
Function: XInput_Init
Initializes XInput.ahk with the given XInput DLL.
Parameters:
dll - The path or name of the XInput DLL to load.
*/
XInput_Init(dll:="")
{
global
if _XInput_hm
return

;======== CONSTANTS DEFINED IN XINPUT.H ========

; NOTE: These are based on my outdated copy of the DirectX SDK.
; Newer versions of XInput may require additional constants.

; Device types available in XINPUT_CAPABILITIES
XINPUT_DEVTYPE_GAMEPAD := 0x01

; Device subtypes available in XINPUT_CAPABILITIES
XINPUT_DEVSUBTYPE_GAMEPAD := 0x01

; Flags for XINPUT_CAPABILITIES
XINPUT_CAPS_VOICE_SUPPORTED := 0x0004

; Constants for gamepad buttons
XINPUT_GAMEPAD_DPAD_UP := 0x0001
XINPUT_GAMEPAD_DPAD_DOWN := 0x0002
XINPUT_GAMEPAD_DPAD_LEFT := 0x0004
XINPUT_GAMEPAD_DPAD_RIGHT := 0x0008
XINPUT_GAMEPAD_START := 0x0010
XINPUT_GAMEPAD_BACK := 0x0020
XINPUT_GAMEPAD_LEFT_THUMB := 0x0040
XINPUT_GAMEPAD_RIGHT_THUMB := 0x0080
XINPUT_GAMEPAD_LEFT_SHOULDER := 0x0100
XINPUT_GAMEPAD_RIGHT_SHOULDER := 0x0200
XINPUT_GAMEPAD_GUIDE := 0x0400
XINPUT_GAMEPAD_A := 0x1000
XINPUT_GAMEPAD_B := 0x2000
XINPUT_GAMEPAD_X := 0x4000
XINPUT_GAMEPAD_Y := 0x8000

; Gamepad thresholds
XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE := 7849
XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE := 8689
XINPUT_GAMEPAD_TRIGGER_THRESHOLD := 30

; Flags to pass to XInputGetCapabilities
XINPUT_FLAG_GAMEPAD := 0x00000001

;=============== END CONSTANTS =================

if (dll = "")
Loop %A_WinDir%\System32\XInput1_*.dll
dll := A_LoopFileName
if (dll = "")
dll := "XInput1_3.dll"

_XInput_hm := DllCall("LoadLibrary" ,"str",dll ,"ptr")

if !_XInput_hm
throw Exception("Failed to initialize XInput: " dll " not found.")

(_XInput_GetState := DllCall("GetProcAddress" ,"ptr",_XInput_hm ,"ptr",100 ,"ptr"))
|| (_XInput_GetState := DllCall("GetProcAddress" ,"ptr",_XInput_hm ,"astr","XInputGetState" ,"ptr"))
_XInput_SetState := DllCall("GetProcAddress" ,"ptr",_XInput_hm ,"astr","XInputSetState" ,"ptr")
_XInput_GetCapabilities := DllCall("GetProcAddress" ,"ptr",_XInput_hm ,"astr","XInputGetCapabilities" ,"ptr")

if !(_XInput_GetState && _XInput_SetState && _XInput_GetCapabilities)
{
XInput_Term()
throw Exception("Failed to initialize XInput: function not found.")
}
}

/*
Function: XInput_GetState
Retrieves the current state of the specified controller.
Parameters:
UserIndex - [in] Index of the user's controller. Can be a value from 0 to 3.
Returns:
The current state of the controller as an associative array.
ErrorLevel:
If the function succeeds, ErrorLevel is ERROR_SUCCESS (zero).
If the controller is not connected, ErrorLevel is ERROR_DEVICE_NOT_CONNECTED (1167).
If the function fails, ErrorLevel is an error code defined in Winerror.h.
http://msdn.microsoft.com/en-us/library/ms681381.aspx
Remarks:
XInput.dll returns controller state as a binary structure:
http://msdn.microsoft.com/en-us/library/microsoft.directx_sdk.reference.xinput_state
http://msdn.microsoft.com/en-us/library/microsoft.directx_sdk.reference.xinput_gamepad
*/
XInput_GetState(UserIndex)
{
global _XInput_GetState

VarSetCapacity(xiState,16)

if ErrorLevel := DllCall(_XInput_GetState ,"uint",UserIndex ,"uint",&xiState)
return 0

return {
(Join,
dwPacketNumber: NumGet(xiState, 0, "UInt")
wButtons: NumGet(xiState, 4, "UShort")
bLeftTrigger: NumGet(xiState, 6, "UChar")
bRightTrigger: NumGet(xiState, 7, "UChar")
sThumbLX: NumGet(xiState, 8, "Short")
sThumbLY: NumGet(xiState, 10, "Short")
sThumbRX: NumGet(xiState, 12, "Short")
sThumbRY: NumGet(xiState, 14, "Short")
)}
}

/*
Function: XInput_SetState
Sends data to a connected controller. This function is used to activate the vibration
function of a controller.
Parameters:
UserIndex - [in] Index of the user's controller. Can be a value from 0 to 3.
LeftMotorSpeed - [in] Speed of the left motor, between 0 and 65535.
RightMotorSpeed - [in] Speed of the right motor, between 0 and 65535.
Returns:
If the function succeeds, the return value is 0 (ERROR_SUCCESS).
If the controller is not connected, the return value is 1167 (ERROR_DEVICE_NOT_CONNECTED).
If the function fails, the return value is an error code defined in Winerror.h.
http://msdn.microsoft.com/en-us/library/ms681381.aspx
Remarks:
The left motor is the low-frequency rumble motor. The right motor is the
high-frequency rumble motor. The two motors are not the same, and they create
different vibration effects.
*/
XInput_SetState(UserIndex, LeftMotorSpeed, RightMotorSpeed)
{
global _XInput_SetState
return DllCall(_XInput_SetState ,"uint",UserIndex ,"uint*",LeftMotorSpeed|RightMotorSpeed<<16)
}

/*
Function: XInput_GetCapabilities
Retrieves the capabilities and features of a connected controller.
Parameters:
UserIndex - [in] Index of the user's controller. Can be a value in the range 0–3.
Flags - [in] Input flags that identify the controller type.
0 - All controllers.
1 - XINPUT_FLAG_GAMEPAD: Xbox 360 Controllers only.
Returns:
The controller capabilities, as an associative array.
ErrorLevel:
If the function succeeds, ErrorLevel is 0 (ERROR_SUCCESS).
If the controller is not connected, ErrorLevel is 1167 (ERROR_DEVICE_NOT_CONNECTED).
If the function fails, ErrorLevel is an error code defined in Winerror.h.
http://msdn.microsoft.com/en-us/library/ms681381.aspx
Remarks:
XInput.dll returns capabilities via a binary structure:
http://msdn.microsoft.com/en-us/library/microsoft.directx_sdk.reference.xinput_capabilities
*/
XInput_GetCapabilities(UserIndex, Flags)
{
global _XInput_GetCapabilities

VarSetCapacity(xiCaps,20)

if ErrorLevel := DllCall(_XInput_GetCapabilities ,"uint",UserIndex ,"uint",Flags ,"ptr",&xiCaps)
return 0

return,
(Join
{
Type: NumGet(xiCaps, 0, "UChar"),
SubType: NumGet(xiCaps, 1, "UChar"),
Flags: NumGet(xiCaps, 2, "UShort"),
Gamepad:
{
wButtons: NumGet(xiCaps, 4, "UShort"),
bLeftTrigger: NumGet(xiCaps, 6, "UChar"),
bRightTrigger: NumGet(xiCaps, 7, "UChar"),
sThumbLX: NumGet(xiCaps, 8, "Short"),
sThumbLY: NumGet(xiCaps, 10, "Short"),
sThumbRX: NumGet(xiCaps, 12, "Short"),
sThumbRY: NumGet(xiCaps, 14, "Short")
},
Vibration:
{
wLeftMotorSpeed: NumGet(xiCaps, 16, "UShort"),
wRightMotorSpeed: NumGet(xiCaps, 18, "UShort")
}
}
)
}

/*
Function: XInput_Term
Unloads the previously loaded XInput DLL.
*/
XInput_Term() {
global
if _XInput_hm
DllCall("FreeLibrary","uint",_XInput_hm), _XInput_hm :=_XInput_GetState :=_XInput_SetState :=_XInput_GetCapabilities :=0
}

; TODO: XInputEnable, 'GetBatteryInformation and 'GetKeystroke.
Binary file added images/F3_Edit_Mode.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/Setup_Debug_Help.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/Setup_new_Overlay.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/image_debug.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit ce3700d

Please sign in to comment.