Keyboard emulation mit SendInput [Metin2] [RESOLVED]

02/01/2012 19:35 käsekuchen11elf#1
Hallo liebe Leute,

ich sitz zur zeit an einem kleinen Projekt in C++, uns zwar versuche ich, für das MMORPG Metin2 einen nicht den Client exploitenden, den Spielregeln folgenden, AI-gesteuerten Bot zu programmieren. Man mag sich fragen wieso einen Bot, wenn man dann den regeln folgen will? Nun, im grunde geht's eher um die Programmiererfahrung im Bereich AI, als um den Bot an sich ;)

Nun, nachdem die ersten Hindernisse aus dem weg waren (HackShield, OCR, ...) scheitert's nun an einer total banalen sache:

Es war mir nich möglich, Input zu generieren, der vom Spielclient als Aufforderung zur Bewegung des Chackters verstanden worden ist

Ich weiß nicht genau, woran es liegt, und dass ich das Problem trotz meiner theoretisch hinreichenden Eloquenz in C++ und der Windows API dokumentation nicht lösen kann, ist reichlich frustrierend.

In der Hoffnung, dass einige von euch bereits erfahrungen in dem bereich haben, hier kurz die gescheiterten Versuche:

SendMessage() / PostMessage() calls
keybd_input() calls
SendInput() calls

damit ist mein repartoire leider erschöpft :)

ich hoffe auf erleuchtende hinweise
- käsekuchen

EDIT: wieder mal typisch, kaum fragt man nach hilfe, schon kriegt man's selber raus :) - Trotzdem Danke an alle, die sich gegebenenfalls gedanken gemacht haben!
02/02/2012 11:03 MoepMeep#2
Wenn du etwas haben willst, dass realistisch aussieht lass das mit den Tastendrücken sein. Nutz Packets bzw. direkt die Funktionen. Dann liest du die Mapfiles ordentlich aus, dazu die Position von Objekten, baust dir dadraus statisch oder dynamisch einen navmesh. Dann kannst du dich zumindest schonmal vernünftig bewegen, gescheite Mathematik kenntnisse vorrausgesetzt.
02/02/2012 16:07 käsekuchen11elf#3
danke für die Anregung, aber ich wollte keinen Bot in dem Sinne schreiben, sondern eher einen Nutzer simulieren :D
und dazu gehören auch Tastendrücke.
02/02/2012 16:10 ηєσχ#4
das bemerkt man aber nicht ob da nun packets oder mausklicke kommen....
02/02/2012 16:14 käsekuchen11elf#5
das mag zwar sein, aber es geht trotzdem an der (selbst gestellten) programmieraufgabe vorbei :)

zeil war es, nur mit den informationen, die auf dem schirm angezeigt werden, einen voll funktionsfähigen bot zu schreiben, unter verwendung der gängigen AI techniken.
02/02/2012 16:25 jacky919#6
Nur sagen die Informationen auf dem Bildschirm weniger als die im Speicher des Programmes. Außerdem ist man bei Pixelerkennung meist an eine Bildschirmauflösung gebunden.
02/02/2012 16:38 käsekuchen11elf#7
na mensch, alles andere wurde doch schon tausend mal gemacht, und ist keine herausforderung mehr ^^
02/02/2012 16:53 .SkyneT.#8
Das höchste was du mit SendInput bei Metin2 erreichen wirst, ist das tasten in den
Chat gespammt werden.

Die Methode von MoepMeep dürfte zwar kompliziert sein, aber wohl der einzige Weg
zu einem wirklich guten Ergebnis.
02/02/2012 16:59 käsekuchen11elf#9
Quote:
Originally Posted by .SkyneT. View Post
Das höchste was du mit SendInput bei Metin2 erreichen wirst, ist das tasten in den
Chat gespammt werden.

Die Methode von MoepMeep dürfte zwar kompliziert sein, aber wohl der einzige Weg
zu einem wirklich guten Ergebnis.
Das ist so nicht ganz richtig. Es ist durchaus möglich, tastenevents via SendInput an metin2 zu senden, sodass diese als gültiger Input akzeptiert werden. man muss dafür nur in das wScan feld des KEYBDINPUT structs den DirectInput code einfügen.

Quote:
Originally Posted by MoepMeep View Post
Wenn du etwas haben willst, dass realistisch aussieht lass das mit den Tastendrücken sein. Nutz Packets bzw. direkt die Funktionen. Dann liest du die Mapfiles ordentlich aus, dazu die Position von Objekten, baust dir dadraus statisch oder dynamisch einen navmesh. Dann kannst du dich zumindest schonmal vernünftig bewegen, gescheite Mathematik kenntnisse vorrausgesetzt.
Wobei ich zugeben muss, dass mich dieser ansatz schon ein bisschen reizt. Kannst du mir n paar details geben, was du mit
Quote:
Originally Posted by MoepMeep View Post
Nutz Packets
oder
Quote:
Originally Posted by MoepMeep View Post
bzw. direkt die Funktionen
meinst? :)
02/02/2012 17:55 Dr. Coxxy#10
reversen.
musst mit nem debugger etc. die funktionen finden, die das spiel nutzt um z.b. zu "springen".
dann kannst du eine dll injecten und die originalen spielfunktionen aufrufen.
um tastendrücke zu emulieren kannst du auch direktinput hooken:

[Only registered and activated users can see links. Click Here To Register...]

z.b. wird i-wo im spiel eine funktion "void keycallback(byte* array[256])" möglicherweise sein.
kann auch so aussehen: "void keycallback(byte scancode)", musst du reversen.

bei 2. möglichkeit wird dann wahrscheinlich nen switch des scancodes folgen:

Code:
switch(scancode)
...
case DIK_SPACE:
    call_jump_function();
    break;
...
wenn du die findest, findest du auch die funktion, die für den jump verantwortlich ist und kannst sie dann aus deiner dll aufrufen.
02/02/2012 18:22 jacky919#11
Quote:
Originally Posted by Dr. Coxxy View Post
void keycallback(byte* array[256])
Was ist denn der Sinn hinter einem Zeiger auf ein Array?
02/02/2012 18:46 Dr. Coxxy#12
das [256] war nur zur verdeutlichung, dass ein zeiger übergeben wird, der auf ein keyboardstate array zeigt, mit 256 keystates, für jeden eine, so wie es directinput tut.

richtig sieht es natürlich so aus:

byte keyboardstates[256];
die dann so aufgerufen wird:
keycallback(keyboardstates);
...
prototyp dementsprechend:
void keycallback(byte* array);

dachte das wäre offensichtlich.
02/02/2012 19:26 jacky919#13
Offensichtlich ist es nicht, wenn du sagst, dass es ihm Spiel diese Funktion "void keycallback(byte* array[256]" gäbe. Aber ist ja jetzt auch egal, hat sich ja geklärt :)