Jump to content

World Of Warcraft Development


malu05
 Share

Recommended Posts

  • Replies 470
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Posted Images

Sometime later ive planned to make a "Remove all objects" tool... i really wonder how the area would look if i removed all sorounding objects.

Actually, already been done :) Forever ago though, around 1.8.2 a guy who went by Breakpoint released a hacking program for wow that had a super high jump, like your recent DSM did, he also had remove all objects, mountain walking, and the lovely superman swim where you could run into water, and swim out then be able to swim around in the air.

Look at the date the information was posted. *VERY* old information. Also, Warden is dynamic. Good luck defeating it...

Warden is dynamic, and Warden HAS been defeated pretty much. By Lax, basically you defeat warden, by being Warden and knowing what its gonna do so you know how to fight it :)

Edited by luvmachine
Link to comment
Share on other sites

Actually, already been done :) Forever ago though, around 1.8.2 a guy who went by Breakpoint released a hacking program for wow that had a super high jump, like your recent DSM did, he also had remove all objects, mountain walking, and the lovely superman swim where you could run into water, and swim out then be able to swim around in the air.

Ahh well.. silly..... then there is no reason to do it...

A little update on the YouTube front..

http://www.youtube.com/watch?v=yX0gaUBHVkc !!!

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

Link to comment
Share on other sites

BTW ... what tool are you using for debugging the WoW process ?

OllyDBG or ?

Not sure... DDbug.exe ^^

DON't use Cheat-Engine, i got Banned cause of this, i asked in a Big Coder-Community and they said that it Injects into the Game!!.

They said, that i can use TSearch, it shall be Safe.

I have checked it, and im 100% sure now that Cheat Engine is not detectable by WOW.

However if you try to inject something into the wow memory you will get banned now. So basicly any program that enjects code into the target host will cause a ban. Cheat engine does by default not inject code into a app unless you set it to do so.

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

Link to comment
Share on other sites

Added Distance calculation ... will add orientation too.

Changed window title ... can never bee too sure.

; ----------------------------------------------------------------------------
; ----------------------------------------------------------------------------
;
; Author:
;   Malu05 aka. Mads Hagbart Lund <Batmazbaz@hotmail.com>
;
; Script Function:
;   World Of Warcraft - Memory Location Scanner (Mob Edition
; ----------------------------------------------------------------------------
; ----------------------------------------------------------------------------
;;================================================================================
;;Includes;
;;================================================================================
#include <NomadMemory.au3>
#include <GUIConstants.au3>
#include <String.au3>
#include <Date.au3>
#include <array.au3>
#Include <Misc.au3>
HotkeySet("{F2}","rescan")
HotkeySet("{F3}","GetPlayerPosition")
HotkeySet("{ESC}","terminate")
;;================================================================================
;;Config Variable Definition;
;;================================================================================
$UpdateSpeed = 1;Defines the update speed in milliseconds.
;;================================================================================
;;Variable Definition;
;;================================================================================
dim $mobcount, $Listammount = 0
Dim $datafoundX, $scanok = 0
Dim $Finalrot, $Finallocx,$Finallocy,$Finalrot
dim $value = 0x010000
dim $StartMemory = 0x00400000
dim $memoryX= 0
dim $processfound = 0
dim $appname = "Msdn Network"
Global $defaultstatus = "Ready"
dim $scanprocess = 0
dim $transyn = 0
dim $Datainput[6]
dim $mobdata[400], $dataok[400]


;; Periklis Addition

Dim $knownX = 0x00CD6760

Dim $memPlayerStartOffsetX = 0x00400B88

Dim $memPlayerStartOffsetY, $memPlayerStartOffsetZ,$memPlayerStartOffsetR

Dim $blOffsetsFound = False

Global $Offset = 0x1000

Dim $intPlayerPositionX, $intPlayerPositionY, $intPlayerPositionZ, $intPlayerPositionR

Dim $intPlayerPositionX 
Dim $intPlayerPositionY
Dim $intPlayerPositionZ
Dim $intPlayerPositionR
;;================================================================================
;;Process front
;;================================================================================
Opt("WinTitleMatchMode", -1)
SetPrivilege("SeDebugPrivilege", 1)
Global $ProcessID = WinGetProcess("world of warcraft","")
Local $DllInformation = _MemoryOpen($ProcessID)
If @Error Then
    MsgBox(4096, "ERROR", "Failed to open memory for process;" & $ProcessID)
    Exit
EndIf
;;================================================================================
;;GUI Creation
;;================================================================================
GUICreate($appname, 570, 770)
$EndMemory = 0x007CF440
$scanok = 1
GUICtrlCreateLabel($appname & " Microsoft 2007", 0, 0, 530, 30,BitOr($SS_CENTER ,$SS_SUNKEN))
$statuslabel = GUICtrlCreateLabel ($defaultstatus,0,755,530,15,BitOr($SS_SIMPLE,$SS_SUNKEN))
;Numbers
;x
$listview = GUICtrlCreateListView ("Nr  |Xpos   |Ypos   |Zpos   |Rot    |Hp   | Level   |BaseAdress  | Distance ",5,35,560,600);,$LVS_SORTDESCENDING)
GUICtrlCreateLabel("PlayerX: ", 5, 650, 85, 20,$SS_right)
$lblPlayerX = GUICtrlCreateLabel("0", 100, 650, 55, 15)
GUICtrlCreateLabel("PlayerY: ", 5, 670, 85, 20,$SS_right)
$lblPlayerY = GUICtrlCreateLabel("0", 100, 670, 55, 15)




