Radar auslesen

08/25/2010 23:03 Nulpe123#1
Ich bräuchte für meinen Bot eine Funktion, mit der ich die Koordinaten aller Monster im Radar auslesen kann. So eine Funktion hat zB. auch der .NET Trainer.
Ich habe bereits die Adressen für die GUID und ID der NPCs. Diese beginnen bei der Adresse 0x0120004C für die GUID des ersten NPCs (0x01200050 für die ID des NPCs). Die jeweils nächste ist je 368 Bytes weiter (0x012003B4 für den 2. NPC).
So weit so gut, allerdings finde ich einfach nicht die Adresse für die Koordinaten, wo sich die NPCs grade befinden. Ich kann die zwar mit CE auslesen, allerdings scheint sich ihre Speicheradresse immer zu ändern, sobald der NPC einmal aus dem Radar verschwunden ist und wieder auftaucht. Auch lässt sich kein Zusammenhang mit den anderen Koordinaten erkennen, da diese Speicheradressen manchmal einfach unmögliche Werte anzeigen...

Weiß jemand Rat, wie ich an die Koordinaten komme?

Ich habe dsfgd schon eine PM geschrieben und gefragt,wie er das in seinem Trainer hinbekommen hat, allerdings hat er sich seit Tagen nicht in diesem Forum blicken lassen und ich bräuchte die Kordinaten wirklich dringend...
08/25/2010 23:09 Elongate#2
Immer wieder Radar auslesen...? Wozu brauchst du das denn?
08/25/2010 23:20 KDeluxe#3
Damit kann man den Bereich gut eingrenzen. Gibt noch weitere Beispiele, ich habe huberhans
mal ein Code geschickt, ich kram den mal raus und lösch das unnötige.

Hat zwar etwas gedauert, aber ich habs gefunden. Es ist zwar nur ein AutoIt Script und für die Items,
aber du solltest was damit anfangen können:
PHP Code:
#include <GUIConstantsEx.au3>
#include <GuiListView.au3> ; ListView UDF
#include <ListViewConstants.au3>
#include <NomadMemory.au3>
#include <WindowsConstants.au3>

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("KDRadar", 370, 368)
GUISetBkColor(0xFFFFFF)
$LV_Items = GUICtrlCreateListView("X|Y|Z|Rotation", 10, 10, 350, 350)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 75)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 75)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 75)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 3, 75)
$ListViewHandle = GUICtrlGetHandle($LV_Items)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

$Handle = _MemoryOpen(ProcessExists("Nksp.exe")) ;vereinfacht
$Base 
= 0x10643528
$mDataSize 
= 0x90

$Address 
= _MemoryRead($Base, $Handle) ;_pNetwork
$GameAddress 
= _MemoryRead($Address + 0x1C, $Handle) ;_pNetwork + 0x1C
$ItemsPointer 
= _MemoryRead($GameAddress + 0x48, $Handle) ;(_pNetwork + 0x1C) + 0x48
$ItemsCount 
= _MemoryRead($GameAddress + 0x4C, $Handle) ;(_pNetwork + 0x1C) + 0x4C

$Time 
= 10000 ;10 Sekunden

While True
    $nMsg 
= GUIGetMsg()
    Switch 
$nMsg
        
Case $GUI_EVENT_CLOSE
            
Exit

    EndSwitch

    If 
TimerDiff($Time) >= 10000 Then ;aktuallisiert das ListView alle 10 Sekunden
        _GUICtrlListView_DeleteAllItems
($ListViewHandle); löscht alle Einträge der ListView
        
For $x = 0 To $ItemsCount - 1 ;Array beginnt bei 0
            $ItemDataPointer 
= _MemoryRead($ItemsPointer + ($x * $mDataSize) + 0xC, $Handle)

            
$ItemX = _MemoryRead($ItemDataPointer + 0x54, $Handle, "float")
            
$ItemY = _MemoryRead($ItemDataPointer + 0x5C, $Handle, "float")
            
$ItemZ = _MemoryRead($ItemDataPointer + 0x58, $Handle, "float")
            
$ItemRot = _MemoryRead($ItemDataPointer + 0x60, $Handle, "float")

            ;
