is it fast enough? because zk quest xp was nerfed to 20k
is it fast enough? because zk quest xp was nerfed to 20k
1-15 levels in about 10 minutes, not bad ;D
Confirmed working!
I will not support this code because I know it sucks but its a start. This is designed for minimum sized windows, but doesn't rely on them being any particular place on the screen.
Note that you will need to get a Window Title name changer to identify which Diablo III window is your "Diablo III Main" and which one is your "Diablo III Slave 1"
You will also need to adjust the coordinates of the invite button on your Main's friend list. The color matching on the quest turnin seems to be fairly reliable, but that will be the other thing to adjust. I put all these variables at the top. It is entirely capable of being in the background with one exception the click to interact to turn in seems to require the mouse to be over the NPC. So with that you will lose textbox focus and such. If someone knows a way around this let me know.
Let me know what you think.
****EDIT*** Updated the script again. No longer has Slave1 leave game before inviting to the next. Also be aware the timings in this script are for a fast connection on a fast machine. You WILL need to increase the sleeps or even add some I'm sure.
****EDIT2**** It should no longer error out if it doesn't find the pixel properly. It should now fix itself after the next invite. Still will have issues if there is a disconnect pop-up
Donations accepted: [email protected]
Code:#include <GUIConstantsEx.au3> Global $winTitleMain = "Diablo III Main" Global $winTitleSlave1 = "Diablo III Slave 1" Global $hWndMain = WinGetHandle($winTitleMain) Global $hWndSlave1 = WinGetHandle($winTitleSlave1) Global $Slave1xcoord = 725 Global $Slave1ycoord = 355 Global $ColorMatch = "0x5D3A3D" Global $ColorVariation = 5 HotKeySet("{pause}", "Terminate") Func Terminate() Exit EndFunc ;==>Terminate While 1 InviteSlave1() BotSlave1AcceptInvite() Sleep(3000) BotMainResume() BotMainLeaveGame() BotSlave1TurnIn() WEnd Func BotMainResume() ControlClick($hWndMain, '', '', "left", 1, 120, 240) Sleep(5000) EndFunc ;==>BotMainResume Func BotSlave1Resume() ControlClick($hWndSlave1, '', '', "left", 1, 120, 240) Sleep(5000) EndFunc ;==>BotSlave1Resume Func BotSlave1AcceptInvite() ControlClick($hWndSlave1, '', '', "left", 1, 700, 520) Sleep(500) ControlClick($hWndSlave1, '', '', "left", 1, 345, 355) Sleep(500) EndFunc ;==>Bot1AcceptInvite Func BotMainLeaveGame() ControlSend($hWndMain, '', '', "{SPACE}") Sleep(500) ControlSend($hWndMain, '', '', "{ESC}") Sleep(500) ControlClick($hWndMain, '', '', "left", 1, 415, 330) Sleep(500) ControlClick($hWndMain, '', '', "left", 1, 345, 360) Sleep(500) EndFunc ;==>BotMainLeaveGame Func InviteSlave1() ControlClick($hWndMain, '', '', "left", 1, 780, 565) Sleep(500) ControlClick($hWndMain, '', '', "left", 1, $Slave1xcoord, $Slave1ycoord) Sleep(500) ControlSend($hWndMain, '', '', "{SPACE}") EndFunc ;==>InviteSlave1 Func BotSlave1TurnIn() Sleep(1000) $aryWinPos = WinGetPos($hWndSlave1) $PixelFound = PixelSearch($aryWinPos[0] + 20, $aryWinPos[1] + 30, $aryWinPos[0] + 200, $aryWinPos[1] + 110, $ColorMatch, $ColorVariation) If (@error) Then Return 0 EndIf ConsoleWrite( "Pixel found: " & $PixelFound[0] - $aryWinPos[0] & " " & $PixelFound[1] - $aryWinPos[1] & @CRLF) $origMousePos = MouseGetPos() BlockInput(1) MouseMove($PixelFound[0], $PixelFound[1], 0) MouseClick("left", $PixelFound[0], $PixelFound[1], 3, 0) MouseMove($origMousePos[0], $origMousePos[1], 0) BlockInput(0) Sleep(3500) ControlSend($hWndSlave1, '', '', "{SPACE}") Sleep(200) ControlSend($hWndSlave1, '', '', "{SPACE}") Sleep(200) ControlSend($hWndSlave1, '', '', "{SPACE}") Sleep(200) ControlSend($hWndSlave1, '', '', "{SPACE}") Sleep(200) ControlSend($hWndSlave1, '', '', "{SPACE}") Sleep(200) ControlSend($hWndSlave1, '', '', "{SPACE}") Sleep(200) ControlSend($hWndSlave1, '', '', "{SPACE}") Sleep(200) ControlSend($hWndSlave1, '', '', "{SPACE}") Sleep(2000) EndFunc ;==>BotSlave1sTurnIn
Last edited by Jaerin; 06-20-2012 at 05:55 PM.
@Jaerin: thx for the share of your script :-)
i didn't check it so far (I will after that post), but i definitly won't recommend to change the window title.
Maybe its better to add something like this:
Code:HotKeySet("^1", "getwin1") HotKeySet("^2", "getwin2") Func getwin1() if WinActive("Diablo III") Then $hWndMain = WinGetHandle("[active]") TrayTip("",$hWndMain,2) Else $hWndMain = 0 EndIf EndFunc Func getwin2() if WinActive("Diablo III") Then $hWndSlave1 = WinGetHandle("[active]") TrayTip("",$hWndSlave1,2) Else $hWndSlave1 = 0 EndIf EndFunc
Changing the window titles wouldn't matter. Only tinfoil hat conspiracy theorist think that's going to get you banned or something.
But thanks for that share, I've been looking for something like that for a while. Now if I can just get either the NPC interaction in game to work in the background or at least the color matching working better.
That's the color matching I'm struggling with. Not sure why but pixelsearch isn't finding the colors of the D3 window properly.
I'll let you know if I figure something out.
I've never used AutoIt before, but I've set up my own AutoIt for this and while it's very specific to my system, I thought the actual technique used might benefit others. As I say, my first AutoIt script, so don't expect magic.
First setup: Two Diablo windows, set all their graphics settings on lowest or "off" everything, and make them as small as you can (800*600 I think they go to if you resize them). I don't have Windows Aero enabled (it's the "classic windows" look) so exact pixel locations might be slightly off (since window titlebars are a bit larger if you have aero theme enabled). Move the "leecher" (lower level) Diablo window to the very top-left of your screen (so the corner of the window is exactly in the top-left of your screen). Put the "quest-runner" window right next to it (to the right of it). Get your quest-runner to go and kill Kulle on either normal or hell (depending if leecher has hit 50 or not yet), get the soulstone, return to town, get the leecher to join the game then leave the game from your main (so you can see the resume button on your main). The "leecher" should be sat in-map (you can go click Adria manually for the first exp freebie now). Now start the macro.
All this does is the quest-runner invites the leecher from the main-menu. The leecher then accepts. The quest-runner resumes game. (this technique avoids any game-creation lag). The quest-runner then exits back to the main menu. The leecher does a quick colour-search for a bit of dark-purple on Adria's robe and clicks on it, and hits space to bypass the speech. And this then repeats over and over - quest-runner invites leecher again, etc. etc.
You can hit Pause key on keyboard to pause the macro from running.Code:Global $pause = False HotKeySet("{PAUSE}","_pause") While 1 mouseclick("left", 1124,11) ; Click quest-runner titlebar twice sleep(300) mouseclick("left", 1124,11) sleep(300) send("o") ; Bring up quest-runner social menu sleep(500) mouseclick("left", 1530, 220) ; Invite top-listed friend (leech) sleep(1000) mouseclick("left", 409, 11) ; Click leech titlebar twice sleep(300) mouseclick("left", 409, 11) sleep(300) mouseclick("left", 699, 538) ; Click to accept the invite sleep(300) mouseclick("left", 339, 370) ; Confirm leaving current game to join party sleep(3000) mouseclick("left", 1124,11) ; Click quest-runner titlebar twice sleep(300) mouseclick("left", 1124,11) sleep(300) mouseclick("left", 935, 255) ; Click "resume game" on quest-runner sleep(3500) ; Pause 3.5 seconds for game creation send("{escape}") ; Bring up quest-runner escape menu sleep(300) mouseclick("left", 1206, 343) ; Click leave game on quest-runner sleep(100) mouseclick("left", 1148, 369) ; Click to confirm leaving game sleep(1400) mouseclick("left", 409, 11) ; Click leecher titlebar twice sleep(200) mouseclick("left", 409, 11) sleep(200) ; Now search for a dark purple pixel only on Adria's robe and click it ; The "4" allows a bit of fuzziness in colour matching, errors are suppressed ; And there's a "failsafe" click in roughly Adria's position incase no pixel found Local $coord = PixelSearch(5, 24, 160, 130, 0x2f1c1a, 4) if not @error Then mouseclick("left", $coord[0], $coord[1]) Else mouseclick("left", 70, 36) endif sleep(4100) ; Takes approx 4 seconds to run to and click on Adria send("{space}") ; Tap space twice to skip the conversation and get the experience sleep(200) send("{space}") sleep(800) ; Little extra delay before starting over again WEnd Func _pause() $pause = Not $pause If $pause Then While 1 Sleep(100) Wend EndIf EndFunc
As I say - this is nothing fancy. It's very specific to my setup. But the actual technique works, it finds Adria's pixel every single time (though it has a "safety click" in roughly the right place incase it doesn't as backup, and while I've never seen it not click Adria, it's possible it might every blue moon which is ok). So yeah, no doubt you'd need to tweak exact pixel locations a little and what-not, but this might help someone else get up-and-running or have something to base their own script off
Edit: I made it always click the title-bar of either window twice, before doing anything in that window - I had some problems if it didn't activate the window first, and clicking the titlebar twice seemed to fix any issues.
Last edited by GilesSmith; 06-20-2012 at 07:25 PM. Reason: Added comments into AutoIt routine
I fixed the script above so if it wasn't working try it again. The color matching should be fixed.
Also I tried getting the window selector working, but gave up. Just easier for me to change windows and know it will find them.
If you have a full friends list of people online and cannot see anyone in the Offline friends list then to Y coords should be as follows from top to bottom 205, 235, 265, 295, 325, 355, 385, 415, 445, 475
If you need to use the AutoIt v3 Window Info utility to find the coords note that I think the coordinates in that tool are +20 from what you need to use. So if you mouse over where you want and it shows 420 try using 400.
Total 1-30 for me was roughly 27 minutes, with few **** ups in the beginning of the plvl.
will they ban because of this trick?
will they ban for using this to lvl ?
There have been no reported bans from abusing legitimate power leveling techniques.
It's a lot easier for blizzard to just prevent the exploit by changing the mechanics/spawn/drop rates, etc on their side than to try to find autoit users.