用于在线游戏的Java机器人

时间:2012-08-31 23:17:58

标签: java bots awtrobot online-game

我正在使用java.awt.Robot在java中创建一个bot。机器人在浏览器上工作正常(我也使用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 个答案:

答案 0 :(得分:3)

首先,大多数游戏都有机器人保护,因此请确保为机器人添加延迟,并且可能是“冷却时间”。在那个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键不起作用的唯一原因是速度一切都已完成。游戏可能有一个反僵尸系统。

答案 1 :(得分:1)

这在很大程度上取决于它是什么类型的游戏。 如果代码只是模拟系统输入,如键盘操作。它应该看起来像一个普通人。

然而从它的外观来看。从你的例子。它以闪电般的速度运行,因此它根本无法检测输入,和/或所谓的游戏中的反机器人措施,你正试图机器人。阻止输入。把延迟放到混合中。看看是否有帮助。我会回来寻求更多帮助。我对此并不专业。但这是我最好的猜测。

编辑:

当我的意思是延迟在关键事件发生前放一个延迟..那样它就有时间处理关键。

答案 2 :(得分: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);
    }
}

希望这会有所帮助!