diff --git a/legend/城镇_欢迎新成员_L199,773.png b/legend/城镇_欢迎新成员_L199,773.png new file mode 100644 index 0000000..2f7dbf2 Binary files /dev/null and b/legend/城镇_欢迎新成员_L199,773.png differ diff --git a/legend/城镇_避难者_L3,174.png b/legend/城镇_避难者_L3,174.png new file mode 100644 index 0000000..9c15314 Binary files /dev/null and b/legend/城镇_避难者_L3,174.png differ diff --git a/legend/野外_搜索_L226,879.png b/legend/野外_搜索_L226,879.png new file mode 100644 index 0000000..6a2a982 Binary files /dev/null and b/legend/野外_搜索_L226,879.png differ diff --git a/legend/野外_搜索_L33,636.png b/legend/野外_搜索_L33,636.png deleted file mode 100644 index beeec43..0000000 Binary files a/legend/野外_搜索_L33,636.png and /dev/null differ diff --git a/legend/野外_资源_搜索.png b/legend/野外_资源_搜索.png deleted file mode 100644 index ee340d5..0000000 Binary files a/legend/野外_资源_搜索.png and /dev/null differ diff --git a/src/main/java/com/example/jmacro/wjdr/JMacro.java b/src/main/java/com/example/jmacro/wjdr/JMacro.java index be68cba..1a2bce3 100644 --- a/src/main/java/com/example/jmacro/wjdr/JMacro.java +++ b/src/main/java/com/example/jmacro/wjdr/JMacro.java @@ -23,13 +23,18 @@ import java.util.concurrent.TimeUnit; * @version 0.0.1 * @since 1.8 */ -public class JMacro { +public abstract class JMacro { /** * 机器人操作实例 */ private final Robot robot; + /** + * 视口区域 + */ + protected ViewRect focusRect; + /** * 图例目录 */ @@ -41,12 +46,13 @@ public class JMacro { this.robot = new Robot(); this.robot.setAutoDelay(100); this.legend = new File("legend"); + this.startFocus(); } catch (AWTException e) { throw new RuntimeException(e); } } - public JMacro(File legend) throws AWTException { + public JMacro(File legend) { this(); this.legend = legend; } @@ -59,6 +65,29 @@ public class JMacro { this.legend = legend; } + /** + * 获取视口区域 + * + * @return 视口区域 + */ + public void startFocus() { + TaskUtil.asyncTask(() -> { + focusRect = TaskUtil.timeTask(this::focus, 10, TimeUnit.SECONDS); + }); + } + + /** + * 获取视口区域 + * + * @return 视口区域 + */ + public abstract ViewRect focus(); + + /** + * 执行脚本 + */ + public abstract void run(); + /** * 键盘按键组 */ @@ -127,7 +156,7 @@ public class JMacro { public void mouseLeftClick(ViewPoint rect) { mouseMove(rect); robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); - delayTap(); + robot.delay(100); robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); } @@ -159,11 +188,11 @@ public class JMacro { */ public void mouseLeftDrag(ViewPoint start, ViewPoint end, boolean smooth) { mouseMove(start, smooth); - delayTap(); + delayUnstable(); robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); - delayTap(); + delayUnstable(); mouseMove(end, smooth); - delayTap(); + delayUnstable(); robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); } @@ -186,11 +215,11 @@ public class JMacro { */ public void mouseRightDrag(ViewPoint start, ViewPoint end, boolean smooth) { mouseMove(start, smooth); - delayTap(); + delayUnstable(); robot.mousePress(InputEvent.BUTTON3_DOWN_MASK); - delayTap(); + delayUnstable(); mouseMove(end, smooth); - delayTap(); + delayUnstable(); robot.mouseRelease(InputEvent.BUTTON3_DOWN_MASK); } @@ -200,11 +229,11 @@ public class JMacro { * @param rect 矩形区域 */ public void mouseWheelClick(ViewRect rect) { - delayTap(); + delayUnstable(); robot.mouseMove(rect.getCenter()[0], rect.getCenter()[1]); - delayTap(); + delayUnstable(); robot.mousePress(InputEvent.BUTTON2_DOWN_MASK); - delayTap(); + delayUnstable(); robot.mouseRelease(InputEvent.BUTTON2_DOWN_MASK); } @@ -214,11 +243,11 @@ public class JMacro { * @param rect 矩形区域 */ public void mouseRightClick(ViewRect rect) { - delayTap(); + delayUnstable(); robot.mouseMove(rect.getCenter()[0], rect.getCenter()[1]); - delayTap(); + delayUnstable(); robot.mousePress(InputEvent.BUTTON3_DOWN_MASK); - delayTap(); + delayUnstable(); robot.mouseRelease(InputEvent.BUTTON3_DOWN_MASK); } @@ -228,9 +257,9 @@ public class JMacro { * @param rect 矩形区域 */ public void mouseLeftDoubleClick(ViewRect rect) { - delayTap(); + delayUnstable(); robot.mouseMove(rect.getCenter()[0], rect.getCenter()[1]); - delayTap(); + delayUnstable(); robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); robot.delay(100); robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); @@ -247,6 +276,13 @@ public class JMacro { return robot.createScreenCapture(new Rectangle(viewRect.getLeft(), viewRect.getTop(), viewRect.getWidth(), viewRect.getHeight())); } + /** + * 获取聚焦区域 + */ + public ViewRect getFocusRect() { + return focusRect; + } + /** * 获取屏幕范围 */ @@ -277,7 +313,7 @@ public class JMacro { * @return 匹配图片区域 */ public ViewRect findPic(File pic, double minSimilar) { - return findPic(getScreenRect(), ImageUtil.load(pic), minSimilar); + return findPic(getFocusRect(), ImageUtil.load(pic), minSimilar); } /** @@ -288,7 +324,7 @@ public class JMacro { * @return 匹配图片区域 */ public ViewRect findPic(BufferedImage pic, double minSimilar) { - return findPic(getScreenRect(), pic, minSimilar); + return findPic(getFocusRect(), pic, minSimilar); } /** @@ -328,6 +364,10 @@ public class JMacro { * @return 匹配图片区域 */ public ViewRect findPic(ViewRect viewRect, BufferedImage pic, double minSimilar) { + // 当聚焦区域为null时,默认全屏查找 + if (viewRect == null) { + viewRect = getFocusRect() != null ? getFocusRect() : getScreenRect(); + } // 当查找区域比图片还小时,直接返回失败 if (viewRect.getWidth() < pic.getWidth() || viewRect.getHeight() < pic.getHeight()) { Logger.error("视口尺寸小于图片"); @@ -373,22 +413,27 @@ public class JMacro { } public void delay() { - delayNormal(); + delay(100); } - public void delayTap() { - int i = RandomUtil.randomInt(100, 500); - robot.delay(i); + public void delay(long millis) { + try { + Thread.sleep(millis); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } } - public void delayNormal() { - int i = RandomUtil.randomInt(500, 1000); - robot.delay(i); + public void delayUnstable() { + delayUnstable(500); } - public void delayLong() { - int i = RandomUtil.randomInt(1000, 2000); - robot.delay(i); + public void delayUnstable(long millis) { + if (millis < 200) { + delay(millis); + return; + } + delay(RandomUtil.randomLong(millis - 100, millis + 100)); } /** @@ -399,7 +444,7 @@ public class JMacro { * @return 匹配图片区域 */ public ViewRect waitAndFindPic(File file, double minSimilar) { - return waitAndFindPic(getScreenRect(), file, minSimilar, 10, TimeUnit.SECONDS); + return waitAndFindPic(getFocusRect(), file, minSimilar, 10, TimeUnit.SECONDS); } /** @@ -439,7 +484,7 @@ public class JMacro { * @return 匹配图片区域 */ public ViewRect waitAndFindPic(File file, double minSimilar, long time, TimeUnit unit) { - return waitAndFindPic(getScreenRect(), file, minSimilar, time, unit); + return waitAndFindPic(getFocusRect(), file, minSimilar, time, unit); } /** @@ -482,7 +527,7 @@ public class JMacro { } while (true) { - delayTap(); + delayUnstable(); ViewRect pic = findPic(rect, image, minSimilar); if (pic != null) { return pic; @@ -503,7 +548,7 @@ public class JMacro { if (!legendName.endsWith(".png")) { legendName = legendName + ".png"; } - return waitAndMatchPic(rect, new File(legend, legendName), minSimilar, 10, TimeUnit.SECONDS); + return waitAndMatchPic(rect, new File(legend, legendName), minSimilar, 3, TimeUnit.SECONDS); } /** @@ -515,7 +560,7 @@ public class JMacro { * @return 匹配图片区域 */ public ViewRect waitAndMatchPic(ViewRect rect, File file, double minSimilar) { - return waitAndMatchPic(rect, file, minSimilar, 10, TimeUnit.SECONDS); + return waitAndMatchPic(rect, file, minSimilar, 3, TimeUnit.SECONDS); } /** @@ -530,6 +575,7 @@ public class JMacro { */ public ViewRect waitAndMatchPic(ViewRect rect, File file, double minSimilar, long time, TimeUnit unit) { return TaskUtil.timeTask(() -> { + // TODO: 2024/9/1 因为另起线程,导致发起线程已停止,但此线程未停止 while (true) { ViewRect matchPic = matchPic(rect, file, minSimilar); if (matchPic != null) { @@ -548,6 +594,9 @@ public class JMacro { * @return 匹配图片 */ public ViewRect matchPic(ViewRect rect, File file, double minSimilar) { + if (minSimilar > 1) { + throw new RuntimeException("this minSimilar must be less than 1"); + } if (!file.exists()) { Logger.error("file [{}] not exist", file.getAbsolutePath()); return null; diff --git a/src/main/java/com/example/jmacro/wjdr/JMacroThread.java b/src/main/java/com/example/jmacro/wjdr/JMacroThread.java deleted file mode 100644 index 1433662..0000000 --- a/src/main/java/com/example/jmacro/wjdr/JMacroThread.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.example.jmacro.wjdr; - -import com.example.jmacro.wjdr.base.ViewRect; -import com.example.jmacro.wjdr.util.TaskUtil; - -import java.util.concurrent.Callable; -import java.util.concurrent.TimeUnit; - -/** - * 脚本线程 - * - * @author wangbing - * @version 0.0.1 - * @since 1.8 - */ -public abstract class JMacroThread implements Runnable { - - /** - * 脚本对象 - */ - protected JMacro macro; - - /** - * 视口区域 - */ - protected ViewRect viewRect; - - public JMacroThread(JMacro macro) { - this.macro = macro; - TaskUtil.asyncTask(() -> { - viewRect = TaskUtil.timeTask(this::location, 10, TimeUnit.SECONDS); - }); - } - - /** - * 获取视口区域 - * - * @return 视口区域 - */ - public abstract ViewRect location(); - - public ViewRect getViewRect() { - return viewRect; - } - - public JMacro getMacro() { - return macro; - } -} diff --git a/src/main/java/com/example/jmacro/wjdr/JMainApplication.java b/src/main/java/com/example/jmacro/wjdr/JMainApplication.java index 5158272..909019f 100644 --- a/src/main/java/com/example/jmacro/wjdr/JMainApplication.java +++ b/src/main/java/com/example/jmacro/wjdr/JMainApplication.java @@ -1,6 +1,6 @@ package com.example.jmacro.wjdr; -import com.example.jmacro.wjdr.demo.DemoThread; +import com.example.jmacro.wjdr.demo.MacroForWJDR; import com.example.jmacro.wjdr.ui.FXMLUtil; import com.example.jmacro.wjdr.util.Logger; import com.example.jmacro.wjdr.util.ResourceUtil; @@ -45,7 +45,7 @@ public class JMainApplication extends Application { stage.show(); JMainApplication.primaryStage = stage; // 服务初始化 - JMainService.init(new DemoThread(new JMacro())); + JMainService.init(new MacroForWJDR()); } public static void main(String[] args) { diff --git a/src/main/java/com/example/jmacro/wjdr/JMainController.java b/src/main/java/com/example/jmacro/wjdr/JMainController.java index 83436b3..5108a5a 100644 --- a/src/main/java/com/example/jmacro/wjdr/JMainController.java +++ b/src/main/java/com/example/jmacro/wjdr/JMainController.java @@ -1,7 +1,8 @@ package com.example.jmacro.wjdr; import com.example.jmacro.wjdr.base.ViewRect; -import com.example.jmacro.wjdr.util.Capture; +import com.example.jmacro.wjdr.tool.Capture; +import com.example.jmacro.wjdr.tool.Location; import com.example.jmacro.wjdr.util.Dialog; import javafx.fxml.FXML; import javafx.scene.control.Button; @@ -33,7 +34,7 @@ public class JMainController { */ @FXML private void onCapture() { - ViewRect screen = JMainService.getInstance().getMacroThread().getViewRect(); + ViewRect screen = JMainService.getInstance().getMacro().getFocusRect(); File legend = JMainService.getInstance().getMacro().getLegend(); if (screen == null) { Dialog.alert("未定位到视口,请稍后再试!"); @@ -46,6 +47,24 @@ public class JMainController { } } + /** + * 截图 + */ + @FXML + private void onLocation() { + ViewRect screen = JMainService.getInstance().getMacro().getFocusRect(); + File legend = JMainService.getInstance().getMacro().getLegend(); + if (screen == null) { + Dialog.alert("未定位到视口,请稍后再试!"); + return; + } + try { + new Location(screen.getLeft(), screen.getTop()); + } catch (AWTException awtException) { + awtException.printStackTrace(); + } + } + /** * 截图 */ diff --git a/src/main/java/com/example/jmacro/wjdr/JMainService.java b/src/main/java/com/example/jmacro/wjdr/JMainService.java index e7219e8..faade1e 100644 --- a/src/main/java/com/example/jmacro/wjdr/JMainService.java +++ b/src/main/java/com/example/jmacro/wjdr/JMainService.java @@ -1,7 +1,7 @@ package com.example.jmacro.wjdr; import cn.hutool.core.thread.ThreadUtil; -import com.example.jmacro.wjdr.demo.DemoThread; +import com.example.jmacro.wjdr.demo.MacroForWJDR; import com.example.jmacro.wjdr.util.Dialog; import com.example.jmacro.wjdr.util.Logger; @@ -16,11 +16,6 @@ import java.io.File; */ public class JMainService { - /** - * 服务运行状态 - */ - private boolean run; - /** * 单例对象 */ @@ -33,56 +28,61 @@ public class JMainService { return instance; } + /** + * 服务运行状态 + */ + public boolean run; + /** * 守护线程 */ public DaemonThread daemonThread; /** - * 脚本线程 + * 脚本 */ - private JMacroThread macroThread; + private JMacro macro; /** * 服务内部构造器 */ private JMainService() { Logger.info("初始化服务"); - this.daemonThread = new DaemonThread(); - Logger.info("初始化守护线程"); - this.daemonThread.setDaemon(true); } - public void setMacroThread(JMacroThread macroThread) { - this.macroThread = macroThread; + public JMacro getMacro() { + return macro; } - public JMacroThread getMacroThread() { - return macroThread; + public static void init(JMacro macro) { + getInstance().macro = macro; } - public JMacro getMacro() { - return macroThread.getMacro(); - } + public void createDaemon() { + this.daemonThread = new DaemonThread(); + Logger.info("初始化守护线程"); + this.daemonThread.setDaemon(true); - public static void init(JMacroThread macroThread) { - getInstance().macroThread = macroThread; + // 启动守护线程 + this.run = true; + this.daemonThread.start(); } public static boolean start() { - if (JMainService.getInstance().macroThread.getViewRect() == null) { - Dialog.alert("未定位到视口,请稍后再试!"); + if (JMainService.getInstance().macro.getFocusRect() == null) { + JMainService.getInstance().macro.startFocus(); + Dialog.alert("未聚焦到视口,请稍后再试!"); return false; } if (JMainService.getInstance().run) { Logger.error("服务已启动"); return false; } + // 启动服务 Logger.info("启动服务"); - // 启动守护线程 - JMainService.getInstance().run = true; - JMainService.getInstance().daemonThread.start(); + // 创建守护线程 + JMainService.getInstance().createDaemon(); return true; } @@ -105,27 +105,31 @@ public class JMainService { * @param legend 图例路径 */ public static void setLegend(File legend) { - if (getInstance().macroThread != null) { - getInstance().macroThread.getMacro().setLegend(legend); + if (getInstance().macro != null) { + getInstance().macro.setLegend(legend); } } /** * 守护线程 */ - class DaemonThread extends Thread { + private class DaemonThread extends Thread { @Override public void run() { + if (macro == null) { + Logger.error("脚本未设置"); + return; + } while (run) { - Logger.info("守护线程ID={}", Thread.currentThread().getId()); - ThreadUtil.sleep(1000); - if (macroThread == null) { - Logger.error("脚本线程未设置"); - continue; + try { + macro.run(); + ThreadUtil.sleep(1000); + } catch (Exception e) { + Logger.error("异常中断"); } - macroThread.run(); } + Logger.info("服务停止,守护线程已退出"); } } @@ -133,7 +137,7 @@ public class JMainService { * 服务启动入口 */ public static void main(String[] args) { - JMainService.init(new DemoThread(new JMacro())); + JMainService.init(new MacroForWJDR()); JMainService.start(); } } diff --git a/src/main/java/com/example/jmacro/wjdr/base/ViewPoint.java b/src/main/java/com/example/jmacro/wjdr/base/ViewPoint.java index 4b75ea4..67fccef 100644 --- a/src/main/java/com/example/jmacro/wjdr/base/ViewPoint.java +++ b/src/main/java/com/example/jmacro/wjdr/base/ViewPoint.java @@ -42,4 +42,12 @@ public class ViewPoint { public void setY(int y) { this.y = y; } + + @Override + public String toString() { + return "ViewPoint{" + + "x=" + x + + ", y=" + y + + '}'; + } } diff --git a/src/main/java/com/example/jmacro/wjdr/base/ViewRect.java b/src/main/java/com/example/jmacro/wjdr/base/ViewRect.java index caa3cd7..5f18f5b 100644 --- a/src/main/java/com/example/jmacro/wjdr/base/ViewRect.java +++ b/src/main/java/com/example/jmacro/wjdr/base/ViewRect.java @@ -83,7 +83,7 @@ public class ViewRect { @Override public String toString() { - return "ScreenRect{" + + return "ViewRect{" + "left=" + left + ", top=" + top + ", right=" + right + diff --git a/src/main/java/com/example/jmacro/wjdr/demo/DemoThread.java b/src/main/java/com/example/jmacro/wjdr/demo/MacroForWJDR.java similarity index 68% rename from src/main/java/com/example/jmacro/wjdr/demo/DemoThread.java rename to src/main/java/com/example/jmacro/wjdr/demo/MacroForWJDR.java index 955a4d3..c7b8623 100644 --- a/src/main/java/com/example/jmacro/wjdr/demo/DemoThread.java +++ b/src/main/java/com/example/jmacro/wjdr/demo/MacroForWJDR.java @@ -3,25 +3,22 @@ package com.example.jmacro.wjdr.demo; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import com.example.jmacro.wjdr.JMacro; -import com.example.jmacro.wjdr.JMacroThread; +import com.example.jmacro.wjdr.JMainService; import com.example.jmacro.wjdr.base.ViewRect; -import com.example.jmacro.wjdr.demo.task.Task_探险领取; -import com.example.jmacro.wjdr.demo.task.Task_离线收益; -import com.example.jmacro.wjdr.demo.task.Task_自动采矿; -import com.example.jmacro.wjdr.demo.task.Task_采矿被攻击; +import com.example.jmacro.wjdr.demo.task.*; import com.example.jmacro.wjdr.util.Logger; import com.example.jmacro.wjdr.util.TaskUtil; import java.util.concurrent.TimeUnit; /** - * 实例工作线程 + * 无尽冬日脚本 * * @author wangbing * @version 0.0.1 * @since 1.8 */ -public class DemoThread extends JMacroThread { +public class MacroForWJDR extends JMacro { /** * 工作开始时间 @@ -38,15 +35,11 @@ public class DemoThread extends JMacroThread { */ private final long workTime = 30 * 60 * 1000; - public DemoThread(JMacro macro) { - super(macro); - } - @Override - public synchronized ViewRect location() { + public synchronized ViewRect focus() { // 定位窗口 Logger.info("定位窗口"); - ViewRect mumu = macro.findPic("慕慕_工具栏", 0.95d); + ViewRect mumu = findPic("慕慕_工具栏", 0.95d); if (mumu == null) { Logger.error("定位窗口失败"); return null; @@ -70,12 +63,12 @@ public class DemoThread extends JMacroThread { Logger.info("任务线程ID={}", Thread.currentThread().getId()); // 获取启动图标 Logger.info("定位启动图标"); - ViewRect launch = macro.waitAndFindPic(viewRect, "启动图标", 0.9, 10, TimeUnit.SECONDS); + ViewRect launch = waitAndFindPic(focusRect, "启动图标", 0.9, 10, TimeUnit.SECONDS); if (launch != null) { Logger.info("启动图标坐标:", launch.toString()); Logger.info("启动程序"); - macro.delay(); - macro.mouseLeftClick(launch); + delay(); + mouseLeftClick(launch); } else { Logger.error("未定位到图标,可能已进入游戏"); Logger.info("继续定位城镇"); @@ -85,31 +78,31 @@ public class DemoThread extends JMacroThread { // 定位城镇 Boolean inMain = TaskUtil.retryTask(() -> { { // 定位弹框,关闭弹框 - ViewRect rect = macro.matchPic(viewRect, "城镇_充值_L448,36", 0.8d); + ViewRect rect = matchPic(focusRect, "城镇_充值_L448,36", 0.8d); if (rect != null) { - macro.mouseLeftClick(rect); + mouseLeftClick(rect); Logger.info("检测到充值广告弹框,关闭弹框"); } } {// 定位离线收益 - ViewRect rect = macro.matchPic(viewRect, "城镇_离线收益_L204,734", 0.9); + ViewRect rect = matchPic(focusRect, "城镇_离线收益_L204,734", 0.9); if (rect != null) { - macro.mouseLeftClick(rect); + mouseLeftClick(rect); Logger.info("检测到离线收益弹框,关闭弹框"); } } // 定位城镇 { - ViewRect rect = macro.matchPic(viewRect, "城镇_L456,887", 0.9); + ViewRect rect = matchPic(focusRect, "城镇_L456,887", 0.9); if (rect != null) { Logger.info("当前区域【野外】"); Logger.info("返回区域【城镇】"); - macro.mouseLeftClick(rect); + mouseLeftClick(rect); return false; } } {// 定位野外 - ViewRect rect = macro.matchPic(viewRect, "野外_L444,888", 0.9); + ViewRect rect = matchPic(focusRect, "野外_L444,888", 0.9); if (rect != null) { Logger.info("当前区域【城镇】"); return true; @@ -126,22 +119,30 @@ public class DemoThread extends JMacroThread { Logger.info("进入城镇成功"); Logger.info("领取探险奖励"); - macro.delay(); - new Task_离线收益(macro, viewRect).run(); + delay(); + new Task_离线收益(this, focusRect).run(); + + Logger.info("收留避难者"); + delay(); + new Task_收留避难者(this, focusRect).run(); Logger.info("启动循环任务"); - while (!Thread.currentThread().isInterrupted()) { + while (JMainService.getInstance().run) { // 矿场攻击检测任务 - macro.delay(); - new Task_采矿被攻击(macro, viewRect).run(); + delayUnstable(1000); + new Task_采矿被攻击(this, focusRect).run(); + + // 避难者 + delayUnstable(1000); + new Task_收留避难者(this, focusRect).run(); // 矿场攻击检测任务 - macro.delay(); - new Task_探险领取(macro, viewRect).run(); + delayUnstable(1000); + new Task_探险领取(this, focusRect).run(); // 自动采矿任务 - macro.delay(); - new Task_自动采矿(macro, viewRect).run(); +// delayUnstable(1000); +// new Task_自动采矿(this, focusRect).run(); } } } diff --git a/src/main/java/com/example/jmacro/wjdr/demo/task/BaseTask.java b/src/main/java/com/example/jmacro/wjdr/demo/task/BaseTask.java index 0e99d29..d16a2bd 100644 --- a/src/main/java/com/example/jmacro/wjdr/demo/task/BaseTask.java +++ b/src/main/java/com/example/jmacro/wjdr/demo/task/BaseTask.java @@ -1,6 +1,7 @@ package com.example.jmacro.wjdr.demo.task; import com.example.jmacro.wjdr.JMacro; +import com.example.jmacro.wjdr.JMainService; import com.example.jmacro.wjdr.base.ViewRect; import com.example.jmacro.wjdr.util.Logger; @@ -25,14 +26,19 @@ public abstract class BaseTask { } public void run() { - Logger.info("守护线程ID={}", Thread.currentThread().getId()); - if (Thread.currentThread().isInterrupted()) { + if (!JMainService.getInstance().run) { + Logger.error("服务中断"); return; } - String name = getClass().getName(); - Logger.info("》》》任务[{}]开始》》》", name); - this.task(macro, viewRect); - Logger.info("》》》任务[{}]结束》》》", name); + String name = getClass().getSimpleName(); + try { + Logger.info("》》》任务[{}]开始》》》", name); + this.task(macro, viewRect); + Logger.info("》》》任务[{}]结束》》》", name); + } catch (Exception e) { + Logger.info("》》》任务[{}]异常中断》》》", name); + throw e; + } } /** diff --git a/src/main/java/com/example/jmacro/wjdr/demo/task/Task_收留避难者.java b/src/main/java/com/example/jmacro/wjdr/demo/task/Task_收留避难者.java new file mode 100644 index 0000000..e305ff3 --- /dev/null +++ b/src/main/java/com/example/jmacro/wjdr/demo/task/Task_收留避难者.java @@ -0,0 +1,39 @@ +package com.example.jmacro.wjdr.demo.task; + +import com.example.jmacro.wjdr.JMacro; +import com.example.jmacro.wjdr.base.ViewRect; +import com.example.jmacro.wjdr.util.Logger; + +public class Task_收留避难者 extends BaseTask { + + public Task_收留避难者(JMacro macro, ViewRect viewRect) { + super(macro, viewRect); + } + + @Override + public void task(JMacro macro, ViewRect viewRect) { + ViewRect rect = macro.waitAndMatchPic(viewRect, "城镇_避难者_L3,174", 0.9); + if (rect == null) { + Logger.info("未发现避难者"); + return; + } + Logger.info("发现避难者"); + + Logger.info("收留避难者"); + macro.mouseLeftClick(rect); + + macro.delayUnstable(); + ViewRect rect1 = macro.waitAndMatchPic(viewRect, "城镇_欢迎新成员_L199,773", 0.9); + if (rect1 == null) { + Logger.info("收留避难者异常"); + return; + } + + macro.delayUnstable(); + Logger.info("欢迎新成员"); + macro.mouseLeftClick(rect1); + + macro.delayUnstable(); + Logger.info("返回城镇"); + } +} diff --git a/src/main/java/com/example/jmacro/wjdr/demo/task/Task_自动采矿.java b/src/main/java/com/example/jmacro/wjdr/demo/task/Task_自动采矿.java index 9a0d47a..b8476c2 100644 --- a/src/main/java/com/example/jmacro/wjdr/demo/task/Task_自动采矿.java +++ b/src/main/java/com/example/jmacro/wjdr/demo/task/Task_自动采矿.java @@ -45,6 +45,18 @@ public class Task_自动采矿 extends BaseTask { Logger.info("定位资源搜索按钮成功:{}", 野外搜索.toString()); macro.mouseLeftClick(野外搜索); + // 定位木材 + + + // 因为搜索按钮透明,不好比对,通过定位其下面的任务图标定位 + ViewRect 野外_搜索 = macro.waitAndMatchPic(this.viewRect, "野外_搜索_L226,879", 0.9); + if (野外_搜索 == null) { + Logger.error("未检测到【野外_搜索】,采矿终止"); + return; + } + + // todo + String[] types = new String[]{ "生肉", "木材", "煤矿", "铁矿" }; @@ -81,6 +93,7 @@ public class Task_自动采矿 extends BaseTask { ViewRect typeRect = macro.waitAndFindPic(viewRect, new File("legend", "野外_" + type + ".png"), 0.9); if (typeRect == null) { Logger.error("定位【{}】图标失败", type); + return false; } Logger.info("定位【{}】图标成功", type); @@ -90,7 +103,7 @@ public class Task_自动采矿 extends BaseTask { if (level == 0) { ViewRect 等级减 = macro.waitAndFindPic(viewRect, new File("legend", "野外_资源_-.png"), 0.98); while (等级减 != null) { - macro.delayTap(); + macro.delayUnstable(); macro.mouseLeftClick(等级减); 等级减 = macro.waitAndFindPic(viewRect, new File("legend", "野外_资源_-.png"), 0.98); } diff --git a/src/main/java/com/example/jmacro/wjdr/util/Capture.java b/src/main/java/com/example/jmacro/wjdr/tool/Capture.java similarity index 98% rename from src/main/java/com/example/jmacro/wjdr/util/Capture.java rename to src/main/java/com/example/jmacro/wjdr/tool/Capture.java index 082d9a0..7af7cbb 100644 --- a/src/main/java/com/example/jmacro/wjdr/util/Capture.java +++ b/src/main/java/com/example/jmacro/wjdr/tool/Capture.java @@ -1,7 +1,8 @@ -package com.example.jmacro.wjdr.util; +package com.example.jmacro.wjdr.tool; import cn.hutool.core.img.ImgUtil; import cn.hutool.log.StaticLog; +import com.example.jmacro.wjdr.util.Logger; import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; diff --git a/src/main/java/com/example/jmacro/wjdr/tool/Location.java b/src/main/java/com/example/jmacro/wjdr/tool/Location.java new file mode 100644 index 0000000..9a16d16 --- /dev/null +++ b/src/main/java/com/example/jmacro/wjdr/tool/Location.java @@ -0,0 +1,166 @@ +package com.example.jmacro.wjdr.tool; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.log.StaticLog; +import com.example.jmacro.wjdr.util.Dialog; +import com.example.jmacro.wjdr.util.Logger; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.awt.image.BufferedImage; + +/** + * 采集坐标工具 + * + * @author wangbing + * @version 0.0.1 + * @since 1.8 + */ +public class Location extends JFrame { + + /** + * 参照原点x坐标 + */ + private int originX; + /** + * 参照原点y坐标 + */ + private int originY; + + /** + * x坐标 + */ + private int x; + /** + * y坐标 + */ + private int y; + + /** + * 全屏幕截图 + */ + private BufferedImage capture; + + /** + * 背景蒙层 + */ + private Color mask = new Color(0, 0, 0, 0.2f); + + /** + * 有参照原点的构造器 + * + * @param originX 原点x + * @param originY 原点y + * @throws AWTException + */ + public Location(int originX, int originY) throws AWTException { + this(); + this.originX = originX; + this.originY = originY; + } + + public Location() throws AWTException { + init(); + } + + private void init() throws AWTException { + setExtendedState(Frame.MAXIMIZED_BOTH); + setLocation(0, 0);//位置 + setUndecorated(true); + setAlwaysOnTop(true); + setBackground(mask); + setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); + + // 获取屏幕截图 + Robot robot = new Robot(); + Toolkit tk = Toolkit.getDefaultToolkit(); + capture = robot.createScreenCapture(new Rectangle(0, 0, tk.getScreenSize().width, tk.getScreenSize().height)); + + // 监听窗口关闭 + addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + // 关闭应用时要释放资源 + dispose(); + System.exit(0);//0正常退出,1非正常退出 + } + }); + + addMouseListener(new MouseAdapter() { + + @Override + public void mouseReleased(MouseEvent e) { + super.mouseReleased(e); + x = e.getX(); + y = e.getY(); + Logger.info("屏幕坐标:[{},{}]", x, y); + Logger.info("相对坐标:[{},{}]", x - originX, y - originY); + close(); + Dialog.confirm(StrUtil.format("屏幕坐标:[{},{}]\n相对坐标:[{},{}]", x, y, x - originX, y - originY)); + } + }); + + addMouseMotionListener(new MouseMotionAdapter() { + + @Override + public void mouseMoved(MouseEvent e) { + super.mouseMoved(e); + x = e.getX(); + y = e.getY(); + repaint(); + } + }); + + addKeyListener(new KeyAdapter() { + + @Override + public void keyReleased(KeyEvent e) { + switch (e.getKeyCode()) { + case KeyEvent.VK_ESCAPE: { + StaticLog.info("exit."); + close(); + } + break; + } + + } + }); + + setVisible(true); + } + + @Override + public void paint(Graphics g) { + super.paint(g); + Graphics2D g2d = (Graphics2D) g; + g2d.drawImage(capture, 0, 0, capture.getWidth(), capture.getHeight(), this); + + // 在背景图上加个蒙层 + g2d.setColor(mask); + g2d.fillRect(0, 0, capture.getWidth(), capture.getHeight()); + + g2d.setColor(Color.WHITE); + g2d.fillRect(x + 5, y + 5, 120, 35); + + g2d.setColor(Color.DARK_GRAY); + g2d.drawString(StrUtil.format("屏幕坐标[{},{}]", x, y), x + 10, y + 20); + g2d.drawString(StrUtil.format("相对坐标[{},{}]", x - originX, y - originY), x + 10, y + 35); + } + + public void close() { + setVisible(false); + dispose(); + } + + /** + * 工具入口 + * + * @param args + * @throws AWTException + */ + public static void main(String[] args) throws AWTException { + // 运行坐标图例截图工具 + new Location(5, 5); + } +} diff --git a/src/main/resources/main.fxml b/src/main/resources/main.fxml index 2fd1206..8077d1b 100644 --- a/src/main/resources/main.fxml +++ b/src/main/resources/main.fxml @@ -36,6 +36,10 @@