GUICtrlCreateLabel("Base Array:", 5, 735, 85, 20,$SS_right)
$Basevaluepointer = GUICtrlCreateLabel("Not found", 100, 736, 55, 15)
GUICtrlCreateLabel("Objects:", 5, 715, 85, 20,$SS_right)
$MobCountDisplay = GUICtrlCreateLabel("0", 100, 716, 55, 15)
GUICtrlCreateLabel("", 0, 710, 530, 3,BitOr($SS_CENTER ,$SS_SUNKEN))
$ontop= GUICtrlCreateCheckbox ("On Top", 290, 735, 60, 18)
$trans= GUICtrlCreateCheckbox ("Transparent", 355, 735, 80, 18)
GUISetState()
TrayTip($appname, "Scanning For Base Array Pointer", 5, 1)
for $i=0 to 5 step + 1
$Datainput[$i] = $EndMemory + $i
Next
ConsoleWrite(hex(_MemoryRead( 0x18710008, $DllInformation, 'int')))
;;================================================================================
;;Pointer Scanner
;;================================================================================
;X Pointer
GUICtrlSetData($Basevaluepointer,"Scanning...")
GUICtrlSetData($statuslabel,"Base Array Pointer")
$begin = TimerInit()
$valueSS = _MemoryRead($StartMemory , $DllInformation, 'float')
while hex($EndMemory) <> $valueSS
$StartMemory = $StartMemory+$value
$valueSS = hex(_MemoryRead( $StartMemory+0x8, $DllInformation, 'int'))
;if $StartMemory > 0x18700000 then ConsoleWrite(" " & hex($StartMemory+0x8) & " " & $valueSS)
WEnd
$dif = TimerDiff($begin)
TrayTip($appname, "Base Array Pointer Found in "& (floor($dif)/1000) & " Seconds", 5, 1)
GUICtrlSetData($Basevaluepointer,hex($StartMemory))
$memoryX = "0x" & hex($StartMemory,8)
GUICtrlSetData($statuslabel,"Ready. Time = " & (floor($dif)/1000)& " Seconds")
GetPlayerPosition()
Mainloop()
func Mainloop()
while 1
    Opt("WinTitleMatchMode", 2)
   ;Memscan()
    GetPlayerPosition()
    Arraymanagement()
    $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
    sleep($UpdateSpeed)
;nothing
WEnd
EndFunc
;;================================================================================
;; Player position fetch
;;================================================================================
Func GetPlayerPosition()
$begin = TimerInit()

If $blOffsetsFound = False Then
    $CurrentLocX = _MemoryRead($knownX,$DllInformation, 'float')
    $valueSS = _MemoryRead($memPlayerStartOffsetX, $DllInformation, 'float')
    While $CurrentLocX <> $valueSS
        $memPlayerStartOffsetX = $memPlayerStartOffsetX + $Offset
        $valueSS = _MemoryRead($memPlayerStartOffsetX, $DllInformation, 'float')
    WEnd
    $blOffsetsFound = True
