diff --git a/.idea/encodings.xml b/.idea/encodings.xml index d2b8c0c..63574ec 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -3,7 +3,6 @@ - \ No newline at end of file diff --git a/legend/L15,632-野外_搜索.png b/legend/L15,632-野外_搜索.png new file mode 100644 index 0000000..f16be24 Binary files /dev/null and b/legend/L15,632-野外_搜索.png differ diff --git a/legend/L196,218-探险_获得奖励.png b/legend/L196,218-探险_获得奖励.png new file mode 100644 index 0000000..29019d0 Binary files /dev/null and b/legend/L196,218-探险_获得奖励.png differ diff --git a/legend/L230,664-探险_领取2.png b/legend/L230,664-探险_领取2.png new file mode 100644 index 0000000..6d1bb95 Binary files /dev/null and b/legend/L230,664-探险_领取2.png differ diff --git a/legend/L233,881-野外_搜索.png b/legend/L233,881-野外_搜索.png new file mode 100644 index 0000000..aa63fad Binary files /dev/null and b/legend/L233,881-野外_搜索.png differ diff --git a/legend/L240,854-探险_按钮.png b/legend/L240,854-探险_按钮.png new file mode 100644 index 0000000..773a563 Binary files /dev/null and b/legend/L240,854-探险_按钮.png differ diff --git a/legend/L35,881-TAB_探险.png b/legend/L35,881-TAB_探险.png new file mode 100644 index 0000000..e373e3e Binary files /dev/null and b/legend/L35,881-TAB_探险.png differ diff --git a/legend/L4,4-探险_返回.png b/legend/L4,4-探险_返回.png new file mode 100644 index 0000000..303c1ce Binary files /dev/null and b/legend/L4,4-探险_返回.png differ diff --git a/legend/L426,667-探险_领取.png b/legend/L426,667-探险_领取.png new file mode 100644 index 0000000..50b7b45 Binary files /dev/null and b/legend/L426,667-探险_领取.png differ diff --git a/legend/L449,887-城镇.png b/legend/L449,887-城镇.png new file mode 100644 index 0000000..fe0660b Binary files /dev/null and b/legend/L449,887-城镇.png differ diff --git a/legend/L454,41-城镇_充值.png b/legend/L454,41-城镇_充值.png new file mode 100644 index 0000000..19b4a49 Binary files /dev/null and b/legend/L454,41-城镇_充值.png differ diff --git a/pom.xml b/pom.xml index f63dcb6..3446cad 100644 --- a/pom.xml +++ b/pom.xml @@ -51,13 +51,13 @@ - - 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 3f1df5b..091dd5f 100644 --- a/src/main/java/com/example/jmacro/wjdr/JMacro.java +++ b/src/main/java/com/example/jmacro/wjdr/JMacro.java @@ -287,6 +287,9 @@ public class JMacro { * @return 匹配图片区域 */ public ScreenRect findPic(ScreenRect screenRect, String legendName, double minSimilar) { + if (!legendName.endsWith(".png")) { + legendName = legendName + ".png"; + } return findPic(screenRect, new File(legend, legendName), minSimilar); } @@ -314,6 +317,7 @@ public class JMacro { public ScreenRect findPic(ScreenRect screenRect, BufferedImage pic, double minSimilar) { // 当查找区域比图片还小时,直接返回失败 if (screenRect.getWidth() < pic.getWidth() || screenRect.getHeight() < pic.getHeight()) { + Logger.error("视口尺寸小于图片"); return null; } @@ -352,6 +356,11 @@ public class JMacro { } } } +// try { +// ImgUtil.write(screen,"png", new FileOutputStream("D://1.png")); +// } catch (FileNotFoundException e) { +// +// } return null; } @@ -458,6 +467,55 @@ public class JMacro { }, time, unit); } + /** + * 等待并匹配图例 + * + * @param rect 参照区域 + * @param legendName 图例名称 + * @param minSimilar 最低相似度 + * @return 匹配图片区域 + */ + public ScreenRect waitAndMatchPic(ScreenRect rect, String legendName, double minSimilar) { + if (!legendName.endsWith(".png")) { + legendName = legendName + ".png"; + } + return waitAndMatchPic(rect, new File(legend, legendName), minSimilar, 10, TimeUnit.SECONDS); + } + + /** + * 等待并匹配图例 + * + * @param rect 参照区域 + * @param file 图例 + * @param minSimilar 最低相似度 + * @return 匹配图片区域 + */ + public ScreenRect waitAndMatchPic(ScreenRect rect, File file, double minSimilar) { + return waitAndMatchPic(rect, file, minSimilar, 10, TimeUnit.SECONDS); + } + + /** + * 等待并匹配图例 + * + * @param rect 参照区域 + * @param file 图例 + * @param minSimilar 最低相似度 + * @param time 最长等待时间 + * @param unit 最长等待时间单位 + * @return 匹配图片区域 + */ + public ScreenRect waitAndMatchPic(ScreenRect rect, File file, double minSimilar, long time, TimeUnit unit) { + return TaskUtil.timeTask(() -> { + while (true) { + delayTap(); + ScreenRect matchPic = matchPic(rect, file, minSimilar); + if (matchPic != null) { + return matchPic; + } + } + }, time, unit); + } + /** * 匹配图片 * @@ -467,6 +525,10 @@ public class JMacro { * @return 匹配图片 */ public ScreenRect matchPic(ScreenRect rect, File file, double minSimilar) { + if (!file.exists()) { + Logger.error("file [{}] not exist", file.getAbsolutePath()); + return null; + } String name = file.getName(); int offsetX = 0; int offsetY = 0; @@ -480,7 +542,6 @@ public class JMacro { BufferedImage image = Imager.load(file); screenRect.setRight(screenRect.getLeft() + image.getWidth()); screenRect.setBottom(screenRect.getTop() + image.getHeight()); - System.out.println(screenRect.toString()); return findPic(screenRect, image, minSimilar); } @@ -493,6 +554,9 @@ public class JMacro { * @return 匹配图片 */ public ScreenRect matchPic(ScreenRect rect, String legendName, double minSimilar) { + if (!legendName.endsWith(".png")) { + legendName = legendName + ".png"; + } return matchPic(rect, new File(legend, legendName), minSimilar); } diff --git a/src/main/java/com/example/jmacro/wjdr/MainTask.java b/src/main/java/com/example/jmacro/wjdr/MainTask.java index afe6235..457c70c 100644 --- a/src/main/java/com/example/jmacro/wjdr/MainTask.java +++ b/src/main/java/com/example/jmacro/wjdr/MainTask.java @@ -7,6 +7,7 @@ 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.task.TaskRewards; import com.example.jmacro.wjdr.util.Capture; import com.example.jmacro.wjdr.util.Logger; import com.example.jmacro.wjdr.util.TaskUtil; @@ -58,11 +59,11 @@ public class MainTask extends JFrame { public void start() throws AWTException { // 加载主题 - try { - org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF(); - } catch (Exception e) { - e.printStackTrace(); - } +// try { +// org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF(); +// } catch (Exception e) { +// e.printStackTrace(); +// } // 设置标题 setTitle("无限工具"); // 设置图标 @@ -155,6 +156,10 @@ public class MainTask extends JFrame { public MacroThread(JMacro jMacro) { super(jMacro); + } + + @Override + public void run() { // 定位mumu bar Logger.info("定位慕慕窗口"); ScreenRect mumu = jMacro.findPic("慕慕_工具栏", 0.95d); @@ -170,10 +175,6 @@ public class MainTask extends JFrame { gameScreen.setBottom(mumu.getBottom() + 951); Logger.info("应用窗口位置:" + gameScreen.toString()); Logger.info("应用窗口大小:{}x{}", gameScreen.getRight() - gameScreen.getLeft(), gameScreen.getBottom() - gameScreen.getTop()); - } - - @Override - public void run() { // 获取启动图标 Logger.info("定位启动图标"); ScreenRect launch = jMacro.waitAndFindPic(gameScreen, "启动图标", 0.8); @@ -190,7 +191,7 @@ public class MainTask extends JFrame { while (true) { jMacro.delay(); { // 定位弹框,关闭弹框 - ScreenRect rect = jMacro.findPic(gameScreen, "首页_广告关闭按钮", 0.95d); + ScreenRect rect = jMacro.matchPic(gameScreen, "L454,41-城镇_充值", 0.1d); if (rect != null) { jMacro.mouseLeftClick(rect); Logger.info("检测到广告弹框,关闭弹框"); @@ -199,7 +200,7 @@ public class MainTask extends JFrame { jMacro.delay(); { // 定位离线收益弹框,关闭弹框 - ScreenRect rect = jMacro.matchPic(gameScreen, new File("legend", "L204,734-城镇_离线收益.png"), 0.9); + ScreenRect rect = jMacro.matchPic(gameScreen, "L204,734-城镇_离线收益", 0.9); if (rect != null) { jMacro.mouseLeftClick(rect); Logger.info("检测到离线收益弹框,关闭弹框"); @@ -208,13 +209,13 @@ public class MainTask extends JFrame { jMacro.delay(); // 定位主程序 - ScreenRect rect = jMacro.matchPic(gameScreen, new File("legend", "L444,888-野外.png"), 0.9); + ScreenRect rect = jMacro.matchPic(gameScreen, "L444,888-野外", 0.9); if (rect != null) { Logger.info("程序主界面已就绪"); return rect; } } - }, 30 * 1000, TimeUnit.MILLISECONDS); + }, 30, TimeUnit.SECONDS); if (城镇 == null) { schedule.cancel(true); @@ -234,6 +235,10 @@ public class MainTask extends JFrame { jMacro.delayNormal(); new TaskMineAttack(jMacro, gameScreen).run(); + // 矿场攻击检测任务 + jMacro.delayNormal(); + new TaskRewards(jMacro, gameScreen).run(); + // 自动采矿任务 jMacro.delayNormal(); new TaskMining(jMacro, gameScreen).run(); 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 c9ae16a..571a898 100644 --- a/src/main/java/com/example/jmacro/wjdr/task/TaskMining.java +++ b/src/main/java/com/example/jmacro/wjdr/task/TaskMining.java @@ -18,20 +18,26 @@ public class TaskMining extends BaseTask { public void run() { Logger.info("》》》自动采矿开始》》》"); - Logger.info("定位【野外】"); - ScreenRect 野外 = jMacro.waitAndFindPic(screenRect, new File("legend", "城镇_野外.png"), 0.99); - if (野外 == null) { - Logger.error("定位【野外】失败,采矿终止"); - return; - } - Logger.error("定位【野外】成功,{}", 野外.toString()); + Logger.info("判断是否在野外"); + ScreenRect 城镇 = jMacro.waitAndMatchPic(this.screenRect, "L449,887-城镇", 0.9); + if (城镇 != null) { + Logger.info("当前界面【野外】"); + } else { + Logger.info("定位【野外】"); + ScreenRect 野外 = jMacro.waitAndMatchPic(this.screenRect, "城镇_野外", 0.99); + if (野外 == null) { + Logger.error("定位【野外】失败,采矿终止"); + return; + } + Logger.error("定位【野外】成功,{}", 野外.toString()); - Logger.info("点击【野外】,坐标{}", JSONUtil.toJsonStr(野外.getCenter())); - jMacro.mouseLeftClick(野外); - Logger.info("定位野外按钮成功"); + Logger.info("点击【野外】,坐标{}", JSONUtil.toJsonStr(野外.getCenter())); + jMacro.mouseLeftClick(野外); + Logger.info("定位野外按钮成功"); + } Logger.info("定位资源搜索按钮"); - ScreenRect 野外搜索 = jMacro.waitAndFindPic(screenRect, new File("legend", "野外_搜索.png"), 1); + ScreenRect 野外搜索 = jMacro.waitAndMatchPic(this.screenRect, "L15,632-野外_搜索", 0.8); if (野外搜索 == null) { Logger.error("未检测到【资源搜索按钮】,采矿终止"); return; @@ -50,18 +56,19 @@ public class TaskMining extends BaseTask { } } - ScreenRect 搜索 = jMacro.waitAndFindPic(screenRect, new File("legend", "野外_资源_搜索.png"), 0.98); + // 检测是否是搜索界面 + ScreenRect 搜索 = jMacro.waitAndMatchPic(this.screenRect, "L233,881-野外_搜索", 0.98); if (搜索 != null) { Logger.info("退出资源搜索界面"); - jMacro.mouseLeftClick(screenRect); + jMacro.mouseLeftClick(this.screenRect); } - ScreenRect 城镇 = jMacro.waitAndFindPic(screenRect, new File("legend", "城镇.png"), 0.9); - if (城镇 == null) { + ScreenRect 城1 = jMacro.waitAndMatchPic(this.screenRect, "L456,887-城镇", 0.9); + if (城1 == null) { Logger.error("未检测到【城镇】,采矿终止"); return; } - + Logger.info("返回城镇"); Logger.info("》》》自动采矿结束,返回城镇》》》"); } diff --git a/src/main/java/com/example/jmacro/wjdr/task/TaskRewards.java b/src/main/java/com/example/jmacro/wjdr/task/TaskRewards.java new file mode 100644 index 0000000..7f88572 --- /dev/null +++ b/src/main/java/com/example/jmacro/wjdr/task/TaskRewards.java @@ -0,0 +1,64 @@ +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 TaskRewards extends BaseTask { + + public TaskRewards(JMacro jMacro, ScreenRect screenRect) { + super(jMacro, screenRect); + } + + @Override + public void run() { + Logger.info("》》》探险奖励领取开始》》》"); + + Logger.info("定位【探险】按钮"); + ScreenRect TAB_探险 = jMacro.waitAndMatchPic(this.screenRect, "L35,881-TAB_探险", 0.9); + if (TAB_探险 == null) { + return; + } + + Logger.info("点击【探险】按钮"); + jMacro.mouseLeftClick(TAB_探险); + + ScreenRect 探险_按钮 = jMacro.waitAndMatchPic(this.screenRect, "L240,854-探险_按钮", 0.9); + if (探险_按钮 == null) { + Logger.info("进入探险界面失败"); + return; + } + Logger.info("进入探险界面成功"); + + Logger.info("定位领取按钮"); + ScreenRect 探险_领取 = jMacro.waitAndMatchPic(this.screenRect, "L426,667-探险_领取", 0.8); + if (探险_领取 == null) { + Logger.error("未检测到【探险_领取】,领取终止"); + return; + } + Logger.info("定位领取按钮成功,准备领取:{}", 探险_领取.toString()); + jMacro.mouseLeftClick(探险_领取); + ScreenRect 探险_领取2 = jMacro.waitAndMatchPic(this.screenRect, "L230,664-探险_领取2", 0.8); + if (探险_领取2 == null) { + Logger.error("任务终止"); + return; + } + jMacro.mouseLeftClick(探险_领取2); + + ScreenRect 探险_获得奖励 = jMacro.waitAndMatchPic(this.screenRect, "L196,218-探险_获得奖励", 0.8); + if (探险_获得奖励 == null) { + Logger.error("任务终止"); + return; + } + jMacro.mouseLeftClick(探险_获得奖励); + + ScreenRect 探险_返回 = jMacro.waitAndMatchPic(this.screenRect, "L4,4-探险_返回", 0.8); + if (探险_返回 == null) { + Logger.error("任务终止"); + return; + } + jMacro.mouseLeftClick(探险_返回); + + Logger.info("》》》探险奖励领取结束,返回城镇》》》"); + } +} diff --git a/src/main/java/com/example/jmacro/wjdr/util/Capture.java b/src/main/java/com/example/jmacro/wjdr/util/Capture.java index d987e83..6bcb3d7 100644 --- a/src/main/java/com/example/jmacro/wjdr/util/Capture.java +++ b/src/main/java/com/example/jmacro/wjdr/util/Capture.java @@ -174,11 +174,11 @@ public class Capture extends JFrame { } public int getCaptureX() { - return (int) Math.min(start.getX(), end.getX()) + originX; + return (int) Math.min(start.getX(), end.getX()); } public int getCaptureY() { - return (int) Math.min(start.getY(), end.getY()) + originY; + return (int) Math.min(start.getY(), end.getY()); } public int getCaptureWidth() { @@ -193,10 +193,9 @@ public class Capture extends JFrame { // 上一次保存目录 String lastPath = preferences.get(LAST_PATH, ""); // 默认文件名 - String prefix = "L" + getCaptureX() + "," + getCaptureY() + "-"; + String prefix = "L" + (getCaptureX() - originX) + "," + (getCaptureY() - originY) + "-"; String filename = prefix + System.currentTimeMillis() + ".png"; - JFileChooser jFileChooser = new JFileChooser(); jFileChooser.setFileFilter(new FileNameExtensionFilter("png", "png")); jFileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);