单击游戏中的移动对象

时间:2018-05-29 12:20:32

标签: object bots

我为一些基于网络的游戏制作了一些非常简单的机器人,我想继续使用其他需要使用更高级功能的游戏。

我在基于网络的游戏中使用了pyautogui机器人,因为所有图像都是静态的(不移动),但是当我想在游戏中点击某些内容时,它可能是一个围绕pyautogui运行的角色或生物并不是非常有效,因为它会寻找完全相同的像素/颜色。

即使角色正在移动,请建议任何可以检测模型或角色的参考文献或任何库或函数?

以下是我想点击的示例:

Moving creature Gif image

感谢。

2 个答案:

答案 0 :(得分:0)

我注意到你链接的图像是来自魔兽世界的一群暴徒。

作为一种爱好,过去几年我一直在为MMO设计机器人。

没有特定的python库可以让你做你所知道的我所知道的;然而,以魔兽为例......

如果您使用Windows作为您的操作系统,您将使用Windows API调用来操纵游戏的目标进程(此处为wow.exe)。

有两种主要方法:

1)进程外 - 您可以通过读取已知偏移量的内存值来做所有事情,并使用Windows API来模拟鼠标和/或键盘输入(您的选择)。

1a)我会很快提到虽然对于大多数现代游戏来说它不是一个选项(由于内置的​​反作弊代码),你也可以通过直接写入内存来操纵游戏。在WAR(warhammer online)中它仍然存在的时候,我制作了一个研磨机器人,尽可能写入内存,因为他们没有启用punkbuster来保护游戏。魔兽世界受到臭名昭着的“守望者”的保护。"

2)DLL注入 - WoW有一个在LUA中创建的内置API。因此,多年来,许多业余爱好者和黑客已经拆开二进制文件来揭示其内部运作。如果您想与WoW合作,可以查看Memory Editing Forum on ownedcore.com。许多人已经在二进制文件中共享已知的偏移量,其中人们可以挂钩到LUA功能,因此可以直接执行游戏中的操作,并且还可以利用所需的信息。有些人甚至分享了他们自己的DLL

您特别提到点击游戏中的3d对象。我将与您分享一个在owncore上共享的片段,以便让人们做到这一点。此示例包含使用内存偏移和游戏内函数调用:

using System;
using SlimDX;

namespace VanillaMagic
{
    public static class Camera
    {
        internal static IntPtr BaseAddress
        {
            get
            {
                var ptr = WoW.hook.Memory.Read<IntPtr>(Offsets.Camera.CameraPtr, true);
                return WoW.hook.Memory.Read<IntPtr>(ptr + Offsets.Camera.CameraPtrOffset);
            }
        }

    private static Offsets.CGCamera cam => WoW.hook.Memory.Read<Offsets.CGCamera>(BaseAddress);

    public static float X => cam.Position.X;
    public static float Y => cam.Position.Y;
    public static float Z => cam.Position.Z;
    public static float FOV => cam.FieldOfView;
    public static float NearClip => cam.NearClip;
    public static float FarClip => cam.FarClip;
    public static float Aspect => cam.Aspect;

    private static Matrix Matrix
    {
        get
        {
            var bCamera = WoW.hook.Memory.ReadBytes(BaseAddress + Offsets.Camera.CameraMatrix, 36);
            var m = new Matrix();
            m[0, 0] = BitConverter.ToSingle(bCamera, 0);
            m[0, 1] = BitConverter.ToSingle(bCamera, 4);
            m[0, 2] = BitConverter.ToSingle(bCamera, 8);
            m[1, 0] = BitConverter.ToSingle(bCamera, 12);
            m[1, 1] = BitConverter.ToSingle(bCamera, 16);
            m[1, 2] = BitConverter.ToSingle(bCamera, 20);
            m[2, 0] = BitConverter.ToSingle(bCamera, 24);
            m[2, 1] = BitConverter.ToSingle(bCamera, 28);
            m[2, 2] = BitConverter.ToSingle(bCamera, 32);

            return m;
        }
    }

    public static Vector2 WorldToScreen(float x, float y, float z)
    {
        var Projection = Matrix.PerspectiveFovRH(FOV * 0.5f, Aspect, NearClip, FarClip);

        var eye = new Vector3(X, Y, Z);
        var lookAt = new Vector3(X + Matrix[0, 0], Y + Matrix[0, 1], Z + Matrix[0, 2]);
        var up = new Vector3(0f, 0f, 1f);

        var View = Matrix.LookAtRH(eye, lookAt, up);
        var World = Matrix.Identity;

        var WorldPosition = new Vector3(x, y, z);

        var ScreenPosition = Vector3.Project(WorldPosition, 0f, 0f, WindowHelper.WindowWidth, WindowHelper.WindowHeight, NearClip, FarClip, World*View*Projection);
        return new Vector2(ScreenPosition.X, ScreenPosition.Y-20f);

答案 1 :(得分:0)

如果小怪的颜色容易与背景区分开,则可以使用pyautogui像素匹配。

import com.armus.common.Dsession;

public class Implement
  extends Remote
  implements DMSer, Ajaxser
{
  private Dsession flowserive;

// ADDING CONSTRUCTOR HERE ////
public Implement() {
    this.flowservice = new Dsession(); // Or initialize with any parameters you need
}
///////////////////////////////


  private Dsession getDsession(long sessionId)
    throws ServiceException
  {
    try
    {
      dss = this.flowserive.getprocessname(Long.valueOf(sessionId));
    }
    catch (ServerException e)
    {
      //some code
    }
   //some code

   public void retrfail(long sessionId)
  {
     Dsession dss = getDsession(sessionId);
    // some code
  }
}

如果颜色不同,您可以使用颜色公差:

import pyautogui
screen = pyautogui.screenshot()

# Use this to scan the area of the screen where the mob appears.
(R, G, B) = screen.getpixel((x, y))

# Compare to mob color