#cs Witch Doctor Cellar Farming Bot - Version 0.5 [1920x1080 ONLY] Developed by Avatar88343 @ Ownedcore and andygongyb @ Ownedcore after V. 0.5 Other contributers: What it does: *This bot will travel to the cellar in Act 1, kill the mobs, collect the gold and items, and repair your gear. Newbiew Info: This is a script that runs on AutoIt. You run this bot by Downloading AutoIt from the web (it's free) and installing it. You then paste all this code into any text editor (such as notepad) and save it anywhere on your hard drive. Follow the Select steps below to configure this bot before you run it. Special Instructions for 1920 x 1080: 1.) Set your game resolution to 1920x1080 (required) 2.) Set the display mode to Fullscreen Windowed (Don't forget!) 3.) Follow the Instructions (for all resolutions) section below Special Instructions for 800 x 600: 1.)Exit Diablo 3 2.)Go to your document folder and locate the Diablo III folder 3.)Open the D3Prefs file in any editor (such as notepad) 4.)Change the following settings to the ones listed below "DisplayModeFlags "0" DisplayModeWindowMode "1" DisplayModeWinLeft "428" DisplayModeWinTop "162" DisplayModeWinWidth "800" DisplayModeWinHeight "600" DisplayModeUIOptWidth "800" DisplayModeUIOptHeight "600" DisplayModeWidth "800" DisplayModeHeight "600" DisplayModeRefreshRate "75" DisplayModeBitDepth "32"" 5.) Follow the Instructions (for all resolutions) section below Instructions (for all resolutions) 1.) Bind your middle mouse button to Move (found in Key Bindings Option) 2.) Set your build to this http://us.battle.net/d3/en/calculator/witch-doctor#jaQPZU!VZW!babbca 3.) Start Act 1, Quest 6 - Talk to Alaric 4.) Hire the Scoundrel 5.) Teleport to The Old Ruins using the waypoint and run left until you reach a checkpoint 6.) Log out of the game 7.) Press F2 to start the bot! Space is used to pause and resume the bot 8.) Press shift + \ to turn off the bot NOTE: *Please make sure you are running the correct resolution settings! *You must be running the game in Fullscreen Windoed mode if you're using 1080P *You WILL need to edit the values below the comments for better results FEATURES: *Supports 1080P Fullscreen Windowed and 800x600 Windowed (V. 0.5 only supports 1080P currently) *Automatic looting of Rare, Legendary, and Set items *Also able to loot blue items, tomes, and gems *Optionally sells blue items when the bag is full *Repairs Items when damaged *Detects death and responds accordingly *Detects connection lost and automatically reconnect (not tested) *Randomization for increased safety *Added ability to find Cellar during bad runs IN DEVELOPMENT: *Multi-resolution support (need people to help) *Stash use *Improved combat *Speed improvements *Multiple routes to improve safety *45 min timeout bug *Edit d3config *Salvage lv60 blue items automatically **Based on the code by notAres and mackus101. Special thanks to them! #ce #include #include ;======THESE VALUES ARE NOT EDITED WITH THE GUI =================================== $R = 0 ; Leave this as 0 if you are using 1080P. Change it to 1 if you're using 800 x 600 $ComputerLag = 1000 ; Increase this by 100-5000 if you have a slow PC. $RunSpeed = 10 ; Enter your character's run speed here $LootRares = True ; Whether or not to loot rare and legendary items $LootBlues = True ; Whether or not to loot blue items $LootGems = True ; Whether or not to loot gems $LootPotions = True ; Whether or not to loot potions $LootTomes = True ; Whether or not to loot Tome of Secret $LootGold = True ; Whether or to collect gold that is missed during the first collection attempt $Repair = True ; Orders the bot to repair when items are damaged $SellBlues = True ; Orders the bot to sell blue items when the bag is full ;====================================================================== Global $Resume[2][2] ;Location of the Resume Button Global $Leave[2][2] ;Location of the in-game leave button Global $GameLobbyCode[2][3] ;Contains X, Y, and Hex color of Resume button so we can see if we're there Global $GameScreenCode[2][3] ;Contains X, Y, and Hex color used to check if we are in an unpaused game Global $Loc1[2][2] ;First movement Global $Loc2[2][2] ;Second movement Global $Loc3[2][2] ;Third movement ttt Global $CellarLocation[2][2] ;Cellar door location Global $CellarLocation2[2] ;Location of cellar during bad runs (ugly workaround for now) Global $AltCellar = False Global $Loc5[2][2] ;Cellar hallway Global $Loc6[2][2] ;Cellar doorway Global $MonsterLoc[2][2] ;Initial boss location Global $MonsterSearch[2][4] ;Bounds of where we will find our monsters Global $GoldLoot1[2][2] ;First place to run when looting Global $GoldLoot2[2][2] ;Second place to run when looting Global $GoldLoot3[2][2] ;Third place to run when looting Global $LootingArea[2][4] ; looting bounds (TL X, TL Y, BR X, BR Y) Global $CharHitBox[2][4] ; Hitbox around user's character Global $DeathBounds[2][2] ; Used to detect the "You Have Died" text Global $RepairCoords[2][4][2] ; Four clicks needed to repair Global $RepairCheck[2][2] ; Used to check for repair icon Global $CellarOffset[2] ; Used to improve cellar clicking with 1080P/800x600 Global $CellarIcon ; Used to find the yellow cellar icon on the minimap (future use) Global $pngLoc[2] ; Absolute path of the folder containing pics for image search Global $LostConnectionOkBtn[2][2] ; The coordinate of the OK button of the "lost connection" window Global $LostConnectionText0[2][4] ; Image search area of the "lost connection" text Global $LostConnectionText1[2][4] Global $CharLoc[2][2] ; Location where the character stands Global $CastLoc[2][2] ; Location to cast Grasp of the Dead in the cellar Global $SellCoords[2][2] ; Coordinate of the sell button Global $SlotOffset[2] ; Length of each slot in the item window Global $ItemStartCoord0[2][4] ; Pixel search area of the first slot on the second column in item window Global $ItemStartCoord1[2][4] Global $BagFullCoords[2][4] ; Image search area of the bag full message Global $IdleCursorCoords[2][2] ; Coordinate of where the cursor should go for not covering any item name Global $CellarPixel Global $RunDelayMult[2] ; Scaler for calculating the delay to run to an item Global $GemLootOffset[2] ; Distance between gem and its text Global $BagFull ActivateGUI() ;Check for people that can't read instructions If Int($R) < 0 Or Int($R) > 1 Then MsgBox(4096, "A wild illiterate appears appears!", "Aha! I caught you! You did not read the instructions. You need to configure the bot!") terminate() EndIf ;Clculate run speed Global $RunTime = 30 * (100 - $RunSpeed) + 2000 ;Length of time to run in 800x600 ;All locations are N dimensional arrays. [0][x] is for 1080P and [1][x] is for 800x600 ;1080P ;1920x1080 $pngLoc[0] = "F:\Program Files (x86)\Diablo III\pics\1920x1080\" ; Location of the .PNGs (NO SUBFOLDERS - ALL PNGS GO HERE) $Resume[0][0] = 319 $Resume[0][1] = 416 $GameLobbyCode[0][0] = 319 $GameLobbyCode[0][1] = 416 $GameLobbyCode[0][2] = 4065536 $GameScreenCode[0][0] = 1119 $GameScreenCode[0][1] = 1044 $GameScreenCode[0][2] = 0xDEFDFE $LostConnectionOkBtn[0][0] = 957 $LostConnectionOkBtn[0][1] = 630 $LostConnectionText0[0][0] = 764 $LostConnectionText0[0][1] = 493 $LostConnectionText0[0][2] = 843 $LostConnectionText0[0][3] = 521 $LostConnectionText1[0][0] = 779 $LostConnectionText1[0][1] = 507 $LostConnectionText1[0][2] = 853 $LostConnectionText1[0][3] = 525 $CharLoc[0][0] = 944 $CharLoc[0][1] = 507 $CastLoc[0][0] = 600 $CastLoc[0][1] = 300 $SellCoords[0][0] = 517 $SellCoords[0][1] = 238 $SlotOffset[0] = 48 $ItemStartCoord0[0][0] = 1460 $ItemStartCoord0[0][1] = 631 $ItemStartCoord0[0][2] = 1462 $ItemStartCoord0[0][3] = 633 $ItemStartCoord1[0][0] = 1460 $ItemStartCoord1[0][1] = 625 $ItemStartCoord1[0][2] = 1468 $ItemStartCoord1[0][3] = 632 $BagFullCoords[0][0] = 1067 $BagFullCoords[0][1] = 129 $BagFullCoords[0][2] = 1116 $BagFullCoords[0][3] = 155 $IdleCursorCoords[0][0] = 400 $IdleCursorCoords[0][1] = 300 $RunDelayMult[0] = 1.5 ;800x600 $pngLoc[1] = "F:\Program Files (x86)\Diablo III\pics\800x600\" ; Need people to make those pics $Resume[1][0] = 174 $Resume[1][1] = 232 $GameLobbyCode[1][0] = 174 $GameLobbyCode[1][1] = 232 $GameLobbyCode[1][2] = 4262400 $GameScreenCode[1][0] = 486 $GameScreenCode[1][1] = 578 $GameScreenCode[1][2] = 0x6C9BFF ; Need people working on the following coordinates $LostConnectionOkBtn[1][0] = 0 $LostConnectionOkBtn[1][1] = 0 $LostConnectionText0[1][0] = 0 $LostConnectionText0[1][1] = 0 $LostConnectionText0[1][2] = 0 $LostConnectionText0[1][3] = 0 $LostConnectionText1[1][0] = 0 $LostConnectionText1[1][1] = 0 $LostConnectionText1[1][2] = 0 $LostConnectionText1[1][3] = 0 $CharLoc[1][0] = 0 $CharLoc[1][0] = 0 $CastLoc[1][0] = 0 $CastLoc[1][1] = 0 $SellCoords[1][0] = 0 $SellCoords[1][1] = 0 $SlotOffset[1] = 0 $ItemStartCoord0[1][0] = 0 $ItemStartCoord0[1][1] = 0 $ItemStartCoord0[1][2] = 0 $ItemStartCoord0[1][3] = 0 $ItemStartCoord1[1][0] = 0 $ItemStartCoord1[1][1] = 0 $ItemStartCoord1[1][2] = 0 $ItemStartCoord1[1][3] = 0 $BagFullCoords[1][0] = 0 $BagFullCoords[1][1] = 0 $BagFullCoords[1][2] = 0 $BagFullCoords[1][3] = 0 $IdleCursorCoords[1][0] = 0 $IdleCursorCoords[1][1] = 0 $RunDelayMult[1] = 0 ;1920x1080 $Leave[0][0] = 969 $Leave[0][1] = 582 ;800x600 $Leave[1][0] = 397 $Leave[1][1] = 322 ;1920x1080 $Loc1[0][0] = 500 ;First movement $Loc1[0][1] = 250 $Loc2[0][0] = 1 ;Second movement $Loc2[0][1] = 370 $Loc3[0][0] = 400 ;Third Movement $Loc3[0][1] = 600 ;800x600 $Loc1[1][0] = 8 ;First movement $Loc1[1][1] = 146 $Loc2[1][0] = 7 ;Second movement $Loc2[1][1] = 300 $Loc3[1][0] = 8 ;Third Movement $Loc3[1][1] = 300 ;1080P $CellarLocation[0][0] = 307 ;Cellar door location $CellarLocation[0][1] = 74 ;800x600 $CellarLocation[1][0] = 499 ;Cellar door location $CellarLocation[1][1] = 148 $CellarLocation2[0] = 439 $CellarLocation2[1] = 145 $AltCellarLocation = False ;Cellar offset $CellarOffset[0] = 33; $CellarOffset[1] = 10; ;1080P $Loc5[0][0] = 116 ;Walk down hallway $Loc5[0][1] = 986 $Loc6[0][0] = 776 ;enter hallway $Loc6[0][1] = 328 ;800x600 $Loc5[1][0] = 3 ;Walk down hallway $Loc5[1][1] = 504 $Loc6[1][0] = 255 ;enter hallway $Loc6[1][1] = 190 ;1080P $MonsterLoc[0][0] = 577 $MonsterLoc[0][1] = 183 ;800x600 $MonsterLoc[1][0] = 188 $MonsterLoc[1][1] = 111 ;1920x1080 $MonsterSearch[0][0] = 162 $MonsterSearch[0][1] = 29 $MonsterSearch[0][2] = 1248 $MonsterSearch[0][3] = 446 ;800x600 $MonsterSearch[1][0] = 40 $MonsterSearch[1][1] = 53 $MonsterSearch[1][2] = 424 $MonsterSearch[1][3] = 191 ;1920x1080 $GoldLoot1[0][0] = 402 $GoldLoot1[0][1] = 306 $GoldLoot2[0][0] = 1260 $GoldLoot2[0][1] = 351 $GoldLoot3[0][0] = 911 $GoldLoot3[0][1] = 694 ;800x600 $GoldLoot1[1][0] = 96 $GoldLoot1[1][1] = 181 $GoldLoot2[1][0] = 560 $GoldLoot2[1][1] = 191 $GoldLoot3[1][0] = 349 $GoldLoot3[1][1] = 418 ;1080P $LootingArea[0][0] = 500 $LootingArea[0][1] = 100 $LootingArea[0][2] = 1600 $LootingArea[0][3] = 700 ;800x600 $LootingArea[1][0] = 75 $LootingArea[1][1] = 90 $LootingArea[1][2] = 630 $LootingArea[1][3] = 400 ;1080P $CharHitBox[0][0] = 790 $CharHitBox[0][1] = 315 $CharHitBox[0][2] = 1200 $CharHitBox[0][3] = 730 ;800x600 $CharHitBox[1][0] = 304 $CharHitBox[1][1] = 190 $CharHitBox[1][2] = 468 $CharHitBox[1][3] = 323 ;1080P $DeathBounds[0][0] = 538 $DeathBounds[0][1] = 335 ;800x600 $DeathBounds[1][0] = 210 $DeathBounds[1][1] = 180 ;1080P $RepairCoords[0][0][0] = 1690 $RepairCoords[0][0][1] = 102 $RepairCoords[0][1][0] = 930 $RepairCoords[0][1][1] = 136 $RepairCoords[0][2][0] = 517 $RepairCoords[0][2][1] = 483 $RepairCoords[0][3][0] = 223 $RepairCoords[0][3][1] = 592 ;800x600 $RepairCoords[1][0][0] = 691 $RepairCoords[1][0][1] = 88 $RepairCoords[1][1][0] = 505 $RepairCoords[1][1][1] = 52 $RepairCoords[1][2][0] = 282 $RepairCoords[1][2][1] = 261 $RepairCoords[1][3][0] = 157 $RepairCoords[1][3][1] = 329 ;1080P $RepairCheck[0][0] = 1507 $RepairCheck[0][1] = 36 ;800x600 $RepairCheck[1][0] = 573 $RepairCheck[1][1] = 21 Opt('MouseCoordMode', 2) Opt('PixelCoordMode', 2) HotKeySet("|", "Terminate") HotKeySet('{F2}', 'Pause') Global $Paused ;bot starts paused. press space to start. Pause() ;Finding loot takes time. We don't want to overdo it $LootAttempts = 0 $GemLootAttempts = 0 Sleep(214) ; Please put a random small number here which will confuse Wardon's harsh function WinActivate('Diablo III') While 1 If WinActive('Diablo III') Then Local $gX Local $gY $AltCellarLocation = False $LootAttempts = 0 $GemLootAttempts = 0 $BagFull = False ;Make sure that we are in the character selection screen ( we are looking at a spot in the Resume game button) For $i = 15 To 0 Step -1 If InGameLobby() Then ExitLoop EndIf Sleep(600) If _ImageSearchArea($pngLoc[$R] & "game.png", 1, $LostConnectionText0[$R][0], _ $LostConnectionText0[$R][1], $LostConnectionText0[$R][2], _ $LostConnectionText0[$R][3], $gX, $gY, 90) _ Or _ImageSearchArea($pngLoc[$R] & "therewas.png", 1, $LostConnectionText1[$R][0], _ $LostConnectionText1[$R][1], $LostConnectionText1[$R][2], _ $LostConnectionText1[$R][3], $gX, $gY, 90) Then ; check if we lost connection Click($LostConnectionOkBtn[$R][0], $LostConnectionOkBtn[$R][1]) ContinueLoop EndIf If $i == 1 Then MsgBox(4096, "Error Resuming Game", "You don't seem to be in the lobby. Did you properly configure the bot? Bot will now exit", 50) Terminate() EndIf Next ;Resume the game Click($Resume[$R][0], $Resume[$R][1]) ;Make sure that we are in the game For $i = 12 To 0 Step -1 If InGameplayScreen() Then ExitLoop EndIf Sleep(1000) If $i == 1 Then MsgBox(4096, "Error Starting the Game", "The game did not properly load...Are you using English language? Do not use custom themes!", 50) Terminate() EndIf Next Rest(200) Send("{2}") Rest(400) ;Custom running for the 800x600. Sometimes I wonder if it's faster to just buy everyone a 1080P monitor... If Int($R) == 1 Then MouseMove(11, 220) Sleep(400) Send("{4}") MouseDown("middle") Sleep($RunTime) MouseUp("middle") Sleep(2000) #cs $CellarIcon = PixelSearch(630, 70, 741, 149, 0x71341A, 5) if not @error then ConsoleWrite("Foundtheseller" & @LF) EndIf #ce Else Move($Loc1[$R][0], $Loc1[$R][1]) Sleep(200) Send("{4}") Sleep(500) Move($Loc2[$R][0], $Loc2[$R][1]) Sleep(1100) Move($Loc3[$R][0], $Loc3[$R][1]) EndIf ;Check to see if the cellar is there ``````` MouseMove($CellarLocation[$R][0], $CellarLocation[$R][1]) Sleep(400) If Int($R) = 1 Then $CellarPixel = PixelSearch($CellarLocation[$R][0] - 30, $CellarLocation[$R][1] - 30, _ $CellarLocation[$R][0] + 20, $CellarLocation[$R][1] + 20, 0x93D7F9, 8) If @error Then MouseMove($CellarLocation2[0], $CellarLocation2[1]) Sleep(300) $CellarPixel = PixelSearch($CellarLocation2[0] - 30, $CellarLocation2[1] - 30, _ $CellarLocation2[0] + 20, $CellarLocation2[1] + 20, 0x93D7F9, 8) If Not @error Then $AltCellarLocation = True EndIf EndIf Else $CellarPixel = PixelSearch($CellarLocation[$R][0] - $CellarOffset[$R], $CellarLocation[$R][1] _ - $CellarOffset[$R], $CellarLocation[$R][0] + 4, $CellarLocation[$R][1] + 4, 0x334FB7, 6) EndIf ;Leave the game if the Cellar is not there If @error Then ConsoleWrite("Did not find the cellar " & @LF) Send("{SHIFTDOWN}") Sleep(10) Click($CharLoc[$R][0], $CharLoc[$R][1]) Sleep(50) Send("{SHIFTUP}") ;Cast Voodoo and Grasp of the Dead to ensure safety Send("{1}") Rest(300) Send("{3}") Rest(300) leaveGame() Sleep(12000) ContinueLoop EndIf ;Enter the cellar ConsoleWrite("Entering the Cellar..." & @LF) If $R > 0 And $AltCellar Then Click($CellarLocation2[$R][0] - 4, $CellarLocation2[$R][1] - 4) Else If Not $AltCellarLocation Then Click($CellarLocation[$R][0], $CellarLocation[$R][1]) Else Click($CellarLocation2[0], $CellarLocation2[1]) EndIf EndIf If Int($R) == 1 Then Sleep(500 + $ComputerLag) Else Sleep(2500 + $ComputerLag) EndIf ;Check to see if we died If CheckForDeath() Then ContinueLoop EndIf ;Inside the celler now - Move to the doorway Move($Loc5[$R][0], $Loc5[$R][1]) Sleep(1400) Move($Loc6[$R][0], $Loc6[$R][1]) Sleep(300) ;Cast Voodoo Send("{1}") ;Cast Grasp of the Dead MouseMove($CastLoc[$R][0], $CastLoc[$R][1]) Send("{3}") ;Kill all the enemies inside While 1 $MonsterBar = PixelSearch($MonsterSearch[$R][0], $MonsterSearch[$R][1], _ $MonsterSearch[$R][2], $MonsterSearch[$R][3], 0xEE0000, 10) If @error Then ConsoleWrite("Didn't find any, attacking to discover potential enemies" & @LF) Attack($MonsterLoc[$R][0], $MonsterLoc[$R][1]) Sleep(500) $MonsterBar = PixelSearch($MonsterSearch[$R][0], $MonsterSearch[$R][1], _ $MonsterSearch[$R][2], $MonsterSearch[$R][3], 0xEE0000, 10) If @error Then ConsoleWrite("No monsters found - Moving on") ExitLoop EndIf EndIf ;if CheckForNearbyMonsters() Then ;send("{4}") ;EndIf For $i = 7 To 0 Step -1 Attack($MonsterBar[0], $MonsterBar[1]) Sleep(100) Next WEnd ;Loot the gold and attack anything we missed Move($GoldLoot1[$R][0], $GoldLoot1[$R][1]) Sleep(Random(800, 900)) AttackNearbyMonsters() Move($GoldLoot2[$R][0], $GoldLoot2[$R][1]) Sleep(Random(400, 500)) AttackNearbyMonsters() Move($GoldLoot3[$R][0], $GoldLoot3[$R][1]) Sleep(Random(400, 500)) AttackNearbyMonsters() ;Loot items If $LootRares Then $BagFull = LootRares() $LootAttemps = 0 $BagFull = LootLegendaries() $LootAttempts = 0 EndIf If $LootBlues And $BagFull = False Then $LootAttempts = 0 $BagFull = LootMagic() EndIf If $LootGems Then LootGems() EndIf If $LootGold Then LootGold() EndIf If $LootTomes Then LootTomes() EndIf If $LootPotions Then LootPotions() EndIf ;Check to see if we died If CheckForDeath() Then ContinueLoop EndIf ;Teleport to town Send("{t}") Sleep(8000) RepairOrSellItems() ;Leave the game LeaveGame() Sleep(1000) EndIf WEnd Func CheckForRepair() $RepairNeeded = PixelSearch($RepairCheck[$R][0], $RepairCheck[$R][1], $RepairCheck[$R][0] + 5, _ $RepairCheck[$R][1] + 5, 0xFFE801, 10) If Not @error Then Return True Else Return False EndIf EndFunc ;==>CheckForRepair Func RepairOrSellItems() Local $NeedRepair Local $xx Local $yy Local $sell $NeedRepair = CheckForRepair() ; Repair the gears when needed If ($NeedRepair And $Repair) Or ($BagFull And $SellBlues) Then Move($RepairCoords[$R][0][0], $RepairCoords[$R][0][1]) Sleep(2000 + $ComputerLag) MouseMove($RepairCoords[$R][1][0], $RepairCoords[$R][1][1]) Sleep(400) Click($RepairCoords[$R][1][0], $RepairCoords[$R][1][1]) Sleep(1300 + $ComputerLag) If $NeedRepair And $Repair Then Click($RepairCoords[$R][2][0], $RepairCoords[$R][2][1]) Sleep(Random(700 - 900)) Click($RepairCoords[$R][3][0], $RepairCoords[$R][3][1]) Sleep(500) EndIf ; If the bag is full, sell the blues If ($BagFull And $SellBlues) Then Sleep(300) Click($SellCoords[$R][0], $SellCoords[$R][1]); Sleep(300) For $xx = 0 To 8 Step 1 For $yy = 0 To 5 Step 1 ; An item recently picked up has blue frame arround the slots $sell = PixelSearch($ItemStartCoord0[$R][0] + $xx * $SlotOffset[$R], _ $ItemStartCoord0[$R][1] + $yy * $SlotOffset[$R], _ $ItemStartCoord0[$R][2] + $xx * $SlotOffset[$R], _ $ItemStartCoord0[$R][3] + $yy * $SlotOffset[$R], 0x0000FF, 10) If Not @error Then MouseClick("right", $sell[0], $sell[1]) Else ; Otherwise the color of the frame is lighter $sell = PixelSearch($ItemStartCoord1[$R][0] + $xx * $SlotOffset[$R], _ $ItemStartCoord1[$R][1] + $yy * $SlotOffset[$R], _ $ItemStartCoord1[$R][2] + $xx * $SlotOffset[$R], _ $ItemStartCoord1[$R][3] + $yy * $SlotOffset[$R], 0x182A5B, 30) If Not @error Then MouseClick("right", $sell[0], $sell[1]) EndIf EndIf Next Next EndIf Sleep(300) Send("{esc}") EndIf EndFunc ;==>RepairOrSellItems Func Terminate() Exit 0 EndFunc ;==>Terminate Func LeaveGame() Send("{esc}") Sleep(400) Click($Leave[$R][0], $Leave[$R][1]) EndFunc ;==>LeaveGame Func Pause() $Paused = Not $Paused While $Paused Sleep(100) ToolTip('Paused... (Press F2 to run it)', 0, 0) WEnd ToolTip("") EndFunc ;==>Pause Func Click($x, $y) MouseClick('left', Random($x - 3, $x + 3), Random($y - 3, $y + 3), 1, Random(0, 1)) Sleep(Random(1000, 1500)) EndFunc ;==>Click Func Move($x, $y) MouseClick('middle', Random($x - 3, $x + 3), Random($y - 3, $y + 3), 1, Random(0, 1)) Sleep(Random(1000, 1500)) EndFunc ;==>Move Func Attack($x, $y) MouseClick('right', Random($x - 3, $x + 3), Random($y - 3, $y + 3), 1, Random(0, 1)) EndFunc ;==>Attack Func Rest($z) Sleep(Random($z, $z + 25)) EndFunc ;==>Rest Func CheckForDeath() ConsoleWrite("Checking to see if we died") $Death = PixelSearch($DeathBounds[$R][0], $DeathBounds[$R][0], $DeathBounds[$R][0] + 4, _ $DeathBounds[$R][0] + 4, 0xFFFFFF) If Not @error Then ConsoleWrite("Died" & @LF) LeaveGame() Sleep(10000) Return True Else Return False EndIf EndFunc ;==>CheckForDeath Func CalcDist($x, $y) Local $dx = $x - $CharLoc[$R][0] Local $dy = $y - $CharLoc[$R][1] Return Sqrt($dx ^ 2 + $dy ^ 2) EndFunc ;==>CalcDist Func LootMagic() Local $gX Local $gY $Magic = PixelSearch($LootingArea[$R][0], $LootingArea[$R][1], $LootingArea[$R][2], _ $LootingArea[$R][3], 0x6969FF, 4) ; If Not @error Then Click($Magic[0] + 5, $Magic[1] + 2) Sleep(Round($RunDelayMult[$R] * CalcDist($gX, $gY))) If _ImageSearchArea($pngLoc[$R] & "item.png", 1, $BagFullCoords[$R][0], $BagFullCoords[$R][1], _ $BagFullCoords[$R][2], $BagFullCoords[$R][3], $gX, $gY, 90) Then Return True EndIf EndIf $LootAttempts += 1 If ($LootAttempts > 5) Then Return Else If LootMagic() Then Return True EndIf EndIf Return False EndFunc ;==>LootMagic Func LootRares() Local $gX Local $gY $Rare = PixelSearch($LootingArea[$R][0], $LootingArea[$R][1], $LootingArea[$R][2], _ $LootingArea[$R][3], 0xBBBB00, 4) If Not @error Then Click($Rare[0] + 5, $Rare[1] + 2) Sleep(Round($RunDelayMult[$R] * CalcDist($gX, $gY))) If _ImageSearchArea($pngLoc[$R] & "item.png", 1, $BagFullCoords[$R][0], $BagFullCoords[$R][1], _ $BagFullCoords[$R][2], $BagFullCoords[$R][3], $gX, $gY, 90) Then Return True EndIf EndIf $LootAttempts += 1 If ($LootAttempts > 5) Then Return Else If LootRares() Then Return True EndIf EndIf Return False EndFunc ;==>LootRares Func LootLegendaries() Local $gX Local $gY $Legendary = PixelSearch($LootingArea[$R][0], $LootingArea[$R][1], $LootingArea[$R][2], _ $LootingArea[$R][3], 0xBF642F, 2) ; If Not @error Then Click($Legendary[0] + 5, $Legendary[1] + 2) Sleep(Round($RunDelayMult[$R] * CalcDist($gX, $gY))) If _ImageSearchArea($pngLoc[$R] & "item.png", 1, $BagFullCoords[$R][0], $BagFullCoords[$R][1], _ $BagFullCoords[$R][2], $BagFullCoords[$R][3], $gX, $gY, 90) Then ; Will terminate if a legendary is present and the bag is full MsgBox(0, "Oops!", "Your bag is full and you may not want to miss this item") terminate() EndIf EndIf $set = PixelSearch($LootingArea[$R][0], $LootingArea[$R][1], $LootingArea[$R][2], _ $LootingArea[$R][2], 0x02CE01, 2) ; If Not @error Then Click($set[0] + 5, $set[1] + 2) Sleep(Round($RunDelayMult[$R] * CalcDist($gX, $gY))) If _ImageSearchArea($pngLoc[$R] & "item.png", 1, $BagFullCoords[$R][0], $BagFullCoords[$R][1], _ $BagFullCoords[$R][2], $BagFullCoords[$R][3], $gX, $gY, 90) Then MsgBox(0, "Oops!", "Your bag is full and you may not want to miss this item") terminate() EndIf EndIf $LootAttempts += 1 If ($LootAttempts > 3) Then Return Else LootLegendaries() EndIf EndFunc ;==>LootLegendaries Func LootGems() Local $gX = 0 Local $gY = 0 MouseMove($IdleCursorCoords[$R][0], $IdleCursorCoords[$R][0]) While _ImageSearchArea($pngLoc[$R] & "square.png", 1, 0, 0, @DesktopWidth, @DesktopHeight, $gX, $gY, 90) MouseClick("left", $gX, $gY) Sleep(Round($RunDelayMult[$R] * CalcDist($gX, $gY))) If _ImageSearchArea($pngLoc[$R] & "item.png", 1, $BagFullCoords[$R][0], $BagFullCoords[$R][1], _ $BagFullCoords[$R][2], $BagFullCoords[$R][3], $gX, $gY, 90) Then Return True EndIf MouseMove($IdleCursorCoords[$R][0], $IdleCursorCoords[$R][0]) Sleep(100) WEnd Return False EndFunc ;==>LootGems Func LootGold() Local $gX = 0 Local $gY = 0 MouseMove($IdleCursorCoords[$R][0], $IdleCursorCoords[$R][0]) While _ImageSearchArea($pngLoc[$R] & "gold.png", 1, 0, 0, @DesktopWidth, @DesktopHeight, $gX, $gY, 90) MouseClick("left", $gX, $gY) MouseMove($IdleCursorCoords[$R][0], $IdleCursorCoords[$R][0]) Sleep(Round($RunDelayMult[$R] * CalcDist($gX, $gY))) WEnd EndFunc ;==>LootGold Func LootTomes() Local $gX = 0 Local $gY = 0 MouseMove($IdleCursorCoords[$R][0], $IdleCursorCoords[$R][0]) While _ImageSearchArea($pngLoc[$R] & "tome.png", 1, 0, 0, @DesktopWidth, @DesktopHeight, $gX, $gY, 90) MouseClick("left", $gX, $gY) MouseMove($IdleCursorCoords[$R][0], $IdleCursorCoords[$R][0]) Sleep(Round($RunDelayMult[$R] * CalcDist($gX, $gY))) WEnd EndFunc ;==>LootTomes Func LootPotions() Local $gX = 0 Local $gY = 0 MouseMove($IdleCursorCoords[$R][0], $IdleCursorCoords[$R][0]) While _ImageSearchArea($pngLoc[$R] & "potion.png", 1, 0, 0, @DesktopWidth, @DesktopHeight, $gX, $gY, 90) MouseClick("left", $gX, $gY) MouseMove($IdleCursorCoords[$R][0], $IdleCursorCoords[$R][0]) Sleep(Round($RunDelayMult[$R] * CalcDist($gX, $gY))) WEnd EndFunc ;==>LootPotions Func AttackNearbyMonsters() While 1 $MonsterData = PixelSearch($CharHitBox[$R][0], $CharHitBox[$R][1], $CharHitBox[$R][2], $CharHitBox[$R][3], 0xEE0000, 10) If @error Then ExitLoop EndIf Send("{4}") Sleep(300) For $i = 10 To 0 Step -1 Attack($MonsterData[0], $MonsterData[1]) Sleep(100) Next WEnd EndFunc ;==>AttackNearbyMonsters Func CheckForNearbyMonsters() $MonsterData = PixelSearch($CharHitBox[$R][0], $CharHitBox[$R][1], $CharHitBox[$R][2], $CharHitBox[$R][3], 0xEE0000, 10) If @error Then Return False Else Return True EndIf EndFunc ;==>CheckForNearbyMonsters Func SnareNearbyEnemies() $MonsterData = PixelSearch($CharHitBox[$R][0], $CharHitBox[$R][1], $CharHitBox[$R][2], $CharHitBox[$R][3], 0xEE0000, 10) If Not @error Then MouseMove($MonsterData[0], $MonsterData[1]) Sleep(350) Send("{3}") Sleep(250) EndIf EndFunc ;==>SnareNearbyEnemies Func InGameLobby() MouseMove($GameLobbyCode[$R][0], $GameLobbyCode[$R][1]) Sleep(300) PixelSearch($GameLobbyCode[$R][0], $GameLobbyCode[$R][1], $GameLobbyCode[$R][0] + 10, $GameLobbyCode[$R][1] + 10, $GameLobbyCode[$R][2], 10) If Not @error Then Return True Else Return False EndIf EndFunc ;==>InGameLobby Func InGameplayScreen() PixelSearch($GameScreenCode[$R][0], $GameScreenCode[$R][1], $GameScreenCode[$R][0] + 4, $GameScreenCode[$R][1] + 3, $GameScreenCode[$R][2], 10) If Not @error Then Return True Else Return False EndIf EndFunc ;==>InGameplayScreen Func _ImageSearchArea($findImage, $resultPosition, $x1, $y1, $right, $bottom, ByRef $x, ByRef $y, $tolerance) $findImage = "*TRANSBLACK " & $findImage If $tolerance > 0 Then $findImage = "*" & $tolerance & " " & $findImage $result = DllCall("ImageSearchDLL_x64.dll", "str", "ImageSearch", "int", $x1, "int", $y1, "int", $right, "int", $bottom, "str", $findImage) If $result = "0" Then Return 0 ; Otherwise get the x,y location of the match and the size of the image to ; compute the centre of search $array = StringSplit($result[0], "|") If (UBound($array) >= 4) Then $x = Int(Number($array[2])) $y = Int(Number($array[3])) If $resultPosition = 1 Then $x = $x + Int(Number($array[4]) / 2) $y = $y + Int(Number($array[5]) / 2) EndIf Return 1 EndIf EndFunc ;==>_ImageSearchArea Func ActivateGUI() ;setup the UI $Waiting = True $Form1 = GUICreate("D3 Witch Doctor bot by Avatar88343 and Andygongyb", 500, 320, -1, -1) GUICtrlCreateLabel("Warning: the script is for education only, not approved for any form of commercial use", _ 25, 30, 550, -1) GUICtrlCreateLabel("Hotkeys:" & @CRLF & @TAB & "Terminate:" & @TAB & "SHIFT + \" & @CRLF _ & @TAB & "Pause:" & @TAB & @TAB & "F2", 25, 50, 550, -1) GUICtrlCreateLabel("Game Resolution", 25, 100, 100, -1) $ResCombo = GUICtrlCreateCombo("", 25, 115, 200, -1) GUICtrlSetData($ResCombo, "1920 x 1080|800 x 600", "Select your Res") GUICtrlCreateLabel("Character run speed (for 800x600)", 275, 100, 200, -1) $RunInput = GUICtrlCreateInput("0", 275, 115, 200, -1) $LootRareCheck = GUICtrlCreateCheckbox("Loot rares/legs/sets", 25, 160) GUICtrlSetState($LootRareCheck, $GUI_CHECKED) $LootBluesCheck = GUICtrlCreateCheckbox("Loot blues", 150, 160) GUICtrlSetState($LootBluesCheck, $GUI_CHECKED) $LootGemsCheck = GUICtrlCreateCheckbox("Loot gems", 275, 160) GUICtrlSetState($LootGemsCheck, $GUI_CHECKED) $LootPotionsCheck = GUICtrlCreateCheckbox("Loot potions", 400, 160) GUICtrlSetState($LootPotionsCheck, $GUI_CHECKED) $LootTomesCheck = GUICtrlCreateCheckbox("Loot tomes of secret", 25, 190) GUICtrlSetState($LootTomesCheck, $GUI_CHECKED) $LootGoldCheck = GUICtrlCreateCheckbox("Collect the gold carefully (slower)", 275, 190) GUICtrlSetState($LootGoldCheck, $GUI_CHECKED) $RepairCheckbox = GUICtrlCreateCheckbox("Repair gears when needed", 25, 220) GUICtrlSetState($RepairCheckbox, $GUI_CHECKED) $SellBluesCheckbox = GUICtrlCreateCheckbox("Sell blue item when the bag is full", 275, 220) GUICtrlSetState($SellBluesCheckbox, $GUI_CHECKED) $StartButton = GUICtrlCreateButton("Start", 175, 260, 150, 33) GUISetState(@SW_SHOW) ;Wait for them to press start While $Waiting $Action = GUIGetMsg() If $Action = $GUI_EVENT_CLOSE Then Terminate() If $Action = $StartButton Then ExitLoop Sleep(50) WEnd ;Get the values $SelectedRes = GUICtrlRead($ResCombo) If $SelectedRes = "1920 x 1080" Then $R = 0 ElseIf $SelectedRes = "800 x 600" Then $R = 1 Else MsgBox(0, "Error", "You did not select a resolution! Try again") Terminate() EndIf $RunSpeed = Int(GUICtrlRead($RunInput)) $LootRares = GUICtrlRead($LootRareCheck) = $GUI_CHECKED $LootBlues = GUICtrlRead($LootBluesCheck) = $GUI_CHECKED $LootGems = GUICtrlRead($LootGemsCheck) = $GUI_CHECKED $LootPotions = GUICtrlRead($LootPotionsCheck) = $GUI_CHECKED $LootTomes = GUICtrlRead($LootTomesCheck) = $GUI_CHECKED $LootGold = GUICtrlRead($LootGoldCheck) = $GUI_CHECKED $Repair = GUICtrlRead($RepairCheckbox) = $GUI_CHECKED $SellBlues = (GUICtrlRead($SellBluesCheckbox) = $GUI_CHECKED) And $LootBlues GUISetState(@SW_HIDE) EndFunc ;==>ActivateGUI