I will update it to use this func in few days probably.
I will update it to use this func in few days probably.
Here my translation for getting attribute.
$idAttrib = read(ACD + 0x120).
sample :
EnergyArmor is active ?
BackPack slot :Code:ConsoleWrite(IsBuffActive([idattrib from PlayerACD], 0x153cf) & @CRLF)
Code:ConsoleWrite(GetAttributeInt([idattrib from PlayerACD], 8) & @CRLF)
Code:Func GetFAG($idAttrib) $c = _memoryread($ofs_objectmanager, $d3, "ptr") $c1 = _memoryread($c + 0x85c, $d3, "ptr") $c2 = _memoryread($c1 + 0x70, $d3, "ptr") $id = BitAND($idAttrib, 0xFFFF) $bitShift = _memoryread($c2 + 0x18C, $d3, "int") $group1 = _memoryread(_memoryread($c2 + 0x148, $d3, "ptr"), $d3, "int") $group2 = 4 * BitShift($id, $bitShift) $group3 = BitShift(1, -$bitShift) - 1 $group4 = 0x180 * BitAND($id, $group3) Return $group2 + $group4 + $group1 EndFunc Func GetAttributeOfs($idAttrib, $attrib) $FAG = GetFAG($idAttrib) $temp1 = _memoryread(_memoryread($FAG + 0x10, $d3, "ptr") + 8, $d3, "int") $temp2 = _memoryread(_memoryread($FAG + 0x10, $d3, "ptr") + 0x418, $d3, "int") $temp3 = BitXOR($attrib, BitShift($attrib, 16)) $temp4 = 4 * BitAND($temp2, $temp3) $attribEntry = _memoryread($temp1 + $temp4, $d3, "int") If $attribEntry <> 0 Then While _memoryread($attribEntry + 4, $d3, "int") <> $attrib $attribEntry = _memoryread($attribEntry, $d3, "int") if $attribEntry == 0 Then Return -1 EndIf WEnd Return $attribEntry + 8 EndIf Return -1 EndFunc Func GetAttributeInt($idAttrib, $attrib) Return _memoryread(GetAttributeOfs($idAttrib, BitOR($attrib, 0xFFFFF000)), $d3, "int") EndFunc Func GetAttributeFloat($idAttrib, $attrib) Return _memoryread(GetAttributeOfs($idAttrib, BitOR($attrib, 0xFFFFF000)), $d3, "float") EndFunc Func IsPowerReady($idAttrib, $idPower) Return _memoryread(GetAttributeOfs($idAttrib, BitOR(0x12B, BitShift($idPower, -12))), $d3, "int") <= 0 EndFunc Func IsBuffActive($idAttrib, $idPower) Return _memoryread(GetAttributeOfs($idAttrib, BitOR(0x202, BitShift($idPower, -12))), $d3, "int") == 1 EndFunc
Thanks again KJ et Basti.
@Hunggarn
All you have to do is adding the above function in the toolkit.
Then remplace this function :
By this new one :Code:;;================================================================================ ; Function: IterateActorAtribs($_GUID,$_REQ) ; Description: Read the requested attribute data from a actor defined by GUID ; Parameter(s): $_GUID - The GUID of the object you want the data from ; $_REQ - The data you want to request (the variable) ; ; Note(s): You can find a list of all the $_REQ variables in the Constants() function ; It should be noted that i have not checked them all through ; so the type ("float" or "int") might be wrong. ; This function will always return "false" if the requested atribute does not exsist ;================================================================================== Func IterateActorAtribs($_GUID, $_REQ) Local $index, $offset, $count, $item[4] startIterateLocalActor($index, $offset, $count) While iterateLocalActorList($index, $offset, $count, $item) If $item[0] = "0x" & Hex($_GUID) Then If $_REQ[1] = 'float' Then Return $AttribInterop.GetAttributeFloat($item[2], $_REQ[0]) Else Return $AttribInterop.GetAttributeInt($item[2], $_REQ[0]) EndIf ExitLoop EndIf WEnd Return False
Code:;;================================================================================ ; Function: IterateActorAtribs($_GUID,$_REQ) ; Description: Read the requested attribute data from a actor defined by GUID ; Parameter(s): $_GUID - The GUID of the object you want the data from ; $_REQ - The data you want to request (the variable) ; ; Note(s): You can find a list of all the $_REQ variables in the Constants() function ; It should be noted that i have not checked them all through ; so the type ("float" or "int") might be wrong. ; This function will always return "false" if the requested atribute does not exsist ;================================================================================== Func IterateActorAtribs($_GUID, $_REQ) Local $index, $offset, $count, $item[4] startIterateLocalActor($index, $offset, $count) While iterateLocalActorList($index, $offset, $count, $item) If $item[0] = "0x" & Hex($_GUID) Then If $_REQ[1] = 'float' Then Return GetAttributeFloat($item[2], $_REQ[0]) Else Return GetAttributeInt($item[2], $_REQ[0]) EndIf ExitLoop EndIf WEnd Return False
Voila.
No more Dll needed.
Updated for 1.0.6. Big thanks everyone for sharing their code. Let me know if it has any bugs now.
I've an error : Line 1415 (File"~\Tracker\tracker.exe"):
Error: Variable must be of type "Object".
I lauched the tracker after login, there was no error, but this appear when i click on play.
Try launching when you are in game.
There is the same error
Looks like the dll is still called.I've an error : Line 1415 (File"~\Tracker\tracker.exe"):
Error: Variable must be of type "Object".
Sorry for the mistake , seems like i've packed wrong file at first time. Anyway now remains question: how to check if bot is in game or menu without the dll? There was a nice functionBut it uses the .dll . Now i'm stuck how to check it without requiring screen pixel / image read.Code:Func _ingame() $gamelookfor = "game_progressBar_healthBall" Return fastcheckuiitemvisible($gamelookfor, 1, 237) EndFunc ;==>_ingame
Let me know of any errors, if it still won't work from exe without the .dll I will remove everything related to .dll from the code, didn't want to do it yet.
Works perfect!!!
One thing to make it better would be a live showing of the numbers changing if possible. Not having it update and then just sit there. The demon buddy bot currently does it so it should be possible but I don't know if its possible with the code you use.
It is possible with my code. Only thing is CPU usageIf you're using self compiled version edit main function sleep:
To Sleep(1000) then it'll be updated every 1 second. Bad thing about it is offsetlist have to be initialized each run and it can load your cpu a lot. Anyway from what I've noticed updating it live has no bigger point, why? Because accurate numbers come after atleast hour, so it doesn't change anything if you see 500 k / hr at start run and then minute later 100k / hrCode:While 1 ;CheckMenu() offsetlist() While Not offsetlist() Sleep(40) WEnd StatsDisplay() $windows = WinList("Diablo III") ;For $i = 1 to $windows[0][0] ;; this function gives diablo window focus - dirty anti afk. ; Sleep(2000) ; WinActivate($windows[$i][1]) ;Next Sleep(100000) ;; <----- This one WEnd
Live numbers version HERE
Also it may much more often screw up numbers, sometimes it shows strange GPH , XPH values, it's related to offset changing ingame, also some other things that happen but idk why :P
Maybe add a button to pause the tracking.
Press HOME key to pause, END to quit. Sorry forgot to mention thatWill add pause button soon.
hi, this script working bad, i get 20m exp, but he show me that i get 58m exp, and per hour 180m , this is not possible, whats wrong ?