All pastes #571384 Raw Edit

Anonymous

public text v1 · immutable
·published 2007-06-17 03:37 UTC
rendered paste body
;------------------------------------------------ 
;--------------------PotThread------------------- 
;------------------------------------------------ 
;Scripts & Design by Smorg 
;www.mmbot.net 
;Version 5.0 
;------------------------------------------------ 
;#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")                   ;Requires AutoIt 3.2.0 + 
opt("PixelCoordMode", 2) 
opt("MouseCoordMode", 2) 
opt("ColorMode", 1) 
#Include <Array.au3> 
;------------------------------------------------ 
;Special string logic function to move up the folter tree. 
$CurrentDir = StringSplit(@ScriptDir, "\") 
_ArrayPop($CurrentDir) 
$BotDir = $CurrentDir[1] 

For $Rebuild = 2 to ($CurrentDir[0] - 1) 
   $BotDir = $BotDir & "\" & $CurrentDir[$Rebuild] 
Next 
;------------------------------------------------ 
;Internal Vars 
LogEvent(0, "---------------------------------------------") 
LogEvent(0, "PotThread Launched, Loading vars & Pixel Data") 
LogEvent(0, "---------------------------------------------") 
$ExtraDebug = "Yes"                                 ;Show Extra pixel info, for debugging purposes only 
$Top = 509                                          ;Top of the health/mana orbs 
$Bottom = 587                                       ;Bottom of the health/mana orbs 
$HealthX = 0                                        ;Xcoord to scan the health orb 
$ManaX = 799                                        ;Xcoord to scan the mana orb 
$BeltX = 437                                        ;Left Belt Slot pixel reference 
$BeltY = 582                                        ;Left Belt Slot pixel reference 
$MercBarLeft = 15                                   ;Left side of the merc bar 
$MercBarRight = 60                                  ;Right side of the merc bar 
$MercBarY = 18                                      ;Merc bar Y coord 
$beltfrjchecksum = 713163619                        ;belt checksum for full rejuvs 
$beltrjchecksum = 1805125736                        ;belt checksum for regular rejuvs 
$ChickenTimeout = 1000                              ;Time to wait for sucessful chicken before retrying 
$ChickenRetries = 3                                 ;Times to retry chicken 
$LifeBarColor = 11519                               ;Life bar color 
$ManaBarColor = 14573857                            ;Mana bar color 
Global $Char_Key_PotionsRow[5]                      ;Potion drink keys 
Global $BeltData[4]                                 ;Potions info. 0 = no pot, 1 = full rejuv pot, 2 = regular rejuv pot 
Dim $HealthPixel = $Top                             ;Current Health Pixel y coord 
Dim $ManaPixel = $Top                               ;Current Mana Pixel y coord 
Dim $MercPixel = $MercBarRight                      ;Current merc bar pixel 
Dim $Timer = 0                                      ;Timer flag, weather or not the drink timer is active 
Dim $LifePercent 
Dim $ManaPercent 
Dim $MercPercent 
Dim $Sleep 
;------------------------------------------------ 
;Importing Vars 
$Char_Key_PotionsRow[1] = IniRead($BotDir & "\Config\mm.BOT.ini", "Character", "Char_Key_PotionsRow1", "") 
$Char_Key_PotionsRow[2] = IniRead($BotDir & "\Config\mm.BOT.ini", "Character", "Char_Key_PotionsRow2", "") 
$Char_Key_PotionsRow[3] = IniRead($BotDir & "\Config\mm.BOT.ini", "Character", "Char_Key_PotionsRow3", "") 
$Char_Key_PotionsRow[4] = IniRead($BotDir & "\Config\mm.BOT.ini", "Character", "Char_Key_PotionsRow4", "") 
$PauseBot = IniRead($BotDir & "\Config\mm.BOT.ini", "Advanced Settings", "Bot_PAUSE_HotKey", "") 
$PauseBot = "{" & $PauseBot & "}" 
$ClearScreen = IniRead($BotDir & "\Config\mm.BOT.ini", "Character", "Char_Key_ClearScreen", "") 
$ClearScreen = "{" & $ClearScreen & "}" 
$D2WinTitle = IniRead($BotDir & "\Config\mm.BOT.ini", "Advanced Settings", "D2_WName", "") 
$LifeRpotDrinkPercent = IniRead($BotDir & "\Config\mm.LifeCheck.ini", "Settings", "Rpot_Life_Percent", "") 
$LifeFpotDrinkPercent = IniRead($BotDir & "\Config\mm.LifeCheck.ini", "Settings", "FRJ_Life_Percent", "") 
$ManaRpotDrinkPercent = IniRead($BotDir & "\Config\mm.LifeCheck.ini", "Settings", "Rpot_Mana_Percent", "") 
$ManaFpotDrinkPercent = IniRead($BotDir & "\Config\mm.LifeCheck.ini", "Settings", "FRJ_Mana_Percent", "") 
$ChickenPercent = IniRead($BotDir & "\Config\mm.LifeCheck.ini", "Settings", "Chicken_Percent", "") 
$ChickenMana = IniRead($BotDir & "\Config\mm.LifeCheck.ini", "Settings", "Chicken_Mana", "") 
$ScanDelay = IniRead($BotDir & "\Config\mm.LifeCheck.ini", "Settings", "Scan_Delay", "") 
$DrinkDelay = IniRead($BotDir & "\Config\mm.LifeCheck.ini", "Settings", "Drink_Delay", "") 
$ChickenWaitDelay = IniRead($BotDir & "\Config\mm.LifeCheck.ini", "Settings", "Chicken_Wait_Delay", "") 
$MaxLife = IniRead($BotDir & "\Config\mm.LifeCheck.ini", "Settings", "Max_Life", "") 
$MaxMana = IniRead($BotDir & "\Config\mm.LifeCheck.ini", "Settings", "Max_Mana", "") 
$UseMerc = IniRead($BotDir & "\Config\mm.LifeCheck.ini", "Merc", "Use_Merc", "") 
$MercChicken = IniRead($BotDir & "\Config\mm.LifeCheck.ini", "Merc", "Merc_Chicken", "") 
$MercHealPercent = IniRead($BotDir & "\Config\mm.LifeCheck.ini", "Merc", "Merc_Heal_Percent", "") 
$MercChickenPercent = IniRead($BotDir & "\Config\mm.LifeCheck.ini", "Merc", "Merc_Chicken_Percent", "") 

;Get base stats 
If $UseMerc = "No" Then $MercPercent = "None" 
SuspendCheck() 
;ChickenWait() 
GetBaseStats($HealthPixel, $ManaPixel, $MercPixel, $LifePercent, $ManaPercent) 
LogEvent(0, "Base Stats loading Successful! Begining main loop check...") 
LogEvent(0, "HealthPixel = " & $HealthPixel & ", ManaPixel = " & $ManaPixel & ", Top = " & $Top) 
ShowTip() 
;------------------------------------------------ 
While 1 
   Sleep($ScanDelay) 
   ;Pause if not in game 
   If PixelGetColor(481, 535) <> 5406092 Then 
      If (PixelGetColor(320, 537) <> 6521492) OR (WinActive($D2WinTitle) = 0) Then 
         SuspendCheck() 
      EndIf 
   EndIf 
    
   ;Check if life has moved either up or down 
   If PixelGetColor($HealthX, $HealthPixel) <> $LifeBarColor Then 
      GetLife("down", $HealthPixel, $LifePercent, $Timer) 
   ElseIf $HealthPixel <> $Top Then 
      If PixelGetColor($HealthX, $HealthPixel - 1) = $LifeBarColor Then GetLife("up", $HealthPixel, $LifePercent, $Timer) 
   EndIf 
    
   ;Check if mana has moved either up or down 
   If PixelGetColor($ManaX, $ManaPixel) <> $ManaBarColor Then 
      GetMana("down", $ManaPixel, $ManaPercent, $Timer) 
   ElseIf $ManaPixel <> $Top Then 
      If PixelGetColor($ManaX, $ManaPixel - 1) = $ManaBarColor Then GetMana("up", $ManaPixel, $ManaPercent, $Timer) 
   EndIf 
    
   ;Check if merc's life has changed & merc chicken check 
   If $UseMerc = "Yes" Then 
      If PixelGetColor($MercPixel, $MercBarY) = 0 Then 
         GetMerc("down", $MercPixel, $MercPercent, $Timer) 
      ElseIf $MercPixel <> $MercBarRight Then 
         If PixelGetColor($MercPixel + 1, $MercBarY) <> 0 Then GetMerc("up", $MercPixel, $MercPercent, $Timer) 
      EndIf 
   EndIf 
WEnd 
;------------------------------------------------ 
Func GetLife($Direction, ByRef $HealthPixel, ByRef $LifePercent, ByRef $Timer) 
   Select 
      Case $Direction = "up" 
         For $Search = $HealthPixel To $Top Step - 1 
            If (PixelGetColor($HealthX, $Search) <> $LifeBarColor) Or $Search = $Top Then 
               $LifePercent = Round(100 * (($Bottom - $Top) - ($Search - $Top)) / ($Bottom - $Top)) 
                  $HealthPixel = $Search 
               ExitLoop 
            EndIf 
         Next 
      Case $Direction = "down" 
         For $Search = $HealthPixel To $Bottom 
            If (PixelGetColor($HealthX, $Search) = $LifeBarColor) Or $Search = $Bottom Then 
               $LifePercent = Round(100 * (($Bottom - $Top) - ($Search - $Top)) / ($Bottom - $Top)) 
                  $HealthPixel = $Search 
               ExitLoop 
            EndIf 
         Next 
   EndSelect 
   ShowTip() 
   If $Timer = 1 Then 
      If TimerDiff($Sleep) > $DrinkDelay Then $Timer = 0 
   EndIf 
   If $Timer = 0 Then 
      If ($LifePercent < $LifeRpotDrinkPercent) And ($LifePercent > $LifeFpotDrinkPercent) Then 
         LogEvent(0, "Life has dropped to " & $LifePercent & "%, Will try to drink a regular rejuv.") 
         Drink(1) 
         $Timer = 1 
         $Sleep = TimerInit() 
      ElseIf $LifePercent < $LifeFpotDrinkPercent Then 
         LogEvent(0, "Life is critical! Life has dropped to " & $LifePercent & "%, Will try to drink a Full rejuv.") 
         Drink(0) 
         $Timer = 1 
         $Sleep = TimerInit() 
      EndIf 
   EndIf 
   If $LifePercent < $ChickenPercent Then 
      LogEvent(0, "Life is very low! Life has dropped to " & $LifePercent & "%, Bot will attempt to chicken...") 
      Chicken() 
   EndIf 
EndFunc   ;==>GetLife 

Func GetMana($Direction, ByRef $ManaPixel, Byref $ManaPercent, ByRef $Timer) 
   Select 
      Case $Direction = "up" 
         For $Search = $ManaPixel To $Top Step - 1 
            If (PixelGetColor($ManaX, $Search) <> $ManaBarColor) Or $Search = $Top Then 
               $ManaPercent = Round(100 * (($Bottom - $Top) - ($Search - $Top)) / ($Bottom - $Top)) 
                  $ManaPixel = $Search 
               ExitLoop 
            EndIf 
         Next 
      Case $Direction = "down" 
         For $Search = $ManaPixel To $Bottom 
            If (PixelGetColor($ManaX, $Search) = $ManaBarColor) Or $Search = $Bottom Then 
               $ManaPercent = Round(100 * (($Bottom - $Top) - ($Search - $Top)) / ($Bottom - $Top)) 
                  $ManaPixel = $Search 
               ExitLoop 
            EndIf 
         Next 
   EndSelect 
   ShowTip() 
   If $Timer = 1 Then 
      If TimerDiff($Sleep) > $DrinkDelay Then $Timer = 0 
   EndIf 
   If $Timer = 0 Then 
      If ($ManaPercent < $ManaRpotDrinkPercent) And ($ManaPercent > $ManaFpotDrinkPercent) Then 
         LogEvent(0, "Mana has dropped to " & $ManaPercent & "%, Will try to drink a regular rejuv.") 
         Drink(1) 
         $Timer = 1 
         $Sleep = TimerInit() 
      ElseIf $ManaPercent < $ManaFpotDrinkPercent Then 
         LogEvent(0, "Mana is critical! Mana has dropped to " & $ManaPercent & "%, Will try to drink a Full rejuv.") 
         Drink(0) 
         $Timer = 1 
         $Sleep = TimerInit() 
      EndIf 
      If $ChickenMana <> "Off" Then 
         If $ManaPercent < $ChickenMana Then 
            LogEvent(0, "Mana is very low! Mana has dropped to " & $ManaPercent & "%, Bot will attempt to chicken...") 
            Chicken() 
         EndIf 
      EndIf 
   EndIf 
EndFunc   ;==>GetMana 

Func GetMerc($Direction, ByRef $MercPixel, ByRef $MercPercent, ByRef $Timer) 
   Select 
      Case $Direction = "up" 
         For $Search = $MercPixel To $MercBarRight 
            If (PixelGetColor($Search, $MercBarY) = 0) Or $Search = $MercBarRight Then 
               $MercPercent = Round(100 * (($Search - $MercBarLeft) / ($MercBarRight - $MercBarLeft))) 
                  $MercPixel = $Search 
               ExitLoop 
            EndIf 
         Next 
      Case $Direction = "down" 
         For $Search = $MercPixel To $MercBarLeft Step - 1 
            If (PixelGetColor($Search, $MercBarY) <> 0) Or $Search = $MercBarLeft Then 
               $MercPercent = Round(100 * (($Search - $MercBarLeft) / ($MercBarRight - $MercBarLeft))) 
               $MercPixel = $Search 
               ExitLoop 
            EndIf 
         Next 
   EndSelect 
   ShowTip() 
   If $Timer = 1 Then 
      If TimerDiff($Sleep) > $DrinkDelay Then $Timer = 0 
   EndIf 
   If $Timer = 0 Then 
      If ($MercPercent < $MercHealPercent) And ($UseMerc = "Yes") Then 
         LogEvent(0, "Merc has dropped below " & $MercHealPercent & "%, Will try to drink a regular rejuv.") 
         Drink(2) 
         $Timer = 1 
         $Sleep = TimerInit() 
      EndIf 
   EndIf 
   If ($MercPercent < $MercChickenPercent) And ($MercChicken = "Yes") Then 
      LogEvent(0, "Merc life is very low! Merc has dropped below " & $MercChickenPercent & "%, Bot will attempt to chicken...") 
      Chicken() 
   EndIf 
EndFunc   ;==>GetMerc 

Func GetBaseStats(ByRef $HealthPixel, ByRef $ManaPixel, ByRef $MercPixel, ByRef $LifePercent, ByRef $ManaPercent) 
   Local $HT = PixelSearch($HealthX, $Top - 10, $HealthX, $Bottom, $LifeBarColor) 
   Local $MT = PixelSearch($ManaX, $Top - 10, $ManaX, $Bottom, $ManaBarColor) 
   $HealthPixel = $HT[1] 
   $ManaPixel = $MT[1] 
   $MercPixel = $MercBarRight 
   If $UseMerc = "Yes" Then GetMerc("down", $MercPixel, $MercPercent, $Timer) 
   $LifePercent = Round(100 * (($Bottom - $Top) - ($HT[1] - $Top)) / ($Bottom - $Top)) 
   $ManaPercent = Round(100 * (($Bottom - $Top) - ($MT[1] - $Top)) / ($Bottom - $Top)) 
EndFunc   ;==>GetBaseStats 

Func ChickenWait() 
   LogEvent(0, "Sleeping to avoid an infinant chicken loop. Wait to visit malah. Chicken_Wait_Delay = " & $ChickenWaitDelay) 
   $Sleep = TimerInit() 
   While TimerDiff($Sleep) < ($ChickenWaitDelay * 1000) 
      ToolTip("Sleep Timer: " & Round($ChickenWaitDelay - (TimerDiff($Sleep)/1000)), 252, 578) 
      Sleep(500) 
   WEnd 
   LogEvent(0, "Chicken Wait finished, Bot will continue checking...") 
EndFunc 

Func ShowTip() 
   If $ExtraDebug = "No" Then 
      ToolTip("Life: " & Round($MaxLife * ($LifePercent / 100)) & " / " & $MaxLife & " - " & Round($LifePercent) & "%" & @CRLF _ 
            & "Mana: " & Round($MaxMana * ($ManaPercent / 100)) & " / " & $MaxMana & " - " & Round($ManaPercent) & "%" & @CRLF _ 
            & "Merc: " & Round($MercPercent) & "%", 252, 578) 
   ElseIf $ExtraDebug = "Yes" Then 
      ToolTip("Life: " & $MaxLife * ($LifePercent / 100) & " / " & $MaxLife & " - " & $LifePercent & "%" & @CRLF _ 
            & "Mana: " & $MaxMana * ($ManaPercent / 100) & " / " & $MaxMana & " - " & $ManaPercent & "%" & @CRLF _ 
            & "Merc: " & $MercPercent & "%" & @CRLF _ 
            & "HealthPix: " & $HealthPixel - $Top & " ManaPix: " & $ManaPixel - $Top & @CRLF _ 
            & "MercPix: " & $MercPixel, 252, 578) 
   EndIf 
EndFunc   ;==>ShowTip 

Func Drink($DrinkType) ;Type of drink. 0 = Full rejuv, 1 = Regular rejuv, 2 = Merc 
   For $N = 0 To 3 
      $Check = PixelChecksum(($BeltX + ($N * 31)) - 1, $BeltY - 1, ($BeltX + ($N * 31)) + 1, $BeltY + 1, 1) 
      If $Check = $beltfrjchecksum Then 
         $BeltData[$N] = 1 
      ElseIf $Check = $beltrjchecksum Then 
         $BeltData[$N] = 2 
      Else 
         $BeltData[$N] = 0 
      EndIf 
   Next 
   LogEvent(0, "Belt Data:") 
   $LogFile = FileOpen($BotDir & "\Logs\LifeCheck.txt", 1) 
   For $N = 0 To 3 
      Select 
         Case $BeltData[$N] = 1 
            FileWrite($LogFile, "(F)") 
         Case $BeltData[$N] = 2 
            FileWrite($LogFile, "(R)") 
         Case Else 
            FileWrite($LogFile, "(E)") 
      EndSelect 
   Next 
   FileWrite($LogFile, @CRLF) 
   FileClose($LogFile) 
   $A = 0 
   Select 
      Case $DrinkType = 0                      ;Prioritize Full rejuves 
         For $N = 0 To 3 
            If $BeltData[$N] = 1 Then 
               Send($Char_Key_PotionsRow[$N + 1]) 
               $A = 1 
               LogEvent(0, "Drank a Full Rejuv from belt slot " & $N + 1) 
               ExitLoop 
            EndIf 
         Next 
         If $A = 0 Then 
            For $N = 0 To 3 
               If $BeltData[$N] = 2 Then 
                  Send($Char_Key_PotionsRow[$N + 1]) 
                  $A = 1 
                  LogEvent(0, "No more Full Rejuvs, so we Drank a Regular Rejuv instead from belt slot " & $N + 1) 
                  ExitLoop 
               EndIf 
            Next 
         EndIf 
         If $A = 0 Then 
            LogEvent(0, "We are out of pots, Chickening...") 
            ;Chicken() 
         EndIf 
      Case $DrinkType = 1                      ;Prioritize Regular rejuves 
         For $N = 0 To 3 
            If $BeltData[$N] = 2 Then 
               Send($Char_Key_PotionsRow[$N + 1]) 
               $A = 1 
               LogEvent(0, "Drank a Regular Rejuv from belt slot " & $N + 1) 
               ExitLoop 
            EndIf 
         Next 
         If $A = 0 Then 
            For $N = 0 To 3 
               If $BeltData[$N] = 1 Then 
                  Send($Char_Key_PotionsRow[$N + 1]) 
                  $A = 1 
                  LogEvent(0, "No more Regular Rejuvs, so we Drank a Full Rejuv instead from belt slot " & $N + 1) 
                  ExitLoop 
               EndIf 
            Next 
         EndIf 
         If $A = 0 Then 
            LogEvent(0, "We are out of pots, Chickening...") 
            ;Chicken() 
         EndIf 
      Case $DrinkType = 2                      ;Send a pot to the merc, Prioritize Regular rejuves 
         Send("{SHIFTDOWN}") 
         For $N = 0 To 3 
            If $BeltData[$N] = 2 Then 
               Send($Char_Key_PotionsRow[$N + 1]) 
               $A = 1 
               LogEvent(0, "Sent a Regular Rejuv to the Merc from belt slot " & $N + 1) 
               ExitLoop 
            EndIf 
         Next 
         If $A = 0 Then 
            For $N = 0 To 3 
               If $BeltData[$N] = 1 Then 
                  Send($Char_Key_PotionsRow[$N + 1]) 
                  $A = 1 
                  LogEvent(0, "No more Regular Rejuvs to send to the Merc, so we'll send a Full Rejuv instead from belt slot " & $N + 1) 
                  ExitLoop 
               EndIf 
            Next 
         EndIf 
         Send("{SHIFTUP}") 
         If $A = 0 Then 
            LogEvent(0, "We are out of pots, Chickening...") 
            ;Chicken() 
         EndIf 
   EndSelect 
EndFunc   ;==>Drink 

Func Chicken() 
   ToolTip("") 
   Send($PauseBot) 
   For $Retries = 1 To $ChickenRetries 
      Send($ClearScreen) 
      If (PixelGetColor(481, 535) <> 5406092) OR (PixelGetColor(320, 537) <> 6521492) Then MouseClick("Left", 400, 575, 1, 0) 
      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(0, "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(0, "Max Retries exceeded, Will terminate the Game.exe process") 
         ProcessClose("Game.exe") 
      Else 
         LogEvent(0, "Failed to chicken, Will retry the chicken...") 
      EndIf 
   Next 
   LogEvent(0, "Chicken was a success! Your ass has been saved by PotThread(tm), gib Smorg a dollar! ^^") 
   Send($PauseBot) 
   SuspendCheck() 
   ChickenWait() 
   GetBaseStats($HealthPixel, $ManaPixel, $MercPixel, $LifePercent, $ManaPercent) 
EndFunc   ;==>Chicken 

Func SuspendCheck() 
   ToolTip("") 
   Do 
      Sleep(100) 
      If WinExists($D2WinTitle) = 0 Then 
         LogEvent(0, "Diablo has been closed, Terminating PotThread...") 
         Exit(1) 
      EndIf 
   Until ((PixelGetColor(481, 535) = 5406092) OR (PixelGetColor(320, 537) = 6521492)) AND (WinActive($D2WinTitle) = 1) 
   ShowTip() 
EndFunc   ;==>SuspendCheck 

Func LogEvent($Code, $String) 
   $LogFile = FileOpen($BotDir & "\Logs\LifeCheck.txt", 1) 
   Select 
      Case $Code = 0 
         FileWriteLine($LogFile, @MON & "/" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & " [I]> " & $String) 
      Case $Code = 1 
         FileWriteLine($LogFile, @MON & "/" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & " [E]> " & $String) 
   EndSelect 
   FileClose($LogFile) 
EndFunc 

Func OnAutoItExit() 
   MouseUp("Right") 
   MouseUp("Left") 
   LogEvent(0, "PotThread Stopped.") 
EndFunc 
;----------