nur zu empfehlen wenn man lesen kann...
Ich möchte das mein kleiner Konsolenbot das Looten *lernt*. Dabei habe ich leider ein Problem damit die Mausklicks zu simulieren. Egal was ich mache, Runes of Magic ignoriert die Mausklicks einfach.
SendInput() oder mouse_event() will ich nicht verwenden, weil ich möchte das mein Bot auch funktioniert wenn ein anderes Fenster ontop ist oder den Fokus hat. Es bleibt also nur SendMessage() und PostMessage().
SendMessage() verwende ich bereits (wie man im Code auch sieht) um den Charakter zu bewegen. Nachdem das Bewegen des Charakters mit der Taste 'W' wunderbar funktioniert hat wollte ich SendMessage() dazu verwenden Mausklicks fürs Looten zu simulieren.
Ich habe mir mit Spy++ angeschaut welche Nachrichten bei einem *echten* Mausklick versendet werden:
Soweit ich weiß bedeutet das P oder S vor der Message:
S -> Nachricht wurde mit SendMessage() verschickt
P -> Nachricht wurde mit PostMessage() verschickt
R -> systeminterne Message
Als dritten Paramter habe ich MK_LMUTTON und 0 getestet -> keine Reaktion.
Dann habe ich es mit einem Sleep zwischen dem *Drücken* und *Loslassen* der Maustaste probiert ... obwohl das eigentlich mit SendMessage komplett Sinnlos sein dürfte weil die Fkt. synchron zu MsgProzedur abläuft ...-> keine Reaktion auf den simulierten Klick.
Ich habe mit Spy++ auch überprüft ob die Messages bei RoM ankommen, sie tun es ... das Spiel sollte also darauf reagiern ...
*ratlos*
Kann es sein das es nicht funktionert weil DirectX verwendet wird? ... das umgeht meines wissens die WinAPI um die Latenz klein zu halten. Nur ich habe keine Ahnung wie man für Direct Input (oder wie das API von Direct X auch immer heißt...) simuliert...
PS: Das handle ist 100% richtig, weil simulierte Tasteneingaben problemlos funktionieren.
kleines Codesnippet zum Looten von Monstern:
Code:
else if (target.health<=0) // Wenn Ziel Health <= 0 looten! { SetAngle(player.x, player.z, target.x, target.z); // Spieler zum Ziel ausrichten while (GetDistance(player.x, player.z, target.x, target.z) > 4.0f)// Solange die Entfernung zwischen Spieler... { // ...und Ziel > 4 ist bewege Spieler in Richtung Ziel memory.Read(playerbase, player); // update playerdata if (player.targetptr==0) // do we still have a target? break; memory.Read(player.targetptr, target); // update targetdata SetAngle(player.x, player.z, target.x, target.z);// Spieler zum Ziel ausrichten SendMessage(memory.hwnd, WM_KEYDOWN, 'W', 0); // start moving } // Der Spieler steht nun direkt im Ziel SendMessage(memory.hwnd, WM_KEYUP, 'W', 0); // stop moving /* SetCursorPos(960,750); SendMessage(memory.hwnd, WM_LBUTTONDOWN, MK_LBUTTON, (LPARAM)MAKELPARAM(960, 750)); Sleep(400); SendMessage(memory.hwnd, WM_LBUTTONUP, (WPARAM)0, (LPARAM)MAKELPARAM(960, 750)); */ cout << "loot ..." << endl; }