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);