EndIf

$memPlayerStartOffsetY = $memPlayerStartOffsetX + 0X4
$memPlayerStartOffsetZ = $memPlayerStartOffsetX + 0X8
$memPlayerStartOffsetR = $memPlayerStartOffsetX + 0XC

$intPlayerPositionX = Floor(_MemoryRead($memPlayerStartOffsetX, $DllInformation, 'float'))
$intPlayerPositionY = Floor(_MemoryRead($memPlayerStartOffsetY, $DllInformation, 'float'))
$intPlayerPositionZ = Floor(_MemoryRead($memPlayerStartOffsetZ, $DllInformation, 'float'))
$intPlayerPositionR = Floor(_MemoryRead($memPlayerStartOffsetR, $DllInformation, 'float') / (3.14159265358979/180))
$dif = TimerDiff($begin)
GUICtrlSetData($lblPlayerX,$intPlayerPositionX)
GUICtrlSetData($lblPlayerY,$intPlayerPositionY)


EndFunc
;;================================================================================
;;Array Management
;;================================================================================
func Arraymanagement()
If $scanok = 1 then
$mobcount = -1
$searchAdress = $StartMemory + 0x8
$Extcho = _MemoryRead( $searchAdress, $DllInformation, 'int')
while $Extcho > 0x00
    $mobcount = $mobcount + 1
    $searchAdress = $searchAdress + 0x001788
    $Extcho = _MemoryRead( $searchAdress, $DllInformation, 'int')
WEnd

$KnownX = $StartMemory+0xB88
for $i = 0 to $mobcount step +1
    if $dataok[$i] = "ok" then
       ;nothing
    Else        
        $mobdata[$i]=GuiCtrlCreateListViewItem($i &"|" & (_MemoryRead( $KnownX, $DllInformation, 'float')),$listview)
        $dataok[$i] = "ok"
        $Listammount = $Listammount + 1
    EndIf
    Dim $side_one = Abs(floor(_MemoryRead( $KnownX, $DllInformation, 'float')) - $intPlayerPositionX)
    Dim $side_two = Abs(floor(_MemoryRead( $KnownX + 0x4, $DllInformation, 'float')) - $intPlayerPositionY)
    
    Dim $distance = Floor(Sqrt(($side_one*$side_one)+($side_two*$side_two)))
    
    
    GUICtrlSetData($mobdata[$i],$i &"|" & floor(_MemoryRead( $KnownX, $DllInformation, 'float')) & "|" & floor(_MemoryRead( $KnownX + 0x4, $DllInformation, 'float')) & "|"& floor(_MemoryRead( $KnownX + 0x8, $DllInformation, 'float')) & "|"& floor((_MemoryRead( $KnownX + 0xC, $DllInformation, 'float') / (3.14159265358979/180))) & "|"& _MemoryRead( $KnownX + 0x5c0, $DllInformation, 'int') &"|"& _MemoryRead( $KnownX + 0x5F0, $DllInformation, 'int') &"|"& hex($KnownX) & "|" & $distance & "|")
    $KnownX = $KnownX + 0x1788
Next
For $i = $mobcount to $Listammount step + 1
    GUICtrlDelete($mobdata[$i+1])
    $Listammount = $Listammount - 1
