Guest User

Untitled

a guest
Jun 17th, 2012
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 33.63 KB | None | 0 0
  1. ;notAres' DH Gold Script 1.9.1 - 6/17/2012 - Window check added again. Increased speed of runs w/ Displacement rune (movement speed 32). 16.1 seconds for closed run, about 35 seconds for open cellar.
  2. ;YOU MUST START THE BOT AT THE RESUME GAME SCREEN!
  3. ;Thread: http://ownedcore.com/forums/diablo-3/diablo-3-bots-programs/354464-goldfarming-notares-sarkoth-dh-gold-script-autoit-script-1920x1080.html
  4. ;;;;;
  5. ;WONT WORK UNLESS MOVE IS BOUND TO MIDDLE MOUSE (Mouse 3) -- NOT MOVE/INTERACT
  6. ;Suggested build: http://us.battle.net/d3/en/calculator/demon-hunter#aRYXVT!aYW!YaaabY
  7. ;Required display mode for cellar detection: "FULLSCREEN WINDOWED"
  8. ;Official supported resolution: 1920x1080
  9. ;;;;;
  10. ;Original by mackus101 @ ownedcore
  11. ;ImageSearch contributions by rvbfreak, goofinator, and asuRob
  12. ;Refactoring and additional functions by Shimizoki
  13.  
  14. ;=========== DO NOT TOUCH ===========;
  15. #RequireAdmin
  16. #include <GUIConstantsEx.au3>
  17. #include <StaticConstants.au3>
  18. #include <WindowsConstants.au3>
  19. Opt('MouseCoordMode', 2)
  20. Opt('PixelCoordMode', 2)
  21. Global $size = WinGetClientSize("[CLASS:D3 Main Window Class]"), $ver = "1.9.1", $ini = "DH.ini", $hFont = 0, $title, $Paused, $Go = False, $i = 0, $gX = 0, $gY = 0, $LegendaryCount = 0, $SetCount = 0, $RareCount = 0, $MagicCount = 0, $GemCount = 0, $TomeCount = 0, $t = TimerInit(), $rt = 0, $run = 0, $yellow = 0xFFF000, $red = 0xD90000, $lblRun, $lblLocation, $lblStatus, $lblLast, $lblRuntime, $lblGear, $lblItems
  22. For $i = 0 To Random(3, 6, 1)
  23. $title &= Chr(Random(97, 122, 1))
  24. Next
  25. For $i = 0 To Random(4, 8, 1)
  26. $title &= Chr(Random(65, 90, 1))
  27. Next
  28. $title &= " "
  29. Global $gems[8] = ["Ru1.png", "Ru2.png", "Em1.png", "Em2.png", "To1.png", "To2.png", "Am1.png", "Am2.png"]
  30. If @OSArch = "X64" Then DllCall("kernel32.dll", "int", "Wow64DisableWow64FsRedirection", "int", 1)
  31. If @OSArch = "X64" And Not @AutoItX64 Then MsgBox(16, "ERROR", "Why aren't you running the 64-bit AutoIt??? Expect bugs!")
  32. If $size = 0 Then
  33. MsgBox(16, "Error", "Diablo III is not running, cannot grab resolution!" & @CRLF & "Exiting...")
  34. Exit
  35. EndIf
  36. ;====================================;
  37.  
  38. ;============= SETTINGS =============;
  39. HotKeySet("=", "Begin") ;script toggled on/off by pressing =
  40. HotKeySet("{PAUSE}", "TogglePause") ;script toggle pause by pressing Pause/Break key
  41. HotKeySet("x", "Stop") ;script stopped by pressing x
  42.  
  43. ;Change to match your abilities (1-4 by default)z
  44. $skillCaltrops = "1"
  45. $skillSmokeScreen = "2"
  46. $skillPreparation = "3"
  47. $skillCompanion = "4"
  48.  
  49. $movementSpeed = 25 ;This is the % increase movement speed you have. 25 = 25%, 0 = 0% (25% is the movement cap but SS + Displacement avg = 32%)
  50.  
  51. ;Custom Loot
  52. $pngLoc = "C:\Games\Diablo III\pics\" ;Location of the .PNGs (NO SUBFOLDERS - ALL PNGS GO HERE)
  53. $totalItems = 1 ;Number of items in the pick array
  54. Global $pick[$totalItems] ;DONT CHANGE THIS
  55.  
  56. ;Array of items to loot (GEMS AND TOMES ALREADY INCLUDED)
  57. $pick[0] = "mythic.png|40" ;png|Tolerance
  58. ;$pick[1] = "item2.png|0"
  59. ;$pick[2] = "item3.png|0"
  60.  
  61. ;Looting
  62. $LootSets = "True" ;True if you want to pick up Sets
  63. $LootLegendaries = "True";True if you want to pick up Legendaries
  64. $LootRares = "True" ;True if you want to pick up Rares
  65. $LootMagic = "True" ;True if you want to pick up Magic
  66. $LootGems = "True" ;True if you want to pick up Gems
  67. $LootTomes = "True" ;True if you want to pick up Tome of Secrets
  68. $LootCustom = "False" ;True if you want to pick up Custom Items (The items in the $pick array above)
  69.  
  70. ;Manage Loot
  71. $mLoot = 5 ;Nuber of successful runs until Stash and Vendor
  72. $mLootOff = 2 ;Stash and Vendor after mLoot +- X number of runs (Variability)
  73.  
  74. ;Stashing
  75. $StashLoot = "True" ;True if you want to store Items in the stash
  76. ;---
  77. $StashLegendary = "True";True if you want to store Legendary items in the stash
  78. $StashRare = "True" ;True if you want to store Rare items in the stash
  79. $StashMagic = "False" ;True if you want to store Magic items in the stash
  80. $StashTomes = "True" ;True if you want to store Tomes items in the stash
  81. $StashGems = "True" ;True if you want to store Gems items in the stash
  82.  
  83. ;Vendoring ==NEW SETTINGS==
  84. $VendorLoot = "True" ;True if you want to vendor anything
  85. ;---
  86. $VendorRare = "False" ;True if you want to vendor Rares
  87. $VendorMagic = "True" ;True if you want to vendor Magic
  88. $vendorAll = "False" ;True if you want to right click all items when talking to vendor
  89. $vendorRows = 5 ;# of rows to vendor, starting from the top (default = 5: bottom row is safe)
  90. $vendorCols = 10 ;# of columns to vendor, starting from left
  91.  
  92. ;Variability ==NEW SETTINGS==
  93. $Timer = "True" ;True and the bot will add random sleep intervals
  94. ;---
  95. $attackTime = 3900 ;Time (in ms) the script will shoot sarkoth with the right button
  96. $attackMulti = "True" ;True if you want to shoot both left and right in addition to the middle (False for Lightning Ball)
  97. $walktime = 2800 ;Time (in ms) the script waits for you to enter and load the cellar. Slow this down for slower move speeds and loading times
  98. $loadtime = 3400 ;Time (in ms) the script waits for the game to load before it starts pathfinding. Slow this down for slower hard drives
  99. $tptime = 6900 ;Time (in ms) the script waits for teleport before exiting the game
  100. ;====================================;
  101.  
  102. $x_ratio = $size[0] / 1920
  103. $y_ratio = $size[1] / 1080
  104. If FileExists($ini) Then
  105. Call("ReadINI")
  106. Call("CreateINI")
  107. Else
  108. Call("CreateINI")
  109. EndIf
  110.  
  111. $mLootIn = $mLoot
  112. $movementSpeed = 1 + ($movementSpeed / 100)
  113. $VersionsInfo = "http://dl.dropbox.com/u/9955791/version.ini"
  114. $oldVersion = IniRead("updater.ini", "Version", "Version", $ver)
  115. $newVersion = "0.0"
  116.  
  117. If Not FileExists($pngLoc & "MainMenu.png") Then
  118. MsgBox(16, "Fatal Error", "FATAL ERROR: Cannot find: " & $pngLoc & "MainMenu.png" & @CRLF & "Make sure your directory is set properly in the script")
  119. Exit
  120. EndIf
  121.  
  122. Call("SetupGUI")
  123. Call("DoUpdate")
  124.  
  125. While 1
  126. Call("RestartRun")
  127. WEnd
  128.  
  129. Func RestartRun()
  130. If ($Go) Then
  131. $i = 0
  132. WinSetTitle($title, "", $title & $ver & " - Running")
  133. ;Checks if the player is in Old Ruins, then if Dead/Logout/Window, then if in Main Menu, etc.
  134. If CheckFor("OldRuins", "", 1500 * $x_ratio, 0 * $y_ratio, 1920 * $x_ratio, 80 * $y_ratio, 1, 120) Then
  135. GUICtrlSetData($lblLocation, "Location: Old Ruins")
  136. Call("TownPortal")
  137. If Not Call("CheckDead") Then Call("LeaveGame")
  138. Return
  139. ElseIf Call("CheckDead") Then
  140. Return
  141. ElseIf CheckFor("MainMenu", "", Round(40 * $x_ratio), Round(300 * $y_ratio), Round(400 * $x_ratio), Round(600 * $y_ratio), 8, 140) Then
  142. GUICtrlSetData($lblRun, "Run Number: " & $run & " - Runs till vendor: " & $mLootIn)
  143. GUICtrlSetData($lblLocation, "Location: Main Menu")
  144. GUICtrlSetData($lblStatus, "Status: Starting Game")
  145. RandClick("left", Round(230 * $x_ratio), Round(416 * $y_ratio), 120, 20) ;Random Click on the resume button
  146. $rt = TimerInit()
  147. $run += 1
  148. ElseIf CheckFor("LimitError", "", Round(700 * $x_ratio), Round(340 * $y_ratio), Round(1200 * $x_ratio), Round(600 * $y_ratio), 1, 80) Then
  149. MouseClick("left", Round(960 * $y_ratio), Round(635 * $x_ratio))
  150. $rand = Random(40000, 80000)
  151. GUICtrlSetData($lblStatus, "Status: Input Limit - Waiting " & Round($rand / 1000) & " seconds.")
  152. Sleep($rand)
  153. Send("{SPACE}")
  154. Return
  155. ElseIf CheckFor("Disconnect", "", Round(700 * $x_ratio), Round(340 * $y_ratio), Round(1200 * $x_ratio), Round(600 * $y_ratio), 1, 80) Then
  156. GUICtrlSetData($lblStatus, "Status: Network Disconnect window up")
  157. MouseClick("left", Round(960 * $x_ratio), Round(632 * $y_ratio))
  158. Sleep(100)
  159. Send("{SPACE}")
  160. Return
  161. ElseIf CheckFor("ExitGame", "", Round(700 * $x_ratio), Round(340 * $y_ratio), Round(1200 * $x_ratio), Round(600 * $y_ratio), 1, 80) Then
  162. GUICtrlSetData($lblStatus, "Status: Exit window up")
  163. MouseClick("left", Round(1064 * $x_ratio), Round(632 * $y_ratio))
  164. Sleep(100)
  165. Send("{SPACE}")
  166. Return
  167. Else
  168. GUICtrlSetData($lblStatus, "ERROR: Cannot find Resume button")
  169. Return
  170. EndIf
  171. ;Make sure we are in the right area before beginning run
  172. If CheckFor("OldRuins", "Area", 1500 * $x_ratio, 0 * $y_ratio, 1920 * $x_ratio, 80 * $y_ratio, 6, 120) Then
  173. Sleep(200)
  174. GUICtrlSetData($lblLocation, "Location: Old Ruins")
  175. Call("CheckRepair")
  176. ;Start Run
  177. RandClick("middle", Round(500 * $x_ratio), Round(250 * $y_ratio), 2, 2) ;starts the run [waypoint 1]
  178. Moving(1300)
  179. Send($skillSmokeScreen)
  180. Moving(600)
  181. RandClick("middle", Round(3 * $y_ratio), Round(370 * $y_ratio), 2, 2) ;waits ~1 second then [waypoint 2]
  182. Moving(2200)
  183. RandClick("middle", Round(400 * $x_ratio), Round(600 * $y_ratio), 2, 2) ;middle of courtyard [waypoint 3]
  184. Moving(100)
  185. Send($skillSmokeScreen)
  186. Moving(100)
  187. Send($skillPreparation)
  188. Moving(750)
  189. Send($skillCaltrops)
  190. Moving(100)
  191. RandMove(Round(235 * $x_ratio), Round(60 * $y_ratio), 1, 1) ;moves cursor over to the cellar so the proper blue pixel becomes highlighted
  192. Sleep(350)
  193. If Call("CheckDead") Then
  194. Return
  195. EndIf
  196.  
  197. ;Checks if Dank Cellar is Open
  198. $Pixel2 = PixelSearch(0, 0, Round(600 * $x_ratio), Round(600 * $y_ratio), 0x334FB7, 3)
  199. If Not @error Then
  200. GUICtrlSetData($lblStatus, "Status: Cellar - Found")
  201. MouseClick("left", Round(235 * $x_ratio), Round(60 * $y_ratio), 1) ;Entrance to cellar
  202. Sleep(940)
  203. Send($skillSmokeScreen)
  204. Moving($walktime)
  205. Else ;ABORT RUN
  206. GUICtrlSetData($lblStatus, "Status: Cellar - Not Found" & @CRLF)
  207. Sleep(10)
  208. RandClick("middle", Round(1100 * $x_ratio), Round(600 * $y_ratio)) ;moves between caltrops for safety before teleporting back to town
  209. Moving(250)
  210. Send($skillCaltrops)
  211. Sleep(620)
  212. Send($skillSmokeScreen)
  213. Sleep(40)
  214. Call("TownPortal")
  215. If Not Call("CheckDead") Then
  216. Call("LeaveGame")
  217. EndIf
  218. Return
  219. EndIf
  220. Else
  221. Call("TownPortal")
  222. If Not Call("CheckDead") Then
  223. Call("LeaveGame")
  224. EndIf
  225. Return
  226. EndIf
  227.  
  228. ;Checks that the player is in the Dank Cellar
  229. If CheckFor("DankCellar", "Area", 1500 * $x_ratio, 0 * $y_ratio, 1920 * $x_ratio, 80 * $y_ratio, 6, 120) Then
  230. GUICtrlSetData($lblLocation, "Location: Dank Cellar")
  231. RandClick("middle", Round(110 * $x_ratio), Round(1000 * $y_ratio), 1, 1) ;moves to doorway leading to rare inside cellar
  232. Sleep(Random(2200, 2800))
  233. RandMove(Round(460 * $x_ratio), Round(80 * $y_ratio), 1, 1) ;hovers over the rare Sarkoth
  234. Sleep(10)
  235. Send("{SHIFTDOWN}")
  236. GUICtrlSetData($lblStatus, "Status: Attacking Sarkoth")
  237. MouseDown("right") ;ATTACK
  238. Sleep(1100)
  239. Send($skillCompanion)
  240. Sleep($attackTime)
  241. MouseUp("right")
  242. RandClick("left", Round(460 * $x_ratio), Round(80 * $y_ratio), 1, 1)
  243. RandMove(Round(240 * $x_ratio), Round(75 * $y_ratio), 1, 1) ;attack left
  244. Sleep(40)
  245. MouseDown("right")
  246. If $attackMulti == "True" Then Sleep($attackTime / 2)
  247. MouseUp("right")
  248. MouseMove(Round(590 * $x_ratio), Round(50 * $y_ratio), 1) ;attack right
  249. MouseDown("right")
  250. If $attackMulti == "True" Then Sleep($attackTime / 2)
  251. MouseUp("right")
  252. MouseDown("left")
  253. MouseMove(Round(Random(240, 260) * $x_ratio), Round(75 * $y_ratio), 1) ;attack left
  254. If $attackMulti == "True" Then Sleep($attackTime / 2.5)
  255. MouseMove(Round(Random(560, 600) * $x_ratio), Round(50 * $y_ratio), 1) ;attack right
  256. If $attackMulti == "True" Then Sleep($attackTime / 2.5)
  257. MouseUp("left")
  258. Sleep(400)
  259. MouseClick("right", Round(630 * $x_ratio), Round(18 * $y_ratio), 1, 8) ;break the table & chair
  260. Sleep(200)
  261. Send("{SHIFTUP}")
  262. Moving(200)
  263. RandClick("middle", Round(530 * $x_ratio), Round(190 * $y_ratio)) ;location of sarkoth after death
  264. Moving(2700)
  265. GUICtrlSetData($lblStatus, "Status: Looting")
  266. Send($skillCompanion)
  267. Call("Loot")
  268. RandSleep(0, 6, 30)
  269. Send($skillCompanion)
  270. Call("TownPortal")
  271. Else
  272. Send($skillCaltrops)
  273. Sleep(400)
  274. Send($skillSmokeScreen)
  275. Sleep(40)
  276. Call("TownPortal")
  277. If Not Call("CheckDead") Then
  278. Call("LeaveGame")
  279. EndIf
  280. Return
  281. EndIf
  282. ;After successful run
  283. If Not Call("CheckDead") Then
  284. Sleep(600)
  285. If $mLootIn = 1 And CheckFor("NewTristram", "Area", 1500 * $x_ratio, 0 * $y_ratio, 1920 * $x_ratio, 80 * $y_ratio, 3, 120) Then ;If its time to manage loot and we are in town
  286. Call("Identify")
  287. If $StashLoot == "True" Then
  288. Call("StashLoot")
  289. EndIf
  290. If $VendorLoot == "True" Then
  291. Call("VendorLoot")
  292. EndIf
  293. $mLootIn = Round(Random($mLoot - $mLootOff, $mLoot + $mLootOff)) ;Reset Counter
  294. ElseIf Not CheckFor("NewTristram", "Area", 1500 * $x_ratio, 0 * $y_ratio, 1920 * $x_ratio, 80 * $y_ratio, 1, 120) Then
  295. GUICtrlSetData($lblStatus, "Status: Skipping vendor, not in New Tristram")
  296. Sleep(3000)
  297. Else
  298. $mLootIn -= 1
  299. EndIf
  300. If Not Call("CheckDead") Then
  301. Call("LeaveGame")
  302. EndIf
  303. Return
  304. Else
  305. Return
  306. EndIf
  307. EndIf
  308. EndFunc ;==>RestartRun
  309.  
  310. ;Helper Functions
  311.  
  312. Func SetupGUI()
  313. $frmBot = GUICreate($title & $ver & " - Updating", 280, 121, Round(1540 * $x_ratio), Round(920 * $y_ratio), -1, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW), 0)
  314. GUISetBkColor(0xC0C0C0)
  315. $lblRun = GUICtrlCreateLabel("Run Number: 0 - Runs till vendor: 0", 4, 0, 280, 24)
  316. GUICtrlSetFont(-1, 10, 600, 0, "Segoe UI")
  317. GUICtrlSetColor(-1, 0xFF0000)
  318. $lblLocation = GUICtrlCreateLabel("Location: Main Menu", 12, 20, 240, 17)
  319. $lblStatus = GUICtrlCreateLabel("Status: ", 12, 35, 240, 17)
  320. $lblLast = GUICtrlCreateLabel("Last Runtime: 0 seconds", 12, 50, 240, 17)
  321. $lblRuntime = GUICtrlCreateLabel("Total Runtime: 0 hours, 0 minutes", 12, 65, 240, 17)
  322. $lblGear = GUICtrlCreateLabel("Legendary: 0 - Set: 0 - Rare: 0", 12, 80, 240, 17)
  323. $lblItems = GUICtrlCreateLabel("Magic: 0 - Gems: 0 - Tomes: 0", 12, 95, 240, 17)
  324. GUISetState(@SW_SHOW)
  325. EndFunc ;==>SetupGUI
  326.  
  327. Func CheckDead()
  328. $LogoutTimerCancel = PixelSearch(Round(900 * $x_ratio), Round(240 * $y_ratio), Round(1010 * $x_ratio), Round(290 * $y_ratio), 0x993827) ; checks for cancel button on logout timer
  329. If Not @error Then
  330. GUICtrlSetData($lblStatus, "Status: Logging out")
  331. Sleep(11000)
  332. Sleep($loadtime)
  333. Return 1
  334. EndIf
  335.  
  336. $CloseButton = PixelSearch(Round(1570*$x_ratio), Round(110*$y_ratio), Round(1590*$x_ratio), Round(120*$y_ratio), 0x8C2300) ; checks for the red color of the "X" on an open window
  337. If Not @error Then
  338. GUICtrlSetData($lblStatus, "Status: Open Window")
  339. Sleep(200)
  340. Send("{SPACE}") ;close any open windows
  341. Return 1
  342. EndIf
  343.  
  344. $YouHaveDied = PixelSearch(Round(620 * $x_ratio), Round(325 * $y_ratio), Round(625 * $x_ratio), Round(330 * $y_ratio), 0xFFFFFF) ; checks for white text "YOU HAVE DIED"
  345. If Not @error Then
  346. GUICtrlSetData($lblStatus, "Status: Dead")
  347. Call("LeaveGame")
  348. Sleep(11000)
  349. Sleep($loadtime)
  350. Return 1
  351. Else
  352. Return 0
  353. EndIf
  354. EndFunc ;==>CheckDead
  355.  
  356. Func CheckRepair()
  357. $RepairArea = PixelSearch(Round(1480 * $x_ratio), 0, Round(1570 * $x_ratio), Round(100 * $y_ratio), $yellow)
  358. If Not @error Then
  359. Call("DoRepair")
  360. EndIf
  361. $RepairAreaRed = PixelSearch(Round(1480 * $x_ratio), 0, Round(1570 * $x_ratio), Round(100 * $y_ratio), $red)
  362. If Not @error Then
  363. Call("DoRepair")
  364. EndIf
  365. EndFunc ;==>CheckRepair
  366.  
  367. Func DoRepair()
  368. Sleep(Random(75, 150))
  369. Call("TownPortal")
  370. If Call("CheckDead") Then
  371. Return
  372. EndIf
  373. If CheckFor("NewTristram", "Area", 1500 * $x_ratio, 0 * $y_ratio, 1920 * $x_ratio, 80 * $y_ratio, 6, 120) Then
  374. RandClick("left", Round(1480 * $x_ratio), Round(281 * $y_ratio), 1, 1) ;begin movement towards merchant
  375. Moving(1875)
  376. RandClick("left", Round(1316 * $x_ratio), Round(206 * $y_ratio), 1, 1) ;moves to get merchant in screen
  377. Moving(1875)
  378. RandClick("left", Round(845 * $x_ratio), Round(225 * $y_ratio), 1, 1) ;NPC Merchant to the right of cain's home
  379. Sleep(1200)
  380. RandClick("left", Round(521 * $x_ratio), Round(506 * $y_ratio), 1, 1) ;button to open up repair menu
  381. Sleep(400)
  382. RandClick("left", Round(260 * $x_ratio), Round(595 * $y_ratio), 1, 1) ;button to pay for repairs
  383. Sleep(200)
  384. Send("{Escape}")
  385. If Not Call("CheckDead") Then
  386. Call("LeaveGame")
  387. EndIf
  388. EndIf
  389. EndFunc ;==>DoRepair
  390.  
  391. Func CalcTime()
  392. $srt = TimerDiff($rt)
  393. GUICtrlSetData($lblLast, "Last Runtime: " & Round($srt / 1000, 2) & " seconds.")
  394. $trt = TimerDiff($t)
  395. $total = Round((($trt / 1000) / 60) / 60, 4)
  396.  
  397. ;Total runtime calculation.
  398. $hours = Floor((($trt / 1000) / 60) / 60)
  399. $minutes = (($trt / 1000) / 60)
  400. ;trim minutes if runtime is more then 1 hour.
  401. If $minutes > 60 Then
  402. While $minutes > 60
  403. $minutes -= 60
  404. WEnd
  405. EndIf
  406. GUICtrlSetData($lblRuntime, "Total Runtime: " & $hours & " hours, " & Ceiling($minutes) & " minutes")
  407. EndFunc ;==>CalcTime
  408.  
  409. Func CheckFor($img, $type = "", $startX = 0, $startY = 0, $endX = @DesktopWidth, $endY = @DesktopHeight, $seconds = 5, $tolerance = 130)
  410. $c = 0
  411. $string = $pngLoc & $img & ".png"
  412. Do
  413. $c += 1
  414. Sleep(100)
  415. If $c > ($seconds * 10) Then ;Make sure we never get stuck here for infinity.
  416. If $type = "Area" Then
  417. GUICtrlSetData($lblStatus, "Status: Area not found - " & $img)
  418. EndIf
  419. Return False
  420. EndIf
  421. Until _ImageSearchArea($string, 1, $startX, $startY, $endX, $endY, $gX, $gY, $tolerance)
  422. Return True
  423. EndFunc ;==>CheckFor
  424.  
  425. Func Loot()
  426. Sleep(Random(500, 2000))
  427. MouseMove(Round(Random(0, 400) * $x_ratio), Round(Random(700, 1080) * $y_ratio), 3) ;Moves mouse out of the way
  428. If $LootSets == "True" Then
  429. $SetCount += LootGear(0x02CE01, 2)
  430. EndIf
  431. If $LootLegendaries == "True" Then
  432. $LegendaryCount += LootGear(0xBF642F, 0)
  433. EndIf
  434. If $LootRares == "True" Then
  435. $RareCount += LootGear(0xBBBB00, 2)
  436. EndIf
  437. If $LootGems == "True" Then
  438. Call("LootGems")
  439. EndIf
  440. If $LootTomes == "True" Then
  441. Call("LootTomes")
  442. EndIf
  443. If $LootCustom == "True" Then
  444. Call("LootCustom")
  445. EndIf
  446. If $LootMagic == "True" Then
  447. $MagicCount += LootGear(0x6969FF, 2)
  448. EndIf
  449. Call("ShowLoot")
  450. EndFunc ;==>Loot
  451.  
  452. Func LootGear($color, $tolerance = 2)
  453. $count = 0
  454. $Loot = PixelSearch(Round(400 * $x_ratio), 0, Round(1690 * $x_ratio), Round(900 * $y_ratio), $color, $tolerance)
  455. If Not @error Then
  456. While Not @error
  457. $count += 1
  458. MouseClick('left', $Loot[0], $Loot[1], 1, 3)
  459. Moving(900)
  460. MouseMove(Round(Random(0, 400) * $x_ratio), Round(Random(700, 1080) * $y_ratio), 3) ;Moves mouse out of the way
  461. ;Run at max 10 times per quality
  462. If $count >= 10 Then
  463. ExitLoop
  464. EndIf
  465. $Loot = PixelSearch(Round(400 * $x_ratio), 0, Round(1690 * $x_ratio), Round(900 * $y_ratio), $color, $tolerance)
  466. WEnd
  467. EndIf
  468. Return $count
  469. EndFunc ;==>LootGear
  470.  
  471. Func LootCustom()
  472. $count = 0
  473. $gX = 0
  474. $gY = 0
  475. For $i = 0 To ($totalItems - 1)
  476. $array = StringSplit($pick[$i], "|")
  477. $file = $array[1]
  478. $accuracy = $array[2]
  479. $urlString = $pngLoc & $file
  480. While _ImageSearchArea($pngLoc & $file, 1, 0, 0, @DesktopWidth, @DesktopHeight, $gX, $gY, $accuracy)
  481. $count += 1
  482. MouseClick("left", $gX, $gY, 1, 1)
  483. Moving(900)
  484. MouseMove(Round(Random(0, 400) * $x_ratio), Round(Random(700, 1080) * $y_ratio), 3) ;Moves mouse out of the way
  485. If $count >= 10 Then
  486. ExitLoop
  487. EndIf
  488. WEnd
  489. Next
  490. EndFunc ;==>LootCustom
  491.  
  492. Func LootGems()
  493. $count = 0
  494. $gX = 0
  495. $gY = 0
  496. While _ImageSearchArea($pngLoc & "square.png", 1, 0, 0, @DesktopWidth, @DesktopHeight, $gX, $gY, 90)
  497. $count += 1
  498. MouseClick("left", $gX, $gY - 3, 1, 3)
  499. $GemCount += 1
  500. Moving(900)
  501. MouseMove(Round(Random(0, 400) * $x_ratio), Round(Random(700, 1080) * $y_ratio), 3) ;Moves mouse out of the way
  502. If $count >= 10 Then
  503. ExitLoop
  504. EndIf
  505. WEnd
  506. EndFunc ;==>LootGems
  507.  
  508. Func LootTomes()
  509. $count = 0
  510. $gX = 0
  511. $gY = 0
  512. While _ImageSearchArea($pngLoc & "tome.png", 1, 0, 0, @DesktopWidth, @DesktopHeight, $gX, $gY, 90)
  513. $count += 1
  514. MouseClick("left", $gX, $gY - 3, 1, 3)
  515. $TomeCount += 1
  516. Moving(900)
  517. MouseMove(Round(Random(0, 400) * $x_ratio), Round(Random(700, 1080) * $y_ratio), 3) ;Moves mouse out of the way
  518. If $count >= 10 Then
  519. ExitLoop
  520. EndIf
  521. WEnd
  522. EndFunc ;==>LootTomes
  523.  
  524. Func Identify()
  525. Send("c")
  526. Sleep(1300)
  527. While _ImageSearchArea($pngLoc & "unidentified.png", 1, 1400 * $x_ratio, 580 * $y_ratio, 1914 * $x_ratio, 888 * $y_ratio, $gX, $gY, 120)
  528. GUICtrlSetData($lblStatus, "Status: Identifying")
  529. Sleep(Random(200, 300))
  530. MouseClick("right", $gX, $gY, 1)
  531. MouseMove(Round(Random(0, 400) * $x_ratio), Round(Random(700, 1080) * $y_ratio), 3) ;Moves mouse out of the way
  532. Sleep(Random(3000, 3500))
  533. WEnd
  534. Send("c")
  535. Sleep(600)
  536. EndFunc ;==>Identify
  537.  
  538. Func StashLoot()
  539. GUICtrlSetData($lblStatus, "Status: Putting Items in Stash")
  540. Sleep(Random(1000, 1500))
  541. MouseClick("left", 1064 * $x_ratio, 256 * $y_ratio)
  542. Sleep(Random(1500, 2000))
  543.  
  544. ;Legendaries
  545. While $StashLegendary == "True"
  546. Sleep(Random(200, 300))
  547. $LegendPixel = PixelSearch(1400 * $x_ratio, 580 * $y_ratio, 1914 * $x_ratio, 888 * $y_ratio, 0x4D2C0D, 0)
  548. If Not @error Then
  549. GUICtrlSetData($lblStatus, "Status: Stashing Legendaries")
  550. MouseClick("right", $LegendPixel[0], $LegendPixel[1], 1, 4)
  551. Else
  552. ExitLoop
  553. EndIf
  554. WEnd
  555.  
  556. ;Rares
  557. While $StashRare == "True"
  558. Sleep(Random(200, 300))
  559. $RarePixel = PixelSearch(1400 * $x_ratio, 580 * $y_ratio, 1914 * $x_ratio, 888 * $y_ratio, 0x4A3C0B, 1)
  560. If Not @error Then
  561. GUICtrlSetData($lblStatus, "Status: Stashing Rares")
  562. MouseClick("right", $RarePixel[0], $RarePixel[1], 1, 4)
  563. Else
  564. ExitLoop
  565. EndIf
  566. WEnd
  567.  
  568. ;Tomes
  569. If $StashTomes == "True" Then
  570. If _ImageSearchArea($pngLoc & "TomeIcon.png", 1, 1400 * $x_ratio, 580 * $y_ratio, 1914 * $x_ratio, 888 * $y_ratio, $gX, $gY, 140) Then
  571. GUICtrlSetData($lblStatus, "Status: Stashing Tomes")
  572. MouseClick("left", 500 * $x_ratio, 360 * $y_ratio, 1, 4)
  573. MouseClick("right", $gX, $gY, 1, 4)
  574. Sleep(80)
  575. MouseClick("left", 500 * $x_ratio, 200 * $y_ratio, 1, 4)
  576. EndIf
  577. EndIf
  578.  
  579. ;Magic
  580. While $StashMagic == "True"
  581. Sleep(Random(100, 300))
  582. $MagicPixel = PixelSearch(1400 * $x_ratio, 580 * $y_ratio, 1914 * $x_ratio, 888 * $y_ratio, 0x182037, 1)
  583. If Not @error Then
  584. GUICtrlSetData($lblStatus, "Status: Stashing Magic")
  585. MouseClick("right", $MagicPixel[0], $MagicPixel[1], 1, 4)
  586. Else
  587. ExitLoop
  588. EndIf
  589. WEnd
  590.  
  591. ;Gems (DOESN'T STASH BOTTOM ROW!)
  592. If $StashGems == "True" Then
  593. GUICtrlSetData($lblStatus, "Status: Stashing Gems")
  594. MouseClick("left", 500 * $x_ratio, 200 * $y_ratio, 1, 4)
  595. Sleep(Random(200, 500))
  596. For $i = 0 To 7
  597. If _ImageSearchArea($pngLoc & $gems[$i], 1, 1400 * $x_ratio, 580 * $y_ratio, 1914 * $x_ratio, 820 * $y_ratio, $gX, $gY, 140) Then
  598. MouseClick("right", $gX, $gY, 1, 4)
  599. Sleep(80)
  600. EndIf
  601. Next
  602. EndIf
  603. Sleep(Random(1000, 1500))
  604. Send("{SPACE}")
  605. EndFunc ;==>StashLoot
  606.  
  607. Func VendorLoot()
  608. GUICtrlSetData($lblStatus, "Status: Vendoring Items")
  609. If Not $StashLoot == "True" Then ;Move from TP towards vendor
  610. Sleep(Random(300, 500))
  611. MouseClick("middle", 1565 * $x_ratio, 50 * $y_ratio)
  612. Else ;Move from Stash towards vendor
  613. Sleep(Random(300, 500))
  614. MouseClick("middle", 1560 * $x_ratio, 120 * $y_ratio)
  615. EndIf
  616. Sleep(3000)
  617. MouseClick("left", 1030 * $x_ratio, 210 * $y_ratio) ;Talk to vendor
  618. Sleep(3000)
  619.  
  620. ;All
  621. If $vendorAll == "True" Then
  622. For $c = 1 To $vendorCols
  623. For $r = 1 To $vendorRows
  624. RandClick("right", (((($c - 1) * 50) + 32 + 1400) * $x_ratio), (((($r - 1) * 51) + 32 + 580) * $y_ratio), 2, 2, 1, 3)
  625. Next
  626. Next
  627. EndIf
  628.  
  629. ;Rares
  630. If $VendorRare == "True" Then
  631. $c = 0
  632. While $c <= 10
  633. Sleep(Random(100, 300))
  634. $RarePixel = PixelSearch(1400 * $x_ratio, 580 * $y_ratio, 1914 * $x_ratio, 888 * $y_ratio, 0x4A3C0B, 1)
  635. If Not @error Then
  636. MouseClick("right", $RarePixel[0], $RarePixel[1], 1, 4)
  637. Sleep(Random(400, 600))
  638. $c += 1
  639. Else
  640. ExitLoop
  641. EndIf
  642. WEnd
  643. EndIf
  644.  
  645. ;Magic
  646. If $VendorMagic == "True" Then
  647. $c = 0
  648. While $c <= 25
  649. Sleep(Random(100, 300))
  650. $MagicPixel = PixelSearch(1400 * $x_ratio, 580 * $y_ratio, 1914 * $x_ratio, 888 * $y_ratio, 0x182037, 1)
  651. If Not @error Then
  652. MouseClick("right", $MagicPixel[0], $MagicPixel[1], 1, 4)
  653. Sleep(Random(400, 600))
  654. $c += 1
  655. Else
  656. ExitLoop
  657. EndIf
  658. WEnd
  659. EndIf
  660.  
  661. Sleep(200)
  662. RandClick("left", Round(521 * $x_ratio), Round(506 * $y_ratio), 1, 1) ;button to open up repair menu
  663. Sleep(300)
  664. RandClick("left", Round(260 * $x_ratio), Round(595 * $y_ratio), 1, 1) ;button to pay for repairs
  665. Sleep(200)
  666. Sleep(Random(1000, 3000))
  667. GUICtrlSetData($lblStatus, "Status: Done With Vendor")
  668. Send("{ESCAPE}")
  669. EndFunc ;==>VendorLoot
  670.  
  671. Func DoUpdate()
  672. $ini = InetGet($VersionsInfo, @ScriptDir & "\version.ini") ;download version.ini
  673. If $ini = 0 Then ;was the download of version.ini successful?
  674. MsgBox(16, "Fatal Error", "The server seems to be offline. No update will be done.")
  675. Else
  676. $newVersion = IniRead(@ScriptDir & "\version.ini", "Version", "Version", "") ;reads the new version out of version.ini
  677. If $newVersion = $oldVersion Then ;compare old and new
  678. ;MsgBox (0,"No update","There is no update available!")
  679. FileDelete(@ScriptDir & "\version.ini")
  680. Else
  681. $msg = MsgBox(68, "Update", "A new version is available: " & $newVersion & "! Current version: " & $oldVersion & @CRLF & "Do you want to download the new version?")
  682. If $msg = 7 Then ;No was pressed
  683. FileDelete(@ScriptDir & "\version.ini")
  684. ElseIf $msg = 6 Then ;OK was pressed
  685. $downloadLink = IniRead(@ScriptDir & "\version.ini", "Version", "download", "NotFound")
  686. $dlhandle = InetGet($downloadLink, @ScriptDir & "\Update_" & $newVersion & ".zip", 1, 1)
  687. ProgressOn("Update", "Downloading Updates", "", -1, -1, 16) ;creates a progressbar
  688.  
  689. $size = InetGetSize($downloadLink, 1) ;get the size of the update
  690. While Not InetGetInfo($dlhandle, 2)
  691. $Percent = Round((InetGetInfo($dlhandle, 0) / $size) * 100)
  692. ProgressSet($Percent, $Percent & "%") ;update progressbar
  693. Sleep(1)
  694. WEnd
  695. ProgressSet(100, "Done", "Complete") ;show complete progressbar
  696. Sleep(500)
  697. ProgressOff() ;close progress window
  698. IniWrite("updater.ini", "version", "version", $newVersion)
  699. InetClose($dlhandle)
  700. $iniMsg = IniRead(@ScriptDir & "\version.ini", "Version", "message", "Exiting...")
  701. MsgBox(64, "Success", "Download Complete!" & @CRLF & "Please restart the bot by extracting the Au3 from Update_" & $newVersion & ".zip" & @CRLF & $iniMsg)
  702. FileDelete(@ScriptDir & "\version.ini")
  703. Exit
  704. EndIf
  705. EndIf
  706. EndIf
  707. WinSetTitle($title, "", $title & $ver & " - Waiting")
  708. EndFunc ;==>DoUpdate
  709. Func ReadINI()
  710. $pngLoc = IniRead($ini, "Custom Loot", "PNG Location", $pngLoc)
  711. $totalItems = IniRead($ini, "Custom Loot", "Total Items", $totalItems)
  712. $skillCaltrops = IniRead($ini, "Skills", "Caltrops", $skillCaltrops)
  713. $skillSmokeScreen = IniRead($ini, "Skills", "SmokeScreen", $skillSmokeScreen)
  714. $skillPreparation = IniRead($ini, "Skills", "Preparation", $skillPreparation)
  715. $skillCompanion = IniRead($ini, "Skills", "Companion", $skillCompanion)
  716. $movementSpeed = IniRead($ini, "Additional", "Movement Speed", $movementSpeed)
  717. $walktime = IniRead($ini, "Additional", "Walk Time", $walktime)
  718. $loadtime = IniRead($ini, "Additional", "Load Time", $loadtime)
  719. $tptime = IniRead($ini, "Additional", "Teleport Time", $tptime)
  720. $LootSets = IniRead($ini, "Looting", "Sets", $LootSets)
  721. $LootLegendaries = IniRead($ini, "Looting", "Legendaries", $LootLegendaries)
  722. $LootRares = IniRead($ini, "Looting", "Rares", $LootRares)
  723. $LootMagic = IniRead($ini, "Looting", "Magic", $LootMagic)
  724. $LootGems = IniRead($ini, "Looting", "Gems", $LootGems)
  725. $LootTomes = IniRead($ini, "Looting", "Tomes", $LootTomes)
  726. $LootCustom = IniRead($ini, "Looting", "Custom", $LootCustom)
  727. $mLoot = IniRead($ini, "ManageLoot", "Every", $mLoot)
  728. $StashLoot = IniRead($ini, "Stashing", "Loot", $StashLoot)
  729. $StashLegendary = IniRead($ini, "Stashing", "Legendaries", $StashLegendary)
  730. $StashRare = IniRead($ini, "Stashing", "Rares", $StashRare)
  731. $StashMagic = IniRead($ini, "Stashing", "Magic", $StashMagic)
  732. $StashTomes = IniRead($ini, "Stashing", "Tomes", $StashTomes)
  733. $StashGems = IniRead($ini, "Stashing", "Gems", $StashGems)
  734. $VendorLoot = IniRead($ini, "Vendoring", "Loot", $VendorLoot)
  735. $VendorRare = IniRead($ini, "Vendoring", "Rares", $VendorRare)
  736. $VendorMagic = IniRead($ini, "Vendoring", "Magic", $VendorMagic)
  737. $vendorAll = IniRead($ini, "Vendoring", "All", $vendorAll)
  738. $vendorRows = IniRead($ini, "Vendoring", "All-Rows", $vendorRows)
  739. $vendorCols = IniRead($ini, "Vendoring", "All-Cols", $vendorCols)
  740. $Timer = IniRead($ini, "Variability", "Timer", $Timer)
  741. $mLootOff = IniRead($ini, "Variability", "Manage Off By", $mLootOff)
  742. $attackTime = IniRead($ini, "Variability", "Attack Time", $attackTime)
  743. $attackMulti = IniRead($ini, "Variability", "Attack Multiple", $attackMulti)
  744. EndFunc ;==>ReadINI
  745. Func CreateINI()
  746. IniWrite($ini, "Custom Loot", "PNG Location", $pngLoc)
  747. IniWrite($ini, "Custom Loot", "Total Items", $totalItems)
  748. IniWrite($ini, "Skills", "Caltrops", $skillCaltrops)
  749. IniWrite($ini, "Skills", "SmokeScreen", $skillSmokeScreen)
  750. IniWrite($ini, "Skills", "Preparation", $skillPreparation)
  751. IniWrite($ini, "Skills", "Companion", $skillCompanion)
  752. IniWrite($ini, "Additional", "Movement Speed", $movementSpeed)
  753. IniWrite($ini, "Additional", "Walk Time", $walktime)
  754. IniWrite($ini, "Additional", "Load Time", $loadtime)
  755. IniWrite($ini, "Additional", "Teleport Time", $tptime)
  756. IniWrite($ini, "Looting", "Sets", $LootSets)
  757. IniWrite($ini, "Looting", "Legendaries", $LootLegendaries)
  758. IniWrite($ini, "Looting", "Rares", $LootRares)
  759. IniWrite($ini, "Looting", "Magic", $LootMagic)
  760. IniWrite($ini, "Looting", "Gems", $LootGems)
  761. IniWrite($ini, "Looting", "Tomes", $LootTomes)
  762. IniWrite($ini, "Looting", "Custom", $LootCustom)
  763. IniWrite($ini, "ManageLoot", "Every", $mLoot)
  764. IniWrite($ini, "Stashing", "Loot", $StashLoot)
  765. IniWrite($ini, "Stashing", "Legendaries", $StashLegendary)
  766. IniWrite($ini, "Stashing", "Rares", $StashRare)
  767. IniWrite($ini, "Stashing", "Magic", $StashMagic)
  768. IniWrite($ini, "Stashing", "Tomes", $StashTomes)
  769. IniWrite($ini, "Stashing", "Gems", $StashGems)
  770. IniWrite($ini, "Vendoring", "Loot", $VendorLoot)
  771. IniWrite($ini, "Vendoring", "Rares", $VendorRare)
  772. IniWrite($ini, "Vendoring", "Magic", $VendorMagic)
  773. IniWrite($ini, "Vendoring", "All", $vendorAll)
  774. IniWrite($ini, "Vendoring", "All-Rows", $vendorRows)
  775. IniWrite($ini, "Vendoring", "All-Cols", $vendorCols)
  776. IniWrite($ini, "Variability", "Timer", $Timer)
  777. IniWrite($ini, "Variability", "Manage Off By", $mLootOff)
  778. IniWrite($ini, "Variability", "Attack Time", $attackTime)
  779. IniWrite($ini, "Variability", "Attack Multiple", $attackMulti)
  780. EndFunc ;==>CreateINI
  781.  
  782. Func _ImageSearchArea($findImage, $resultPosition, $x1, $y1, $right, $bottom, ByRef $x, ByRef $y, $tolerance)
  783. If $tolerance > 0 Then $findImage = "*" & $tolerance & " " & $findImage
  784. $findImage = "*TRANSBLACK " & $findImage
  785. If @AutoItX64 Then
  786. $result = DllCall("ImageSearchDLL_x64.dll", "str", "ImageSearch", "int", $x1, "int", $y1, "int", $right, "int", $bottom, "str", $findImage)
  787. Else
  788. $result = DllCall("ImageSearchDLL.dll", "str", "ImageSearch", "int", $x1, "int", $y1, "int", $right, "int", $bottom, "str", $findImage)
  789. EndIf
  790. If $result = "0" Then
  791. Return 0
  792. EndIf
  793.  
  794. ; Otherwise get the x,y location of the match and the size of the image to
  795. ; compute the centre of search
  796. $array = StringSplit($result[0], "|")
  797. If (UBound($array) >= 4) Then
  798. $x = Int(Number($array[2]))
  799. $y = Int(Number($array[3]))
  800. If $resultPosition = 1 Then
  801. $x = $x + Int(Number($array[4]) / 2)
  802. $y = $y + Int(Number($array[5]) / 2)
  803. EndIf
  804. Return 1
  805. EndIf
  806. EndFunc ;==>_ImageSearchArea
  807.  
  808. Func LeaveGame()
  809. Call("RandSleep")
  810. GUICtrlSetData($lblStatus, "Status: Leaving Game")
  811. Sleep(Random(200, 500))
  812. Send("{Escape}")
  813. Sleep(Random(200, 500))
  814. RandClick("left", Round(956 * $x_ratio), Round(579 * $y_ratio), 120, 20) ;Random Click on the leave button
  815. Call("CalcTime")
  816. EndFunc ;==>LeaveGame
  817.  
  818. Func TownPortal()
  819. GUICtrlSetData($lblStatus, "Status: Returning to Town")
  820. Send("t")
  821. Sleep(Random($tptime, $tptime + 500))
  822. EndFunc ;==>TownPortal
  823.  
  824. Func Moving($time)
  825. Sleep($time / $movementSpeed)
  826. EndFunc ;==>Moving
  827.  
  828. Func RandClick($clickType, $xPos, $yPos, $xOff = 10, $yOff = 10, $clicks = 1, $speed = 4)
  829. If $xOff < 1 Then $xOff = 1
  830. If $yOff < 1 Then $yOff = 1
  831. $randX = Round(Random($xPos - ($xOff * $x_ratio), $xPos + ($xOff * $x_ratio)))
  832. $randY = Round(Random($yPos - ($yOff * $y_ratio), $yPos + ($yOff * $y_ratio)))
  833. MouseClick($clickType, $randX, $randY, $clicks, $speed)
  834. EndFunc ;==>RandClick
  835.  
  836. Func RandMove($xPos, $yPos, $xOff = 10, $yOff = 10, $speed = 1)
  837. $randX = Round(Random($xPos - ($xOff * $x_ratio), $xPos + ($xOff * $x_ratio)))
  838. $randY = Round(Random($yPos - ($yOff * $y_ratio), $yPos + ($yOff * $y_ratio)))
  839. MouseMove($randX, $randY, $speed)
  840. EndFunc ;==>RandMove
  841.  
  842. Func RandSleep($min = 30, $max = 45, $chance = 3)
  843. $randNum = Round(Random(1, 100))
  844. If $Timer == "True" And $randNum <= $chance Then
  845. $sleepTime = Random($min * 1000, $max * 1000)
  846. GUICtrlSetData($lblStatus, "Status: Random Sleep - " & Round($sleepTime / 1000) & " secs")
  847.  
  848. For $c = 0 To 10
  849. Sleep($sleepTime / 10)
  850. Next
  851. EndIf
  852. EndFunc ;==>RandSleep
  853.  
  854. ;Hotkey Functions
  855.  
  856. Func Begin()
  857. $Go = Not $Go
  858. If Not $Go Then WinSetTitle($title, "", $title & $ver & " - Halted")
  859. EndFunc ;==>Begin
  860.  
  861. Func TogglePause()
  862. $Paused = Not $Paused
  863. While $Paused
  864. Sleep(100)
  865. WinSetTitle($title, "", $title & $ver & " - Paused")
  866. ToolTip('Script is "Paused"', 0, 0)
  867. WEnd
  868. WinSetTitle($title, "", $title & $ver & " - Running")
  869. ToolTip("")
  870. EndFunc ;==>TogglePause
  871.  
  872. Func ShowLoot()
  873. GUICtrlSetData($lblGear, "Legendary: " & $LegendaryCount & " - Set: " & $SetCount & " - Rare: " & $RareCount)
  874. GUICtrlSetData($lblItems, "Magic: " & $MagicCount & " - Gems: " & $GemCount & " - Tomes: " & $TomeCount)
  875. EndFunc ;==>ShowLoot
  876.  
  877. Func Stop() ;to allow the script to stop
  878. Exit
  879. EndFunc ;==>Stop
Advertisement
Add Comment
Please, Sign In to add comment