;------------------------------------------------ ;--------------Smorg's PotBot V3.1--------------- ;------------------------------------------------ ;www.mmbot.net ;#NoTrayIcon ;Comment for tests, Uncomment for bot use WinActivate("Diablo II") ;Comment for bot use, Uncomment for tests WinMove("Diablo II", "", 0, 0) ;Optional opt("OnExitFunc", "OnAutoItExit") opt("PixelCoordMode", 2) opt("MouseCoordMode", 2) opt("ColorMode", 1) #Include $TotalTime = TimerInit() ;------------------------------------------------ $DrinkExcess = "Yes" ;Drinks any non-rejuv pots in the belt, if present. Set to "No" to disable this check (not recomended) $MouseSpeed = 0 ;Duh $MouseDelay = 50 ;delay after each mouse movment and before each mouseclick. increase if first click fails. $ClickDelay = 50 ;delay before lag scan starts in order to limit bot speed slightly $DrinkCheckDelay = 0 ;time to sleep between drink lag checks $MaxLag = 1000 ;amount of time to wait for pot to drink before retry (milliseconds) $ScreenTimeout = 1000 ;timeout for all screen open and close checks (milliseconds) $MaxRetries = 10 ;number of times to retry upon failed to drink, and menu open/closes $check = 0 ;potion pixelchecksum $frj = 0 ;frjs in invantory $rj = 0 ;regular rejuvs in invantory $beltfrj = 0 ;frjs in belt $beltrj = 0 ;regular rejuvs in belt $beltNum = 0 ;total potions in belt $ChickenTimeout = 1000 ;Time to wait for sucessful chicken before retrying $ChickenRetries = 3 ;Times to retry chicken Dim $invArray[4][10] ;the inventory array data. 0 = no pot, 1 = full rejuv pot, 2 = regular rejuv pot Dim $beltArray[4][4] ;the belt array data. 0 = no pot, 1 = full rejuv pot, 2 = regular rejuv pot $beltfrjchecksum = 713163619 ;belt checksum for full rejuvs $beltrjchecksum = 1805125736 ;belt checksum for regular rejuvs $invfrjchecksum = 853607181 ;inventory full rejuv checksum $invrjchecksum = 1757546291 ;inventory regular rejuv checksum $invscreenchecksum = 657791128 ;inventory screen check. coords are: 750, 40, 760, 50, resolution 2 $InvScreenBeltSum = 372771323 ;checks the belt is open over the inventory. coords: 500, 500, 510, 510, resolution 2 $BeltStartX = 437 ;Starting points for upper left inventory and belt squares $BeltStartY = 486 $InvStartX = 432 $InvStartY = 335 Dim $DrinkSuccess ;returns weather or not the drink was a success Dim $Type ;type of inventory click. "Left" = send pot to belt, "Right" = Drink pot. Global $BotDir ;------------------------------------------------ MouseMove(100, 100, $MouseSpeed) $CurrentDir = StringSplit(@ScriptDir, "\") _ArrayPop($CurrentDir) $BotDir = $CurrentDir[1] For $Rebuild = 2 to ($CurrentDir[0] - 1) $BotDir = $BotDir & "\" & $CurrentDir[$Rebuild] Next LogEvent("PotBot script Launched") $KEY_ClearScreen = IniRead($BotDir & "\Config\mm.BOT.ini", "Character", "Char_Key_ClearScreen", "") $KEY_ClearScreen = "{" & $KEY_ClearScreen & "}" $KEY_Inventory = IniRead($BotDir & "\Config\mm.BOT.ini", "Character", "Char_Key_Inventory", "") $KEY_Belt = IniRead($BotDir & "\Config\mm.BOT.ini", "Character", "Char_Key_ShowBelt", "") $KEY_Belt = "{" & $KEY_Belt & "}" ;CHECK IF MINIPANEL IS OPEN (Required) If (PixelGetColor(481, 535) <> 5406092) OR (PixelGetColor(320, 537) <> 6521492) Then MouseClick("Left", 400, 575, 1, 0) MouseMove(100, 100, $MouseSpeed) ;OPEN THE BELT & INVENTORY For $Retry = 1 to $MaxRetries If $Retry = $MaxRetries Then LogEvent("Max Retries reached. Chickening...") Chicken() Exit(0) EndIf Send($KEY_Belt) Send($KEY_Inventory) $Timeout = TimerInit() While 1 If PixelChecksum(750, 40, 760, 50, 2) = $InvScreenChecksum Then ExitLoop ElseIf TimerDiff($Timeout) > $ScreenTimeout Then If CloseInv() = 1 Then Chicken() Exit(0) EndIf Sleep(100) LogEvent("Failed to open the Inventory, Retrying. Retry #: " & $Retry) ContinueLoop 2 EndIf Sleep(100) WEnd $Timeout = TimerInit() While TimerDiff($Timeout) < $ScreenTimeout If PixelChecksum(500, 500, 510, 510, 2) <> $InvScreenBeltSum Then ExitLoop 2 Sleep(100) WEnd Send($Key_ClearScreen) Sleep(100) LogEvent("Failed to open the Belt, Retrying. Retry #: " & $Retry) Next ;------------------------------------------------ If $DrinkExcess <> "No" Then If DrinkPots() = 1 Then LogEvent("Failed to drink a pot while drinking non rejuves in belt slot (" & $row & ", " & $col & ")") CloseInv() Chicken() Exit(0) EndIf EndIf ;GENERATE BELT ARRAY For $row = 0 To 3 For $col = 0 To 3 $check = PixelChecksum(($BeltStartX - 1) + (31 * $col) , ($BeltStartY - 1) + ($row * 32) , ($BeltStartX + 1) + (31 * $col) , ($BeltStartY + 1) + ($row * 32), 1) If $check = $beltfrjchecksum Then $beltArray[$row][$col] = 1 $beltfrj = $beltfrj + 1 ElseIf $check = $beltrjchecksum Then $beltArray[$row][$col] = 2 $beltrj = $beltrj + 1 Else $beltArray[$row][$col] = 0 EndIf Next Next ;GENERATE INVENTORY ARRAY For $row = 0 To 3 For $col = 0 To 9 $check = PixelChecksum(($InvStartX - 1) + ($col * 29) , ($InvStartY - 1) + ($row * 29) , ($InvStartX + 1) + ($col * 29) , ($InvStartY + 1) + ($row * 29), 1) If $check = $invfrjchecksum Then $invArray[$row][$col] = 1 $frj = $frj + 1 ElseIf $check = $invrjchecksum Then $invArray[$row][$col] = 2 $rj = $rj + 1 Else $invArray[$row][$col] = 0 EndIf Next Next $beltfree = 16 - ($beltfrj + $beltrj) ;16 - sum of belt pots = free belt spaces. $beltdrink = $frj - $beltfree ;available frjs in inventory - belt freespaces = max # of belt rjs to drink & replace. ;LOG BELT $LogFile = FileOpen($BotDir & "\Logs\LifeCheck.txt", 1) FileWriteLine($LogFile, @CRLF & "== Belt: ==") For $row = 0 To 3 For $col = 0 To 3 Select Case $BeltArray[$row][$col] = 1 FileWrite($LogFile, "F ") Case $BeltArray[$row][$col] = 2 FileWrite($LogFile, "R ") Case Else FileWrite($LogFile, "E ") EndSelect Next FileWrite($LogFile, @CRLF) Next ;LOG INVENTORY FileWriteLine($LogFile, @CRLF & "== Inventory: ==") For $row = 0 To 3 For $col = 0 To 9 Select Case $InvArray[$row][$col] = 1 FileWrite($LogFile, "F ") Case $InvArray[$row][$col] = 2 FileWrite($LogFile, "R ") Case Else FileWrite($LogFile, "E ") EndSelect Next FileWrite($LogFile, @CRLF) Next FileWrite($LogFile, @CRLF) FileClose($LogFile) ;DRINK EXCESS BELT REJUVS For $row = 0 To 3 For $col = 0 To 3 If $beltdrink <= 0 Then ExitLoop 2 If $beltArray[$row][$col] = 2 Then If BeltClick($col, $row) = 1 Then $beltdrink = $beltdrink - 1 $beltfree = $beltfree + 1 Else CloseInv() LogEvent("Failed to drink a pot while drinking excess belt rejuvs at belt slot (" & $row & ", " & $col & ")") Chicken() Exit(0) EndIf EndIf Next Next ;SEND INVENTORY FRJS TO BELT For $row = 0 To 3 For $col = 0 To 9 If $beltfree <= 0 Then ExitLoop 2 If $invArray[$row][$col] = 1 Then If InvClick("Left", $col, $row) = 1 Then $invArray[$row][$col] = 0 $frj = $frj - 1 $beltfree = $beltfree - 1 Else CloseInv() LogEvent("Failed to drink a pot while sending inventory FRJs to belt at inventory slot (" & $row & ", " & $col & ")") Chicken() Exit(0) EndIf EndIf Next Next ;SEND INVENTORY REJUVS TO BELT For $row = 0 To 3 For $col = 0 To 9 If $beltfree <= 0 Then ExitLoop 2 If $invArray[$row][$col] = 2 Then If InvClick("Left", $col, $row) = 1 Then $invArray[$row][$col] = 0 $rj = $rj - 1 $beltfree = $beltfree - 1 Else CloseInv() LogEvent("Failed to drink a pot while sending inventory regular rejuves to belt at inventory slot (" & $row & ", " & $col & ")") Chicken() Exit(0) EndIf EndIf Next Next ;DRINK ALL EXCESS INVENTORY POTS For $row = 0 To 3 For $col = 0 To 9 If $invArray[$row][$col] <> 0 Then If InvClick("Right", $col, $row) = 0 Then CloseInv() LogEvent("Failed to drink an excess pot at inventory slot (" & $row & ", " & $col & ")") Chicken() Exit(0) EndIf EndIf Next Next If CloseInv() = 1 Then Chicken() Exit(0) EndIf LogEvent("Finished! PotBot took " & Round(TimerDiff($TotalTime)/1000, 2) & " seconds.") Exit(1) ;------------------------------------------------ Func CloseInv() For $Retry = 1 To $MaxRetries Send($KEY_ClearScreen) $timeout = TimerInit() While 1 If PixelChecksum(750, 40, 760, 50, 2) <> $invscreenchecksum Then Return 0 ElseIf TimerDiff($timeout) > $ScreenTimeout Then ExitLoop EndIf Sleep(100) WEnd LogEvent("Failed to close inventory, Retry# " & $Retry) Next LogEvent("Cannot close the inventory, Ensure your ClearScreen key is correct.") Return 1 EndFunc Func BeltClick($col, $row) Local $DrinkFlag = 0 For $Retry = 1 To $MaxRetries MouseMove($BeltStartX + ($col * 31), $BeltStartY + ($row * 32), $MouseSpeed) Sleep($MouseDelay) $PotRef = PixelGetColor($BeltStartX + ($col * 31) - 3, $BeltStartY + ($row * 32) - 3) MouseClick("Right") Sleep($ClickDelay) $TimeStart = TimerInit() While TimerDiff($TimeStart) < $MaxLag If PixelGetColor($BeltStartX + ($col * 31) - 3, $BeltStartY + ($row * 32) - 3) <> $PotRef Then $DrinkFlag = 1 ExitLoop 2 EndIf Sleep($DrinkCheckDelay) WEnd LogEvent("Failed to click belt pot, Retry# " & $Retry) Next Return $DrinkFlag EndFunc Func InvClick($Type, $col, $row) Local $DrinkFlag = 0 If $Type = "Left" Then Send("{ShiftDown}") For $Retry = 1 To $MaxRetries MouseMove($InvStartX + ($col * 29), $InvStartY + ($row * 29), $MouseSpeed) Sleep($MouseDelay) $PotRef = PixelGetColor($InvStartX + ($col * 29) - 3, $InvStartY + ($row * 29) - 3) If $Type = "Left" Then MouseClick("left") Else MouseClick("Right") EndIf Sleep($ClickDelay) $TimeStart = TimerInit() While TimerDiff($TimeStart) < $MaxLag If PixelGetColor($InvStartX + ($col * 29) - 3, $InvStartY + ($row * 29) - 3) <> $PotRef Then $DrinkFlag = 1 ExitLoop 2 EndIf Sleep($DrinkCheckDelay) WEnd LogEvent("Failed to click inventory pot, Retry# " & $Retry) Next If $Type = "Left" Then Send("{ShiftUp}") Return $DrinkFlag EndFunc Func DrinkPots() Local $a = 0 For $row = 0 To 3 For $col = 0 To 3 $Mana = PixelSearch(($BeltStartX - 10) + ($col * 31) , ($BeltStartY - 10) + ($row * 32) , ($BeltStartX + 10) + ($col * 31) , ($BeltStartY + 10) + ($row * 32), 9711665, 0, 1) ;Mana $Healing = PixelSearch(($BeltStartX - 10) + ($col * 31) , ($BeltStartY - 10) + ($row * 32) , ($BeltStartX + 10) + ($col * 31) , ($BeltStartY + 10) + ($row * 32), 148, 0, 1) ;Healing If IsArray($Mana) Or IsArray($Healing) Then If BeltClick($col, $row) = 1 Then LogEvent("Drank a Healing or Mana pot in belt slot (" & $row & ", " & $col & ")") $a = 1 Else Return 1 EndIf EndIf Next Next If $a = 1 Then MouseMove(100, 100, $MouseSpeed) Sleep(200) Return 0 EndIf Return 0 EndFunc Func Chicken() For $Retries = 1 To $ChickenRetries Send($KEY_ClearScreen) MouseUp("Right") MouseUp("Left") Send("{ESC}") $Timeout = TimerInit() While 1 If (PixelGetColor(481, 535) <> 5406092) AND (PixelGetColor(320, 537) <> 6521492) Then ExitLoop ElseIf TimerDiff($Timeout) > 500 Then LogEvent("Failed to open the main menu, will retry... Retry # " & $Retries) ContinueLoop 2 EndIf Sleep(100) WEnd MouseClick("Left", 400, 280, 1, 0) $Timeout = TimerInit() While TimerDiff($Timeout) < $ChickenTimeout If (PixelGetColor(600, 575) <> 6512995) AND (PixelGetColor(5, 575) <> 2697257) Then ExitLoop 2 Sleep(100) WEnd If $Retries >= $ChickenRetries Then LogEvent("Max Retries exceeded, Will terminate the Game.exe process") ProcessClose("Game.exe") Else LogEvent("Failed to chicken, Will retry the chicken...") EndIf Next LogEvent("Chicken was a success! Your ass has been saved by PotThread(tm), gib Smorg a dollar! ^^") EndFunc ;==>Chicken Func LogEvent($String) $LogFile = FileOpen($BotDir & "\Logs\LifeCheck.txt", 1) FileWriteLine($LogFile, @MON & "/" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & " [P]> " & $String) FileClose($LogFile) EndFunc Func OnAutoItExit() MouseUp("Right") MouseUp("Left") Send("{ShiftUp}") EndFunc ;------------------------------------------------