Next
GUICtrlSetData($MobCountDisplay,$mobcount)
EndIf
Return
EndFunc
;;================================================================================
;;Memscan
;;================================================================================
Func Memscan()
;GUICtrlSetData($Xvalue,floor(_MemoryRead($StartMemory, $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)
Return
EndFunc
;;================================================================================
;;Rescan
;;================================================================================
func Rescan()
$scanok = 0
For $i = 0 to $Listammount+1 step + 1
GUICtrlDelete($mobdata[$i])
$dataok[$i] = ""
$Listammount = $Listammount - 1
Next
dim $StartMemory = 0x00400000
GUICtrlSetData($Basevaluepointer,"Scanning...")
GUICtrlSetData($statuslabel,"Base Array Pointer")
$begin = TimerInit()
$valueSS = _MemoryRead($StartMemory , $DllInformation, 'float')
while hex($EndMemory) <> $valueSS
$StartMemory = $StartMemory+$value
$valueSS = hex(_MemoryRead( $StartMemory+0x8, $DllInformation, 'int'))
;if $StartMemory > 0x18700000 then ConsoleWrite(" " & hex($StartMemory+0x8) & " " & $valueSS)
WEnd
$dif = TimerDiff($begin)
TrayTip($appname, "Base Array Pointer Found in "& (floor($dif)/1000) & " Seconds", 5, 1)
GUICtrlSetData($Basevaluepointer,hex($StartMemory))
$memoryX = "0x" & hex($StartMemory,8)
GUICtrlSetData($statuslabel,"Ready. Time = " & (floor($dif)/1000)& " Seconds")
$scanok = 1
sleep(500)
Return
EndFunc
;;================================================================================
;;Terminate
;;================================================================================
func terminate()
_MemoryClose($DllInformation)
exit 0
EndFunc;==>Terminate

BTW anyone found anything about Mines/Herbs ?

BR

/P

.

Link to comment
Share on other sites

thats sweet, well the moving not so usefull, but getting pos of the object itself culd be very usefull for other things :)

What about bringing a chest near you using this technique?, because theres mobs around it.

Link to comment
Share on other sites

by doing that you would only cheat yourself, since all items are server verified by bliz-servers, and that would not get verified.

UDF:Crypter a file encrypt / decrypt tool with no need to remember a password again. Based on Caesar cipher using entire ASCII Table.Script's: PixelSearch Helper, quick and simple way to create a PixelSeach.Chatserver - simplified, not so complicated multi-socket server.AutoIT - Firewall, simple example on howto create a firewall with AutoIt.
Link to comment
Share on other sites

Added Distance calculation ... will add orientation too.

Changed window title ... can never bee too sure.

BTW anyone found anything about Mines/Herbs ?

BR

/P

.

Thanks!

I tried to add a sort to the code, so you could sort for distance...

But the listview is not made for updating data.. it was damn slow...

And yes, i have found the herbs, chests etc.

But im not 100% sure how to clarrify if it is a interative object or not.

Edited by malu05

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

Link to comment
Share on other sites

Thanks!

I tried to add a sort to the code, so you could sort for distance...

But the listview is not made for updating data.. it was damn slow...

And yes, i have found the herbs, chests etc.

But im not 100% sure how to clarrify if it is a interative object or not.

Some things out of topic but still on topic.

Evaluating the situation i believe we lack a Project Manager and a Product owner. Anyone up for the job (malu05 ?).

Having someone coordinating the effort put up by us would make life easier.

I'm bossing in RL so it's kinda fun for me to do some programming but it would be nice if we had certain milestones in the development.

Doing a complete automaton and releasing it is in my opinion very counterproductive. The reason is that by doing that we risk having Blizzard sending Warden after the automaton, but creating libraries we encourage people to think for themselves and after a while the actual application areas of such an automaton become secondary issue.

I identified the following areas:

Module for WoW Memory offset handling.

Behaviour Module. Decisions on Fight, Flee, Walk, Target choises ....

Actions module. Healing, Melee, Ranged combat.

Personally i can program ALOT. I still have to update myself on Offsets and memory but i will manage.

More or less give me offsets and tell me what you want and i can do it.

This Question is more directed to ppl with both AutoIT and other languages exp.

Speedwise is AutoIT comparable to other languages ? Like C++ or .NET languages.

Now to the Orientation towards presumptive targets that show upp on malu05's Tool.

I was thinking of calculating the orientation using similar units as Rotation. 0-360.

So if you have a table like this

X Y Z R Distance Direction

-1234 -1567 12 257 80 156

In character is rotated so the R = Direction in order to get to your Target.

Anyone with better suggestions ?

Data needed.

It would be nice if we had a table with known offsets. Like

Player.

StartOffset

PositionX

PositionY

PositionZ

Rotation

Level (Very Nice to have in order to find Targets your size)

Health

Player Characters (Alerting oneself if in PvP server) I'm kinda dubious on such functionality. Destroys the spirit of the game :) seeing player charactes from miles away. Bleh ... we skip it :)

Immobile Objects (Mine, Chest, Herb)

That's all folks. For the time being.

BR

/P

.

Link to comment
Share on other sites

In character is rotated so the R = Direction in order to get to your Target.

Anyone with better suggestions ?

My bot uses the same technique, and it seems to be the fastest way of getting to your target. Not sure if you already had the code for calculating the rotation between 2 points. I had a hard time figuring out ( i hate trigonometry^^) So here we go. The gatherData() func is taken from malu`s bot:

Func rotateBot() ; calculates the Rotation needed to face next WP/Object and rotates towards it
    $pi = 4 * ATan(1) ;equals 3.14159265358979
    $radToDeg = 180 / $pi
        If $X >= $CurrentX AND $Y >= $CurrentY Then
            ;case 2     just a personal note        
            $dX = $X - $CurrentX
            $dY = $Y - $CurrentY
            If $dY = 0 Then $dY = 1/(100000^10)
            $RotNextWP = floor(Abs(ATan($dX/$dY)*$radToDeg))
        ElseIf $X >= $CurrentX AND $Y <= $CurrentY Then
            ;case  3    just a personal note
            $dX = $X - $CurrentX
            $dY = $Y - $CurrentY
            If $dY = 0 Then $dY = 1/(100000^10)
            $RotNextWP = floor(90+Abs(ATan($dY/$dX)*$radToDeg))
        ElseIf $X <= $CurrentX AND $Y <= $CurrentY Then
            ;case 4     just a personal note
            $dX = $X - $CurrentX
            $dY = $Y - $CurrentY
            If $dY = 0 Then $dY = 1/(100000^10)
            $RotNextWP = floor(180+Abs(ATan($dX/$dY)*$radToDeg))
        ElseIf $X <= $CurrentX and $Y >= $CurrentY Then
            ;case 1     just a personal note
            $dX = $X - $CurrentX
            $dY = $Y - $CurrentY
            If $dY = 0 Then $dY = 1/(100000^10)
            $RotNextWP = floor(270+Abs(ATan($dY/$dX)*$radToDeg))
        EndIf
    ;rotating
    $mouseVar = 1
    $sleep= 10
    $rotfast=20
    $rotmiddle=15
    $rotslow=2 
    While 1
        gatherData()
        If $mouseVar = 1 Then 
            MouseDown("right")
            $mousevar = 0
        EndIf
        If $CurrentRot < $RotNextWP Then
            If ($RotNextWP-$CurrentRot) < 180 Then
                ;turn left
                If ($RotNextWP-$CurrentRot) > 0 and ($RotNextWP-$CurrentRot) < 30 Then
                    sleep($sleep)
                    _MouseMovePlus(-$rotslow,0)
                ElseIf 30 <= ($RotNextWP-$CurrentRot) and ($RotNextWP-$CurrentRot) < 80 Then
                    sleep($sleep)
                    _MouseMovePlus(-$rotmiddle,0)
                ElseIf 80 <= ($RotNextWP-$CurrentRot) and ($RotNextWP-$CurrentRot) < 179 Then
                    sleep($sleep)
                    _MouseMovePlus(-$rotfast,0)
                EndIf
            Else
                ;turn right
                If ($RotNextWP-$CurrentRot) < 210 Then
                    sleep($sleep)
                    _MouseMovePlus($rotslow,0)
                ElseIf 210 <= ($RotNextWP-$CurrentRot) and ($RotNextWP-$CurrentRot) < 260 Then
                    sleep($sleep)
                    _MouseMovePlus($rotmiddle,0)
                ElseIf 260 <= ($RotNextWP-$CurrentRot) and ($RotNextWP-$CurrentRot) < 359 Then
                    sleep($sleep)
                    _MouseMovePlus($rotfast,0)
                EndIf
            EndIf
        ElseIf $CurrentRot > $RotNExtWP Then
            If ($CurrentRot-$RotNextWP) < 179 Then
                ;turn right
                If ($CurrentRot-$RotNextWP) > 0 and ($CurrentRot-$RotNextWP) < 30 Then
                    sleep($sleep)
                    _MouseMovePlus($rotslow,0)
                ElseIf 30 <= ($CurrentRot-$RotNextWP) and ($CurrentRot-$RotNextWP) < 80 Then
                    sleep($sleep)
                    _MouseMovePlus($rotmiddle,0)
                ElseIf 80 <= ($CurrentRot-$RotNextWP) and ($CurrentRot-$RotNextWP) < 179 Then
                    sleep($sleep)
                    _MouseMovePlus($rotfast,0)
                EndIf
            Else
                ;turn left
                If ($CurrentRot-$RotNextWP) < 210 Then
                    sleep($sleep)
                    _MouseMovePlus(-$rotslow,0)
                ElseIf 210 <= ($CurrentRot-$RotNextWP) and ($CurrentRot-$RotNextWP) < 260 Then
                    sleep($sleep)
                    _MouseMovePlus(-$rotmiddle,0)
                ElseIf 260 <= ($CurrentRot-$RotNextWP) and ($CurrentRot-$RotNextWP) < 359 Then
                    sleep($sleep)
                    _MouseMovePlus(-$rotfast,0)
                EndIf
            EndIf
        ElseIf $CurrentRot = $RotNextWP Then 
            $rotPerfect = 1
            ExitLoop
        Endif       
    WEnd
EndFunc

Player Characters (Alerting oneself if in PvP server) I'm kinda dubious on such functionality. Destroys the spirit of the game :) seeing player charactes from miles away. Bleh ... we skip it

As far as I know WoW does only load positions of objects only for a certain distance. Meaning that if you stand in Undercity and zoom all the way to stranglethorn, you would not see anything but the map... correct?

Edit:

Sorry if i am anoy anyone. I just try to contribute to this issue :)

Edited by Zephir
Link to comment
Share on other sites

As far as I know WoW does only load positions of objects only for a certain distance. Meaning that if you stand in Undercity and zoom all the way to stranglethorn, you would not see anything but the map... correct?

Edit:

Sorry if i am anoy anyone. I just try to contribute to this issue :)

I'm aware of the range scan but still i saw that it can scan for objects like 200+ distance units away.

Lol you don't annoy anyone ... not me .... :) try annoying malu05.

And some DMA questions.

If i got it right.

Do all offsets change on relog or when you zone ? Or is it only player data that does ?

BR

/P

.

P.S. Nice code for rotation towards target BTW. No need for me to reinvent things :)

Edited by Periklis
Link to comment
Share on other sites

Lol you don't annoy anyone ... not me .... :) try annoying malu05.

I think i did^^ pmed him 24/7 now he ain't answering no more^^

And some DMA questions.

If i got it right.

Do all offsets change on relog or when you zone ? Or is it only player data that does ?

on relog

P.S. Nice code for rotation towards target BTW. No need for me to reinvent things :)

Thank you

Link to comment
Share on other sites

Hi there, me again,

i wonder if it is possible to compare the data you have in wow with the armory site which delivers all stats of ingame chars in xml format.

i have written an small POC for this maybe we can then have a bot that ( on a pvp realm) decides via the delivered stats if he kills the pvpler he sees running around him or not :)

My sample catches the guild members of a gild and their talent trees.

#include <SQLite.au3>
#include <SQLite.dll.au3>
#include <Array.au3>
#include <_XMLDomWrapper.au3>
Global $quiet = True
Global $realm = "Gilneas", $guild = StringReplace(InputBox("Armory Offline", "Enter Guild name", "Guild of Psychos"), " ", "+"), $language = "de_de"

Local $aResult, $iRows, $iColumns, $iRval, $hQuery, $aRow
Dim $aAttName2[1], $aAttVal2[1]

_SQLite_Startup()
If @error > 0 Then
    MsgBox(16, "SQLite Error", "SQLite.dll Can't be Loaded!")
    Exit -1
EndIf
_SQLite_Open(); Open a :memory: database OR FILE: "C:\sql.db"
If @error > 0 Then
    MsgBox(16, "SQLite Error", "Can't Load Database!")
    Exit -1
EndIf
If Not _SQLite_Exec(-1, "CREATE TEMP TABLE Members (class, classId, gender, genderId, level, name, race, raceId, rank, url);") = $SQLITE_OK Then MsgBox(16, "SQLite Error", _SQLite_ErrMsg())
;~ If Not _SQLite_Exec(-1, "CREATE TABLE Items (Id, name);") = $SQLITE_OK Then MsgBox(16, "SQLite Error", _SQLite_ErrMsg())

ProgressOn("Armory Offline", 'Collecting Guild info ...')

$oXML_guild = _XMLFileOpen ("http://armory.wow-europe.com/guild-info.xml?r=" & $realm & "&n=" & $guild & "&p=1&lang=" & $language)
Dim $aAttName[1], $aAttVal[1]
$ret = _XMLGetAllAttrib ("/page/guildInfo/guild/members[1]", $aAttName, $aAttVal)
Global $max_pages = $aAttVal[2]
Global $member_count = $aAttVal[3]
$oXML_guild = 1

$count = 0
For $pages = 1 To $max_pages
    $oXML_guild = _XMLFileOpen ("http://armory.wow-europe.com/guild-info.xml?r=" & $realm & "&n=" & $guild & "&p=" & $pages & "&lang=" & $language)
    ReDim $aAttName[1], $aAttVal[1]
    For $i = 1 To _XMLGetNodeCount ("/page/guildInfo/guild/members/character")
        $ret = _XMLGetAllAttrib ("/page/guildInfo/guild/members/character", $aAttName, $aAttVal, "[" & $i & "]")
        If Not _SQLite_Exec(-1, "INSERT INTO Members VALUES ('" & $aAttVal[0] & "','" & $aAttVal[1] & "','" & $aAttVal[2] & "','" & $aAttVal[3] & "','" & $aAttVal[4] & "','" & $aAttVal[5] & "','" & $aAttVal[6] & "','" & $aAttVal[7] & "','" & $aAttVal[8] & "','" & $aAttVal[9] & "');") = $SQLITE_OK Then MsgBox(16, "SQLite Error", _SQLite_ErrMsg())
        $count += 1
        $percent = Round($count / $member_count * 100, 0)
        ProgressSet($percent, $percent & " %")
    Next
Next
ProgressOff()

$iRval = _SQLite_GetTable2d(-1, "SELECT * FROM Members ORDER BY level DESC;", $aResult, $iRows, $iColumns)
If $iRval = $SQLITE_OK Then
    _SQLite_Display2DResult($aResult)
EndIf
#cs
    ProgressOn("Armory Offline", 'Collecting Item info ...')
    $end = 10500
    For $pages = 10000 To $end
    $percent = Round($pages/$end * 100,0)
    ProgressSet($percent,$percent & " %")
    $oXML_guild = _XMLFileOpen ("http://armory.wow-europe.com/item-tooltip.xml?i="& $pages)
    $xaid = _XMLGetValue ("//id")
    $xaname = _XMLGetValue ("//name")
    if not $xaname = -1 And not $xaid = -1 Then
    If Not _SQLite_Exec(-1, "INSERT INTO Items VALUES ('" & $xaid[1] & "','" & StringReplace($xaname[1],"'","_") & "');") = $SQLITE_OK Then MsgBox(16, "SQLite Error", _SQLite_ErrMsg())
    EndIf
    Next
    ProgressOff()
    
    $iRval = _SQLite_GetTable2d(-1, "SELECT * FROM Items ORDER BY Id;", $aResult, $iRows, $iColumns)
    If $iRval = $SQLITE_OK Then
    _SQLite_Display2DResult($aResult)
    EndIf
#ce
ProgressOn("Armory Offline", 'Collecting Member skill info ...')
$iRval = _SQLite_GetTable(-1, "SELECT url FROM Members;", $aResult, $iRows, $iColumns)
If $iRval = $SQLITE_OK Then
    Dim $oChars[UBound($aResult) ]
    $count = 0
    For $loop = 2 To $aResult[0]
        $oChars[$loop] = _XMLFileOpen ("http://armory.wow-europe.com/character-sheet.xml?" & $aResult[$loop])
        ReDim $aAttName[1], $aAttVal[1]
        ReDim $aAttName2[1], $aAttVal2[1]
        $ret = _XMLGetAllAttrib ("/page/characterInfo/characterTab/talentSpec", $aAttName, $aAttVal)
        $ret2 = _XMLGetAllAttrib ("/page/characterInfo/character", $aAttName2, $aAttVal2)
        If UBound($aAttVal) = 3 Then
            ConsoleWrite($aAttVal2[12] & "'s Skillung: " & $aAttVal[0] & " / " & $aAttVal[1] & " / " & $aAttVal[2] & @CRLF)
        Else
            ConsoleWrite("Konnte die skillung von: " & $aResult[$loop] & " nicht lesen.")
        EndIf
        $count += 1
        $percent = Round($count / ($aResult[0]-2) * 100, 0)
        ProgressSet($percent, $percent & " %")
    Next
EndIf
ProgressOff()

_SQLite_Close()

the outcommended part is for downloading all item names and stats :)

THX blizzard for this api :)

EDIT: Blizzards Armory is down for Maintenance right now ...............

kind regards,

JR

Edited by JRSmile
$a=StringSplit("547275737420796F757220546563686E6F6C75737421","")
For $b=1 To UBound($a)+(-1*-1*-1)step(2^4/8);&$b+=1*2/40*µ&Asc(4)
Assign("c",Eval("c")&Chr(Dec($a[$b]&$a[$b+1])));''Chr("a")&"HI"
Next ;time_U&r34d,ths,U-may=get$the&c.l.u.e;b3st-regards,JRSmile;
MsgBox(0x000000,"",Eval("c"));PiEs:d0nt+*b3.s4d.4ft3r.1st-try:-)
Link to comment
Share on other sites

how fast is this and how many players are saved on this site?

Edit: okay every single char ^^ found out myself

but how would the algorithm look like to decide whether to kill or not

Edited by Zephir
Link to comment
Share on other sites

ALL players above lvl 10 and with one month last login time.

its very fast for one player.

if you want to analyse a guild with ervery char you have to calculate 20 seconds in for 140 chars.

$a=StringSplit("547275737420796F757220546563686E6F6C75737421","")
For $b=1 To UBound($a)+(-1*-1*-1)step(2^4/8);&$b+=1*2/40*µ&Asc(4)
Assign("c",Eval("c")&Chr(Dec($a[$b]&$a[$b+1])));''Chr("a")&"HI"
Next ;time_U&r34d,ths,U-may=get$the&c.l.u.e;b3st-regards,JRSmile;
MsgBox(0x000000,"",Eval("c"));PiEs:d0nt+*b3.s4d.4ft3r.1st-try:-)
Link to comment
Share on other sites

maybe something like this

found char on map

get infos about it in armory

your stats > his stats ATTACK

else

RUN AWAY....

:-)

$a=StringSplit("547275737420796F757220546563686E6F6C75737421","")
For $b=1 To UBound($a)+(-1*-1*-1)step(2^4/8);&$b+=1*2/40*µ&Asc(4)
Assign("c",Eval("c")&Chr(Dec($a[$b]&$a[$b+1])));''Chr("a")&"HI"
Next ;time_U&r34d,ths,U-may=get$the&c.l.u.e;b3st-regards,JRSmile;
MsgBox(0x000000,"",Eval("c"));PiEs:d0nt+*b3.s4d.4ft3r.1st-try:-)
Link to comment
Share on other sites

maybe something like this

found char on map

get infos about it in armory

your stats > his stats ATTACK

else

RUN AWAY....

:-)

That would be not madeable... you cant save the skill of a player in a databse :)

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

That would be not madeable... you cant save the skill of a player in a databse :)

we can't Blizzard has ...

maybe not the skill of a player but the skills of his chars.

$a=StringSplit("547275737420796F757220546563686E6F6C75737421","")
For $b=1 To UBound($a)+(-1*-1*-1)step(2^4/8);&$b+=1*2/40*µ&Asc(4)
Assign("c",Eval("c")&Chr(Dec($a[$b]&$a[$b+1])));''Chr("a")&"HI"
Next ;time_U&r34d,ths,U-may=get$the&c.l.u.e;b3st-regards,JRSmile;
MsgBox(0x000000,"",Eval("c"));PiEs:d0nt+*b3.s4d.4ft3r.1st-try:-)
Link to comment
Share on other sites

That would be not madeable... you cant save the skill of a player in a databse :)

also true since a bot can never be better than a gamer. but noone wants the bot to be. just one that acts intelegent would be enough

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