Daten in das ListView einfügen
            $ItemsAddListView 
= _GUICtrlListView_GetItemCount($LV_Items)
            
_GUICtrlListView_AddItem($ListViewHandle, Round($ItemX, 4), 0)
            
_GUICtrlListView_AddSubItem($ListViewHandle, $ItemsAddListView, Round($ItemY, 4), 1)
            
_GUICtrlListView_AddSubItem($ListViewHandle, $ItemsAddListView, Round($ItemZ, 4), 2)
            
_GUICtrlListView_AddSubItem($ListViewHandle, $ItemsAddListView, Round($ItemRot, 4), 3)
        
Next

        $Time 
= TimerInit() ;resettet den Timer
    
EndIf
WEnd 
Ist nicht mehr aktuell.
08/26/2010 14:31 Nulpe123#4
Quote:
Originally Posted by KillerDeluxe View Post
Damit kann man den Bereich gut eingrenzen. Gibt noch weitere Beispiele, ich habe huberhans
mal ein Code geschickt, ich kram den mal raus und lösch das unnötige.

Hat zwar etwas gedauert, aber ich habs gefunden. Es ist zwar nur ein AutoIt Script und für die Items,
aber du solltest was damit anfangen können:
PHP Code:
#include <GUIConstantsEx.au3>
#include <GuiListView.au3> ; ListView UDF
#include <ListViewConstants.au3>
#include <NomadMemory.au3>
#include <WindowsConstants.au3>

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("KDRadar", 370, 368)
GUISetBkColor(0xFFFFFF)
$LV_Items = GUICtrlCreateListView("X|Y|Z|Rotation", 10, 10, 350, 350)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 75)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 75)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 75)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 3, 75)
$ListViewHandle = GUICtrlGetHandle($LV_Items)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

$Handle = _MemoryOpen(ProcessExists("Nksp.exe")) ;vereinfacht
$Base 
= 0x10643528
$mDataSize 
= 0x90

$Address 
= _MemoryRead($Base, $Handle) ;_pNetwork
$GameAddress 
= _MemoryRead($Address + 0x1C, $Handle) ;_pNetwork + 0x1C
$ItemsPointer 
= _MemoryRead($GameAddress + 0x48, $Handle) ;(_pNetwork + 0x1C) + 0x48
$ItemsCount 
= _MemoryRead($GameAddress + 0x4C, $Handle) ;(_pNetwork + 0x1C) + 0x4C

$Time 
= 10000 ;10 Sekunden

While True
    $nMsg 
= GUIGetMsg()
    Switch 
$nMsg
        
Case $GUI_EVENT_CLOSE
            
Exit

    EndSwitch

    If 
TimerDiff($Time) >= 10000 Then ;aktuallisiert das ListView alle 10 Sekunden
        _GUICtrlListView_DeleteAllItems
($ListViewHandle); löscht alle Einträge der ListView
        
For $x = 0 To $ItemsCount - 1 ;Array beginnt bei 0
            $ItemDataPointer 
= _MemoryRead($ItemsPointer + ($x * $mDataSize) + 0xC, $Handle)

            
$ItemX = _MemoryRead($ItemDataPointer + 0x54, $Handle, "float")
            
$ItemY = _MemoryRead($ItemDataPointer + 0x5C, $Handle, "float")
            
$ItemZ = _MemoryRead($ItemDataPointer + 0x58, $Handle, "float")
            
$ItemRot = _MemoryRead($ItemDataPointer + 0x60, $Handle, "float")

            ;
Daten in das ListView einfügen
            $ItemsAddListView 
= _GUICtrlListView_GetItemCount($LV_Items)
            
_GUICtrlListView_AddItem($ListViewHandle, Round($ItemX, 4), 0)
            
_GUICtrlListView_AddSubItem($ListViewHandle, $ItemsAddListView, Round($ItemY, 4), 1)
            
_GUICtrlListView_AddSubItem($ListViewHandle, $ItemsAddListView, Round($ItemZ, 4), 2)
            
_GUICtrlListView_AddSubItem($ListViewHandle, $ItemsAddListView, Round($ItemRot, 4), 3)
        
Next

        $Time 
= TimerInit() ;resettet den Timer
    
