From 7a029ee49c93ea82cbdcdf39046878b68f845b29 Mon Sep 17 00:00:00 2001 From: wangbing Date: Fri, 6 Sep 2024 11:24:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=A4=87=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 28 +- pom.xml | 10 - src/main/java/xyz/wbsite/jmacro/JMacro.java | 441 ++++++++---------- .../java/xyz/wbsite/jmacro/base/Legend.java | 6 + .../xyz/wbsite/jmacro/util/ImageUtil.java | 20 +- .../xyz/wbsite/jmacro/wjdr/MacroForWJDR.java | 84 ++-- ...”回城镇.java => Task_定ä½åŸŽé•‡.java} | 4 +- .../jmacro/wjdr/task/Task_探险领å–.java | 2 +- .../wjdr/task/Task_æ”¶ç•™é¿éš¾è€….java | 8 +- .../jmacro/wjdr/task/Task_离线收益.java | 26 -- .../jmacro/wjdr/task/Task_自动采矿.java | 32 +- 11 files changed, 296 insertions(+), 365 deletions(-) rename src/main/java/xyz/wbsite/jmacro/wjdr/task/{Task_返回城镇.java => Task_定ä½åŸŽé•‡.java} (96%) delete mode 100644 src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_离线收益.java diff --git a/README.md b/README.md index 05b87ad..513c99c 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,34 @@ # 简介 -JMacro使用Java Robot工具实现的自动化/脚本脚手架,å±å¹•找图,定ä½ï¼Œæ¨¡æ‹Ÿäººæ“作鼠标ã€é”®ç›˜ç­‰åŸºæœ¬äº‹ä»¶ã€‚ +JMacro使用Java Robot工具实现的脚本/自动化脚手架,å±å¹•找图,定ä½ï¼Œæ¨¡æ‹Ÿäººæ“作鼠标ã€é”®ç›˜ç­‰åŸºæœ¬äº‹ä»¶ã€‚ -#背景 +# 背景 +èµ·åˆæ˜¯åœ¨çŽ©ä¸€æ¬¾ç»è¥ç±»å°æ¸¸æˆä¸­æœ‰äº†æƒ³æ³•;其中有ç€å¤§é‡çš„é‡å¤å·¥ä½œï¼Œä¾‹å¦‚领å–奖励ã€é¢†å–å®ç®±ã€é‡ŽåŒºé‡‡çŸ¿ã€å‡ºå‡»é‡Žæ€ªç­‰åŸºæœ¬æ“作。 +因此曾想过使用æˆç†Ÿçš„æ–¹æ¡ˆå¦‚按键精çµï¼Œå› ä¸ºå¾ˆä¹…以å‰ä¹Ÿæ›¾ç”¨è¿‡å…¶åˆ¶ä½œçš„辅助工具,ä¸è¿‡è®°å¾—其在æŸäº›æ€æ¯’软件下是报毒,且例如腾讯类 +å¤§åž‹æ¸¸æˆæœ‰å®‰å…¨æ£€æµ‹ç›´æŽ¥ä¸é€šè¿‡ï¼Œæ˜¯å› ä¸ºã€ŠæŒ‰é”®ç²¾çµã€‹çš„典型特å¾ã€‚因此放弃的此方案。 +åŽæ¥åœ¨æƒ³èƒ½å¦ä½¿ç”¨javaæ¥å†™ä¸€ä¸ªè„šæœ¬/自动化机器人了?因为我自己就是一ä½javaå¼€å‘äººå‘˜ï¼›è¯­æ³•ä¹Ÿç†Ÿæ‚‰ï¼›å®žçŽ°ä¸Šä¹Ÿä¼šæ›´åŠ çš„çµæ´»ï¼›è¿™ä¸€æƒ³å°±åŽ»è°ƒæŸ¥ +一番,å‘现也确实有人有这个想法,但å´ä¸€ç›´æœªæ‰¾åˆ°æˆç†Ÿçš„æ¡†æž¶æˆ–ä¾èµ–åº“ã€‚æƒ³æƒ³ä¹Ÿå¯¹ï¼Œè¿™æœ¬å°±ä¸æ˜¯java领域的特长。 +所以最终决定自己编写一款简易脚手架,并开æºå…±äº«ã€‚ -###环境ä¾èµ– +## å¼€å‘环境 +idea + +## 环境ä¾èµ– jdk1.8 -### 构建工具 +## 构建工具 Maven 3+ -### ä¾èµ–说明 -Hutool:一个å°è€Œå…¨çš„Javaå·¥å…·ç±»åº“ï¼Œé€šè¿‡é™æ€æ–¹æ³•å°è£…,é™ä½Žç›¸å…³APIçš„å­¦ä¹ æˆæœ¬ï¼Œæé«˜å·¥ä½œæ•ˆçއ +## ä¾èµ–说明 +### Hutool +使用了其中éžå¸¸æ–¹ä¾¿çš„api +### jintellitype +用于注册热键的库,è¿è¡Œæ—¶é¼ æ ‡å¯èƒ½ä¸æ–¹ä¾¿æ“作,åªèƒ½é€šè¿‡çƒ­é”®æ¥ç»“æŸã€‚ +### javafx-maven-plugin +程åºå®žçŽ°äº†ä¸€ä¸ªç®€å•çš„UI控制å°ï¼Œç”¨äºŽæŽ§åˆ¶è¿è¡Œã€åœæ­¢ã€å’Œå¼€å‘调试工具。通过æ’ä»¶å°†jar打包为windows下å¯ç›´æŽ¥è¿è¡Œçš„程åºåŒ…。这样å¯ä»¥è®©ä¸å®‰è£…jre和开å‘工具的电脑也能使用。 +### maven-antrun-plugin +æ‰“åŒ…å›¾ä¾‹èµ„æºæ–‡ä»¶ ##打包EXE坿‰§è¡Œæ–‡ä»¶ ``` diff --git a/pom.xml b/pom.xml index f319a28..ee2953a 100644 --- a/pom.xml +++ b/pom.xml @@ -52,22 +52,12 @@ - ${artifactId}-${version} - src/main/java src/main/resources - - - ${basedir}/src/main/resources/lib - BOOT-INF/lib/ - - *.jar - - diff --git a/src/main/java/xyz/wbsite/jmacro/JMacro.java b/src/main/java/xyz/wbsite/jmacro/JMacro.java index 9d202af..e2f78f2 100644 --- a/src/main/java/xyz/wbsite/jmacro/JMacro.java +++ b/src/main/java/xyz/wbsite/jmacro/JMacro.java @@ -345,20 +345,9 @@ public abstract class JMacro { * * @param pic 图片 * @param minSimilar 最低相似度 - * @return 匹é…图片区域 + * @return 匹é…区域 */ public ViewRect findPic(File pic, double minSimilar) { - return findPic(getFocusRect(), ImageUtil.load(pic), minSimilar); - } - - /** - * 免屿Ÿ¥æ‰¾å›¾ç‰‡ - * - * @param pic 图片 - * @param minSimilar 最低相似度 - * @return 匹é…图片区域 - */ - public ViewRect findPic(BufferedImage pic, double minSimilar) { return findPic(getFocusRect(), pic, minSimilar); } @@ -368,10 +357,20 @@ public abstract class JMacro { * @param viewRect 查找范围(ä¸è®¾æ—¶ï¼Œå–å…¨å±ï¼‰ * @param pic 待查找图片 * @param minSimilar 相似度 - * @return 匹é…图片区域 + * @return 匹é…区域 */ public ViewRect findPic(ViewRect viewRect, File pic, double minSimilar) { - return findPic(viewRect, ImageUtil.load(pic), minSimilar); + if (!pic.exists()) { + Logger.error("[{}] does not exist!", pic.getAbsolutePath()); + return null; + } + if (!pic.isFile()) { + Logger.error("[{}] is not a file!", pic.getAbsolutePath()); + return null; + } + Logger.info("查找图片:{}", pic.getAbsolutePath()); + BufferedImage bufferedImage = ImageUtil.load(pic); + return findPic(viewRect, bufferedImage, minSimilar); } /** @@ -380,7 +379,7 @@ public abstract class JMacro { * @param viewRect 查找范围(ä¸è®¾æ—¶ï¼Œå–å…¨å±ï¼‰ * @param pic 待查找图片 * @param minSimilar 相似度 - * @return 匹é…图片区域 + * @return 匹é…区域 */ public ViewRect findPic(ViewRect viewRect, BufferedImage pic, double minSimilar) { // 当èšç„¦åŒºåŸŸä¸ºnullæ—¶ï¼Œé»˜è®¤å…¨å±æŸ¥æ‰¾ @@ -450,48 +449,61 @@ public abstract class JMacro { } /** - * 查找图片 + * 等待并查找图片 * - * @param legend 图例 + * @param rect 查找区域 + * @param pic 图片 * @param minSimilar 最低相似度 - * @return 匹é…图片区域 + * @return 匹é…区域 */ - public ViewRect findLegend(String legend, double minSimilar) { - return findLegend(Legend.inflate(legend), minSimilar); + public ViewRect waitAndFindPic(ViewRect rect, File pic, double minSimilar) { + return waitAndFindPic(rect, pic, minSimilar, defaultTimeOut); } /** - * 查找图片 + * 等待并查找图片 * - * @param legend 图例 + * @param pic 图片 * @param minSimilar 最低相似度 - * @return 匹é…图片区域 + * @return 匹é…区域 */ - public ViewRect findLegend(Legend legend, double minSimilar) { - return findLegend(getFocusRect(), legend, minSimilar); + public ViewRect waitAndFindPic(File pic, double minSimilar) { + return waitAndFindPic(getFocusRect(), pic, minSimilar, defaultTimeOut); } /** - * 查找图例 + * 等待并查找图片 * - * @param legend 图例 + * @param pic 图片 * @param minSimilar 最低相似度 - * @return 匹é…图片区域 + * @param seconds 最长等待秒数 + * @return 匹é…区域 */ - public ViewRect findLegend(ViewRect rect, String legend, double minSimilar) { - return findLegend(rect, Legend.inflate(legend), minSimilar); + public ViewRect waitAndFindPic(File pic, double minSimilar, long seconds) { + return waitAndFindPic(getFocusRect(), pic, minSimilar, seconds); } /** - * 查找图例 + * 等待并查找图片 * - * @param legend 图例 + * @param rect 查找区域 + * @param picFile 图片 * @param minSimilar 最低相似度 - * @return 匹é…图片区域 + * @param seconds 最长等待秒数 + * @return 匹é…区域 */ - public ViewRect findLegend(ViewRect rect, Legend legend, double minSimilar) { - Logger.info("查找图例:{}", legend.getName()); - return findPic(rect, legend.getFile(), minSimilar); + public ViewRect waitAndFindPic(ViewRect rect, File picFile, double minSimilar, long seconds) { + Logger.info("等待并查找图片:{}", picFile.getAbsolutePath()); + BufferedImage pic = ImageUtil.load(picFile); + return TaskUtil.timeTask(() -> { + while (JMainService.getInstance().run) { + ViewRect result = findPic(rect, pic, minSimilar); + if (result != null) { + return result; + } + } + return null; + }, seconds, TimeUnit.SECONDS); } /** @@ -499,10 +511,10 @@ public abstract class JMacro { * * @param legend 图例 * @param minSimilar 最低相似度 - * @return 匹é…图片区域 + * @return 匹é…区域 */ - public ViewRect waitAndFindLegend(Legend legend, double minSimilar, long seconds) { - return waitAndFindPic(legend.getFile(), minSimilar, seconds); + public ViewRect findLegend(String legend, double minSimilar) { + return findLegend(Legend.inflate(legend), minSimilar); } /** @@ -510,252 +522,217 @@ public abstract class JMacro { * * @param legend 图例 * @param minSimilar 最低相似度 - * @return 匹é…图片区域 + * @return 匹é…区域 */ - public ViewRect waitAndFindLegend(ViewRect rect, Legend legend, double minSimilar, long seconds) { - return waitAndFindPic(rect, legend.getFile(), minSimilar, seconds); + public ViewRect findLegend(Legend legend, double minSimilar) { + return findLegend(getFocusRect(), legend, minSimilar); } /** - * 等待并查找图片 + * 查找图例 * - * @param pic 图片 + * @param legend 图例 * @param minSimilar 最低相似度 - * @return 匹é…图片区域 + * @return 匹é…区域 */ - public ViewRect waitAndFindPic(File pic, double minSimilar) { - return waitAndFindPic(getFocusRect(), pic, minSimilar, defaultTimeOut); + public ViewRect findLegend(ViewRect rect, String legend, double minSimilar) { + return findLegend(rect, Legend.inflate(legend), minSimilar); } /** - * 等待并查找图片 + * 查找图例 * - * @param pic 图片 + * @param legend 图例 * @param minSimilar 最低相似度 - * @return 匹é…图片区域 + * @return 匹é…区域 */ - public ViewRect waitAndFindPic(BufferedImage pic, double minSimilar) { - return waitAndFindPic(getFocusRect(), pic, minSimilar, defaultTimeOut); + public ViewRect findLegend(ViewRect rect, Legend legend, double minSimilar) { + Logger.info("查找图例:{}", legend.getName()); + return findPic(rect, legend.getImage(), minSimilar); } /** - * 等待并查找图片 + * 等待并查找图例 * - * @param pic 图片 + * @param legend 图例 * @param minSimilar 最低相似度 - * @param seconds 最长等待秒数 - * @return 匹é…图片区域 + * @return 匹é…区域 */ - public ViewRect waitAndFindPic(File pic, double minSimilar, long seconds) { - return waitAndFindPic(getFocusRect(), pic, minSimilar, seconds); + public ViewRect waitAndFindLegend(ViewRect rect, Legend legend, double minSimilar, long seconds) { + Logger.info("等待并查找图例:{}", legend.getName()); + return TaskUtil.timeTask(() -> { + while (JMainService.getInstance().run) { + ViewRect result = findPic(rect, legend.getImage(), minSimilar); + if (result != null) { + return result; + } + } + return null; + }, seconds, TimeUnit.SECONDS); } /** - * 等待并查找图片 + * 等待并查找图例 * - * @param pic 图片 + * @param legend 图例 * @param minSimilar 最低相似度 - * @param seconds 最长等待秒数 - * @return 匹é…图片区域 + * @return 匹é…区域 */ - public ViewRect waitAndFindPic(BufferedImage pic, double minSimilar, long seconds) { - return waitAndFindPic(getFocusRect(), pic, minSimilar, seconds); + public ViewRect waitAndFindLegend(ViewRect rect, String legend, double minSimilar, long seconds) { + return waitAndFindLegend(rect, Legend.inflate(legend), minSimilar, seconds); } /** - * 等待并查找图片 + * 等待并查找图例 * - * @param rect 查找区域 - * @param pic 图片 + * @param legend 图例 * @param minSimilar 最低相似度 - * @return 匹é…图片区域 + * @return 匹é…区域 */ - public ViewRect waitAndFindPic(ViewRect rect, File pic, double minSimilar) { - return waitAndFindPic(rect, pic, minSimilar, defaultTimeOut); + public ViewRect waitAndFindLegend(Legend legend, double minSimilar, long seconds) { + return waitAndFindLegend(getFocusRect(), legend, minSimilar, seconds); } /** - * 等待并查找图片 + * 等待并查找图例 * - * @param rect 查找区域 - * @param pic 图片 + * @param legend 图例 * @param minSimilar 最低相似度 - * @param seconds 最长等待秒数 - * @return 匹é…图片区域 + * @return 匹é…区域 */ - public ViewRect waitAndFindPic(ViewRect rect, File pic, double minSimilar, long seconds) { - return waitAndFindPic(rect, ImageUtil.load(pic), minSimilar, seconds); + public ViewRect waitAndFindLegend(String legend, double minSimilar, long seconds) { + return waitAndFindLegend(getFocusRect(), Legend.inflate(legend), minSimilar, seconds); } /** - * 等待并查找图片 + * 等待并查找图例 * - * @param rect 查找区域 - * @param pic 图片 + * @param legend 图例 * @param minSimilar 最低相似度 - * @return 匹é…图片区域 + * @return 匹é…区域 */ - public ViewRect waitAndFindPic(ViewRect rect, BufferedImage pic, double minSimilar) { - return waitAndFindPic(rect, pic, minSimilar, defaultTimeOut); + public ViewRect waitAndFindLegend(Legend legend, double minSimilar) { + return waitAndFindLegend(getFocusRect(), legend, minSimilar, defaultTimeOut); } /** - * 等待并查找图片 + * 等待并查找图例 * - * @param rect 查找区域 - * @param pic 图片 + * @param legend 图例 * @param minSimilar 最低相似度 - * @param seconds 最长等待秒数 - * @return 匹é…图片区域 + * @return 匹é…区域 */ - public ViewRect waitAndFindPic(ViewRect rect, BufferedImage pic, double minSimilar, long seconds) { - if (rect.getWidth() < pic.getWidth()) { - Logger.error("查找图片区域宽度{}å°äºŽå›¾ç‰‡å®½åº¦{}", rect.getWidth(), pic.getWidth()); - return null; - } - if (rect.getHeight() < pic.getHeight()) { - Logger.error("查找图片区域宽度{}å°äºŽå›¾ç‰‡å®½åº¦{}", rect.getHeight(), pic.getHeight()); - return null; - } - return TaskUtil.timeTask(() -> { - while (JMainService.getInstance().run) { - ViewRect result = findPic(rect, pic, minSimilar); - if (result != null) { - return result; - } - } - return null; - }, seconds, TimeUnit.SECONDS); + public ViewRect waitAndFindLegend(String legend, double minSimilar) { + return waitAndFindLegend(getFocusRect(), Legend.inflate(legend), minSimilar, defaultTimeOut); } /** - * 匹é…图片 + * 匹é…图例 * - * @param pic 图片 - * @param location å®šä½ + * @param legend 图例 * @param minSimilar 最低相似度 * @return 匹é…图片 */ - public ViewRect matchPic(File pic, ViewPoint location, double minSimilar) { - if (!pic.exists()) { - Logger.error("file [{}] not exist", pic.getAbsolutePath()); - return null; - } - return matchPic(ImageUtil.load(pic), location, minSimilar); - } - - public ViewRect matchPic(BufferedImage pic, ViewPoint location, double minSimilar) { - ViewRect focusRect = getFocusRect(); - int offsetX = location.getX(); - int offsetY = location.getY(); + public ViewRect matchLegend(Legend legend, double minSimilar) { + BufferedImage image = ImageUtil.load(legend.getFile()); + // 获å–å›¾ä¾‹ç›¸å¯¹åæ ‡ + int offsetX = legend.getLocation().getX(); + int offsetY = legend.getLocation().getY(); + // æ ¹æ®åŽŸç‚¹è®¡ç®—å›¾ä¾‹ç»å¯¹åæ ‡ ViewRect viewRect = new ViewRect(); - viewRect.setLeft(focusRect.getLeft() + offsetX); - viewRect.setTop(focusRect.getTop() + offsetY); - viewRect.setRight(viewRect.getLeft() + pic.getWidth()); - viewRect.setBottom(viewRect.getTop() + pic.getHeight()); - ImageUtil.show(viewRect); - return findPic(viewRect, pic, minSimilar); - } - - /** - * 等待并匹é…图片 - * - * @param pic 图片 - * @param minSimilar 最低相似度 - * @return 匹é…图片区域 - */ - public ViewRect waitAndMatchPic(File pic, ViewPoint location, double minSimilar) { - return waitAndMatchPic(ImageUtil.load(pic), location, minSimilar); + viewRect.setLeft(getFocusRect().getLeft() + offsetX); + viewRect.setTop(getFocusRect().getTop() + offsetY); + viewRect.setRight(viewRect.getLeft() + image.getWidth()); + viewRect.setBottom(viewRect.getTop() + image.getHeight()); + Logger.info("匹é…图例:{},区域:{}", legend.getName(), viewRect); + return findPic(viewRect, image, minSimilar); } /** - * 等待并匹é…图片 + * 匹é…图例 * - * @param pic 图片 + * @param legend 图例 * @param minSimilar 最低相似度 - * @return 匹é…图片区域 + * @return 匹é…图片 */ - public ViewRect waitAndMatchPic(BufferedImage pic, ViewPoint location, double minSimilar) { - return waitAndMatchPic(pic, location, minSimilar, defaultTimeOut); + public ViewRect matchLegend(String legend, double minSimilar) { + return matchLegend(Legend.inflate(legend), minSimilar); } /** - * 等待并匹é…图片 + * 等待并匹é…图例 * - * @param pic 图片 + * @param legend 图例 * @param minSimilar 最低相似度 * @param seconds 最长等待秒数 - * @return 匹é…图片区域 + * @return 匹é…区域 */ - public ViewRect waitAndMatchPic(File pic, ViewPoint location, double minSimilar, long seconds) { - return waitAndMatchPic(ImageUtil.load(pic), location, minSimilar, seconds); + public ViewRect waitAndMatchLegend(Legend legend, double minSimilar, long seconds) { + Logger.info("等待并匹é…图例:{}", legend.getName()); + return TaskUtil.timeTask(() -> { + while (JMainService.getInstance().run) { + ViewRect result = findPic(getFocusRect(), legend.getImage(), minSimilar); + if (result != null) { + return result; + } + } + return null; + }, seconds, TimeUnit.SECONDS); } /** - * 等待并匹é…图片 + * 等待并匹é…图例 * - * @param pic 图片 + * @param legend 图例 * @param minSimilar 最低相似度 * @param seconds 最长等待秒数 - * @return 匹é…图片区域 + * @return 匹é…区域 */ - public ViewRect waitAndMatchPic(BufferedImage pic, ViewPoint location, double minSimilar, long seconds) { - return TaskUtil.timeTask(() -> { - while (JMainService.getInstance().run) { - ViewRect matchPic = matchPic(pic, location, minSimilar); - if (matchPic != null) { - return matchPic; - } - delayUnstable(); - } - return null; - }, seconds, TimeUnit.SECONDS); + public ViewRect waitAndMatchLegend(String legend, double minSimilar, long seconds) { + return waitAndMatchLegend(Legend.inflate(legend), minSimilar, seconds); } /** - * 匹é…图例 + * 等待并匹é…图例 * - * @param legends 图例 - * @param seconds 最长等待秒数 - * @return 匹é…图片区域 + * @param legend 图例 + * @param minSimilar 最低相似度 + * @return 匹é…区域 */ - public ViewRect[] waitAndMatchLegend(String[] legends, long seconds) { - return TaskUtil.timeTask(() -> { - while (JMainService.getInstance().run) { - ViewRect[] viewRects = matchLegend(legends); - for (ViewRect viewRect : viewRects) { - if (viewRect != null) { - return viewRects; - } - } - delayUnstable(); - } - return new ViewRect[legends.length]; - }, seconds, TimeUnit.SECONDS); + public ViewRect waitAndMatchLegend(String legend, double minSimilar) { + return waitAndMatchLegend(legend, minSimilar, defaultTimeOut); } /** - * 匹é…图例 + * 等待并匹é…图例 * - * @param legends 图例 - * @return 匹é…图片 + * @param legend 图例 + * @param minSimilar 最低相似度 + * @return 匹é…区域 */ - public ViewRect[] matchLegend(String... legends) { - return matchLegend(legends, 1.0); + public ViewRect waitAndMatchLegend(Legend legend, double minSimilar) { + return waitAndMatchLegend(legend, minSimilar, defaultTimeOut); } /** - * 匹é…图例 + * 图例组åˆåŒ¹é…,图例区域结果和入å‚长度一致,ä»»æ„图例检测到åŽåˆ™ä¼šè¿”回,其他未检测到的区域则为null + *

