This is basically the old yokkalbot, with some changes ive made to try with my lvl 27 hunter. Basically, I want it to work like this:
1) find mob
2) hit "macro" which is a simple ingame macro that tells pet to attack and casts hunter's mark
3) waits a few sec to let pet get aggro, and then hits serpent sting key which also initiates autoshoot
4) I tried to set the defensive actions to use mend pet twice in a row, but I need help using the pets health bar instead of mine
I was also thinking maybe make a loop that would alternate between hitting autoattack and autoshot keys after serpent sting. That way I could still attack in melee if I go aggro.
There is also something wrong with the end function for check hp.
Here it is:
Code:
; yokkalbot2.1
;
;
; Creation and Design by ---> Yokkal <---
;
; For compilation by AutoIt3
; [http://www.hiddensoft.com/autoit3/index.php]
;Editing, documentation, and additional content by
;
;DarkOmNi
;Dakr
;Haiku
;xeonz16
;scroll down to bot options settings, for configuration control
;--------------------------------------VERSION 2.2--------------------------------------
;fixed lots of small bugs, added in general code improvements, new splash window that updates
;bot stats in realtime. Hope this works better then the last. The most recent version of
;yokkalbot can be obtained at warcraft.smashingplates.com
;------------------VERSION 2.1 is here-------------------------------------
;Several Big Changes. First off added support to use yokkalbot.ini to set your local variables
;rather then changing them all in script. Also added the ability to turn travel off...so
;yokkalbot doesn't run in crazy circles unless thats your thing.
;----------------Bot OPTIONS-----------------------------------------------
;Simply to make it harder for you to be detected or optimize performance.
;These are non-essential and you can leave them as default if you wish.
;Figure_Eight=1 not very stable yet...over a period of time you will 'migrate'
;Figure_Eight=0 to travel in smaller circle, that sticks in one area
;getloot=1 stops after each kill to loot corpse...misses some now and then
; but most is better then none.
;getskins=1 skins corpse and collects skin after loot...you must enable getloot
; in order for getskins to work properly.
;Loopsize is the number of milliseconds the bot waits before 'turning' one click while
; it is running in circles. Hence smaller loopsize reduces affect of 'migration' but
; larger loopsize allows bot to cover more area. Suggest: 900 -> 3000
;Loopstep is the number of milliseconds that the 'turn' key is depressed. Aka the measurement
; of one loopsize 'click'. Longer Loopstep, smaller loop Suggest: 50 -> 400
;if you are having really bad spiraling migration, you should experiment with these two settings
;$dir="C:\unzipped\yokkalbot"
$waitFORhealth=90;percentage
$figure_eight=0
$use_stealth=0
$NumofThrowStacks=0
$getloot=1
$getskins=1
$loopsize=1700
$loopstep=200
$travel=1
$heal=1
$HP_go_defensive=40;percent that hps must hit to enable 'defensive' actions
$healthcheckSTEP=8;increment to scan health in....I don't recomend you change this too much.
;5-15 is a good range...the higher it is, the less stress on your comp, but the higher it is
;set the less accurate your health scanner is. a number 5 means it only updates every fifth % point.
;$logdirectory="C:\Logs"
;un comment above line and add in your own directory to change where logs go
;leave commented out if you want the log to go into the same directory as
;the script(.au3) or exe
;----------------WoW Hotkeys------------------------------------------------
;These are simply what number you would normally hit on your keyboard to
;fire off the given skill. All the skills need to be on the same skillbar.
;if you set evasionkey to a slot that holds healing potions, you get a similar result.
$macrokey=1
$serpentstingkey=6
$mendpetkey=9
;WinWaitActive("World of Warcraft")
;-------------------------Ini Preloader-------------------------------
global $MoBwindowX, $MoBwindowY, $MoBwindowHEX
global $hpbarLx, $hpbarLy, $hpbarLHEX
global $hpbarRx, $hpbarRy, $hpbarRHEX
dim $useinternal
dim $answer
if FileExists("yokkalbot.ini") then
$answer = MsgBox(4, "Yokkalbot", "Import custom run variables from yokkalbot.ini?")
endif
if $answer = 7 then
;\---------------Essential Control Variables--------------
;You must configure the below variables to fit your machine, otherwise the bot
;simply will not work. The preset options are in 800x600 Windowed and
;maximized. If you don't want to mess with these variables then toggle windowed
;mode under Video Options in WoW, AND hit the maximize square next to the 'X' on the top corner
;of the window to secure it's size. Reset your WoW gamma to zero if you have changed it
;and set your desktop screen resolution to 800x600.
;mob @ 20%hp just get x,y cord and HEX color of mob's health bar when its about 20%
;$MobAt20hpX=217
;$MobAt20hpY=55
;$MobAt20hpHEX="00A500"
;Silver part somewhere on the mob portrait
$MoBwindowX=294
$MoBwindowY=39
$MoBwindowHEX="7D7C7D"
;HP bar far Left side...middle
$hpbarLx=73
$hpbarLy=55
$hpbarLHEX="008A00"
;HP bar far right side...middle
$hpbarRx=159
$hpbarRy=55
$hpbarRHEX="00D000"
else
$MobAt20hpX=IniRead("yokkalbot.ini","Critical","mobHPx","0")
$MobAt20hpY=IniRead("yokkalbot.ini","Critical","mobHPx","0")
$MobAt20hpHEX=IniRead("yokkalbot.ini","Critical","mobHPHEX","0")
$MoBwindowX=IniRead("yokkalbot.ini","Critical","silvx","0")
$MoBwindowY=IniRead("yokkalbot.ini","Critical","silvy","0")
$MoBwindowHEX=IniRead("yokkalbot.ini","Critical","silvHEX","0")
$hpbarLx = IniRead("yokkalbot.ini","Critical","hpbarLx","0")
$hpbarLy = IniRead("yokkalbot.ini","Critical","hpbarLy","0")
$hpbarLHEX = IniRead("yokkalbot.ini","Critical","hpbarLHEX","0")
$hpbarRx = IniRead("yokkalbot.ini","Critical","hpbarRx","0")
$hpbarRy = IniRead("yokkalbot.ini","Critical","hpbarRy","0")
$hpbarRHEX = IniRead("yokkalbot.ini","Critical","hpbarRHEX","0")
msgbox(0, "yokkalbot 2.2", "Local Variables Imported from " & @crlf & " > yokkalbot.ini <")
endif
;msgbox(0, "Left", $hpbarLx & ", " & $hpbarLy & @CRLF & $hpbarLHEX)
;msgbox(0, "Right", $hpbarRx & ", " & $hpbarRy & @CRLF & $hpbarRHEX)
;------------Mainloop Control Variables-----------------------------------------------
;leave these alone
Dim $Botting=0
Dim $Walking=0
Dim $Attacking=0
Dim $debugmode=1
Dim $mobcount=0
dim $i, $looted=0
dim $botmode = "Waiting..."
;----------------Setting AutoIt3 Internal Hotkeys--------------------------------------
;at the moment 'F8', 'F10', 'ESC', and 'PAUSE' are preset hotkeys, hitting these keys at any
;time during the script will take it to a pre-designated function. Feel free to add your
;own once you get the hang of it.
;
;for now just remember to hit 'esc' if anything goes badly wrong, the whole script will term
;
;Hotkeyset("{A}", "B")
;A = key to press on your keyboard
;B = Function that Key starts up
;Remeber you actually need to declare a function for this to work
global $splash_message
$EmergencyTerminate="ESC"
$Startbot="F5"
$Stopbot="F6"
dim $mobcount, $startmin = @min, $starthour = @hour, $mins_running, $logdirectory, $HPAT
global $hp_percent
$defensivecount = 0
;-----------------------------------NO VARIABLES below THIS LINE---------------------
HotkeySet("{F8}","Debug")
HotkeySet("{F9}","check_health")
HotkeySet("{F10}","debugmode")
HotkeySet("{" & $startbot & "}","StartBot")
HotkeySet("{" & $stopbot & "}","StopBot")
HotKeySet("{" & $EmergencyTerminate & "}", "Terminate")
$splash_message = "Waiting for Logon..." & @CRLF & "ESC - Terminate" & @CRLF & "F5 - Start Bot"
update_splash()
;----------------------- Main Control Loop ---------------------------------------
;if fileexists("yokkal_log.txt") then
;filedelete("yokkal_log.txt")
;endif
;$file = fileopen("yokkal_log.txt", 2)
While 1; endless loop
;msgbox(0, "Main", "Mainloop")
$splash_message = "Waiting..." & @crlf & "F5 - Start Bot"
update_splash()
sleep(1000);saves cycles when script is on, but you haven't hit f5
If $Botting=1 Then
;Wait til your health is full, unless something hits you
While $hp_percent <= $waitFORhealth
$splash_message = "Healing..." & @crlf & "Kills: " & $mobcount & @CRLF & "Corpses Looted: " & $looted & "ESC - Terminate"
update_splash()
sleep(350)
;if mob is selected then it restarts Attack loop
If (hex(PixelGetColor($MoBwindowX,$MoBwindowY),6)=$MoBwindowHEX) then
AttackTarget()
EndIf
WEnd
if $travel = 1 then
FindTarget()
endif
scan()
if (hex(PixelGetColor($MoBwindowX,$MoBwindowY),6)=$MoBwindowHEX) then AttackTarget()
;loot and skin corpse
if $getloot = 1 AND $i < 14 then LootCorpse()
if $getskins = 1 AND $i < 14 then SkinCorpse()
EndIf
;Write to log
;filewrite("yokkal_log.txt", "Mob Kills: " & $mobcount & @CRLF & "Defensive Actions :" & $defensivecount)
sleep(300)
;fileclose($file)
sleep(500)
WEnd
;----------------------------------Declare All Functions Below----------------------------------------------
;skincordx and skincordy are set in the lootcorpse() function depending where it found the corpse
;as of now it just checks three different cords, but more would be easily added.
Func SkinCorpse()
$splash_message = "Skinning..." & @crlf & "Kills: " & $mobcount & @CRLF & "Corpses Looted: " & $looted & "ESC - Terminate"
update_splash()
mouseclick("right", $skincordx, $skincordy)
sleep(5000)
mouseclick("right", 32, 164)
mouseclick("left", 135, 113)
sleep(500)
Endfunc
Func LootCorpse()
$mobcount = $mobcount + 1
$splash_message = "Looting..." & @crlf & "Kills: " & $mobcount & @CRLF & "Corpses Looted: " & $looted & "ESC - Terminate"
mouseclick("right", 403, 433)
$skincordx = 403
$skincordy = 433
sleep(700)
if pixelgetcolor(31, 105) = 0 then $looted = $looted + 1
If NOT pixelgetcolor(31, 105) = 0 then
Mouseclick("right", 405, 361)
$skincordx = 405
$skindcordy = 361
sleep(700)
if pixelgetcolor(31, 105) = 0 then $looted = $looted + 1
endif
If NOT pixelgetcolor(31, 105) = 0 then
Mouseclick("right", 304, 407)
$skincordx = 304
$skindcordy = 407
sleep(700)
if pixelgetcolor(31, 105) = 0 then $looted = $looted + 1
endif
sleep(500)
mouseclick("right", 32, 164)
sleep(100)
mouseclick("right", 32, 203)
sleep(100)
if pixelgetcolor(31, 105) = 0 then mouseclick("left", 135, 113)
sleep(100)
endfunc
Func FindTarget();Runs around til it finds a target
$splash_message = "Waiting about 5 seconds..." & @crlf & "Kills: " & $mobcount & @CRLF & "Corpses Looted: " & $looted & "ESC - Terminate"
update_splash()
sleep(5000)
$splash_message = "Scanning for enemies..." & @crlf & "Kills: " & $mobcount & @CRLF & "Corpses Looted: " & $looted & "ESC - Terminate"
update_splash()
Scan()
$splash_message = "Moving..." & @crlf & "Kills: " & $mobcount & @CRLF & "Corpses Looted: " & $looted & "ESC - Terminate"
update_splash()
Sleep(100)
If NOT (hex(PixelGetColor($MoBwindowX,$MoBwindowY),6)=$MoBwindowHEX) then
While NOT (hex(PixelGetColor($MoBwindowX,$MoBwindowY),6)=$MoBwindowHEX)
If $figure_eight = 1 then
$z = $z + 1
if $z < 14 then
send("{w down}")
send("{d up}")
Send("{a down}")
endif
if $z >= 14 then
send("{w down}")
Send("{a up}")
send("{d down}")
endif
if $z = 28 then $z = 0
endif
if $figure_eight = 0 then
send("{w down}")
send("{d down}")
endif
sleep($loopstep);I removed a random function here...if you randomize the circle you will migrate
Send("{a up}")
send("{d up}")
sleep($loopsize)
Send("{TAB}")
WEnd
send("{w up}")
EndIf
EndFunc
Func Scan();Spins a circle in place looking for a target
$splash_message = "Scanning..." & @crlf & "Kills: " & $mobcount & @CRLF & "Corpses Looted: " & $looted & "ESC - Terminate"
update_splash()
$i = 0
sleep(500)
if $use_stealth = 1 then send($stealthkey)
While NOT (hex(PixelGetColor($MoBwindowX,$MoBwindowY),6)=$MoBwindowHEX) AND $i < 14
send("{RIGHT down}")
sleep(120)
send("{RIGHT up}")
$i = $i + 1
Send("{TAB}"); find a Mob
sleep(100)
Wend
EndFunc
Func AttackTarget();Attacks the target
Dim $HotKey = 2
$splash_message = "FIGHTING..." & @crlf & "Kills: " & $mobcount & @CRLF & "Corpses Looted: " & $looted & @CRLF & "ESC - Terminate"
update_splash()
;pull
Pull()
sleep(2000);wait for pet to go and get aggro
;While the mob is still selected(game unselects it if it dies)
While (hex(PixelGetColor($MoBwindowX,$MoBwindowY),6)=$MoBwindowHEX)
check_health()
;auto defense system
$defhotkey = $mendpetkey
;Sperent sting and start autoattack
Send($serpentstingkey)
;If the Out of range! message displays, try throwing again.
PixelSearch(297, 110, 505, 120, 16718362, 10, 4)
if not @error then
Send("{UP down}")
Sleep(800)
Send("{UP up}")
endif
;Do the Attack
$splash_message = "FIGHTING..." & @crlf & "Kills: " & $mobcount & @CRLF & "Corpses Looted: " & $looted & "ESC - Terminate"
update_splash()
if $hp_percent <= $HP_go_defensive then
Send($defhotkey)
Sleep(5000)
Send($defhotkey)
$defensivecount = $defensivecount + 1
endif
Send($HotKey)
Sleep(1200)
WEnd
EndFunc
func update_splash ()
check_health()
$endmin = @min
$endhour = @hour
if $endmin >= $startmin then
$mins_running = $endmin - $startmin
else
$mins_running = (60 - $startmin) +$endmin
endif
if $endhour >= $starthour then
$hours_running = $endhour - $starthour
else
$hours_running = (24 - $starthour) + $endhour
endif
SplashTextOn( "yb", "Apr. Hp%: " & $hp_percent & @CRLF & "Use Defense: " & $defensivecount & @CRLF & @CRLF & $splash_message & @CRLF & "Hours: " & $hours_running & @CRLF & "Mins: " & $mins_running , 120 , 160 ,695 ,299 , 17, "", 8)
EndFunc
Func Pull();Function to handle ranged pulling
sleep(100 + Random(200));make sure you've stopped moving
Send($macrokey)
sleep(100)
EndFunc
Func StartBot()
WinActivate("World of Warcraft")
$Botting=1
EndFunc
Func StopBot()
$Botting=0
$mobcount=0
If $walking Then
send("{UP}")
$walking=0
EndIf
EndFunc
Func TogglePause()
$Paused = NOT $Paused
While $Paused
sleep(1000)
ToolTip('Script is "Paused"',0,0)
WEnd
ToolTip("")
EndFunc
Func Terminate()
$endmin = @min
$endhour = @hour
traytip("yokkalbot2.1", "yokkalbot is TERMINATING..." & @crlf & "Kills: " & $mobcount & @CRLF & "Corpses Looted: " & $looted, 500)
;mouseclick("left", 588, 532, 1, 0)
;mouseclick("left", 620, 479, 1, 0)
send("{a up}")
send("{d up}")
send("{w up}")
sleep(2200)
Exit 0
EndFunc
Func Debug()
$pos = MouseGetPos()
$coords = ("X: " & $pos[0] & " Y: " & $pos[1] & " Hex: " & hex(PixelGetColor($pos[0],$pos[1]),6))
FileWriteLine("Debugcords.txt",$coords)
EndFunc
Func Debugmode()
$debugmode=1
Endfunc
func check_health()
;msgbox(0, "check", "get to healthloop?")
fileopen("HPcolors.txt", 0)
$distancebar = $hpbarRx - $hpbarLx
$HBAR_RX = $hpbarRx
sleep(100)
msgbox(0, "precheckhealth", $hpbarLx & " to " & $HBAR_RX)
for $step = $hpbarLx to $HBAR_RX step $healthcheckSTEP
msgbox(0, "checkhealth for next", "this loop firing?")
$gotcolor = hex(pixelgetcolor($step, $hpbarLy), 6)
for $stepcolor = 1 to $distancebar
$filecolor = filereadline("HPcolors.txt", $stepcolor)
if $gotcolor = $filecolor then
$HPAT = $step
endif
next
next
$hp_pixel_dist = $HPAT - $hpbarLx
$hp_percent = int(number((($hp_pixel_dist / $distancebar) + .07)*100))
if FileExists("HPcolors.txt") then fileclose("HPcolors.txt")
endif
endfunc