Improving script performance / reliability

Ask gaming related questions (AHK v1.1 and older)
escuminac
Posts: 1
Joined: 06 Jun 2023, 21:47
Contact:

Improving script performance / reliability

Post by escuminac » 06 Jun 2023, 21:52

Wondering how this script might be improved to increase performance or reliability for long term usage, particularly in the Reconnect() function

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!]

Return to “Gaming Help (v1)”