+ * 说明:一个æ“作之åŽå¯èƒ½ä¼šæœ‰å¤šä¸ªé¢„期结果,以å‘èµ·ã€è¿›æ”»ã€‘æ“作为例,å¯èƒ½ä¼šæç¤ºå¤šç§ç»“果如下: + * 1.æˆåŠŸå‘èµ· + * 2.敌人已逃走 + * 3.兵力ä¸è¶³ + * ä¸åŒçš„æ“ä½œè¿”å›žç»“æžœï¼Œä¼šæœ‰ä¸åŒçš„åŽç»­æ“ä½œï¼›å¦‚æžœä»¥èŽ·å–æŸä¸€ç»“æžœåŽ»æ£€æµ‹ï¼Œè€ƒè™‘å¤„ç†æ—¶é—´å»¶è¿Ÿç­‰éœ€è¦åŠ ä¸Šç­‰å¾…æ—¶é—´ + * ä¸åŒç»“果的获å–å°±ä¼šä¾æ¬¡ä¸²è¡Œï¼Œè¿™æ ·æ£€æŸ¥è‚¯å®šä¼šæµªè´¹å¤§é‡æ£€æµ‹æ—¶é—´ã€‚因此正对此情况åšäº†å¹¶è”检测机制。 * * @param legends 图例 * @param minSimilar 最低相似度 * @return 匹é…图片 */ - public ViewRect[] matchLegend(String[] legends, double minSimilar) { + public ViewRect[] matchLegends(String[] legends, double minSimilar) { ViewRect[] viewRects = new ViewRect[legends.length]; for (int i = 0; i < legends.length; i++) { String legend = legends[i]; - viewRects[i] = matchLegend(Legend.inflate(legend), minSimilar); + viewRects[i] = matchLegend(legend, minSimilar); if (viewRects[i] != null) { return viewRects; } @@ -764,83 +741,73 @@ public abstract class JMacro { } /** - * 匹é…图例 + * 多图例匹é…调用优化 * - * @param legend 图例 - * @param minSimilar 最低相似度 + * @param legends 图例 * @return 匹é…图片 */ - public ViewRect matchLegend(String legend, double minSimilar) { - return matchLegend(Legend.inflate(legend), minSimilar); + public ViewRect[] matchLegends(double minSimilar, String... legends) { + return matchLegends(legends, minSimilar); } /** - * 匹é…图片 + * 等待并匹é…å›¾ä¾‹ç»„åˆ * - * @param legend 图例 + * @param legends 图例组 * @param minSimilar 最低相似度 - * @return 匹é…图片 + * @param seconds 最长等待秒数 + * @return 匹é…区域 */ - public ViewRect matchLegend(Legend legend, double minSimilar) { - if (minSimilar > 1) { - throw new RuntimeException("this minSimilar must be less than 1"); + public ViewRect[] waitAndMatchLegends(String[] legends, double minSimilar, long seconds) { + if (legends.length == 0) { + return new ViewRect[0]; } - int offsetX = legend.getLocation().getX(); - int offsetY = legend.getLocation().getY(); - ViewRect viewRect = new ViewRect(); - viewRect.setLeft(getFocusRect().getLeft() + offsetX); - viewRect.setTop(getFocusRect().getTop() + offsetY); - BufferedImage image = ImageUtil.load(legend.getFile()); - viewRect.setRight(viewRect.getLeft() + image.getWidth()); - viewRect.setBottom(viewRect.getTop() + image.getHeight()); - //ImageUtil.show(viewRect); - return findPic(viewRect, image, minSimilar); - } - - /** - * 等待并匹é…图例 - * - * @param legend 图例 - * @param minSimilar 最低相似度 - * @return 匹é…图片区域 - */ - public ViewRect waitAndMatchLegend(String legend, double minSimilar) { - return waitAndMatchLegend(Legend.inflate(legend), minSimilar); + Logger.info("等待并匹é…图例组åˆï¼š{}", String.join(",", legends)); + return TaskUtil.timeTask(() -> { + while (JMainService.getInstance().run) { + ViewRect[] viewRects = matchLegends(legends, minSimilar); + for (ViewRect viewRect : viewRects) { + if (viewRect != null) { + return viewRects; + } + } + } + return null; + }, seconds, TimeUnit.SECONDS); } /** - * 等待并匹é…图例 + * 等待并匹é…å›¾ä¾‹ç»„åˆ * - * @param legend 图例 * @param minSimilar 最低相似度 - * @return 匹é…图片区域 + * @param seconds 最长等待秒数 + * @param legends 图例组 + * @return 匹é…区域 */ - public ViewRect waitAndMatchLegend(Legend legend, double minSimilar) { - return waitAndMatchLegend(legend, minSimilar, defaultTimeOut); + public ViewRect[] waitAndMatchLegends(double minSimilar, long seconds, String... legends) { + return waitAndMatchLegends(legends, minSimilar, seconds); } /** - * 等待并匹é…图例 + * 等待并匹é…å›¾ä¾‹ç»„åˆ * - * @param legend 图例 * @param minSimilar 最低相似度 - * @param seconds 最长等待秒数 - * @return 匹é…图片区域 + * @param legends 图例组 + * @return 匹é…区域 */ - public ViewRect waitAndMatchLegend(String legend, double minSimilar, long seconds) { - return waitAndMatchLegend(Legend.inflate(legend), minSimilar, seconds); + public ViewRect[] waitAndMatchLegends(double minSimilar, String... legends) { + return waitAndMatchLegends(legends, minSimilar, defaultTimeOut); } /** - * 等待并匹é…图例 + * 等待并匹é…å›¾ä¾‹ç»„åˆ * - * @param legend 图例 + * @param legends 图例组 * @param minSimilar 最低相似度 - * @param seconds 最长等待秒数 - * @return 匹é…图片区域 + * @return 匹é…区域 */ - public ViewRect waitAndMatchLegend(Legend legend, double minSimilar, long seconds) { - return waitAndMatchPic(legend.getFile(), legend.getLocation(), minSimilar, seconds); + public ViewRect[] waitAndMatchLegends(String[] legends, double minSimilar) { + return waitAndMatchLegends(legends, minSimilar, defaultTimeOut); } /** @@ -863,7 +830,7 @@ public abstract class JMacro { * * @param color è‰²å€¼åæ ‡ç‚¹ * @param seconds 最长等待秒数 - * @return 匹é…图片区域 + * @return 匹é…区域 */ public boolean waitAndMatchColor(ViewColor color, long seconds) { Boolean result = TaskUtil.timeTask(() -> { diff --git a/src/main/java/xyz/wbsite/jmacro/base/Legend.java b/src/main/java/xyz/wbsite/jmacro/base/Legend.java index 0ffdc3b..0e8627e 100644 --- a/src/main/java/xyz/wbsite/jmacro/base/Legend.java +++ b/src/main/java/xyz/wbsite/jmacro/base/Legend.java @@ -5,8 +5,10 @@ import cn.hutool.cache.CacheUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.ReUtil; +import xyz.wbsite.jmacro.util.ImageUtil; import xyz.wbsite.jmacro.util.Logger; +import java.awt.image.BufferedImage; import java.io.File; import java.util.List; @@ -111,6 +113,10 @@ public class Legend { return file; } + public BufferedImage getImage() { + return ImageUtil.load(this.file); + } + public String getName() { return name; } diff --git a/src/main/java/xyz/wbsite/jmacro/util/ImageUtil.java b/src/main/java/xyz/wbsite/jmacro/util/ImageUtil.java index 558c5ab..a05077b 100644 --- a/src/main/java/xyz/wbsite/jmacro/util/ImageUtil.java +++ b/src/main/java/xyz/wbsite/jmacro/util/ImageUtil.java @@ -1,14 +1,13 @@ package xyz.wbsite.jmacro.util; import cn.hutool.core.img.ImgUtil; +import cn.hutool.core.io.IoUtil; import xyz.wbsite.jmacro.JMainApplication; import xyz.wbsite.jmacro.JMainService; import xyz.wbsite.jmacro.base.ViewRect; import java.awt.*; import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.io.File; import java.util.ArrayList; import java.util.HashMap; @@ -127,19 +126,18 @@ public class ImageUtil { * @param image 图片 */ public static void show(BufferedImage image) { - int viewSize = 100; Image showImage = image; - // 图片太大时进行缩放显示 - if (image.getWidth() > viewSize || image.getHeight() > viewSize) { - if (image.getWidth() > image.getHeight()) { - showImage = ImgUtil.scale(showImage, 1.0f * viewSize / image.getWidth()); + // å›¾ç‰‡å®½é«˜éƒ½å¤§äºŽé¢„è§ˆçª—å£æ—¶è¿›è¡Œç¼©æ”¾æ˜¾ç¤º + if (image.getWidth() > 192 || image.getHeight() > 108) { + // 宽高比大于预览窗å£ï¼Œé€‚é…宽, å¦åˆ™é€‚é…高 + if (1D * image.getWidth() / image.getHeight() > 192D / 108D) { + showImage = ImgUtil.scale(showImage, 1.0f * 192 / image.getWidth()); } else { - showImage = ImgUtil.scale(showImage, 1.0f * viewSize / image.getHeight()); + showImage = ImgUtil.scale(showImage, 1.0f * 108 / image.getHeight()); } } - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - ImgUtil.write(showImage, "PNG", outputStream); - javafx.scene.image.Image image1 = new javafx.scene.image.Image(new ByteArrayInputStream(outputStream.toByteArray())); + byte[] bytes = ImgUtil.toBytes(showImage, "PNG"); + javafx.scene.image.Image image1 = new javafx.scene.image.Image(IoUtil.toStream(bytes)); JMainApplication.mainController.preview(image1); } } diff --git a/src/main/java/xyz/wbsite/jmacro/wjdr/MacroForWJDR.java b/src/main/java/xyz/wbsite/jmacro/wjdr/MacroForWJDR.java index c49eeba..f17ccb6 100644 --- a/src/main/java/xyz/wbsite/jmacro/wjdr/MacroForWJDR.java +++ b/src/main/java/xyz/wbsite/jmacro/wjdr/MacroForWJDR.java @@ -1,14 +1,14 @@ package xyz.wbsite.jmacro.wjdr; +import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import xyz.wbsite.jmacro.JMacro; import xyz.wbsite.jmacro.JMainService; -import xyz.wbsite.jmacro.base.Legend; import xyz.wbsite.jmacro.base.ViewRect; import xyz.wbsite.jmacro.util.Logger; +import xyz.wbsite.jmacro.wjdr.task.Task_定ä½åŸŽé•‡; import xyz.wbsite.jmacro.wjdr.task.Task_æ”¶ç•™é¿éš¾è€…; import xyz.wbsite.jmacro.wjdr.task.Task_自动采矿; -import xyz.wbsite.jmacro.wjdr.task.Task_返回城镇; import xyz.wbsite.jmacro.wjdr.task.Task_采矿被攻击; /** @@ -37,65 +37,63 @@ public class MacroForWJDR extends JMacro { @Override public synchronized ViewRect focus() { - // 定ä½çª—å£ - Logger.info("定ä½çª—å£"); - ViewRect mumu = findPic(Legend.inflate("æ…•æ…•_工具æ ").getFile(), 0.95d); + Logger.info("èšç„¦çª—å£"); + ViewRect mumu = findLegend("æ…•æ…•_工具æ ", 0.95d); + ViewRect rect = getScreenRect(); if (mumu == null) { - Logger.error("定ä½çª—å£å¤±è´¥"); - return null; + Logger.info("èšç„¦çª—å£å¤±è´¥ï¼Œé»˜è®¤å…¨å±"); + } else { + // 计算应用窗å£è¿”回 + rect.setLeft(mumu.getLeft() - 428); + rect.setTop(mumu.getBottom() + 7); + rect.setRight(mumu.getRight()); + rect.setBottom(mumu.getBottom() + 951); } - Logger.info("å®šä½æ…•æ…•çª—å£æˆåŠŸ"); - // 计算应用窗å£è¿”回 - ViewRect gameScreen = new ViewRect(); - gameScreen.setLeft(mumu.getLeft() - 428); - gameScreen.setTop(mumu.getBottom() + 7); - gameScreen.setRight(mumu.getRight()); - gameScreen.setBottom(mumu.getBottom() + 951); - Logger.info("应用窗å£ä½ç½®ï¼š" + gameScreen.toString()); - Logger.info("应用窗å£å¤§å°ï¼š{}x{}", gameScreen.getRight() - gameScreen.getLeft(), gameScreen.getBottom() - gameScreen.getTop()); - return gameScreen; + Logger.info("èšç„¦çª—å£ï¼š" + rect.toString()); + Logger.info("èšç„¦çª—å£å¤§å°ï¼š{}x{}", rect.getRight() - rect.getLeft(), rect.getBottom() - rect.getTop()); + return rect; } @Override public void run() { - long startTime = System.currentTimeMillis(); - Logger.info("任务线程开始", DateUtil.date(startTime).toString("yyyy-MM-dd HH:mm:ss")); + DateTime current = DateUtil.date(); + String currentTime = current.toString("HH:mm:ss"); + Logger.info("工作时间:{}~{}", workStart, workEnd); + Logger.info("当剿—¶é—´ï¼š{}", currentTime); + if (!DateUtil.parseTime(currentTime).isIn(DateUtil.parseTime(workStart), DateUtil.parseTime(workEnd))) { + Logger.info("当剿—¶é—´ä¸ºéžå·¥ä½œæ—¶é—´ï¼Œä¼‘眠待命ï¼"); + delay(60 * 1000); + return; + } + Logger.info("当剿—¶é—´ä¸ºå·¥ä½œæ—¶é—´"); + Logger.info("任务线程开始", current.toString("yyyy-MM-dd HH:mm:ss")); // 获å–å¯åŠ¨å›¾æ ‡ - Logger.info("定ä½å¯åŠ¨å›¾æ ‡"); - ViewRect launch = waitAndFindPic(of("å¯åŠ¨å›¾æ ‡").getFile(), 0.9, 10); + Logger.info("查找å¯åŠ¨å›¾æ ‡"); + ViewRect launch = findLegend("å¯åŠ¨å›¾æ ‡", 0.9); if (launch != null) { Logger.info("å¯åŠ¨å›¾æ ‡åæ ‡ï¼š", launch.toString()); - Logger.info("å¯åŠ¨ç¨‹åº"); + Logger.info("点击å¯åŠ¨å›¾æ ‡"); mouseLeftClick(launch); + Logger.info("等待程åºå¯åŠ¨ä¸­ï¼Œè¯·ç¨ç­‰..."); delay(10 * 1000); } - Logger.info("定ä½åŸŽé•‡"); -// -// delayUnstable(); -// new Task_离线收益(this, focusRect).run(); -// -// delayUnstable(); -// new Task_æ”¶ç•™é¿éš¾è€…(this, focusRect).run(); -// -// // 矿场攻击检测任务 -// delayUnstable(1000); -// new Task_探险领å–(this, focusRect).run(); - Logger.info("å¯åŠ¨å¾ªçŽ¯ä»»åŠ¡"); while (JMainService.getInstance().run) { - new Task_返回城镇(this, focusRect).run(); + // ä»»æ„界é¢ä¼˜å…ˆè¿”回城镇 + new Task_定ä½åŸŽé•‡(this, focusRect).run(); - // 矿场攻击检测任务 - new Task_采矿被攻击(this, focusRect).run(); + // 坿Œ‰ä¼˜å…ˆçº§æŽ’åºä»¥ä¸‹ä»»åŠ¡ + { + // 矿场攻击检测任务 + new Task_采矿被攻击(this, focusRect).run(); - // é¿éš¾è€… - delayUnstable(1000); - new Task_æ”¶ç•™é¿éš¾è€…(this, focusRect).run(); + // é¿éš¾è€… + new Task_æ”¶ç•™é¿éš¾è€…(this, focusRect).run(); - // 自动采矿任务 - delayUnstable(1000); - new Task_自动采矿(this, focusRect).run(); + // 自动采矿任务 + new Task_自动采矿(this, focusRect).run(); + } } } } diff --git a/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_返回城镇.java b/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_定ä½åŸŽé•‡.java similarity index 96% rename from src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_返回城镇.java rename to src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_定ä½åŸŽé•‡.java index 5b848b9..fa63149 100644 --- a/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_返回城镇.java +++ b/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_定ä½åŸŽé•‡.java @@ -4,9 +4,9 @@ import xyz.wbsite.jmacro.JMacro; import xyz.wbsite.jmacro.base.ViewRect; import xyz.wbsite.jmacro.util.Logger; -public class Task_返回城镇 extends BaseTask { +public class Task_定ä½åŸŽé•‡ extends BaseTask { - public Task_返回城镇(JMacro macro, ViewRect viewRect) { + public Task_定ä½åŸŽé•‡(JMacro macro, ViewRect viewRect) { super(macro, viewRect); } diff --git a/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_探险领å–.java b/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_探险领å–.java index 677f300..fa02269 100644 --- a/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_探险领å–.java +++ b/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_探险领å–.java @@ -28,7 +28,7 @@ public class Task_æŽ¢é™©é¢†å– extends BaseTask { } Logger.info("è¿›å…¥æŽ¢é™©ç•Œé¢æˆåŠŸ"); - ViewRect[] viewRects = macro.waitAndMatchLegend(new String[]{"探险_领å–", "探险_ä¸å¯é¢†å–"}, 5); + ViewRect[] viewRects = macro.waitAndMatchLegends(0.9, 5, "探险_领å–", "探险_ä¸å¯é¢†å–"); if (viewRects[0] != null) { // å¯ä»¥é¢†å– Logger.info("定ä½é¢†å–按钮"); ViewRect 探险_é¢†å– = macro.waitAndMatchLegend("探险_领å–", 0.8); diff --git a/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_æ”¶ç•™é¿éš¾è€….java b/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_æ”¶ç•™é¿éš¾è€….java index c859281..c7fc77d 100644 --- a/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_æ”¶ç•™é¿éš¾è€….java +++ b/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_æ”¶ç•™é¿éš¾è€….java @@ -12,7 +12,7 @@ public class Task_æ”¶ç•™é¿éš¾è€… extends BaseTask { @Override public void task(JMacro macro, ViewRect viewRect) { - ViewRect rect = macro.waitAndMatchLegend("城镇_é¿éš¾è€…", 0.9,3); + ViewRect rect = macro.matchLegend("城镇_é¿éš¾è€…", 0.9); if (rect == null) { Logger.info("未å‘现é¿éš¾è€…"); return; @@ -21,19 +21,15 @@ public class Task_æ”¶ç•™é¿éš¾è€… extends BaseTask { Logger.info("æ”¶ç•™é¿éš¾è€…"); macro.mouseLeftClick(rect); - - macro.delayUnstable(); - ViewRect rect1 = macro.waitAndMatchLegend("城镇_欢迎新æˆå‘˜", 0.9); + ViewRect rect1 = macro.waitAndMatchLegend("城镇_欢迎新æˆå‘˜", 0.9, 2000); if (rect1 == null) { Logger.info("æ”¶ç•™é¿éš¾è€…异常"); return; } - macro.delayUnstable(); Logger.info("欢迎新æˆå‘˜"); macro.mouseLeftClick(rect1); - macro.delayUnstable(); Logger.info("返回城镇"); } } diff --git a/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_离线收益.java b/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_离线收益.java deleted file mode 100644 index 05bdd18..0000000 --- a/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_离线收益.java +++ /dev/null @@ -1,26 +0,0 @@ -package xyz.wbsite.jmacro.wjdr.task; - -import xyz.wbsite.jmacro.JMacro; -import xyz.wbsite.jmacro.base.ViewRect; -import xyz.wbsite.jmacro.util.Logger; - -public class Task_离线收益 extends BaseTask { - - public Task_离线收益(JMacro macro, ViewRect viewRect) { - super(macro, viewRect); - } - - @Override - public void task(JMacro macro, ViewRect viewRect) { - macro.delayUnstable(); - // 定ä½ç¦»çº¿æ”¶ç›Šå¼¹æ¡†ï¼Œå…³é—­å¼¹æ¡† - ViewRect rect = macro.matchLegend("城镇_离线收益", 0.9); - if (rect != null) { - macro.mouseLeftClick(rect); - Logger.info("检测到离线收益弹框,关闭弹框"); - } else { - Logger.info("未检测到离线收益弹框"); - } - macro.delayUnstable(); - } -} diff --git a/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_自动采矿.java b/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_自动采矿.java index c8ed328..d44d839 100644 --- a/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_自动采矿.java +++ b/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_自动采矿.java @@ -54,14 +54,14 @@ public class Task_自动采矿 extends BaseTask { }; for (String type : types) { Logger.info("æœç´¢èµ„æºã€{}】", type); - boolean collect = collect(type, 3); - if (collect) { // 中断采集 + boolean success = collect(type, 3); + if (!success) { // 中断采集 break; } } // æ£€æµ‹æ˜¯å¦æ˜¯æœç´¢ç•Œé¢ - ViewRect 野外_任务2 = macro.waitAndMatchLegend("野外_任务", 9); + ViewRect 野外_任务2 = macro.matchLegend("野外_任务", 0.9); if (野外_任务2 != null) { Logger.info("é€€å‡ºèµ„æºæœç´¢ç•Œé¢"); macro.mouseLeftClick(this.viewRect); @@ -69,11 +69,10 @@ public class Task_自动采矿 extends BaseTask { ViewRect 城1 = macro.waitAndMatchLegend("城镇", 0.9); if (城1 == null) { - Logger.error("未检测到ã€åŸŽé•‡ã€‘,采矿终止"); + Logger.error("未检测到ã€åŸŽé•‡ã€‘,异常终止"); return; } Logger.info("返回城镇"); - macro.delayUnstable(); } /** @@ -96,14 +95,12 @@ public class Task_自动采矿 extends BaseTask { if (clevel > level) { TaskUtil.execTask(() -> { Logger.info("调整等级"); - macro.delayUnstable(700); macro.mouseLeftClick(macro.of(51, 777)); }, clevel - level, 1000); } if (clevel < level) { TaskUtil.execTask(() -> { Logger.info("调整等级"); - macro.delayUnstable(700); macro.mouseLeftClick(macro.of(360, 777)); }, level - clevel, 1000); } @@ -115,18 +112,14 @@ public class Task_自动采矿 extends BaseTask { } Logger.info("点击æœç´¢{}{}级矿", type, level); - macro.delayUnstable(); macro.mouseLeftClick(野外_èµ„æºæœç´¢); - macro.delayUnstable(); - ViewRect 采集 = macro.waitAndMatchLegend("野外_资æºé‡‡é›†", 0.98); + macro.delayUnstable(1500); + ViewRect 采集 = macro.waitAndMatchLegend("野外_资æºé‡‡é›†", 0.9); if (采集 != null) { macro.mouseLeftClick(采集); - macro.delayUnstable(1000); - - ViewRect[] viewRects = macro.matchLegend("野外_资æºå‡ºå¾", "野外_èµ„æºæ— å¯¹é˜Ÿåˆ—", "野外_èµ„æºæ— å£«å…µ"); - + ViewRect[] viewRects = macro.waitAndMatchLegends(0.9, "野外_资æºå‡ºå¾", "野外_èµ„æºæ— å¯¹é˜Ÿåˆ—", "野外_èµ„æºæ— å£«å…µ"); if (viewRects[0] != null) { Logger.info("出å¾"); macro.mouseLeftClick(viewRects[0]); @@ -134,22 +127,15 @@ public class Task_自动采矿 extends BaseTask { } if (viewRects[1] != null) { Logger.info("é˜Ÿåˆ—å·²æ»¡ï¼Œå–æ¶ˆé‡‡é›†"); - macro.delayUnstable(1000); - macro.mouseLeftClick(macro.of(471, 250)); - - Logger.info("é˜Ÿåˆ—å·²æ»¡ï¼Œå–æ¶ˆé‡‡é›†"); - macro.delayUnstable(1000); macro.mouseLeftClick(macro.of(471, 250)); return false; } if (viewRects[2] != null) { Logger.info("士兵ä¸è¶³ï¼Œå–消采集"); - macro.delayUnstable(1000); - macro.mouseLeftClick(macro.of(32,30)); + macro.mouseLeftClick(macro.of(32, 30)); return false; } - - } else if (level > 1) { + } else if (level > 1) { // 当å‰ç­‰çº§æ— èµ„æºï¼Œé™ä½Žèµ„æºç­‰çº§ return collect(type, level - 1); }