Keyboard emulation mit SendInput [Metin2] [RESOLVED]
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:
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!
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.
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.
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.
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
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
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:
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.
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);
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
SendInput C++/C# 06/22/2010 - C/C++ - 5 Replies hi ihc hab mal ne frage, nämlich wie kann ich in dem spiel Eingaben simulieren?
so wie ich es bisher immer versucht habe:
public void SendKey(int key)
{
SendMessage(hwnd, WM_KEYDOWN, key, 0);
SendMessage(hwnd, WM_KEYUP, key, 1);
}
funktioniert es irgendwie nicht :(, kann mir jmd sagen was ich falsch mache?
GG Emulation 06/17/2010 - Cabal Online - 0 Replies Hi guyz, I tried everything but I can't make it to work. I was trying to emulate GG but it when I try to run my client it doesn't dl the GG files in my apache server. My hosts files is already updated. I'm trying to degrade rev. 1553. Hope you guyz could help me. thnks
GG EMULATION. 05/16/2009 - Soldier Front - 1 Replies IT DOESNT WORK!, SINCE THE ABYSS WEB SERVER CNT READ IP'S, ONLY HOSTNAMES, GG CNT BE EMULATED! ATLEAST THTS MY EXPERIENCE WITH EMULATING FOR 2 WEEKS! :mad::mad::mad:
need help with gg emulation 01/28/2009 - Soldier Front - 0 Replies AFTER CLICKING PLAY LIVE it just keeps on saying "failed to download the game information file." if u no the solution, plzz tell me.
SendInput C# 12/07/2006 - .NET Languages - 4 Replies Ich habe folgende Klasse geschrieben:
using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;