diff --git a/.idea/encodings.xml b/.idea/encodings.xml index 0e1c064..d2b8c0c 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -2,6 +2,8 @@ + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 57c94df..f63dcb6 100644 --- a/pom.xml +++ b/pom.xml @@ -49,6 +49,15 @@ jintellitype 1.4.0 + + + + org.jb2011.lnf + beautyeye + 1.0.0 + system + ${project.basedir}/src/main/resources/lib/beautyeye_lnf.jar + diff --git a/src/main/java/com/example/jmacro/wjdr/JMacro.java b/src/main/java/com/example/jmacro/wjdr/JMacro.java index 2c01dee..3f1df5b 100644 --- a/src/main/java/com/example/jmacro/wjdr/JMacro.java +++ b/src/main/java/com/example/jmacro/wjdr/JMacro.java @@ -114,7 +114,7 @@ public class JMacro { public void mouseLeftClick(ScreenPoint rect) { mouseMove(rect); robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); - waitTap(); + delayTap(); robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); } @@ -146,11 +146,11 @@ public class JMacro { */ public void mouseLeftDrag(ScreenPoint start, ScreenPoint end, boolean smooth) { mouseMove(start, smooth); - waitTap(); + delayTap(); robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); - waitTap(); + delayTap(); mouseMove(end, smooth); - waitTap(); + delayTap(); robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); } @@ -173,11 +173,11 @@ public class JMacro { */ public void mouseRightDrag(ScreenPoint start, ScreenPoint end, boolean smooth) { mouseMove(start, smooth); - waitTap(); + delayTap(); robot.mousePress(InputEvent.BUTTON3_DOWN_MASK); - waitTap(); + delayTap(); mouseMove(end, smooth); - waitTap(); + delayTap(); robot.mouseRelease(InputEvent.BUTTON3_DOWN_MASK); } @@ -187,11 +187,11 @@ public class JMacro { * @param rect 矩形区域 */ public void mouseWheelClick(ScreenRect rect) { - waitTap(); + delayTap(); robot.mouseMove(rect.getCenter()[0], rect.getCenter()[1]); - waitTap(); + delayTap(); robot.mousePress(InputEvent.BUTTON2_DOWN_MASK); - waitTap(); + delayTap(); robot.mouseRelease(InputEvent.BUTTON2_DOWN_MASK); } @@ -201,11 +201,11 @@ public class JMacro { * @param rect 矩形区域 */ public void mouseRightClick(ScreenRect rect) { - waitTap(); + delayTap(); robot.mouseMove(rect.getCenter()[0], rect.getCenter()[1]); - waitTap(); + delayTap(); robot.mousePress(InputEvent.BUTTON3_DOWN_MASK); - waitTap(); + delayTap(); robot.mouseRelease(InputEvent.BUTTON3_DOWN_MASK); } @@ -215,9 +215,9 @@ public class JMacro { * @param rect 矩形区域 */ public void mouseLeftDoubleClick(ScreenRect rect) { - waitTap(); + delayTap(); robot.mouseMove(rect.getCenter()[0], rect.getCenter()[1]); - waitTap(); + delayTap(); robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); robot.delay(100); robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); @@ -242,6 +242,20 @@ public class JMacro { return new ScreenRect(0, 0, tk.getScreenSize().width, tk.getScreenSize().height); } + /** + * 全屏查找图片 + * + * @param legendName 图例名称 + * @param minSimilar 最低相似度 + * @return 匹配图片区域 + */ + public ScreenRect findPic(String legendName, double minSimilar) { + if (!legendName.endsWith(".png")) { + legendName = legendName + ".png"; + } + return findPic(new File(legend, legendName), minSimilar); + } + /** * 全屏查找图片 * @@ -264,6 +278,31 @@ public class JMacro { return findPic(getScreenRect(), pic, minSimilar); } + /** + * 应用视口查找图例 + * + * @param screenRect 应用视口 + * @param legendName 图例名称 + * @param minSimilar 最低相似度 + * @return 匹配图片区域 + */ + public ScreenRect findPic(ScreenRect screenRect, String legendName, double minSimilar) { + return findPic(screenRect, new File(legend, legendName), minSimilar); + } + + + /** + * 应用视口查找图例 + * + * @param screenRect 应用视口 + * @param legend 图例文件 + * @param minSimilar 最低相似度 + * @return 匹配图片区域 + */ + public ScreenRect findPic(ScreenRect screenRect, File legend, double minSimilar) { + return findPic(screenRect, Imager.load(legend), minSimilar); + } + /** * 获取定位 * @@ -316,18 +355,23 @@ public class JMacro { return null; } - public void waitTap() { - int i = RandomUtil.randomInt(100, 200); + public void delay() { + delayNormal(); + } + + + public void delayTap() { + int i = RandomUtil.randomInt(100, 500); robot.delay(i); } - public void waitNormal() { + public void delayNormal() { int i = RandomUtil.randomInt(500, 1500); robot.delay(i); } - public void waitLong() { - int i = RandomUtil.randomInt(2000, 5000); + public void delayLong() { + int i = RandomUtil.randomInt(1500, 3000); robot.delay(i); } @@ -354,6 +398,21 @@ public class JMacro { return waitAndFindPic(rect, file, minSimilar, 10, TimeUnit.SECONDS); } + /** + * 等待并查找图片 + * + * @param rect 查找区域 + * @param legendName 图例名称 + * @param minSimilar 最低相似度 + * @return 匹配图片区域 + */ + public ScreenRect waitAndFindPic(ScreenRect rect, String legendName, double minSimilar) { + if (!legendName.endsWith(".png")) { + legendName = legendName + ".png"; + } + return waitAndFindPic(rect, new File(legend, legendName), minSimilar, 10, TimeUnit.SECONDS); + } + /** * 等待并查找图片 * @@ -390,7 +449,7 @@ public class JMacro { } while (true) { - waitTap(); + delayTap(); ScreenRect pic = findPic(rect, image, minSimilar); if (pic != null) { return pic; @@ -463,5 +522,4 @@ public class JMacro { } return matchPic(rect, new File(legend, legendName), minSimilar) != null; } - } diff --git a/src/main/java/com/example/jmacro/wjdr/MainTask.java b/src/main/java/com/example/jmacro/wjdr/MainTask.java index c722d77..31f91cf 100644 --- a/src/main/java/com/example/jmacro/wjdr/MainTask.java +++ b/src/main/java/com/example/jmacro/wjdr/MainTask.java @@ -1,17 +1,19 @@ package com.example.jmacro.wjdr; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.img.ImgUtil; import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.RandomUtil; import com.example.jmacro.wjdr.base.ScreenRect; +import com.example.jmacro.wjdr.task.TaskMineAttack; import com.example.jmacro.wjdr.task.TaskMining; -import com.example.jmacro.wjdr.util.Imager; import com.example.jmacro.wjdr.util.Logger; import com.example.jmacro.wjdr.util.TaskUtil; +import javax.swing.*; import java.awt.*; -import java.awt.image.BufferedImage; import java.io.File; +import java.net.URL; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; @@ -22,7 +24,7 @@ import java.util.concurrent.TimeUnit; * @version 0.0.1 * @since 1.8 */ -public class MainTask { +public class MainTask extends JFrame { /** * 脚本线程 @@ -41,36 +43,80 @@ public class MainTask { private boolean noDelay = true; + private JMacro jMacro; + public void start() throws AWTException { + // 加载主题 + try { + org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF(); + } catch (Exception e) { + e.printStackTrace(); + } + // 设置标题 + setTitle("无限工具"); + // 设置图标 + URL icon = this.getClass().getClassLoader().getResource("icon.png"); + setIconImage(ImgUtil.read(icon)); + // 脚本初始化 + Logger.info("初始化脚本"); + jMacro = new JMacro(new File("legend")); + // 设置窗口的宽度和高度 + setSize(400, 300); // 设置窗口的宽度为400像素,高度为300像素 + // 添加一个标签作为示例内容 + getContentPane().add(new JLabel("Hello, Swing!")); + // 设置窗口关闭时的操作 + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + // 启动后台线程 + startBack(); + center(); + // 显示窗口 + setVisible(true); + } + + /** + * 居中 + */ + private void center() { + // 获取屏幕尺寸 + java.awt.Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + // 获取窗口尺寸 + java.awt.Dimension frameSize = getSize(); + // 计算窗口居中位置 + setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2); + } + + /** + * 后台线程 + */ + public void startBack() { Logger.setDebug(true); - Logger.info("初始化脚本"); - JMacro jMacro = new JMacro(new File("legend")); + new Thread(() -> { + while (true) { + ThreadUtil.sleep(1000); - while (true) { - ThreadUtil.sleep(1000); + // 立即执行 + if (noDelay) { + if (schedule != null) { + schedule.cancel(true); + } - // 立即执行 - if (noDelay) { + noDelay = false; + Logger.info("启动线程"); + schedule = TaskUtil.schedule(new MacroThread(jMacro), 0, TimeUnit.SECONDS); + continue; + } if (schedule != null) { - schedule.cancel(true); + continue; } - noDelay = false; - Logger.info("启动线程"); - schedule = TaskUtil.schedule(new MacroThread(jMacro), 0, TimeUnit.SECONDS); - continue; - } - if (schedule != null) { - continue; - } - - if (DateUtil.isIn(DateUtil.date(), DateUtil.parse(workStart), DateUtil.parse(workEnd))) { - int delay = RandomUtil.randomInt(5, 20); - Logger.info("等待{}分钟后,重新启动线程", delay); - schedule = TaskUtil.schedule(new MacroThread(jMacro), delay, TimeUnit.MINUTES); + if (DateUtil.isIn(DateUtil.date(), DateUtil.parse(workStart), DateUtil.parse(workEnd))) { + int delay = RandomUtil.randomInt(5, 20); + Logger.info("等待{}分钟后,重新启动线程", delay); + schedule = TaskUtil.schedule(new MacroThread(jMacro), delay, TimeUnit.MINUTES); + } } - } + }).start(); } /** @@ -87,12 +133,12 @@ public class MainTask { super(jMacro); // 定位mumu bar Logger.info("定位慕慕窗口"); - ScreenRect mumu = locationMuMu(jMacro); + ScreenRect mumu = jMacro.findPic("慕慕_工具栏", 0.95d); if (mumu == null) { throw new IllegalStateException("未检测到MuMu,请开启MuMu模拟器"); } Logger.info("定位慕慕窗口成功"); - // 获取窗口返回 + // 计算应用窗口返回 gameScreen = new ScreenRect(); gameScreen.setLeft(mumu.getLeft() - 428); gameScreen.setTop(mumu.getBottom() + 7); @@ -106,10 +152,11 @@ public class MainTask { public void run() { // 获取启动图标 Logger.info("定位启动图标"); - ScreenRect launch = jMacro.waitAndFindPic(gameScreen, new File("legend", "启动图标.png"), 0.8, 5, TimeUnit.SECONDS); + ScreenRect launch = jMacro.waitAndFindPic(gameScreen, "启动图标", 0.8); if (launch != null) { Logger.info("启动图标坐标:", launch.toString()); Logger.info("启动程序"); + jMacro.delay(); jMacro.mouseLeftClick(launch); } else { Logger.info("启动图标失败,继续定位主界面"); @@ -117,11 +164,31 @@ public class MainTask { Logger.info("定位主界面"); ScreenRect 城镇 = TaskUtil.timeTask(() -> { while (true) { - ScreenRect screenRect1 = locationHome(jMacro, gameScreen); - if (screenRect1 != null) { - return screenRect1; + jMacro.delay(); + { // 定位弹框,关闭弹框 + ScreenRect rect = jMacro.findPic(gameScreen, "首页_广告关闭按钮", 0.95d); + if (rect != null) { + jMacro.mouseLeftClick(rect); + Logger.info("检测到广告弹框,关闭弹框"); + } + } + + jMacro.delay(); + { // 定位离线收益弹框,关闭弹框 + ScreenRect rect = jMacro.matchPic(gameScreen, new File("legend", "L204,734-城镇_离线收益.png"), 0.9); + if (rect != null) { + jMacro.mouseLeftClick(rect); + Logger.info("检测到离线收益弹框,关闭弹框"); + } + } + + jMacro.delay(); + // 定位主程序 + ScreenRect rect = jMacro.matchPic(gameScreen, new File("legend", "L444,888-野外.png"), 0.9); + if (rect != null) { + Logger.info("程序主界面已就绪"); + return rect; } - ThreadUtil.sleep(1000); } }, 30 * 1000, TimeUnit.MILLISECONDS); @@ -129,6 +196,7 @@ public class MainTask { schedule.cancel(true); schedule = null; Logger.info("未扫描到主界面:退出线程"); + return; } @@ -137,62 +205,20 @@ public class MainTask { Logger.info("进入任务线程"); TaskUtil.timeTask((Runnable) () -> { while (true) { - jMacro.waitNormal(); - Logger.info("检测矿场攻击状态开始"); - taskMineAttack(jMacro, gameScreen); - Logger.info("检测矿场攻击状态结束"); + // 矿场攻击检测任务 + jMacro.delayNormal(); + new TaskMineAttack(jMacro, gameScreen).run(); - // 自动采矿 - Logger.info("自动采矿开始"); - new TaskMining(jMacro, gameScreen).start(); - Logger.info("自动采矿结束"); + // 自动采矿任务 + jMacro.delayNormal(); + new TaskMining(jMacro, gameScreen).run(); } }, 10, TimeUnit.MINUTES); } } - public static ScreenRect locationHome(JMacro jMacro, ScreenRect gameScreen) { - { // 定位弹框,关闭弹框 - BufferedImage image = Imager.load(new File("legend", "首页_广告关闭按钮.png")); - ScreenRect rect = jMacro.findPic(gameScreen, image, 0.95d); - if (rect != null) { - jMacro.mouseLeftClick(rect); - Logger.info("检测到广告弹框,关闭弹框"); - } - } - - { // 定位离线收益弹框,关闭弹框 - ScreenRect rect = jMacro.matchPic(gameScreen, new File("legend", "L204,734-城镇_离线收益.png"), 0.9); - if (rect != null) { - jMacro.mouseLeftClick(rect); - Logger.info("检测到离线收益弹框,关闭弹框"); - } - } - - { // 定位主程序 - ScreenRect rect = jMacro.matchPic(gameScreen, new File("legend", "L444,888-野外.png"), 0.9); - if (rect != null) { - Logger.info("程序主界面已就绪"); - return rect; - } - } - return null; - } - - public static ScreenRect locationMuMu(JMacro jMacro) { - BufferedImage image = Imager.load(new File("legend", "慕慕_工具栏.png")); - return jMacro.findPic(image, 0.95d); - } - - /** - * 检测矿场被攻击 - */ - public static void taskMineAttack(JMacro jMacro, ScreenRect screenRect) { - - } - /** * 启动入口 */ diff --git a/src/main/java/com/example/jmacro/wjdr/task/BaseTask.java b/src/main/java/com/example/jmacro/wjdr/task/BaseTask.java new file mode 100644 index 0000000..1b6de0a --- /dev/null +++ b/src/main/java/com/example/jmacro/wjdr/task/BaseTask.java @@ -0,0 +1,22 @@ +package com.example.jmacro.wjdr.task; + +import com.example.jmacro.wjdr.JMacro; +import com.example.jmacro.wjdr.base.ScreenRect; + +public abstract class BaseTask implements Runnable { + + /** + * 脚本持有对象 + */ + protected JMacro jMacro; + + /** + * 应用窗口 + */ + protected ScreenRect screenRect; + + public BaseTask(JMacro jMacro, ScreenRect screenRect) { + this.jMacro = jMacro; + this.screenRect = screenRect; + } +} diff --git a/src/main/java/com/example/jmacro/wjdr/task/TaskMineAttack.java b/src/main/java/com/example/jmacro/wjdr/task/TaskMineAttack.java new file mode 100644 index 0000000..da9b6c5 --- /dev/null +++ b/src/main/java/com/example/jmacro/wjdr/task/TaskMineAttack.java @@ -0,0 +1,19 @@ +package com.example.jmacro.wjdr.task; + +import com.example.jmacro.wjdr.JMacro; +import com.example.jmacro.wjdr.base.ScreenRect; +import com.example.jmacro.wjdr.util.Logger; + +public class TaskMineAttack extends BaseTask { + + public TaskMineAttack(JMacro jMacro, ScreenRect screenRect) { + super(jMacro, screenRect); + } + + @Override + public void run() { + Logger.info("》》》检测被攻击状态开始》》》"); + Logger.info("未实现,跳过"); + Logger.info("》》》检测被攻击状态结束》》》"); + } +} diff --git a/src/main/java/com/example/jmacro/wjdr/task/TaskMining.java b/src/main/java/com/example/jmacro/wjdr/task/TaskMining.java index 8309dfc..c9ae16a 100644 --- a/src/main/java/com/example/jmacro/wjdr/task/TaskMining.java +++ b/src/main/java/com/example/jmacro/wjdr/task/TaskMining.java @@ -8,17 +8,14 @@ import com.example.jmacro.wjdr.util.Logger; import java.io.File; -public class TaskMining { - - private JMacro jMacro; - private ScreenRect screenRect; +public class TaskMining extends BaseTask { public TaskMining(JMacro jMacro, ScreenRect screenRect) { - this.jMacro = jMacro; - this.screenRect = screenRect; + super(jMacro, screenRect); } - public void start() { + @Override + public void run() { Logger.info("》》》自动采矿开始》》》"); Logger.info("定位【野外】"); @@ -81,13 +78,13 @@ public class TaskMining { } Logger.info("定位【{}】图标成功", type); - Logger.info("单击【{}】图标,坐标[{},{}]",type, typeRect.getCenter()[0], typeRect.getCenter()[1]); + Logger.info("单击【{}】图标,坐标[{},{}]", type, typeRect.getCenter()[0], typeRect.getCenter()[1]); jMacro.mouseLeftClick(typeRect); if (level == 0) { ScreenRect 等级减 = jMacro.waitAndFindPic(screenRect, new File("legend", "野外_资源_-.png"), 0.98); while (等级减 != null) { - jMacro.waitTap(); + jMacro.delayTap(); jMacro.mouseLeftClick(等级减); 等级减 = jMacro.waitAndFindPic(screenRect, new File("legend", "野外_资源_-.png"), 0.98); } @@ -128,8 +125,4 @@ public class TaskMining { jMacro.mouseLeftClick(出征); return true; } - - public static void main(String[] args) { - - } } diff --git a/src/main/resources/icon.png b/src/main/resources/icon.png new file mode 100644 index 0000000..adf116c Binary files /dev/null and b/src/main/resources/icon.png differ diff --git a/target/classes/icon.png b/target/classes/icon.png new file mode 100644 index 0000000..adf116c Binary files /dev/null and b/target/classes/icon.png differ