diff --git a/legend/仓库_体力罐头领取#L235,690.png b/legend/仓库_体力罐头领取#L235,690.png new file mode 100644 index 0000000..3e7519d Binary files /dev/null and b/legend/仓库_体力罐头领取#L235,690.png differ diff --git a/legend/仓库_体力罐头领取关闭#L440,126.png b/legend/仓库_体力罐头领取关闭#L440,126.png new file mode 100644 index 0000000..272015c Binary files /dev/null and b/legend/仓库_体力罐头领取关闭#L440,126.png differ diff --git a/legend/野外_攻击#L249,433.png b/legend/野外_攻击#L249,433.png new file mode 100644 index 0000000..1fa158d Binary files /dev/null and b/legend/野外_攻击#L249,433.png differ diff --git a/legend/野外_攻击出征#L385,872.png b/legend/野外_攻击出征#L385,872.png new file mode 100644 index 0000000..3efad89 Binary files /dev/null and b/legend/野外_攻击出征#L385,872.png differ diff --git a/legend/野外_攻击平均配置#L186,914.png b/legend/野外_攻击平均配置#L186,914.png new file mode 100644 index 0000000..efc0b76 Binary files /dev/null and b/legend/野外_攻击平均配置#L186,914.png differ diff --git a/src/main/java/xyz/wbsite/jmacro/JMacro.java b/src/main/java/xyz/wbsite/jmacro/JMacro.java index fe6f80d..6863daa 100644 --- a/src/main/java/xyz/wbsite/jmacro/JMacro.java +++ b/src/main/java/xyz/wbsite/jmacro/JMacro.java @@ -638,6 +638,51 @@ public abstract class JMacro { return waitAndFindLegend(getFocusRect(), Legend.inflate(legend), minSimilar, defaultTimeOut); } + /** + * 匹配图例和点击 + * + * @param legend 图例 + * @param minSimilar 最低相似度 + * @return 是否成功 + */ + public boolean matchLegendAndClick(String legend, double minSimilar) { + ViewRect matchLegend = matchLegend(legend, minSimilar); + if (matchLegend != null) { + mouseLeftClick(matchLegend); + return true; + } else { + return false; + } + } + + /** + * 匹配图例和点击 + * + * @param legend 图例 + * @param minSimilar 最低相似度 + * @return 是否成功 + */ + public boolean matchLegendAndClick(Legend legend, double minSimilar) { + ViewRect matchLegend = matchLegend(legend, minSimilar); + if (matchLegend != null) { + mouseLeftClick(matchLegend); + return true; + } else { + return false; + } + } + + /** + * 匹配图例 + * + * @param legend 图例 + * @param minSimilar 最低相似度 + * @return 匹配图片 + */ + public ViewRect matchLegend(String legend, double minSimilar) { + return matchLegend(Legend.inflate(legend), minSimilar); + } + /** * 匹配图例 * @@ -660,17 +705,6 @@ public abstract class JMacro { return findPic(viewRect, image, minSimilar, false); } - /** - * 匹配图例 - * - * @param legend 图例 - * @param minSimilar 最低相似度 - * @return 匹配图片 - */ - public ViewRect matchLegend(String legend, double minSimilar) { - return matchLegend(Legend.inflate(legend), minSimilar); - } - /** * 等待并匹配图例 * 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 141b652..ab54b24 100644 --- a/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_仓库奖励领取.java +++ b/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_仓库奖励领取.java @@ -65,14 +65,20 @@ public class Task_仓库奖励领取 extends BaseTask { macro.delay(1000); } - Logger.info("检测体力宝箱/罐头"); - ViewRect 仓库_体力罐头 = macro.matchLegend("仓库_体力罐头", 0.5); + Logger.info("检测体力罐头"); + ViewRect 仓库_体力罐头 = macro.waitAndMatchLegend("仓库_体力罐头", 0.5, 5); if (仓库_体力罐头 == null) { Logger.info("无体力宝箱"); return; } else { Logger.info("领取体力罐头"); macro.mouseLeftClick(仓库_体力罐头); + macro.delay(1000); + + ViewRect 仓库_体力罐头领取 = macro.matchLegend("仓库_体力罐头领取", 0.8); + if (仓库_体力罐头领取 != null) { + macro.mouseLeftClick(仓库_体力罐头领取); + } } macro.delay(1000); } 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 a1f72a5..ca77b3c 100644 --- a/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_定位城镇.java +++ b/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_定位城镇.java @@ -21,6 +21,13 @@ public class Task_定位城镇 extends BaseTask { return; } } + {// 仓库_体力罐头领取关闭 + ViewRect rect = macro.matchLegend("仓库_体力罐头领取关闭", 0.9); + if (rect != null) { + macro.mouseLeftClick(rect); + Logger.info("返回城镇"); + } + } {// 探险返回 ViewRect rect = macro.matchLegend("探险_返回", 0.9); if (rect != null) { diff --git a/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_自动野怪.java b/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_自动野怪.java new file mode 100644 index 0000000..1042f53 --- /dev/null +++ b/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_自动野怪.java @@ -0,0 +1,317 @@ +package xyz.wbsite.jmacro.wjdr.task; + +import cn.hutool.json.JSONUtil; +import xyz.wbsite.jmacro.JMacro; +import xyz.wbsite.jmacro.base.ViewRect; +import xyz.wbsite.jmacro.util.Logger; + +public class Task_自动野怪 extends BaseTask { + + public boolean 队列1空闲; + public boolean 队列2空闲; + public boolean 队列3空闲; + public boolean 队列4空闲; + public boolean 队列5空闲; + public boolean 队列6空闲; + + public Task_自动野怪(JMacro macro, ViewRect viewRect) { + super(macro, viewRect); + } + + @Override + public void task(JMacro macro, ViewRect viewRect) { + { + Logger.info("打开面板,读取行军状态"); + ViewRect[] viewRects = macro.matchLegends(0.6, "城镇_打开面板", "城镇_关闭面板"); + if (viewRects[0] == null && viewRects[1] == null) { + Logger.error("检测面板状态失败"); + return; + } + + if (viewRects[0] != null) { + Logger.info("打开面板"); + macro.mouseLeftClick(viewRects[0]); + macro.delay(1000); + } + + Logger.info("选中野外"); + macro.mouseLeftClick(macro.of(245, 200)); + macro.delay(1000); + + ViewRect[] viewRects1 = macro.matchLegends(0.6D, + "城镇_面板_空闲1", + "城镇_面板_空闲2", + "城镇_面板_空闲3", + "城镇_面板_空闲4", + "城镇_面板_空闲5", + "城镇_面板_空闲6" + ); + + if (null != macro.matchLegend("城镇_面板_空闲1", 0.6D)) { + 队列1空闲 = true; + Logger.info("队列1空闲"); + } + if (null != macro.matchLegend("城镇_面板_空闲2", 0.6D)) { + 队列2空闲 = true; + Logger.info("队列2空闲"); + } + if (null != macro.matchLegend("城镇_面板_空闲3", 0.6D)) { + 队列3空闲 = true; + Logger.info("队列3空闲"); + } + if (null != macro.matchLegend("城镇_面板_空闲4", 0.6D)) { + 队列4空闲 = true; + Logger.info("队列4空闲"); + } + if (null != macro.matchLegend("城镇_面板_空闲5", 0.6D)) { + 队列5空闲 = true; + Logger.info("队列5空闲"); + } + if (null != macro.matchLegend("城镇_面板_空闲6", 0.6D)) { + 队列6空闲 = true; + Logger.info("队列6空闲"); + } + } + + ViewRect 城镇_关闭面板 = macro.matchLegend("城镇_关闭面板", 0.6); + if (城镇_关闭面板 == null) { + Logger.info("关闭面板异常"); + return; + } + Logger.info("关闭面板"); + macro.mouseLeftClick(城镇_关闭面板); + + Logger.info("定位【野外】"); + ViewRect 野外 = macro.matchLegend("野外", 0.99); + if (野外 == null) { + Logger.error("定位【野外】失败,刷怪终止"); + return; + } + Logger.info("定位【野外】成功,{}", 野外.toString()); + + Logger.info("点击【野外】,坐标{}", JSONUtil.toJsonStr(野外.getCenter())); + macro.mouseLeftClick(野外); + macro.delayUnstable(); + Logger.info("定位野外按钮成功"); + + if (队列1空闲) { + Logger.info("队列一派去打野怪"); + boolean success = challenge(15); + if (!success) { // 中断采集 + return; + } + } + + if (队列2空闲) { + Logger.info("队列一派去打野怪"); + boolean success = challenge(15); + if (!success) { // 中断采集 + return; + } + } + if (队列3空闲) { + Logger.info("队列一派去打野怪"); + boolean success = challenge(15); + if (!success) { // 中断采集 + return; + } + } + if (队列4空闲) { + Logger.info("队列一派去打野怪"); + boolean success = challenge(15); + if (!success) { // 中断采集 + return; + } + } + + if (队列5空闲) { + Logger.info("队列一派去打野怪"); + boolean success = challenge(15); + if (!success) { // 中断采集 + return; + } + } + if (队列6空闲) { + Logger.info("队列一派去打野怪"); + boolean success = challenge(15); + if (!success) { // 中断采集 + return; + } + } + + // 检测是否是搜索界面 + ViewRect 野外_任务2 = macro.matchLegend("野外_任务", 0.9); + if (野外_任务2 != null) { + Logger.info("退出资源搜索界面"); + macro.mouseLeftClick(this.viewRect); + } + + ViewRect 城1 = macro.waitAndMatchLegend("城镇", 0.9); + if (城1 == null) { + Logger.error("未检测到【城镇】,异常终止"); + return; + } + macro.mouseLeftClick(城1); + Logger.info("返回城镇"); + } + + /** + * @param level 等级(0为重置) + * @return 采集是否结束(满队则返回true,接下来的采集也不需要了) + */ + private boolean challenge(int level) { + Logger.info("查看放大镜搜索"); + ViewRect 野外_放大镜搜索 = macro.waitAndMatchLegend("野外_放大镜搜索", 0.4); + if (野外_放大镜搜索 == null) { + Logger.error("未检测到【放大镜搜索】,采矿终止"); + return false; + } + + Logger.info("点击放大镜搜索按钮"); + macro.mouseLeftClick(野外_放大镜搜索); + + Logger.info("等待搜索面板"); + ViewRect 野外_搜索面板_搜索按钮 = macro.waitAndMatchLegend("野外_搜索面板_搜索按钮", 0.9); + if (野外_搜索面板_搜索按钮 == null) { + Logger.error("未检测到【待搜索面板】,采矿终止"); + return false; + } + + Logger.info("点击野兽"); + macro.mouseLeftDrag(macro.of(61, 682), macro.of(433, 679), true); + macro.delay(1000); + macro.mouseLeftClick(macro.of(60, 677)); + macro.delay(1000); + + switch (level) { + case 1: + macro.mouseLeftClick(macro.of(93, 778)); + break; + case 2: + macro.mouseLeftClick(macro.of(101, 778)); + break; + case 3: + macro.mouseLeftClick(macro.of(109, 778)); + break; + case 4: + macro.mouseLeftClick(macro.of(117, 778)); + break; + case 5: + macro.mouseLeftClick(macro.of(125, 778)); + break; + case 6: + macro.mouseLeftClick(macro.of(133, 778)); + break; + case 7: + macro.mouseLeftClick(macro.of(141, 778)); + break; + case 8: + macro.mouseLeftClick(macro.of(149, 778)); + break; + case 9: + macro.mouseLeftClick(macro.of(157, 778)); + break; + case 10: + macro.mouseLeftClick(macro.of(165, 778)); + break; + case 11: + macro.mouseLeftClick(macro.of(173, 778)); + break; + case 12: + macro.mouseLeftClick(macro.of(181, 778)); + break; + case 13: + macro.mouseLeftClick(macro.of(189, 778)); + break; + case 14: + macro.mouseLeftClick(macro.of(197, 778)); + break; + case 15: + macro.mouseLeftClick(macro.of(205, 778)); + break; + case 16: + macro.mouseLeftClick(macro.of(213, 778)); + break; + case 17: + macro.mouseLeftClick(macro.of(221, 778)); + break; + case 18: + macro.mouseLeftClick(macro.of(229, 778)); + break; + case 19: + macro.mouseLeftClick(macro.of(237, 778)); + break; + case 20: + macro.mouseLeftClick(macro.of(245, 778)); + break; + case 21: + macro.mouseLeftClick(macro.of(253, 778)); + break; + case 22: + macro.mouseLeftClick(macro.of(261, 778)); + break; + case 23: + macro.mouseLeftClick(macro.of(269, 778)); + break; + case 24: + macro.mouseLeftClick(macro.of(277, 778)); + break; + case 25: + macro.mouseLeftClick(macro.of(285, 778)); + break; + case 26: + macro.mouseLeftClick(macro.of(293, 778)); + break; + case 27: + macro.mouseLeftClick(macro.of(301, 778)); + break; + case 28: + macro.mouseLeftClick(macro.of(309, 778)); + break; + case 29: + macro.mouseLeftClick(macro.of(317, 778)); + break; + case 30: + macro.mouseLeftClick(macro.of(325, 778)); + break; + } + + ViewRect 野外_资源搜索 = macro.matchLegend("野外_资源搜索", 0.9); + if (野外_资源搜索 == null) { + Logger.error("定位【野外_资源搜索】失败,挑战终止"); + return false; + } + + Logger.info("点击搜索{}级野怪", level); + macro.mouseLeftClick(野外_资源搜索); + macro.delay(1500); + + ViewRect 野外_攻击 = macro.waitAndMatchLegend("野外_攻击", 0.9); + if (野外_攻击 != null) { + macro.mouseLeftClick(野外_攻击); + macro.delay(1000); + + macro.matchLegendAndClick("野外_攻击平均配置", 0.9); + macro.delay(1000); + + ViewRect[] viewRects = macro.waitAndMatchLegends(0.9, "野外_攻击出征", "野外_资源无对队列"); + if (viewRects[0] != null) { + Logger.info("出征"); + macro.mouseLeftClick(viewRects[0]); + return true; + } + if (viewRects[1] != null) { + Logger.info("队列已满,取消采集"); + macro.mouseLeftClick(macro.of(471, 250)); + return false; + } + if (viewRects[2] != null) { + Logger.info("士兵不足,取消采集"); + macro.mouseLeftClick(macro.of(32, 30)); + return false; + } + } + + return true; + } +}