Java 使用大漠插件 制作游戏后台脚本

·  阅读 1403
Java 使用大漠插件 制作游戏后台脚本

白菜Java自习室 涵盖核心知识

1. 安装 32 位 JDK 1.8

这里强调一下,jdk 1.8 必须是 32 位 的,亲测 64 位不行(最新版大漠插件也存在问题)。

这里提供 jdk 华为云下载镜像:JDK 1.8 华为云镜像下载(选择 jdk-8u192-windows-i586.exe)

image.png

2. 注册 和 下载 大漠插件

这里提供大漠插件官方网站地址:大漠插件官方网站

image.png

当前时间(看作者文章发布时间)注册充值大漠插件需要注意:

  1. 由于官方限制流量,目前 账号注册时间限制只能每月1-3号,当然一些论坛上能买到20元空账号;
  2. 充值的话最低金额为100元,资费为 每天每台机器(电脑)扣费7分钱,不用耍小聪明 F12 改页面表单充值金额,官网后台已经做了校验;
  3. 这里作者提供的 收费版是百分百稳定可用的,如果你实在不想花钱,请自行百度那种破解版,但是风险请自行承担;
  4. 所有一切搞定以后,去软件菜单里下载工具包,下边是大漠插件大概一些组件,注意360安全卫士报毒请添加白名单(放心真的没毒);

image.png

3. 安装 大漠插件 到系统

大漠插件的原理是作者采用 vc6.0 编写的 COM 接口,支持任何语言调用,安装大漠插件的意思就是把 .dll 动态链接库文件注册到系统。

运行 注册大漠插件到系统.bat 即可,里边代码内容可以贴出来看下:

%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
cd /d "%~dp0"
regsvr32 dm.dll
复制代码

到这里我们的准备工作就做的差不多了,现在开始就可以新建 Java 项目来使用了。

4. 新建 MAVEN 项目,JDK 导入 JACOB 1.9

新建一个 maven 项目,这里需要额外下载一个 jacob 1.9 的 jar 包,这里是 POM 文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.dm</groupId>
    <artifactId>drone</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.jacob</groupId>
            <artifactId>jacob</artifactId>
            <version>1.19</version>
        </dependency>
    </dependencies>

</project>
复制代码

JACOB 是一个 JAVA-COM 连接组件,这里提供下载地址:jacob.jar 的github下载地址

image.png

下载到电脑上,进入 jar 包所在的目录,用 mvn 命令导入到自己电脑的 repository 中:

mvn install:install-file -DgroupId=com.jacob -DartifactId=jacob -Dversion=1.19 -Dpackaging=jar -Dfile=jacob.jar
复制代码

然后需要将 jacob-1.19-x86.dll,复制到 32 位 jdk1.8 安装目录的 jre/bin 下边:

image.png

5. Java 代码实现(参阅 大漠插件接口说明.chm )

下边是我们项目的大概结构,idea 必须用管理员模式运行

image.png

注意:我们目前实现的是后台键鼠功能,就是后台自动捕捉游戏进程,类似按键精灵输入虚拟信号(按键精灵窗口失焦就会不行),此时你可以把游戏最小化去看电影或者玩别的游戏。当然大漠插件提供了无比强大的 API,读者可以自行去研究,作者比较菜就先用这个将就一下。

打开 大漠插件的接口说明.chm,就能查看提供的 API 接口:

image.png

下边我贴上 Java 代码,具体内容很简单的,相信有 Java 基础的同学都看得懂:

DmConfig.java(插件配置)

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;

import java.util.ResourceBundle;

public class DmConfig {

    private final static String version = "";
    private final static String license = ResourceBundle.getBundle("config").getString("license");
    /**
     * 大漠插件执行组件
     */
    private final ActiveXComponent dm = new ActiveXComponent("dm.dmsoft");

    public DmConfig() {
        this.version();
        this.register();
    }

    public void version() {
        System.out.println("大漠插件版本:" + dm.invoke("Ver").getString());
    }

    public void register() {
        int success = Dispatch.call(dm, "Reg", license, version).getInt();
        System.out.println("正在注册插件:" + (success == 1 ? "注册成功" : "注册失败"));
    }

    public ActiveXComponent getDm() {
        return dm;
    }

}
复制代码

TaskConfig(任务配置)

import java.util.ResourceBundle;

public class TaskConfig {

    private final String process;
    private final String[] vk_codes;
    private final long delay;