EndIf
WEnd 
Ist nicht mehr aktuell.

Ein dickes Thanks von mir :)

Bei den Items habe ich das jetzt geschafft, aber bei den Monstern komm ich leider nicht weiter. Bei den Offsets überspringt der einfach das, was bei dir der $ItemsPointer (bei den Monstern warscheinlich der MonsterPointer) ist und geht direkt zur $GameAddress. Das endet natürlich in einer komplett falschen Endadresse...

Hat jemand eine Ahnung, wie ich an die Offset für den "MonsterPointer" komme?
08/26/2010 18:19 KDeluxe#5
Da ist mir ein kleiner Fehler unterlaufen. Ich hab das ganze aber mal etwas verbessert und für die Monster angepasst.
PHP Code:
#include <GUIConstantsEx.au3>
#include <GuiListView.au3> ; ListView UDF
#include <ListViewConstants.au3>
#include <NomadMemory.au3>
#include <WindowsConstants.au3>

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("KDRadar", 370, 368)
GUISetBkColor(0xFFFFFF)
$LV_Monster = GUICtrlCreateListView("X|Y|Z|Rotation", 10, 10, 350, 350)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 75)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 75)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 75)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 3, 75)
$ListViewHandle = GUICtrlGetHandle($LV_Monster)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###


$Base = 0x105F1A58
$mDataSize 
= 0x368
$Window 
= "[CLASS:Nksp]"
$Time = 10000 ;10 Sekunden


While True
    $nMsg 
= GUIGetMsg()
    Switch 
$nMsg
        
Case $GUI_EVENT_CLOSE
            
Exit

    EndSwitch

    If 
TimerDiff($Time) >= 10000 Then ;aktuallisiert das ListView alle 10 Sekunden
        $Handle 
= _MemoryOpen(WinGetProcess($Window)) ;vereinfacht
        
If Not @error Then
            $Address 
= _MemoryRead($Base, $Handle) ;_pNetwork
            $GameAddress 
= _MemoryRead($Address + 0x1C, $Handle) ;_pNetwork + 0x1C
            $MonsterPointer 
= _MemoryRead($GameAddress + 0x18, $Handle) ;(_pNetwork + 0x1C) + 0x18
            $MonsterCount 
= _MemoryRead($GameAddress + 0x1C, $Handle) ;(_pNetwork + 0x1C) + 0x1C

            _GUICtrlListView_DeleteAllItems
($ListViewHandle); löscht alle Einträge der ListView
            
For $x = 0 To $MonsterCount - 1 ;Array beginnt bei 0
                $MonsterDataPointer 
= _MemoryRead($MonsterPointer + ($x * $mDataSize) + 0x14, $Handle)

                
$MonsterX = _MemoryRead($MonsterDataPointer + 0x54, $Handle, "float")
                
$MonsterY = _MemoryRead($MonsterDataPointer + 0x5C, $Handle, "float")
                
$MonsterZ = _MemoryRead($MonsterDataPointer + 0x58, $Handle, "float")
                
$MonsterRot = _MemoryRead($MonsterDataPointer + 0x60, $Handle, "float")

                ;
Daten in das ListView einfügen
                $MonsterAddListView 
= _GUICtrlListView_GetItemCount($LV_Monster)
                
_GUICtrlListView_AddItem($ListViewHandle, Round($MonsterX, 4), 0)
                
_GUICtrlListView_AddSubItem($ListViewHandle, $MonsterAddListView, Round($MonsterY, 4), 1)
                
_GUICtrlListView_AddSubItem($ListViewHandle, $MonsterAddListView, Round($MonsterZ, 4), 2)
                
_GUICtrlListView_AddSubItem($ListViewHandle, $MonsterAddListView, Round($MonsterRot, 4), 3)
            
Next
            _MemoryClose
($Handle)
        EndIf

        
$Time = TimerInit() ;resettet den Timer
    
EndIf
WEnd 
08/26/2010 21:05 Nulpe123#6
Edit: habe meinen Fehler entdeckt, jetzt funktioniert das, was du mir geschrieben hast einwandfrei!

Wenn ich dir nicht schon ein thx gegeben hätte, würde ich dir glatt noch eins geben :D