Jump to content

World Of Warcraft Development


malu05
 Share

Recommended Posts

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 + 4

Z = $offset + 8

So...| 0 4 8 | 12 16 20 | 24 28 32 | etc

1,2,3,5,6,7,9,10 and 11 is still unknown...

Edited by malu05

[center][u]WoW Machinima Tool[/u] (Tool for Machinima Artists) [/center]

Link to comment
Share on other sites

  • Replies 470
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Posted Images

X = offset

Y = $offset + 4

Z = $offset + 8

So...| 0 4 8 | 12 16 20 | 24 28 32 | etc

1,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) ?

Cia

lutin

P.S : have you checked your PM malu?

Edited by joyeuxlutin
Link to comment
Share on other sites

the first demo...

Not much to say... target a mob and the program shows the info about the mob...

Posted Image

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..

1

Passive - This is for reading only, alterig these makes no diffrence.

2

Current - Changing this makes the mob port to the entered distination.

3

Send 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 by malu05

[center][u]WoW Machinima Tool[/u] (Tool for Machinima Artists) [/center]

Link to comment
Share on other sites

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) ?

Cia

lutin

P.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 mob

2; Scroll to the X position

3; 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 Name

9; 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 by malu05

[center][u]WoW Machinima Tool[/u] (Tool for Machinima Artists) [/center]

Link to comment
Share on other sites

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 :).

Link to comment
Share on other sites

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]

Link to comment
Share on other sites

World Of Warcraft Memory Scanner

This 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.7

Posted Image

Thanks 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

; ----------------------------------------------------------------------------
; ----------------------------------------------------------------------------
;
; 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 ;==>Terminate

Now 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 by malu05

[center][u]WoW Machinima Tool[/u] (Tool for Machinima Artists) [/center]

Link to comment
Share on other sites

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 by DigitalAnomaly
Link to comment
Share on other sites

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]

Link to comment
Share on other sites

[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 by Busti
My UDF's : Startet on : 06.06.2006_CaseSearchOrReplaceStr();~> Searches OR Replaces a String,;~> With or Without Casesensivity
Link to comment
Share on other sites

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'

Posted Image

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 by malu05

[center][u]WoW Machinima Tool[/u] (Tool for Machinima Artists) [/center]

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...