Code: Select all
#SingleInstance Force
#MaxMem, 256
#Requires AutoHotkey >=1.1.36.01 <1.2
#NoEnv
#KeyHistory 0
SetBatchLines -1
SetDefaultMouseSpeed, 3
SetWorkingDir %A_ScriptDir%
CoordMode, Pixel, Client
CoordMode, Mouse, Client
ListLines Off
global GuiStatus
global webhookLink := "yourdiscordwebhook.com"
global privateServerLink := "yourrobloxprivateserver.com"
global chosenWave := 29
global hourlySent := A_NowUTC
global alwaysOnTop := True
global webhooksEnabled := True
global webhooksScreenshots := True
if !FileExist("settings\config.ini") {
FileAppend,
(
[Links]
settings_webhookLink=yourdiscordwebhook.com
settings_privateServerLink=yourrobloxprivateserver.com
[Preferences]
settings_chosenWave=29
settings_alwaysOnTop=True
settings_webhooksEnabled=True
settings_webhooksScreenshot=True
), settings\config.ini
}
UpdateGlobals() {
IniRead, webhookLink, settings\config.ini, Links, settings_webhookLink
IniRead, privateServerLink, settings\config.ini, Links, settings_privateServerLink
IniRead, chosenWave, settings\config.ini, Preferences, settings_chosenWave
IniRead, alwaysOnTop, settings\config.ini, Preferences, settings_alwaysOnTop
IniRead, webhooksEnabled, settings\config.ini, Preferences, settings_webhooksEnabled
IniRead, webhooksScreenshots, settings\config.ini, Preferences, settings_webhooksScreenshots
}
UpdateConfig() {
Gui, Submit, NoHide
IniWrite, %webhookLink%, settings\config.ini, Links, settings_webhookLink
IniWrite, %webhookLink%, sub\webconfig.ini, Links, settings_webhookLink
IniWrite, %privateServerLink%, settings\config.ini, Links, settings_privateServerLink
IniWrite, %chosenWave%, settings\config.ini, Preferences, settings_chosenWave
IniWrite, %alwaysOnTop%, settings\config.ini, Preferences, settings_alwaysOnTop
IniWrite, %webhooksEnabled%, settings\config.ini, Preferences, settings_webhooksEnabled
IniWrite, %webhooksScreenshots%, settings\config.ini, Preferences, settings_webhooksScreenshots
}
Config() {
If (chosenWave < 20) or (chosenWave > 30) {
MsgBox Invalid wave chosen
ExitApp
}
UpdateConfig()
}
Menu, Tray, Icon, settings\icons\handsome.ico
UpdateGlobals()
Gui +Border +minsize300x100 +lastfound -MinimizeBox
If (AlwaysOnTop) {
Gui +AlwaysOnTop +Owner
}
Gui Font, s7 cDefault Norm, Tahoma
Gui Font, w800
Gui Add, Statusbar, x15 y75 w10 h60 BackgroundTrans,Status: Idle
Gui, Add, Tab, x0 y0 w215 h150 BackgroundTrans -Wrap, Status||Settings|Misc
Gui, Tab, 1
Gui Add, Button, gStop x110 y85 w80 h31, Stop (CTRL+2)
Gui Add, Button, gStart x20 y85 w80 h31, Start (CTRL+1)
Gui Add, Text, x27 y45 w159 h14 , Wave:
Gui Add, Edit, vchosenWave x25 y60 w159 h14 +0x2000, %chosenWave%
Gui Add, UpDown, Range20-30 Wrap 0x100, %chosenWave%
Gui, Tab, 2
Gui Add, Edit, vprivateServerLink x25 y25 w159 h14, %privateServerLink%
If (AlwaysOnTop) {
Gui, Add, CheckBox, valwaysOnTop -Wrap y105 x23 Checked, Always on top
} else {
Gui, Add, CheckBox, valwaysOnTop -Wrap y105 x23, Always on top
}
If (webhooksEnabled) {
Gui Add, Edit, vwebhookLink x25 y45 w159 h14, %webhookLink%
Gui, Add, CheckBox, vwebhooksEnabled -Wrap y90 x23 Checked, Webhook Enabled
} else {
Gui, Add, CheckBox, vwebhooksEnabled -Wrap y90 x23, Webhook Enabled
}
If (webhooksScreenshots) {
Gui, Add, CheckBox, vwebhooksScreenshots -Wrap y75 x23 Checked, Webhook Screenshots
} else {
Gui, Add, CheckBox, vwebhooksScreenshots -Wrap y75 x23, Webhook Screenshots
}
Gui, Tab, 3
Gui Add, Button, gResetConfig x15 y89 w80 h31, Reset Settings
Gui Add, Text, x20 y59 w150 h31, Stopwatch: (CTRL+4)
Gui Show, w210 h150 x1130 y60 NoActivate, Esc TD
ReloadGui() {
Gui, Submit, NoHide
globalVarsToCheck := ["webhooksScreenshots", "webhooksEnabled", "alwaysOnTop", "privateServerLink", "webhookLink", "chosenWave"]
For each, globalName in globalVarsToCheck {
keyToCheck := "settings_" globalName
If (globalName == "webhookLink") or (globalName == "privateServerLink") {
varSection := "Links"
} else {
varSection := "Preferences"
}
globalValue := %globalName%
IniRead, valueToCompare, settings\config.ini, %varSection%, %keyToCheck%
If (valueToCompare != globalValue) {
MsgBox, 0, this took me 2 hours to make :skull:, Reloading script to use new global variable value "%globalValue%" for global variable "%globalName%"
UpdateConfig()
Reload
}
}
Control, TabLeft , 1, SysTabControl321,
Control, Disable,, Edit1
Control, Disable,, Edit2
Control, Disable,, Edit3
Control, Disable,, Button5
Control, Disable,, Button4
Control, Disable,, Button3
Return True
}
if !FileExist("sub\webconfig.ini") {
FileAppend,
(
[Links]
settings_webhookLink=%webhookLink%
), sub\webconfig.ini
}
Reconnect() {
ScreenAndSend()
StatusLog("Disconnected")
Loop, {
If WinExist("ahk_exe RobloxPlayerBeta.exe") {
PostMessage, 0x0112, 0xF060,,, ahk_exe RobloxPlayerBeta.exe
}
WinActivate, ahk_exe Brave.exe
Send, ^{w}
Run, %privateServerLink%
Loop, 400 {
ImageSearch, erroryesX, erroryesY, 0, 0, A_ScreenWidth, A_ScreenHeight, *90 settings\images\erroryes.png
If (ErrorLevel == 0) {
MouseMove, erroryesX, erroryesY
Click, Left
}
Sleep, 500
If WinExist("ahk_exe RobloxPlayerBeta.exe") {
WinActivate, ahk_exe RobloxPlayerBeta.exe
If (CheckConnection(false)) {
ScreenAndSend()
StatusLog("Reconnection Confirmed")
Sleep, 60000
Break
}
}
}
Loop, 2 {
Sleep, 8000
; joins red team
ImageSearch, teamButtonX, teamButtonY, 0, 0, A_ScreenWidth, A_ScreenHeight, *90 settings\images\teambutton.png
If (ErrorLevel == 0) {
MouseMove, teamButtonX, teamButtonY, 8
Click, Left
Sleep, 2500
}
ImageSearch, redX, redY, 0, 0, A_ScreenWidth, A_ScreenHeight, *90 settings\images\redteam.png
If (ErrorLevel == 0) {
MouseMove, redX, redY, 8
Click, Left
Sleep, 2000
}
ImageSearch, joinTeamX, joinTeamY, 0, 0, A_ScreenWidth, A_ScreenHeight, *90 settings\images\jointeam.png
If (ErrorLevel == 0) {
MouseMove, joinTeamX, joinTeamY, 8
Click, Left
Sleep, 2000
}
ImageSearch, teamButtonX, teamButtonY, 0, 0, A_ScreenWidth, A_ScreenHeight, *90 settings\images\teambutton.png
If (ErrorLevel == 0) {
MouseMove, teamButtonX, teamButtonY, 8
Click, Left
Sleep, 2000
}
ImageSearch, savesbX, savesbY, 0, 0, A_ScreenWidth, A_ScreenHeight, *90 settings\images\savesb.png
If (ErrorLevel == 0) {
MouseMove, savesbX, savesbY, 8
Click, Left
Sleep, 3500
}
ImageSearch, savesX, savesY, 0, 0, A_ScreenWidth, A_ScreenHeight, *90 settings\images\saves.png
If (ErrorLevel == 0) {
MouseMove, savesX, savesY, 8
Click, Left
Sleep, 2000
}
ImageSearch, loadsavesX, loadsavesY, 0, 0, A_ScreenWidth, A_ScreenHeight, *90 settings\images\loadsave.png
If (ErrorLevel == 0) {
MouseMove, loadsavesX, loadsavesY, 8
Click, Left
Sleep, 2000
}
ImageSearch, savesbX, savesbY, 0, 0, A_ScreenWidth, A_ScreenHeight, *90 settings\images\savesb.png
If (ErrorLevel == 0) {
MouseMove, savesbX, savesbY, 8
Click, Left
Sleep, 2000
StatusLog("Reconnection finished")
ScreenAndSend()
Return True
}
}
}
}
; checks if you're connected to tower defense (checks for the # of cracker icon)
CheckConnection(reconnectTrue := True) {
If !WinExist("ahk_exe RobloxPlayerBeta.exe") {
Return Reconnect()
} else {
WinActivate, ahk_exe RobloxPlayerBeta.exe
}
ImageSearch,,, 0, 0, A_ScreenWidth//2, A_ScreenHeight, *90 settings\images\savesb.png
If (ErrorLevel == 0) {
Return True
}
ImageSearch,,, 0, 0, A_ScreenWidth//2, A_ScreenHeight, *90 settings\images\wavesb.png
If (ErrorLevel == 0) {
Return True
}
ImageSearch,,, 0, 0, A_ScreenWidth//2, A_ScreenHeight, *90 settings\images\connected.png
If (ErrorLevel == 0) {
Return True
} else {
If (reconnectTrue) {
Return Reconnect()
} else {
Return False
}
}
}
; releases all held keys / mouse
ReleaseHeldKeysAndMouse() {
Click, Up
For each, key in ["w","a","s","d","e", "space"] {
Send, {%key% up}
}
}
; logs the status to your webhook and updates the Gui statusbar
StatusLog(status) {
If !(webhooksEnabled) {
Return False
}
webhookStatus := status " [" A_Hour ":" A_Min ":" A_Sec "]"
SB_SetText("Status: " status)
postdata=
(
{
"embeds": [
{
"description": "%webhookStatus%",
"color": 8280002
}
]
}
)
Try {
WebRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
WebRequest.Open("POST", webhookLink, false)
WebRequest.SetRequestHeader("Content-Type", "application/json")
WebRequest.Send(postdata)
}
}
; sends a screenshot of your screen to the webhook
ScreenAndSend() {
If !(webhooksScreenshots) or !(webhooksEnabled){
Return False
}
Try
{
RunWait, sub\screenshoter.ahk
RunWait, sub\imagesender.ahk
FileDelete, screen.png
}
}
; primary function for farming waves
FarmWaves() {
ReleaseHeldKeysAndMouse()
StatusLog("Farming Started")
ScreenAndSend()
Loop, 150 {
WinActivate, ahk_exe RobloxPlayerBeta.exe
CheckConnection()
ImageSearch, erroryesX, erroryesY, 0, 0, A_ScreenWidth, A_ScreenHeight, *90 settings\images\erroryes.png
If (ErrorLevel == 0) {
MouseMove, erroryesX, erroryesY
Click, Left
Sleep, 1000
}
Send, b
Sleep, 690
ImageSearch, waveX, waveY, 0, 0, A_ScreenWidth, A_ScreenHeight//2, *90 settings\images\wave%chosenWave%.png
If (ErrorLevel == 0) {
MouseMove, waveX, waveY, 8
Sleep, 450
Click, Left
}
MouseMove, waveX, waveY, 8
Sleep, 450
Click, Left
}
StatusLog("Farming Ended")
ScreenAndSend()
}
;calculates hourly crackers, based on time spent on a specific wave, idk how to use gdip lol
HourlyStats() {
; wave : crackers amount
Sleep, 1000
StatusLog("Stopwatch Started")
crackersPerWave := {20: 0.73, 21: 0.8, 22: 0.88, 23: 0.97, 24: 1.07, 25:1.18, 26: 1.3, 27: 1.43, 28: 1.57, 29: 1.73, 30: 1.9}
wavesCracker := crackersPerWave[chosenWave]
timeStart := A_NowUTC
Loop, 6969 {
ImageSearch,,, 0, 0, A_ScreenWidth//2, A_ScreenHeight, *90 settings\images\waves.png
If (ErrorLevel == 0) {
CheckConnection()
StatusLog("Wave finished, calculating hourly")
Break
}
Sleep, 10
}
timeEnd := A_NowUTC
EnvSub, timeEnd, timeStart, Seconds
timeEnd := timeEnd - 1
wavesHour := Round(3600 / timeEnd)
crackersHour := (wavesHour * wavesCracker)
StatusLog("**Hourly Crackers**\nTotal Hourly: " crackersHour "\nWave " chosenWave " in " timeEnd " seconds")
Reload
}
;resets "config.ini", resetting all settings
Return
ResetConfig:
FileDelete, settings\config.ini
MsgBox Deleted config.ini
Reload
;timer wave
$^4::
{
Loop, 10 {
Send, b
Sleep, 690
ImageSearch, wavesX, wavesY, 0, 0, A_ScreenWidth, A_ScreenHeight//2, *90 settings\images\wave%chosenWave%.png
If (ErrorLevel == 0) {
MouseMove, wavesX, wavesY, 8
Sleep, 450
Click, Left
Break
}
}
HourlyStats()
Return
}
; hotkeys/g-labels
; start
$^1::
{
Start:
ReloadGui()
StatusLog("TD macro started")
CheckConnection()
ReleaseHeldKeysAndMouse()
Loop, {
FarmWaves()
}
}
; end script
$^2::
{
Stop:
Config()
Reload
Return
}
; force close
$^3::
{
GuiClose:
GuiEscape:
ExitApp
}
[Mod edit: Added [code][/code] tags. Please use them yourself when posting code, especially when posting such a large script!]