|
You last visited: Today at 06:00
Advertisement
Monster per Memory findbar machen?
Discussion on Monster per Memory findbar machen? within the AutoIt forum part of the Coders Den category.
01/07/2014, 16:04
|
#1
|
elite*gold: 0
Join Date: Sep 2009
Posts: 228
Received Thanks: 42
|
Monster per Memory findbar machen?
Heeeey Coder's c:
Ich hab' mal wieder ein Problem. Und zwar bin ich dabei einen Bot für ein Spiel zu schreiben, welcher Monster ausfindig machen kann und sie dann anklickt, um anzugreifen.
Das Problem ist leider, dass ich absolut nicht weiß, wie ich ein Monster per AutoIT ausfindig machen kann. Ich hab mich bereits erkundigt, aber konnte nur rausfinden, dass es per Memory möglich sei, jedoch weiss ich nicht wie.
Hat jemand bereits Erfahrung mit Memory? Villeicht kann mir ja jemand von euch ein Beispielcode schreiben, damit ich ungefähr weiss, wie ich den Bot zu konstruieren hab.
Falls die Monster-ID oder Ähnliches von nöten ist, habe ich diese sogar schon herausfinden können, nur fragt sich ob es damit irgendwie machbar ist..
LG
|
|
|
01/07/2014, 16:40
|
#2
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|
Hmm, wenn sich die Monster bewegen dann haben sie doch andere Koordinaten oder nicht?
CE an, Search for initial value und dann einfach nach changed / unchanged je nach Position suchen. Wenn du die Position vom Mob findest dann wird der Name des Mobs sicherlich auch irgendwo in der Nähe im RAM stehen. Memory View <-
|
|
|
01/07/2014, 16:50
|
#3
|
elite*gold: 0
Join Date: Sep 2009
Posts: 228
Received Thanks: 42
|
Quote:
Originally Posted by alpines
Hmm, wenn sich die Monster bewegen dann haben sie doch andere Koordinaten oder nicht?
CE an, Search for initial value und dann einfach nach changed / unchanged je nach Position suchen. Wenn du die Position vom Mob findest dann wird der Name des Mobs sicherlich auch irgendwo in der Nähe im RAM stehen. Memory View <-
|
Danke erstmal für deine Antwort.
Kann ich nicht einfach den Namen des Mob's in CE suchen und dann irgendwie den Basepointer rausfinden? Nehmen wir mal an ich stelle mich im Spiel an einem Ort, wo 10 Ochsen sind. Wenn ich jetzt im CE nach dem String "Ochse" suche, findet er also 10 verschiedene Adressen mit der Value "Ochse".
Das bedeutet also, dass jeder Ochse, eine andere Adresse hat, obwohl es die selben Monster sind.
In Prinzip muss ich doch nur die Base-Adresse herausfinden, um diese dann irgendwie per AutoIT anklicken zu lassen.
Oder gibt es da einen anderen weg? Das Monster muss auf jeden Fall angeklickt werden, damit man es angreifen kann.
Ich hatte es schon mit Pixelsearch versucht, aber das scheint nicht so professionell zu funktionieren, wie ich es mir vorstellte ._.
|
|
|
01/07/2014, 17:20
|
#4
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|
Haha, versuch es doch mal...
Nicht nur die Monster heißen Ochse sondern andere Sachen z.B. auch.
Nur weil da 10 sind heißt das nicht das du 10 findest bzw weniger.
|
|
|
01/07/2014, 20:01
|
#5
|
elite*gold: 0
Join Date: Aug 2011
Posts: 1,190
Received Thanks: 549
|
Bin mir nicht sicher ob dies mit AutoIt geht, aber ich meine es sollte möglich sein.
Ich würde es ja so machen das man die Funktion für auswählen eines Mobs sucht und die dann wieder aufruft.
Bräuchtest dafür aber wahrscheinlich die Addis der einzelnen Mobs und eben die richtige Funktion.
Solltest dich am besten mit Olly vertraut machen, sofern es überhaupt in AutoIt möglich ist. :b
|
|
|
01/07/2014, 21:32
|
#6
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
Um welches Spiel geht es denn?
|
|
|
01/07/2014, 22:43
|
#7
|
elite*gold: 0
Join Date: Sep 2009
Posts: 228
Received Thanks: 42
|
Quote:
Originally Posted by lolkop
Um welches Spiel geht es denn?
|
Flyff.
Irgendwie muss das ja zu schaffen sein ...
|
|
|
01/07/2014, 22:53
|
#8
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
Quote:
Originally Posted by /-/µR€
Flyff.
Irgendwie muss das ja zu schaffen sein ...
|
die auflistung von objekten in spielen läuft über einen nachbau der clientinternen funktionen. relativ einfach wird das ganze, wenn minimaps oder ähnliche genutzt werden um mobs darzustellen bzw aufzulisten.
hier gilt es die funktion zu finden und die relvanten informationen zu extrahieren.
die letztendliche selektierung kann je nach implementierung im spiel sehr einfach (zb über das setzen eines einzelnen wertes), oder aber auch recht kompliziert über eine client interne funktion mit mindestens einem parameter funktionieren.
|
|
|
01/08/2014, 03:29
|
#9
|
elite*gold: 0
Join Date: Sep 2009
Posts: 228
Received Thanks: 42
|
Eine Minimap ist soweit vorhanden. Aber wie kann ich mir das zum Vorteil nutzen? Die Monster werden auf der Minimap als gelber Punkt angezeigt, aber man kann sie per Klick auf den jeweiligen gelben Punkt nicht anvisieren... ich bin echt am verzweifeln..
|
|
|
01/08/2014, 11:10
|
#10
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
Quote:
Originally Posted by /-/µR€
Eine Minimap ist soweit vorhanden. Aber wie kann ich mir das zum Vorteil nutzen? Die Monster werden auf der Minimap als gelber Punkt angezeigt, aber man kann sie per Klick auf den jeweiligen gelben Punkt nicht anvisieren... ich bin echt am verzweifeln..
|
wie gesagt sobald du weist, wo im client objekte ohnehin durchlaufen werden (wie zb in der minimap funktion), kannst du beginnen diese in autoit nachzubauen...
vor etwa 3 jahren habe ich im stealthex forum mal beschrieben, wie ich das ganze in silkroad gemacht habe:
Quote:
first of all i have to say, that i was looking for a way to list all items. i didn't know that i would find a list of all objects this way.
to start getting all items listed, i took the grab function...
in the zszc client it looks like this:
Code:
007440B0 /$ 83EC 20 SUB ESP,20
007440B3 |. A1 440EAA00 MOV EAX,DWORD PTR DS:[AA0E44]
007440B8 |. D905 70C09C00 FLD DWORD PTR DS:[9CC070]
007440BE |. 8B88 8C000000 MOV ECX,DWORD PTR DS:[EAX+8C]
007440C4 |. D91C24 FSTP DWORD PTR SS:[ESP]
007440C7 |. 8B90 90000000 MOV EDX,DWORD PTR DS:[EAX+90]
007440CD |. 8B80 94000000 MOV EAX,DWORD PTR DS:[EAX+94]
007440D3 |. 8325 2490A800 >AND DWORD PTR DS:[A89024],FFFFFFFE
007440DA |. 894424 10 MOV DWORD PTR SS:[ESP+10],EAX
007440DE |. A1 1890A800 MOV EAX,DWORD PTR DS:[A89018]
007440E3 |. 57 PUSH EDI
007440E4 |. 33FF XOR EDI,EDI
007440E6 |. 85C0 TEST EAX,EAX
007440E8 |. 894C24 0C MOV DWORD PTR SS:[ESP+C],ECX
007440EC |. 895424 10 MOV DWORD PTR SS:[ESP+10],EDX
007440F0 |. A3 2090A800 MOV DWORD PTR DS:[A89020],EAX
007440F5 |. 0F84 E0000000 JE sro_clie.007441DB
007440FB |. 56 PUSH ESI
007440FC |. 8D6424 00 LEA ESP,DWORD PTR SS:[ESP]
00744100 |> 8DB0 34FFFFFF /LEA ESI,DWORD PTR DS:[EAX-CC]
00744106 |. 85F6 |TEST ESI,ESI
00744108 |. 0F84 AA000000 |JE sro_clie.007441B8
0074410E |. 68 7834AA00 |PUSH sro_clie.00AA3478
00744113 |. 8BCE |MOV ECX,ESI
00744115 |. E8 B6921D00 |CALL sro_clie.0091D3D0
0074411A |. 84C0 |TEST AL,AL
0074411C |. 0F84 91000000 |JE sro_clie.007441B3
00744122 |. 83BE F4010000 >|CMP DWORD PTR DS:[ESI+1F4],0
00744129 |. 0F85 84000000 |JNZ sro_clie.007441B3
0074412F |. D986 8C000000 |FLD DWORD PTR DS:[ESI+8C]
00744135 |. D86424 10 |FSUB DWORD PTR SS:[ESP+10]
00744139 |. D95C24 1C |FSTP DWORD PTR SS:[ESP+1C]
0074413D |. D986 90000000 |FLD DWORD PTR DS:[ESI+90]
00744143 |. D86424 14 |FSUB DWORD PTR SS:[ESP+14]
00744147 |. D95C24 20 |FSTP DWORD PTR SS:[ESP+20]
0074414B |. D986 94000000 |FLD DWORD PTR DS:[ESI+94]
00744151 |. D86424 18 |FSUB DWORD PTR SS:[ESP+18]
00744155 |. D95C24 24 |FSTP DWORD PTR SS:[ESP+24]
00744159 |. D94424 20 |FLD DWORD PTR SS:[ESP+20]
0074415D |. D94424 1C |FLD DWORD PTR SS:[ESP+1C]
00744161 |. D94424 24 |FLD DWORD PTR SS:[ESP+24]
00744165 |. D9C1 |FLD ST(1)
00744167 |. DECA |FMULP ST(2),ST
00744169 |. D9C2 |FLD ST(2)
0074416B |. DECB |FMULP ST(3),ST
0074416D |. D9C9 |FXCH ST(1)
0074416F |. DEC2 |FADDP ST(2),ST
00744171 |. DCC8 |FMUL ST,ST
00744173 |. DEC1 |FADDP ST(1),ST
00744175 |. D95C24 0C |FSTP DWORD PTR SS:[ESP+C]
00744179 |. D94424 0C |FLD DWORD PTR SS:[ESP+C]
0074417D |. E8 EE301A00 |CALL sro_clie.008E7270
00744182 |. D95C24 0C |FSTP DWORD PTR SS:[ESP+C]
00744186 |. D94424 0C |FLD DWORD PTR SS:[ESP+C]
0074418A |. D95C24 0C |FSTP DWORD PTR SS:[ESP+C]
0074418E |. D94424 0C |FLD DWORD PTR SS:[ESP+C]
00744192 |. D94424 08 |FLD DWORD PTR SS:[ESP+8]
00744196 |. D8D9 |FCOMP ST(1)
00744198 |. DFE0 |FSTSW AX
0074419A |. F6C4 41 |TEST AH,41
0074419D |. 75 12 |JNZ SHORT sro_clie.007441B1
0074419F |. 8BB6 E8000000 |MOV ESI,DWORD PTR DS:[ESI+E8]
007441A5 |. 85F6 |TEST ESI,ESI
007441A7 |. 74 08 |JE SHORT sro_clie.007441B1
007441A9 |. D95C24 08 |FSTP DWORD PTR SS:[ESP+8]
007441AD |. 8BFE |MOV EDI,ESI
007441AF |. EB 02 |JMP SHORT sro_clie.007441B3
007441B1 |> DDD8 |FSTP ST
007441B3 |> A1 2090A800 |MOV EAX,DWORD PTR DS:[A89020]
007441B8 |> F605 2490A800 >|TEST BYTE PTR DS:[A89024],1
007441BF |. 74 09 |JE SHORT sro_clie.007441CA
007441C1 |. 8325 2490A800 >|AND DWORD PTR DS:[A89024],FFFFFFFE
007441C8 |. EB 08 |JMP SHORT sro_clie.007441D2
007441CA |> 8B40 0C |MOV EAX,DWORD PTR DS:[EAX+C]
007441CD |. A3 2090A800 |MOV DWORD PTR DS:[A89020],EAX
007441D2 |> 85C0 |TEST EAX,EAX
007441D4 |.^0F85 26FFFFFF \JNZ sro_clie.00744100
007441DA |. 5E POP ESI
007441DB |> 8BC7 MOV EAX,EDI
007441DD |. 5F POP EDI
007441DE |. 83C4 20 ADD ESP,20
007441E1 \. C3 RETN
as we know, the grab function should loop through all loots in the ground, and select the one with the lowest distance to us.
so to start this, we will directly step into the loop, olly shows us.
Code:
00744100 |> 8DB0 34FFFFFF /LEA ESI,DWORD PTR DS:[EAX-CC]
00744106 |. 85F6 |TEST ESI,ESI
00744108 |. 0F84 AA000000 |JE sro_clie.007441B8
..........................................................................................
007441CA |> 8B40 0C |MOV EAX,DWORD PTR DS:[EAX+C]
007441CD |. A3 2090A800 |MOV DWORD PTR DS:[A89020],EAX
007441D2 |> 85C0 |TEST EAX,EAX
007441D4 |.^0F85 26FFFFFF \JNZ sro_clie.00744100
i've removed some lines, to keep it short.
as we see, EAX - 0xCC gets loaded into ESI. now we should take a look above the loop, to see, where EAX gets set.
a few lines above the loop, we find this line:
Code:
007440DE |. A1 1890A800 MOV EAX,DWORD PTR DS:[A89018]
now we'll take a look at the end of the grap function, to see what gets returned. the returned register should be the id of the item, with the lowest distance to our char. if we found the output, we'll trace it back to see where it gets read from the memory:
Code:
0074419F |. 8BB6 E8000000 |MOV ESI,DWORD PTR DS:[ESI+E8]
007441AD |. 8BFE |MOV EDI,ESI
007441DB |> 8BC7 MOV EAX,EDI
so the id of the item should be stored in [ESI+0xE8]
when this was done, i've build a simple autoit tool, to list up what i've found out so far:
Code:
$pid = WinGetProcess('[CLASS:CLIENT]')
$mid = OpenProcess($pid)
$EAX = ReadProcessMemory($mid, 0xA89018)
Do
$ESI = $EAX - 0xCC
$id = ReadProcessMemory($mid, $ESI + 0xE8)
ConsoleWrite('ID: '&Hex($id)&@CRLF)
$EAX = ReadProcessMemory($mid, $EAX+0xC)
Until $EAX = 0
CloseHandle($mid)
as i ran the tool, i've noticed, that the tool did list way to many ids. when i took a deeper look at the ids, i've noticed, that mobs players and npcs also got listed.
since the pickup function should only list items, it had to detect items in the loop. so i went back into the loop.
the first thing thats done in the loop, looks like this:
Code:
00744113 |. 8BCE |MOV ECX,ESI
00744115 |. E8 B6921D00 |CALL sro_clie.0091D3D0
0074411A |. 84C0 |TEST AL,AL
0074411C |. 0F84 91000000 |JE sro_clie.007441B3
it looks like a function gets called. in case of a fail, the grab-function skips that object.
if we follow the call, we will find something like this:
Code:
0091D3DD |. 8B11 MOV EDX,DWORD PTR DS:[ECX]
0091D3E0 |. 8B02 MOV EAX,DWORD PTR DS:[EDX]
so now we could assume, that eax stores our current object type.
adding this part to our source, will show us, if it realy works like that:
Code:
$pid = WinGetProcess('[CLASS:CLIENT]')
$mid = OpenProcess($pid)
$EAX = ReadProcessMemory($mid, 0xA89018)
Do
$ESI = $EAX - 0xCC
$type = ReadProcessMemory($mid, ReadProcessMemory($mid, $ESI))
$id = ReadProcessMemory($mid, $ESI + 0xE8)
ConsoleWrite('Type: '&Hex($type)&@CRLF)
ConsoleWrite('ID: '&Hex($id)&@CRLF)
$EAX = ReadProcessMemory($mid, $EAX+0xC)
Until $EAX = 0
CloseHandle($mid)
now we can log all kinds of objects, in our range.
i've spend some more time in analyzing the code around ESI and i've found some more, quite interesting stuff.
in the end my function for zszc looked like this:
Code:
Func recognize_objects($pid)
Local $type_mob = 0x739910, $type_item = 0x7442D0, $type_player = 0x740BE0, $type_me = 0x73F8B0, $type_npc = 0x73A8A0, $type_teleport = 0x747340
Local $mid, $object, $base, $name, $type, $id, $x, $y, $my_x, $my_y, $static_id, $distance, $last_distance = 0xFFFFFF
$mid = OpenProcess($pid)
$object = ReadProcessMemory($mid, 0xA89018)
Do
$base = $object - 0xCC
If ReadProcessMemory($mid, $base + 0x118) > 16 Then
$name = ReadProcessMemory($mid, ReadProcessMemory($mid, $base + 0x104), "char[200]")
Else
$name = ReadProcessMemory($mid, $base + 0x104, "char[200]")
EndIf
$type = ReadProcessMemory($mid, ReadProcessMemory($mid, $base))
$static_id = ReadProcessMemory($mid, $base + 0x184)
$id = ReadProcessMemory($mid, $base + 0xE8)
$x = BitRotate(Execute(ReadProcessMemory($mid, $base + 0x78, "byte[1]")) * 3 - 0x195, 6) - Int(ReadProcessMemory($mid, $base + 0x7C, "float") / (-10))
$y = BitRotate(Execute(ReadProcessMemory($mid, $base + 0x79, "byte[1]")) * 3 - 0x114, 6) - Int(ReadProcessMemory($mid, $base + 0x84, "float") / (-10))
$distance = Sqrt(Abs($my_x - $x) ^ 2 + Abs($my_y - $y) ^ 2)
Switch $type
Case $type_me
$my_x = $x ; if we found ourself as object, we save our position to
$my_y = $y ; calculate the distance between us and the other objects
Case $type_mob
ConsoleWrite('Mob Name: '&$name&'('&$static_id&')'&' found!'&@CRLF)
ConsoleWrite(' ID to Select: '&$id&@CRLF)
ConsoleWrite(' Position: '&$x&','&$y&@CRLF)
ConsoleWrite(' Distance to us: '&Round($distance, 2)&@CRLF)
Case $type_item
ConsoleWrite('Item Name: '&$name&'('&$static_id&')'&' found!'&@CRLF)
ConsoleWrite(' ID to Select: '&$id&@CRLF)
ConsoleWrite(' Position: '&$x&','&$y&@CRLF)
ConsoleWrite(' Distance to us: '&Round($distance, 2)&@CRLF)
Case $type_player
ConsoleWrite('Player Name: '&$name&'('&$static_id&')'&' found!'&@CRLF)
ConsoleWrite(' ID to Select: '&$id&@CRLF)
ConsoleWrite(' Position: '&$x&','&$y&@CRLF)
ConsoleWrite(' Distance to us: '&Round($distance, 2)&@CRLF)
Case $type_npc
ConsoleWrite('NPC Name: '&$name&'('&$static_id&')'&' found!'&@CRLF)
ConsoleWrite(' ID to Select: '&$id&@CRLF)
ConsoleWrite(' Position: '&$x&','&$y&@CRLF)
ConsoleWrite(' Distance to us: '&Round($distance, 2)&@CRLF)
Case $type_teleport
ConsoleWrite('Teleport Name: '&$name&'('&$static_id&')'&' found!'&@CRLF)
ConsoleWrite(' ID to Select: '&$id&@CRLF)
ConsoleWrite(' Position: '&$x&','&$y&@CRLF)
ConsoleWrite(' Distance to us: '&Round($distance, 2)&@CRLF)
EndSwitch
$object = ReadProcessMemory($mid, $object + 0xC)
Until $object <= 0
CloseHandle($mid)
EndFunc
the output looked like this:
|
|
|
|
 |