    public TaskConfig() {
        ResourceBundle bundle = ResourceBundle.getBundle("config");
        this.process = bundle.getString("process");
        this.vk_codes = bundle.getString("vk_codes").split(",");
        this.delay = Long.parseLong(bundle.getString("interval"));
    }

    public String getProcess() {
        return process;
    }

    public String[] getVk_codes() {
        return vk_codes;
    }

    public long getDelay() {
        return delay;
    }

}
复制代码

TimerService.java(定时线程池)

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

public class TimerService {

    private ScheduledFuture<?> future = null;
    private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    public boolean start(Runnable command, long delay) {
        try {
            if (future != null) {
                future.cancel(false);
            }
            future = scheduler.scheduleWithFixedDelay(command, 0, delay, TimeUnit.MILLISECONDS);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public boolean stop() {
        try {
            if (future != null) {
                future.cancel(true);
            }
            return true;
        } catch (Exception e) {
            return false;
        }
    }

}
复制代码

KeyboardTask.java(虚拟键盘任务)

import com.dm.conf.DmConfig;
import com.dm.conf.TaskConfig;
import com.jacob.com.Dispatch;

public class KeyboardTask extends Thread {

    /**
     * 虚拟键码(键盘)
     */
    private final String[] vk_code;
    /**
     * 大漠插件配置
     */
    private final DmConfig config;


    public KeyboardTask(DmConfig dmConfig, TaskConfig taskConfig) {
        this.config = dmConfig;
        this.vk_code = taskConfig.getVk_codes();
        this.bindWindow(taskConfig.getProcess());
    }

    @Override
    public void run() {
        for (String item : vk_code) {
            Dispatch.call(config.getDm(), "KeyDown", Integer.parseInt(item));
            Dispatch.call(config.getDm(), "KeyUp", Integer.parseInt(item));
        }
    }

    public void bindWindow(String process_name) {
        int hwnd = Dispatch.call(config.getDm(), "FindWindowByProcess", process_name, "", "").getInt();
        Dispatch.call(config.getDm(), "BindWindow", hwnd, "normal", "windows", "windows", 0);
        System.out.println("正在绑定窗口:" + process_name);
        System.out.println("请输入有效指令:\n启动脚本:1\n结束脚本:0");
    }

}
复制代码

DroneApplication.java(启动入口)

import com.dm.conf.DmConfig;
import com.dm.conf.TaskConfig;
import com.dm.serv.TimerService;
import com.dm.task.KeyboardTask;

import java.util.Scanner;

public class DroneApplication {

    public static void main(String[] args) {
        DmConfig dmConfig = new DmConfig();
        TaskConfig taskConfig = new TaskConfig();
        KeyboardTask task = new KeyboardTask(dmConfig, taskConfig);
        TimerService timerService = new TimerService();
        Scanner scanner = new Scanner(System.in);
        while (true) {
            try {
                if (scanner.hasNextLine()) {
                    String str = scanner.nextLine();
                    if (str.equals("1")) {
                        boolean done = timerService.start(task, taskConfig.getDelay());
                        if (done) System.out.println("脚本开始启动...");
                        continue;
                    }
                    if (str.equals("0")) {
                        boolean done = timerService.stop();
                        if (done) System.out.println("脚本结束退出...");
                        continue;
                    }
                    System.out.println("请输入有效指令:\n启动脚本:1\n结束脚本:0");
                }
            } catch (Exception e) {
                e.printStackTrace();
                break;
            }
        }
    }

}
复制代码

config.properties(配置文件)

# 大漠注册码
license=(自己去付费,我的不告诉你)
# 进程名称
process=cmd.exe
# 键盘虚拟码
vk_codes=68,69
# 按键间隔时间
interval=2000
复制代码

注意:windows 模式的键盘虚拟码自己百度,这里举例映射:68='d', 69='e'

6. 运行效果展示(idea 管理员模式运行)

Maven 项目请读者自定打包然后配置使用,打包结果很小大约 7KB,这里直接 idea 里跑下效果:

启动项目

image.png

输入脚本启动指令

image.png

后台窗口自动信号

image.png

输入脚本结束指令

image.png

总结:其实 Java 语言并不适合做脚本,安装跨平台运行环境等太重,对于电脑萌新不友好,如果读者有别的脚本语言基础,可以尝试把这个代码翻译过去使用。

分类:
后端
分类:
后端