Dota 2 Helper
An objective timer tracker with audio notifications for Dota 2. This application is designed to help players keep track of important in-game events such as stacking, power runes, bounty runes, and more. The application is designed to be used in conjunction with the Game State Integration feature of Dota 2.
Support
If you find this application useful, please consider supporting me by buying me a coffee.
Platform
I do not own a Mac or Linux machine to test the application, so only Windows is supported at this time.
Features
- Timers view optimised to place over Dota 2 Game in full screen mode
- Customisable timers with intervals and reminders
- Audio effect or text to speech (tts) notifications for each timer
- Dark & light modes available
- Manual reset for dynamic objectives (e.g. Tormentors, Roshan)
- Fake timers are used when the game is not running for easy configuration
- When the game is running, the timers will automatically start based on the game time
- Game State Integration (GSI) with the click of a button when you launch the application
- Advanced settings to modify audio files and intervals with
appsettings.json
(GSI) Game State Integration
The application uses the Game State Integration feature of Dota 2 to get the game time and other information.
When you launch the application, you will need to enable the Game State Integration by clicking the Install
button on the Dota 2 Helper Configuration window.
Go to ..\steamapps\common\dota 2 beta\game\dota\cfg\gamestate_integration
:
You should be able to see a file created called gamestate_integration_dota2_helper.cfg
with the following content:
"Dota 2 Integration Configuration"
{
"uri" "http://localhost:4001/"
"timeout" "5.0"
"buffer" "0.1"
"throttle" "0.1"
"heartbeat" "1.0"
"data"
{
"provider" "0"
"map" "1"
"player" "0"
"hero" "0"
"abilities" "0"
"items" "0"
}
}
Dota2 will send the game state information to the application when the game is running on the provided URI.
This application runs a small local web server waiting for Dota2 to post the game state information to the helper app, which it uses to calculate the timers.
Valve does not seem to have dedicated GSI documentation for Dota2, but the concept and configuration is similar to Valves CSGO GSI, which is documented here.
How to?
- Download the latest release from the releases page.
- Extract the zip file to a folder.
- Run the
Dota2Helper.Desktop.exe
Advanced settings
Labels, removal of UI elements, intervals, starting times, and audio has additional customisation for advanced users
Note on the fields:
IsTts
- Text to speech
IsSoundEnabled
- Audio on or off
IsManualReset
- Manual reset for dynamic objectives
IsEnabled
- Timer on or off
First
- Starting time
Interval
- Interval between timers
Reminder
- Reminder time (i.e 15 seconds before the timer)
AudioFile
- Audio file path for effect sound if not using Text to speech
Label
- Name of the timer
Offset
- Some timers can be offset from the minute mark. This is used to adjust the timer for these cases.
Offset example:
Pulling the small camp at 0:15
and 0:45
is a common strategy in Dota 2. To set up a timer for this, you would set the First
to 02:00
, the Interval
to 00:30
, and the Reminder
to 00:15
. The Offset
would be -00:15
to adjust the timer to 0:15
and 0:45
.
appsettings.json
```json
{
"DotaTimers": [
{
"Label": "Stack",
"First": "02:00",
"Interval": "01:00",
"Reminder": "00:15",
"AudioFile": "audio/Stack.mp3",
"IsManualReset": false,
"IsEnabled": true,
"IsTts": false,
"IsSoundEnabled": true
},
{
"Label": "Pull",
"First": "02:00",
"Interval": "00:30",
"Offset": "-00:15",
"Reminder": "00:15",
"AudioFile": "audio/Stack.mp3",
"IsManualReset": false,
"IsEnabled": true,
"IsTts": false,
"IsSoundEnabled": true
},
{
"Label": "Wisdom",
"First": "07:00",
"Interval": "07:00",
"Reminder": "00:45",
"AudioFile": "audio/Wisdom.mp3",
"IsManualReset": false,
"IsEnabled": true,
"IsTts": false,
"IsSoundEnabled": true
},
{
"Label": "Bounty",
"First": "00:00",
"Interval": "03:00",
"Reminder": "00:20",
"AudioFile": "audio/Bounty.mp3",
"IsManualReset": false,
"IsEnabled": true,
"IsTts": false,
"IsSoundEnabled": true
},
{
"Label": "Power",
"First": "06:00",
"Interval": "06:00",
"Reminder": "00:20",
"AudioFile": "audio/Power.mp3",
"IsManualReset": false,
"IsEnabled": true,
"IsTts": false,
"IsSoundEnabled": true
},
{
"Label": "Lotus",
"First": "03:00",
"Interval": "03:00",
"Reminder": "00:15",
"AudioFile": "audio/Lotus.mp3",
"IsManualReset": false,
"IsEnabled": true,
"IsTts": false,
"IsSoundEnabled": true
},
{
"Label": "Tormentor (R)",
"First": "20:00",
"Interval": "10:00",
"Reminder": "00:45",
"AudioFile": "audio/Tormentor.mp3",
"IsManualReset": true,
"IsEnabled": true,
"IsTts": false,
"IsSoundEnabled": true
},
{
"Label": "Tormentor (D)",
"First": "20:00",
"Interval": "10:00",
"Reminder": "00:45",
"AudioFile": "audio/Tormentor.mp3",
"IsManualReset": true,
"IsEnabled": true,
"IsTts": false,
"IsSoundEnabled": true
},
{
"Label": "Roshan",
"First": "11:00",
"Interval": "11:00",
"Reminder": "03:00",
"AudioFile": "audio/Roshan.mp3",
"IsManualReset": true,
"IsEnabled": false,
"IsTts": false,
"IsSoundEnabled": true
},
{
"Label": "Catapult",
"First": "05:00",
"Interval": "05:00",
"Reminder": "00:30",
"AudioFile": "audio/Catapult.mp3",
"IsManualReset": false,
"IsEnabled": false,
"IsTts": false,
"IsSoundEnabled": true
}
]
}
```
UI Preview
Preview
![preview](./screenshots/preview.gif)
Screenshots
![settings](./screenshots/Settings.png)
![theme](./screenshots/Theme.png)
![timers](./screenshots/Timers.png)
![timers2](./screenshots/Timers2.png)