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"370368)
GUISetBkColor(0xFFFFFF)
$LV_Items GUICtrlCreateListView("X|Y|Z|Rotation"1010350350)
GUICtrlSendMsg(-1$LVM_SETCOLUMNWIDTH075)
GUICtrlSendMsg(-1$LVM_SETCOLUMNWIDTH175)
GUICtrlSendMsg(-1$LVM_SETCOLUMNWIDTH275)
GUICtrlSendMsg(-1$LVM_SETCOLUMNWIDTH375)
$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 ;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($ListViewHandleRound($ItemX4), 0)
            
_GUICtrlListView_AddSubItem($ListViewHandle$ItemsAddListViewRound($ItemY4), 1)
            
_GUICtrlListView_AddSubItem($ListViewHandle$ItemsAddListViewRound($ItemZ4), 2)
            
_GUICtrlListView_AddSubItem($ListViewHandle$ItemsAddListViewRound($ItemRot4), 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"370368)
GUISetBkColor(0xFFFFFF)
$LV_Items GUICtrlCreateListView("X|Y|Z|Rotation"1010350350)
GUICtrlSendMsg(-1$LVM_SETCOLUMNWIDTH075)
GUICtrlSendMsg(-1$LVM_SETCOLUMNWIDTH175)
GUICtrlSendMsg(-1$LVM_SETCOLUMNWIDTH275)
GUICtrlSendMsg(-1$LVM_SETCOLUMNWIDTH375)
$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 ;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($ListViewHandleRound($ItemX4), 0)
            
_GUICtrlListView_AddSubItem($ListViewHandle$ItemsAddListViewRound($ItemY4), 1)
            
_GUICtrlListView_AddSubItem($ListViewHandle$ItemsAddListViewRound($ItemZ4), 2)
            
_GUICtrlListView_AddSubItem($ListViewHandle$ItemsAddListViewRound($ItemRot4), 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"370368)
GUISetBkColor(0xFFFFFF)
$LV_Monster GUICtrlCreateListView("X|Y|Z|Rotation"1010350350)
GUICtrlSendMsg(-1$LVM_SETCOLUMNWIDTH075)
GUICtrlSendMsg(-1$LVM_SETCOLUMNWIDTH175)
GUICtrlSendMsg(-1$LVM_SETCOLUMNWIDTH275)
GUICtrlSendMsg(-1$LVM_SETCOLUMNWIDTH375)
$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 ;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($ListViewHandleRound($MonsterX4), 0)
                
_GUICtrlListView_AddSubItem($ListViewHandle$MonsterAddListViewRound($MonsterY4), 1)
                
_GUICtrlListView_AddSubItem($ListViewHandle$MonsterAddListViewRound($MonsterZ4), 2)
                
_GUICtrlListView_AddSubItem($ListViewHandle$MonsterAddListViewRound($MonsterRot4), 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