Code:
HotKeySet("{ESC}", "_exit")
AutoItSetOption("TrayIconHide", 1)
Global $PROG, $STATUS, $N1, $N2, $N3, $TIMPC, $NN, $CURSE
Func NOTEAZA($FTEXT)
$FILE = FileOpen("drag bot.log", 1)
FileWriteLine($FILE, $FTEXT)
FileClose($FILE)
EndFunc
Func ASTEAPTA($WIN, $XX, $YY, $COL, $TT)
WinActivate($WIN)
WinWaitActive($WIN)
$NP = WinGetPos($WIN)
$TT = 10 * $TT
For $II = 1 To $TT
GUICtrlSetData($PROG, $II / $TT * 100)
$NP = WinGetPos($WIN)
If PixelGetColor($NP[0] + $XX, $NP[1] + $YY) == $COL Then Return 0
Sleep(100)
Next
Return 1
EndFunc
Func DACLIC($WIN, $XX, $YY, $SILC)
If $SILC Then
ControlClick($WIN, "", "", "left", 1, $XX - 8, $YY - 30)
Else
WinActivate($WIN)
WinWaitActive($WIN)
$WP = WinGetPos($WIN)
MouseClick("left", $XX + $WP[0], $YY + $WP[1])
EndIf
EndFunc
Func F5($WIN)
WinActivate($WIN)
Send("{F5 DOWN}")
Sleep(10)
Send("{F5 UP}")
ControlSend($WIN, "", "", "mm")
EndFunc
Func F9($WIN)
WinActivate($WIN)
Sleep(100)
Send("{F9 DOWN}")
Sleep(10)
Send("{F9 UP}")
ControlSend($WIN, "", "", "mm")
EndFunc
Func SETST($TEXTS)
GUICtrlSetData($STATUS, $TEXTS)
EndFunc
Func ACCEPTINV($WIN)
If ASTEAPTA($WIN, 263, 371, 8948360, 15) Then FINAL("Error: accept race invitation")
DACLIC($WIN, 263, 371, 1)
Sleep(50)
If Not ASTEAPTA($WIN, 263, 371, 8948360, 0.1) Then DACLIC($WIN, 263, 371, 0)
EndFunc
Func LEAVEG($WIN)
SETST("Leave lobby (" & $WIN & ")")
If ASTEAPTA($WIN, 696, 587, 16119285, 5) Then FINAL("Error: leave lobby")
DACLIC($WIN, 685, 586, 1)
Sleep(50)
If Not ASTEAPTA($WIN, 696, 587, 16119285, 0.1) Then DACLIC($WIN, 685, 586, 0)
EndFunc
Func NEXTW($WIN)
SETST("Next (" & $WIN & ")")
DACLIC($WIN, 712, 507, 1)
EndFunc
Func SELECARD($WIN)
SETST("Reward card (" & $WIN & ")")
DACLIC($WIN, 390, 316, 1)
EndFunc
Func SENDINV($WIN)
WinActivate($WIN)
WinWaitActive($WIN, "", 5)
Sleep(100)
ControlSend($WIN, "", "", "\")
Sleep(50)
ControlSend($WIN, "", "", "p")
If ASTEAPTA($WIN, 514, 359, 16185078, 15) Then FINAL("Error: sending invitation")
DACLIC($WIN, 514, 359, 1)
EndFunc
Func ENTL($WIN)
DACLIC($WIN, 722, 342, 0)
EndFunc
Func TIMP($SEC)
For $I = $SEC To 0 Step -0.1
GUICtrlSetData($PROG, $I / $SEC * 100)
Sleep(100)
Next
EndFunc
Func ASTNEXT($WIN)
SETST("Waiting to finish")
If ASTEAPTA($WIN, 728, 506, 14737888, 35) Then FINAL("Error: next button")
EndFunc
Func ASTFNCURSA($WIN)
SETST("Waiting to start")
If ASTEAPTA($WIN, 793, 45, 7967863, 55) Then FINAL("Error: race dind't start")
EndFunc
Func RULEAZA()
$BEGIN = TimerInit()
SETST("")
WinActivate($N3)
WinWaitActive($N3)
SETST("Sending invitation")
SENDINV($N3)
ENTL($N3)
$BEGIN2 = TimerInit()
TIMP(1)
ACCEPTINV($N1)
F5($N1)
ACCEPTINV($N2)
F5($N2)
SETST("Wainting in lobby ...")
WinActivate($N3)
Do
Sleep(100)
$LB = TimerDiff($BEGIN2) / 1000
GUICtrlSetData($PROG, 100 - ($LB * 4.35))
Until $LB > 21
LEAVEG($N3)
WinActivate($N2)
ASTFNCURSA($N1)
SETST("Waiting to race")
TIMP(15)
ASTNEXT($N1)
F5($N1)
NEXTW($N1)
TIMP(1)
NEXTW($N1)
TIMP(1)
NEXTW($N1)
NEXTW($N2)
TIMP(1)
SELECARD($N1)
NEXTW($N2)
TIMP(1)
NEXTW($N1)
NEXTW($N2)
TIMP(1)
SELECARD($N2)
F5($N2)
TIMP(1)
NEXTW($N2)
TIMP(1)
LEAVEG($N1)
LEAVEG($N2)
$DIFF = Round(TimerDiff($BEGIN) / 1000)
GUICtrlSetData($TIMPC, $DIFF & " s")
EndFunc
Func FINAL($TFINAL)
$HBMP = _ScreenCapture_Capture("")
_ScreenCapture_SaveImage("drag_bot_" & @YEAR & "_" & @MON & "_" & @MDAY & "__" & @HOUR & "_" & @MIN & ".jpg", $HBMP)
NOTEAZA($TFINAL)
$ERR = MsgBox(48, "NFSW", $TFINAL, $NN)
If $ERR == -1 Then
Shutdown(13)
EndIf
_EXIT()
EndFunc
Func _EXIT()
NOTEAZA("Number of races played: " & $CURSE)
NOTEAZA("Bot was closed at " & @HOUR & ":" & @MIN)
Exit
EndFunc
GUICreate("Drag bot", 275, 60, 0, 0)
$STATUS = GUICtrlCreateLabel("Nfsw bot", 10, 10, 200, 15)
$PROG = GUICtrlCreateProgress(10, 30, 100, 20)
$CURSA = GUICtrlCreateLabel("Race", 120, 32, 100, 30)
$TIMPC = GUICtrlCreateLabel("0 sec", 240, 32, 50, 30)
GUISetState(@SW_SHOW)
Opt("GUIOnEventMode", 1)
GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
$NFSW = 0
$N1 = 0
$N2 = 0
$N3 = 0
$NR = 0
While $NR < 3
If WinExists("NEED FOR SPEED™ WORLD") Then
$NFSW = WinList("NEED FOR SPEED™ WORLD")
$NR = $NFSW[0][0]
EndIf
If $NR < 3 Then MsgBox(0, "Attention", "Start 3 instances of NEED FOR SPEED™ WORLD with GMZ hack")
WEnd
$XX = Round((@DesktopWidth - 816) / 2)
$YY = Round((@DesktopHeight - 680) / 2)
$N1 = $NFSW[1][1]
$N2 = $NFSW[2][1]
$N3 = $NFSW[3][1]
WinMove($N1, "", $XX, $YY)
WinMove($N2, "", $XX, $YY)
WinMove($N3, "", $XX, $YY)
Dim $JUC[4] = [0, 0, 0, 0]
For $I = 1 To $NFSW[0][0]
WinActivate($NFSW[$I][1])
Sleep(1000)
$IES = 0
While $IES == 0
If ($JUC[1] * $JUC[2]) And $JUC[3] = 0 Then
$JUC[3] = 1
$N3 = $NFSW[$I][1]
EndIf
If ($JUC[1] * $JUC[3]) And $JUC[2] = 0 Then
$JUC[2] = 1
$N2 = $NFSW[$I][1]
EndIf
If ($JUC[3] * $JUC[2]) And $JUC[1] = 0 Then
$JUC[1] = 1
$N1 = $NFSW[$I][1]
EndIf
If ($JUC[1] + $IES) < 1 Then
If MsgBox(262180, "Set 1st place", "This player (" & $NFSW[$I][1] & ") have the best car (winner)?") == 6 Then
$JUC[1] = 1
$N1 = $NFSW[$I][1]
$IES = 1
EndIf
EndIf
If ($JUC[2] + $IES) < 1 Then
If MsgBox(262180, "Set 2nd place", "This player (" & $NFSW[$I][1] & ") have weaker car (must arrive after no more than 2.5 seconds!)?") == 6 Then
$JUC[2] = 1
$N2 = $NFSW[$I][1]
$IES = 1
EndIf
EndIf
If ($JUC[3] + $IES) < 1 Then
If MsgBox(262180, "Set the host", "This player (" & $NFSW[$I][1] & ") will send the invitations?") == 6 Then
$JUC[3] = 1
$N3 = $NFSW[$I][1]
$IES = 1
EndIf
EndIf
If ($JUC[1] * $JUC[2] * $JUC[3]) > 0 Then $IES = 1
WEnd
Next
WinActivate($N3)
MsgBox(262144, "Drag bot", "Teleport the host to a drag location (ex. Rockport Turnpike) and after press OK")
WinMove($N1, "", 0, 100)
WinMove($N2, "", @DesktopWidth - 816, 0)
WinMove($N3, "", @DesktopWidth - 816, @DesktopHeight - 680)
NOTEAZA("")
NOTEAZA(@YEAR & "." & @MON & "." & @MDAY & " " & @HOUR & ":" & @MIN & " Bot was started")
If $NN == "" Then $NN = 100
For $CURSE = 0 To 1000
GUICtrlSetData($CURSA, "Race nr.: " & $CURSE)
RULEAZA()
Next
GUIDelete()
$ERR = MsgBox(48, "NFSW", "End", $NN)
If $ERR == -1 Then
Shutdown(13)
EndIf