一个用于在线游戏的Java机器人

7
我正在使用java.awt.Robot在Java中创建一个机器人。这个机器人在浏览器上运作正常(我也在Microsoft Word中进行了测试!),但是当我在游戏中运行它时,唯一起作用的功能是mouseMove。我希望构建一个可以替我按键的机器人。
我实例化机器人类。
Robot r = new Robot();

然后我做一些简单的事情: 按下z键、按下1键、移动鼠标并右击。

r.keyPress(KeyEvent.VK_Z);
r.keyRelease(KeyEvent.VK_Z);

r.keyPress(KeyEvent.VK_1);
System.out.println("Press 1 button");
r.keyRelease(KeyEvent.VK_1);
System.out.println("Release 1 button");
r.delay(1000);

System.out.println("Move mouse");
r.mouseMove(110, 690);

System.out.println("Press");
r.mousePress(InputEvent.BUTTON3_MASK);
System.out.println("Release");
r.mouseRelease(InputEvent.BUTTON3_MASK);

为什么会这样?如果Robot类在后台运行,能否执行这些动作?谢谢。
更新:比如在PES 2012上运行我的机器人可以正常工作,但是在像Cabal这样的在线游戏中运行时,它就不起作用了。游戏的保护系统没有检测到任何问题,所以原因不在于此。

3
游戏通常会对机器人采取“防御措施”-这只是一种可能性。 - Nate-Wilkins
4
尝试在“键按下”和“键松开”事件之间添加几毫秒的延迟。如果这是一个普通的街机风格游戏,我猜测游戏只是在每次轮询时检查该键是否处于按下状态,而不是捕捉瞬时事件,如“键按下”和“键松开”。 - Quuxplusone
尝试过了,但不起作用。 - George Artemiou
2
可能是Java:在运行全屏应用程序时使用机器人的重复问题。 - Tim Bender
问题在于游戏防御系统无法检测到这个机器人。如果能够检测到,我就会被踢出游戏。我想知道,游戏是用哪种语言编写的是否有关系?或者有没有特定的语言可以帮助我解决这个问题?谢谢。 - George Artemiou
显示剩余3条评论
3个回答

5
首先,大多数游戏都有机器人保护措施,所以请确保给机器人添加延迟和“冷却”时间。在r.delay(1000)语句之前,机器人执行了两个瞬间操作。
我几乎可以确定它不起作用是因为按键太快了:它们立即按下并释放。尝试在实例化Robot类之后,在所有按键函数之前添加bot.delay(500)(或更多,取决于游戏)。这将在机器人执行的所有操作之间添加500毫秒的延迟。
public static void doStuff() {

    Robot r = new Robot();

        r.delay(500); //Or more - depends on the game

        r.keyPress(KeyEvent.VK_Z);
        r.keyRelease(KeyEvent.VK_Z);

        r.keyPress(KeyEvent.VK_1);
        System.out.println("Press 1 button");
        r.keyRelease(KeyEvent.VK_1);
        System.out.println("Release 1 button");
        r.delay(1000);

        System.out.println("Move mouse");
        r.mouseMove(110, 690);

        System.out.println("Press");
        r.mousePress(InputEvent.BUTTON3_MASK);
        System.out.println("Release");
        r.mouseRelease(InputEvent.BUTTON3_MASK);
}

我认为Z和1键无法使用的唯一原因是所有操作都太快了。游戏可能有反机器人系统。


2
这要看游戏类型。如果代码只是模拟系统输入,比如键盘操作,那么它的行为就应该像一个正常人一样。
然而,从你的例子看来,它以惊人的速度运行,因此很可能根本没有检测到输入,或者所谓的游戏反作弊措施正在阻止输入。在其中加入延迟试试看是否有帮助。我会回来提供更多帮助。虽然我不是专业人士,但这是我最好的猜测。
编辑:
我的意思是在“键松开”事件之前加一个延迟,这样它就有时间处理按键。

nop。没有起作用。我在按键松开事件触发之间添加了一些延迟。 - George Artemiou

0

你的代码可能在游戏中按下和释放键的速度过快。 通常有些游戏需要你按下并释放键时至少要有40ms-80ms的延迟。尝试这样做应该会有所帮助 -

public static void doSomething() throws Exception{
    Robot rbt = new Robot();
    int typingTimes = 20;
    while(timer-- > 0){
        rbt.keyPress(KeyEvent.VK_1);
        //You can use Thread.sleep() after each keyPress to increase the delay
        Thread.sleep(500);
        rbt.keyRelease(KeyEvent.VK_1);
        
        rbt.keyPress(KeyEvent.VK_Z);
        //You can use Robot's delay() method after each keyPress too
        rbt.delay(500);
        rbt.keyRelease(KeyEvent.VK_Z);
    }
}

希望这能帮到你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接