Similar Threads
|
[Memory Read] Monster HP auslesen
04/02/2012 - AutoIt - 7 Replies
Ich versuche im Moment herauszufinden, wie ich die HP eines Monsters auslesen kann.
Wie man hier an dem Bild sehen kann, steht leider keine HP Zahl im Balken, weswegen ich mit Cheat engine per unknown initial value versucht habe, den Wert auszulesen:
http://www9.picfront.org/picture/K3rbobWJdKL/thb/ HP.jpg
Da dies aber nicht funktioniert hat, bzw. ich nur einen Wert rausbekomme, der sich nach dem Tot des Monsters in eine irrsinnige Zahl ändert, frage ich hier um Rat.
Hat vielleicht einer...
|
How to find monster.csv ce document in memory in the AIKey items ~ Thank you
09/02/2011 - Dekaron - 0 Replies
How to find monster.csv ce document in memory in the AIKey items ~ Thank you
|
[TuT] 1GB Memory Stick zu 2GB Memory Stick machen (in 3 schritte)
11/03/2010 - Tutorials - 11 Replies
1. Ihr Braucht
• sdfix2g => Download
• eine psp mit usb Kabel
• eine 1GB MS (2,4 und 8gb gehen nicht)
2. MS Formatieren
• psp und pc mit usb Kabel verbinden
• Formatiert die MS über PC (geht auch schnellformatieren)
3. 1 werden 2
|
AutoIt Monster HP Memory auslesen
04/07/2010 - Last Chaos - 7 Replies
Ich wollte fragen ob ich diesen Code benutzen kann, das wenn die HP des Monster 0 sind TAB gedrückt wird. Offset hab ich schon.
Func Monster HP()
$ID=_MemoryOpen(0x0000043C) <== Nksp.exe
$Address=0x"Monster HP Offset"
$CurrentMonsterHP=_MemoryRead($Address,$ID)
If $CurrentMonsterHP < 0 Then
ControlSend("{TAB}") <== Ziel wechseln(erstmal nicht wichtig)
EndIf
|
All times are GMT +1. The time now is 06:01.
|
|