malu05 Posted May 22, 2007 Author Posted May 22, 2007 (edited) BACK IN ACTION! -with my computer setup and ready for doin some programming.So, since there is patch for EU tonight i decided to wait with development for tomorow, but i couldnt keep my hands of wow untill then so i sat'down and took a look at how wow handels Mobs and NPC's.I have made a little sample program that tells the positions of all mobs that are loaded.So, what do i know?Well i only know a little since i was very lazy and only found the X and Y positions (but thats all the bot needs anyway).First crappy documentation...Position How to find (number plus offset) [MOB(a)] Xa =$offset Ya =Xa+4 [MOB(b)] Xb =Xa+12 =Ya+8 Yb =Xa+16 =Ya+12 =Xb+4 [MOB(c)] Xc =Xa+24 =Ya+20 =Xb+12 =Yb+8 Yc =Xa+28 =Ya+24 =Xb+16 =Yb+12 =Xc+4 Overall when you got $offset which is the first mobs X position (Mob(a)). 4 + $offset = Ypos of Mob(a) 12+4 + $offset = Xpos of Mob(b) 4+12+4 + $offset = Ypos of Mob(b) etc... meaning offset 12 between each mob chrunk.Edit;Took the time to find the Z value.X = offset Y = $offset + 4Z = $offset + 8So...| 0 4 8 | 12 16 20 | 24 28 32 | etc1,2,3,5,6,7,9,10 and 11 is still unknown... Edited May 22, 2007 by malu05 [center][u]WoW Machinima Tool[/u] (Tool for Machinima Artists) [/center]
ffrankcool Posted May 22, 2007 Posted May 22, 2007 Hooah! Looks like you're back to work Don't forget to keep us up to date! I find it really interesting to see what you're working on, even if I'd probably not understand the code
joyeuxlutin Posted May 22, 2007 Posted May 22, 2007 (edited) X = offset Y = $offset + 4Z = $offset + 8So...| 0 4 8 | 12 16 20 | 24 28 32 | etc1,2,3,5,6,7,9,10 and 11 is still unknown...That might interrest you :if you add 574(hex) to $offset, then you'll find the mob's health percentage My question is, how do you find the first mob(X) ?CialutinP.S : have you checked your PM malu? Edited May 22, 2007 by joyeuxlutin
Zephir Posted May 22, 2007 Posted May 22, 2007 interesting, i've been looking for the x/y position of mobs as well. however, i did not quite get your explanation. elaborate plz
malu05 Posted May 23, 2007 Author Posted May 23, 2007 (edited) the first demo...Not much to say... target a mob and the program shows the info about the mob...A fun thing is to make the app set the mobs position to your position.Then you can make everything follow you ^^There are 3 diffrent positions to take care of..1Passive - This is for reading only, alterig these makes no diffrence.2Current - Changing this makes the mob port to the entered distination.3Send Command - Changing this makes the mob "walk" to the entered destination (should be used for the example shown above to make a smooth follow) Edited May 23, 2007 by malu05 [center][u]WoW Machinima Tool[/u] (Tool for Machinima Artists) [/center]
malu05 Posted May 23, 2007 Author Posted May 23, 2007 (edited) That might interrest you :if you add 574(hex) to $offset, then you'll find the mob's health percentage My question is, how do you find the first mob(X) ?CialutinP.S : have you checked your PM malu?Once again, thanks for the Health tip... it works! ^^Well, i have just finished a very "cheap" way of doing finding it, if you have seen the memory scanner for the hack i made a little month ago you would know how the basics work, however this time i have found a static value that is not to be found anywhere in the memory other than at the mobs... so..1; I find a mob2; Scroll to the X position3; Go one item array back (that is hex(-1740) offset)4; Check the value. If the value is 0 then it checks for a specified string on a specified offset, if that turns out to be ZERO then there is no mob meaning the previous item was the first mob in the array.5; Then i run the array from 0 to X untill the ZERO string turns up again. Then i got the last item in the array.6; Each mob is placed in a AutoIT Array with location, altitude, rotation, UniqueID and now health (thx).7; The unique ID is matched with the NameList in the memory.8; Selected mob is matched with the UniqueID's Name9; volla... all information about the selected mob is shown...Problems is that i still dont know the diffrence between a mob, NPC, serverside object etc... loads of data needs to be mined before i can make get all the data needed to make a bot "smart" and not just trying to pwn a questgiver or what so ever....Sory for the Spelling and Grammer, but its 03:08 and i am soooooo tired... Edited May 23, 2007 by malu05 [center][u]WoW Machinima Tool[/u] (Tool for Machinima Artists) [/center]
joyeuxlutin Posted May 23, 2007 Posted May 23, 2007 Thank you for your answers malu05, I'll look into you altitudehack for the pointerscanner (it seems it doesn't work anymore). Damn all memory addresses have changed :-/ Moreover I wont pay wow this month (it ends in 2 hours :s ) ,coz I'm going on vacation in a few days I'll make the algorithm while I'm away from computer. See you in about 3 weeks .
malu05 Posted May 23, 2007 Author Posted May 23, 2007 Thank you for your answers malu05, I'll look into you altitudehack for the pointerscanner (it seems it doesn't work anymore).Damn all memory addresses have changed :-/Moreover I wont pay wow this month (it ends in 2 hours :s ) ,coz I'm going on vacation in a few days I'll make the algorithm while I'm away from computer.See you in about 3 weeks .Hehe.. no, the altitude hack doesnt "HEHE" work anymore, since it needs the 6 values to be updated.... and i hope the people who abuse it don't know how to do that.Well, even tho all the memory locations have changed they still use this funny pattern as descriped in my recent threads.Anyway, have a loveley vecation! [center][u]WoW Machinima Tool[/u] (Tool for Machinima Artists) [/center]
malu05 Posted May 23, 2007 Author Posted May 23, 2007 (edited) World Of Warcraft Memory ScannerThis program finds the NonStatic Changeable value of X, Y, Z and Rotation of your char.This scanner is ALOT faster then the previous versions, and as said above also finds the rotation of the player.This is 100% harmless since it only scans for the values (it is not detectable)As you can see there is a timer in this version.If you guys would be so kind as to try the sciprt and see what your "time" is, and post your "time" here or send a pm to me.Mine is between 4.5 - 6.7Thanks to Whoot for testing this for me.Thanks to Ragnorok161 for knowledge for the update.The Scanner requires the <NomadMemory.au3> from thermo prime. If you don't have it, then program wont be able to run!You will be able to get Thermo Prime from the main post in this thread expandcollapse popup; ---------------------------------------------------------------------------- ; ---------------------------------------------------------------------------- ; ; Author: ; Malu05 aka. Mads Hagbart Lund <Batmazbaz@hotmail.com> ; ; Script Function: ; World Of Warcraft - Memory Location Scanner ; ---------------------------------------------------------------------------- ; ---------------------------------------------------------------------------- ;;================================================================================ ;;Includes; ;;================================================================================ #include <NomadMemory.au3> #include <GUIConstants.au3> #include <String.au3> #include <Date.au3> #include <array.au3> #Include <Misc.au3> HotkeySet("{F2}","rescan") HotkeySet("{ESC}","terminate") ;;================================================================================ ;;Config Variable Definition; ;;================================================================================ $UpdateSpeed = 5 ;Defines the update speed in milliseconds. ;;================================================================================ ;;Variable Definition; ;;================================================================================ Dim $datafoundX= 0 Dim $Finalrot, $Finallocx,$Finallocy,$Finalrot dim $value = 100 dim $knownX = 0x00CD6760 dim $startsearchX = 0x00400B88 dim $startsearchY, $startsearchZ, $startsearchRot dim $memoryX, $memoryY, $memoryZ, $memoryRot = 0 dim $processfound = 0 dim $appname = "WOW Mem Scanner" Global $defaultstatus = "Ready" dim $scanprocess = 0 dim $transyn = 0 ;;================================================================================ ;;Process front ;;================================================================================ Opt("WinTitleMatchMode", 4) SetPrivilege("SeDebugPrivilege", 1) processopen() func processopen() Global $ProcessID = WinGetProcess("World of Warcraft","") Global $offset = 0x1000 while $processfound = 0 If $ProcessID = -1 Then MsgBox(4096, "ERROR", "Failed to detect process.") $reply = msgbox(1,$appname,"If world of warcraft is running please enter the name of the process (Ie, WORLD OF WARCRAFT) (uppercase sensitive)") if $reply = 2 then Exit Else $Processnewname = InputBox($appname,"Please enter the name of the process. (Case sensitive)") Global $ProcessID = WinGetProcess($Processnewname,"") EndIf Else $processfound = 1 EndIf WEnd EndFunc Local $DllInformation = _MemoryOpen($ProcessID) If @Error Then MsgBox(4096, "ERROR", "Failed to open memory for process;" & $ProcessID) Exit EndIf ;;================================================================================ ;;GUI Creation ;;================================================================================ GUICreate($appname, 230, 170) GUICtrlCreateLabel($appname & " by Malu05", 0, 0, 230, 30,BitOr($SS_CENTER ,$SS_SUNKEN)) $statuslabel = GUICtrlCreateLabel ($defaultstatus,0,155,230,15,BitOr($SS_SIMPLE,$SS_SUNKEN)) ;Numbers ;x GUICtrlCreateLabel("X Axis Pointer:", 5, 35, 95, 50) $Xvaluepointer = GUICtrlCreateLabel("Not found", 80, 35, 70, 18,BitOr($SS_CENTER ,$SS_SUNKEN)) $Xvalue = GUICtrlCreateLabel("Not found", 160, 35, 70, 18,BitOr($SS_CENTER ,$SS_SUNKEN)) ;y GUICtrlCreateLabel("Y Axis Pointer:", 5, 55, 95, 50) $Yvaluepointer = GUICtrlCreateLabel("Not found", 80, 55, 70, 18,BitOr($SS_CENTER ,$SS_SUNKEN)) $Yvalue = GUICtrlCreateLabel("Not found", 160, 55, 70, 18,BitOr($SS_CENTER ,$SS_SUNKEN)) ;z GUICtrlCreateLabel("Z Axis Pointer:", 5, 75, 95, 20) $Zvaluepointer = GUICtrlCreateLabel("Not found", 80, 75, 70, 18,BitOr($SS_CENTER ,$SS_SUNKEN)) $Zvalue = GUICtrlCreateLabel("Not found", 160, 75, 70, 18,BitOr($SS_CENTER ,$SS_SUNKEN)) ;rot GUICtrlCreateLabel("Rotat Pointer:", 5, 95, 95, 20) $Rotvaluepointer = GUICtrlCreateLabel("Not found", 80, 95, 70, 18,BitOr($SS_CENTER ,$SS_SUNKEN)) $Rotvalue = GUICtrlCreateLabel("Not found", 160, 95, 70, 18,BitOr($SS_CENTER ,$SS_SUNKEN)) GUICtrlCreateLabel("", 0, 130, 230, 3,BitOr($SS_CENTER ,$SS_SUNKEN)) $ontop= GUICtrlCreateCheckbox ("On Top", 90, 135, 120, 18) $trans= GUICtrlCreateCheckbox ("Transparent", 5, 135, 80, 18) GUISetState() $CurrentLocX = _MemoryRead($knownX , $DllInformation, 'float') TrayTip($appname, "Scanning For Memory Pointers. Do NOT move your character while scanning...", 5, 1) ;;================================================================================ ;;Pointer Scanner ;;================================================================================ ;X Pointer GUICtrlSetData($Xvaluepointer,"Scanning...") GUICtrlSetData($Yvaluepointer,"Scanning...") GUICtrlSetData($Zvaluepointer,"Scanning...") GUICtrlSetData($Rotvaluepointer,"Scanning...") GUICtrlSetData($statuslabel,"Scanning For Pointer X") $begin = TimerInit() $valueSS = _MemoryRead($startsearchX , $DllInformation, 'float') while $CurrentLocX <> $valueSS $startsearchX = $startsearchX+$offset $valueSS = _MemoryRead($startsearchX , $DllInformation, 'float') WEnd $dif = TimerDiff($begin) TrayTip($appname, "X, Y and Z Position Pointer Found in "& (floor($dif)/1000) & " Seconds", 5, 1) GUICtrlSetData($Xvaluepointer,hex($startsearchX)) $memoryX = "0x" & hex($startsearchX,8) $startsearchY = $startsearchX + 0X4 GUICtrlSetData($Yvaluepointer,hex($startsearchY)) $memoryY = "0x" & hex($startsearchx,8) $startsearchZ = $startsearchX + 0X8 GUICtrlSetData($Zvaluepointer,hex($startsearchZ)) $memoryZ = "0x" & hex($startsearchx,8) $startsearchRot = $startsearchX + 0XC GUICtrlSetData($Rotvaluepointer,hex($startsearchRot)) $memoryRot = "0x" & hex($startsearchx,8) GUICtrlSetData($statuslabel,"Ready. Time = " & (floor($dif)/1000)& " Seconds") while 1 Memscan() $scanprocess = 0 if GUICtrlRead($trans) = 4 Then if $transyn = 1 Then WinSetTrans( $appname, $appname, 255) $transyn = 0 EndIf Else if $transyn = 0 Then WinSetTrans( $appname, $appname, 200) $transyn = 1 EndIf EndIf if GUICtrlRead($ontop) = 1 Then WinSetOnTop($appname, "", 1) Else WinSetOnTop($appname, "", 0) EndIf ;nothing WEnd ;;================================================================================ ;;Memscan ;;================================================================================ Func Memscan() GUICtrlSetData($Xvalue,floor(_MemoryRead($startsearchX, $DllInformation, 'float'))) GUICtrlSetData($Yvalue,floor(_MemoryRead($startsearchY, $DllInformation, 'float'))) GUICtrlSetData($Zvalue,floor(_MemoryRead($startsearchZ, $DllInformation, 'float'))) GUICtrlSetData($Rotvalue,floor((_MemoryRead($startsearchRot, $DllInformation, 'float') / (3.14159265358979/180)))) sleep($UpdateSpeed) EndFunc ;;================================================================================ ;;Rescan ;;================================================================================ func Rescan() $startsearchX = 0x00000B88 $begin = 0 $CurrentLocX = _MemoryRead($knownX , $DllInformation, 'float') TrayTip($appname, "Scanning For Memory Pointers. Do NOT move your character while scanning...", 5, 1) GUICtrlSetData($Xvaluepointer,"Scanning...") GUICtrlSetData($Yvaluepointer,"Scanning...") GUICtrlSetData($Zvaluepointer,"Scanning...") GUICtrlSetData($Rotvaluepointer,"Scanning...") GUICtrlSetData($statuslabel,"Scanning For Pointer X") $begin = TimerInit() $valueSS = _MemoryRead($startsearchX , $DllInformation, 'float') while $CurrentLocX <> $valueSS $startsearchX = $startsearchX+$offset $valueSS = _MemoryRead($startsearchX , $DllInformation, 'float') WEnd $dif = TimerDiff($begin) TrayTip($appname, "X, Y and Z Position Pointer Found in "& (floor($dif)/1000) & " Seconds", 5, 1) GUICtrlSetData($Xvaluepointer,hex($startsearchX)) $memoryX = "0x" & hex($startsearchX,8) $startsearchY = $startsearchX + 0X4 GUICtrlSetData($Yvaluepointer,hex($startsearchY)) $memoryY = "0x" & hex($startsearchx,8) $startsearchZ = $startsearchX + 0X8 GUICtrlSetData($Zvaluepointer,hex($startsearchZ)) $memoryZ = "0x" & hex($startsearchx,8) $startsearchRot = $startsearchX + 0XC GUICtrlSetData($Rotvaluepointer,hex($startsearchRot)) $memoryRot = "0x" & hex($startsearchx,8) GUICtrlSetData($statuslabel,"Ready. Time = " & (floor($dif)/1000)& " Seconds") EndFunc ;;================================================================================ ;;Terminate ;;================================================================================ func terminate() _MemoryClose($DllInformation) exit 0 EndFunc ;==>TerminateNow DONT try to replicate my hack since the new 2.1.0 warden checks for wild Z value offsets.(hint... but still not packets ^^)Edit;Update 23.05.07 - 16:03*Updated for minor preformence increase. (5-10%) faster.*Added $UpdateSpeed for Defininition the update speed in milliseconds.*Added a Rescan funtion, so you dont need to reopen the app when you Zone... (press F2)Update 23.05.07 - 16:50*Updated for minor preformence increase. (??%) faster. Edited May 23, 2007 by malu05 [center][u]WoW Machinima Tool[/u] (Tool for Machinima Artists) [/center]
kned Posted May 23, 2007 Posted May 23, 2007 so .. the position of the mob array is variable? btw n1 work^^
malu05 Posted May 23, 2007 Author Posted May 23, 2007 8,83 secThe code is updated....I have gotten a 0.60 sec preformence increasement. [center][u]WoW Machinima Tool[/u] (Tool for Machinima Artists) [/center]
Zephir Posted May 23, 2007 Posted May 23, 2007 The code is updated....I have gotten a 0.60 sec preformence increasement.11,58 sec ^^
DigitalAnomaly Posted May 23, 2007 Posted May 23, 2007 (edited) 6.606 (before code update) 6.47 (after code update) EDIT: Wait, I ran the program again while WoW was maximized. I'm getting 10-12 seconds on the average. I appreciate the work that you're doing here. I used to do bot dev as well, for Ragnarok Online. I'm going to study your source and see what I can do to help. Edited May 23, 2007 by DigitalAnomaly
malu05 Posted May 23, 2007 Author Posted May 23, 2007 11,58 sec ^^Haha.. well thats not the way you have to do it.Each time you relog, zone or restart wow the offset changes making the search time shorter or longer...Login, Take the old code and scan, then take the new code and scan without relog...That should give you a minor speed buff...6.606 (before code update)6.47 (after code update)EDIT: Wait, I ran the program again while WoW was maximized. I'm getting 10-12 seconds on the average.I appreciate the work that you're doing here. I used to do bot dev as well, for Ragnarok Online. I'm going to study your source and see what I can do to help. I appriciate it.... [center][u]WoW Machinima Tool[/u] (Tool for Machinima Artists) [/center]
Zephir Posted May 23, 2007 Posted May 23, 2007 well, about 10 million people playing.... the largest adict community ever!
Busti Posted May 23, 2007 Posted May 23, 2007 (edited) [01:49.35][DEBUG]=>Starting Bot. [01:49.35][DEBUG]=>Looking for Process ID. [01:49.35][DEBUG]=>Found ID:3236 [01:49.35][DEBUG-SCRIPT]=>Memory-Handle :1812 [01:49.35][DEBUG-SCRIPT]=>Current X Location :-5112.859375 [01:49.35][DEBUG-SCRIPT]=>$sValueSearch :0 [01:49.35][DEBUG]=>Scanning Pointers. [01:50.28][DEBUG]=>Pointers Found. Data : [01:50.28][DEBUG]=>X :0x11728B88 [01:50.28][DEBUG]=>Y :0x11728B8C [01:50.28][DEBUG]=>Z :0x11728B90 [01:50.28][DEBUG]=>Rotation :0x11728B94 [01:50.28][DEBUG]=>Time :52853 [01:50.28][DEBUG]=>Loops Total :70441 [01:50.28][DEBUG]=>Scanning File 'Waypoint.txt' for Waypoints. oÝ÷ Ù8¦{¼ç|fj[®±ëaÇè®èqë,jëh×6 $aPID = 0 While $aPID = 0 $aPID = ProcessExists( "WoW.exe" ) Sleep(100) WEnd Edited May 23, 2007 by Busti My UDF's : Startet on : 06.06.2006_CaseSearchOrReplaceStr();~> Searches OR Replaces a String,;~> With or Without Casesensivity
malu05 Posted May 25, 2007 Author Posted May 25, 2007 (edited) This is a importaint day in the development of Thermo Prime and the toolkit lying behind. For the first time i have been able to produce the moblist that Thermo Prime will use for interacting with Mobs, NPC's and other players.The list tool is going to be tested tommorow by some of my selected testerrs from this forums.If if it all turn out pretty well, then it wont be long before Thermo Prime can interact with the enviroment.IT IS FAST!, yes take a look at the scan time on this shot..A stunishing 0,73 sec to find the offset.The rest you can see here is a complete list of all mobs, npc's and players loaded around this char, their X,Y and Z position and their rotation.In the buttom the Object count is the number of Objects offcause and the base array for debugin'So why is this so importaint?Well... i must say back when i started developing Thermo Prime i gave up on finding the mobs before even trying since it looked so damn hard to figure how to get them into AutoIT. Right now im just overwhelmed by the current development just within this thread. Never imagined i would make it so far... Edited May 25, 2007 by malu05 [center][u]WoW Machinima Tool[/u] (Tool for Machinima Artists) [/center]
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now