ICe 4 maanden geleden
bovenliggende
commit
6b348caf55
36 gewijzigde bestanden met toevoegingen van 383 en 65 verwijderingen
  1. 43 42
      conf/config.properties
  2. BIN
      opencv/scene/check.png
  3. BIN
      opencv/scene/explore/king/kings/skip2.png
  4. BIN
      opencv/scene/fight/vs/show.png
  5. BIN
      opencv/scene/fight/vs/showEvil.png
  6. BIN
      opencv/scene/fight/vs/showHero.png
  7. BIN
      opencv/scene/fight/vs/showNext.png
  8. BIN
      opencv/scene/fight/vs/showStart.png
  9. BIN
      opencv/scene/mail/extClose.png
  10. BIN
      opencv/scene/mail/extTake.png
  11. BIN
      opencv/scene/role/back.png
  12. BIN
      opencv/scene/role/canLvup.png
  13. BIN
      opencv/scene/role/check.png
  14. BIN
      opencv/scene/role/close.png
  15. BIN
      opencv/scene/role/dropPoint.png
  16. BIN
      opencv/scene/role/enter.png
  17. BIN
      opencv/scene/role/exp.png
  18. BIN
      opencv/scene/role/level.png
  19. BIN
      opencv/scene/role/ob.png
  20. BIN
      opencv/scene/role/over.png
  21. BIN
      opencv/scene/role/quick.png
  22. BIN
      opencv/scene/role/skill.png
  23. BIN
      opencv/scene/role/skillUp.png
  24. BIN
      opencv/scene/role/time3.png
  25. BIN
      opencv/scene/role/time30.png
  26. 6 7
      src/main/java/com/sencorsta/rabs/obj/ai/AiManage.java
  27. 40 8
      src/main/java/com/sencorsta/rabs/obj/ai/api/BaseScene.java
  28. 6 0
      src/main/java/com/sencorsta/rabs/obj/ai/api/Scene.java
  29. 8 3
      src/main/java/com/sencorsta/rabs/obj/ai/scene/SceneMain.java
  30. 5 0
      src/main/java/com/sencorsta/rabs/obj/ai/scene/explore/SceneMain_Explore_King_kings.java
  31. 4 0
      src/main/java/com/sencorsta/rabs/obj/ai/scene/family/SceneMain_Family_Help.java
  32. 16 1
      src/main/java/com/sencorsta/rabs/obj/ai/scene/fight/SceneMain_Fight_Endless.java
  33. 35 2
      src/main/java/com/sencorsta/rabs/obj/ai/scene/fight/SceneMain_Fight_VS.java
  34. 8 1
      src/main/java/com/sencorsta/rabs/obj/ai/scene/mail/SceneMain_Mail.java
  35. 169 0
      src/main/java/com/sencorsta/rabs/obj/ai/scene/role/SceneMain_Role.java
  36. 43 1
      src/main/java/com/sencorsta/rabs/util/ResettableData.java

+ 43 - 42
conf/config.properties

@@ -1,49 +1,50 @@
 []
-windowX = 152
-windowY = 502
+windowX = 278
+windowY = 332
 windowWidth = 1351.0
 windowHeight = 717.0
 extendedState = 0
 appTheme = Darcula Theme
 [robot]
-selectedWindowTitle = winServer - www.sencorsta.com:3389 - 远程桌面连接
-lastUpdateTime = 1715503822093
+selectedWindowTitle = sencorsta - sencorsta.com - 远程桌面连接
+lastUpdateTime = 1715563688297
 [SceneData]
-SceneMain_Fight_VS_Quick = {"data":{"isDone":false,"count":0,"done":false},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain = {"data":{"isDone":false,"count":0,"done":false},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Fight_Endless_Quick = {"data":{"isDone":true,"count":99,"done":true},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Fight = {"data":{"isDone":false,"count":0,"done":false},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Fight_VS = {"data":{"isDone":true,"count":99,"done":true},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Fight_Endless = {"data":{"isDone":true,"count":99,"done":true},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Qiyu_helper = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Qiyu = {"data":{"isDone":false,"count":0,"done":false},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Fight_Endless_Reward = {"data":{"isDone":true,"count":99,"done":true},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Qiyu_quest = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Qiyu_find = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Energy_Home = {"data":{"isDone":false,"count":2,"done":false},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Mail = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Energy = {"data":{"isDone":false,"count":0,"done":false},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Energy_Home_Select = {"data":{"isDone":false,"count":6,"done":false},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Energy_Friend = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Energy_Home_SelectRes = {"data":{"isDone":false,"count":4,"done":false},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Energy_Free = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Energy_buy = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Welfare = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Explore = {"data":{"isDone":false,"count":0,"done":false},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Explore_Leader = {"data":{"isDone":false,"count":0,"done":false},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Explore_Leader_quick = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Explore_King = {"data":{"isDone":false,"count":0,"done":false},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Explore_King_kings = {"data":{"isDone":false,"count":9,"done":false},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Family_Out_Boss = {"data":{"isDone":false,"count":3,"done":false},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Explore_Gift = {"data":{"isDone":false,"count":0,"done":false},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Family_Info = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Family_Out = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Challenge_Extreme = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Explore_King_hell = {"data":{"isDone":true,"count":99,"done":true},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Family = {"data":{"isDone":false,"count":0,"done":false},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Family_Out_Fight = {"data":{"isDone":false,"count":3,"done":false},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Family_Task = {"data":{"isDone":true,"count":99,"done":true},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Family_Help = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Explore_Gift_Evil = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Family_Out_BigBoss = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715547600000,"resetType":"DAILY"}
-SceneMain_Challenge = {"data":{"isDone":false,"count":0,"done":false},"nextResetTime":1715547600000,"resetType":"DAILY"}
+SceneMain = {"data":{"isDone":false,"count":0,"done":false},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Challenge = {"data":{"isDone":false,"count":0,"done":false},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Challenge_Extreme = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Energy = {"data":{"isDone":false,"count":0,"done":false},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Energy_Free = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715601600000,"resetType":"SPECIAL_RULES"}
+SceneMain_Energy_Friend = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Energy_Home = {"data":{"isDone":false,"count":2,"done":false},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Energy_Home_Select = {"data":{"isDone":false,"count":6,"done":false},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Energy_Home_SelectRes = {"data":{"isDone":false,"count":4,"done":false},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Energy_buy = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Explore = {"data":{"isDone":false,"count":0,"done":false},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Explore_Gift = {"data":{"isDone":false,"count":0,"done":false},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Explore_Gift_Evil = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Explore_King = {"data":{"isDone":false,"count":0,"done":false},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Explore_King_hell = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Explore_King_kings = {"data":{"isDone":false,"count":9,"done":false},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Explore_Leader = {"data":{"isDone":false,"count":0,"done":false},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Explore_Leader_quick = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Family = {"data":{"isDone":false,"count":0,"done":false},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Family_Help = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Family_Info = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Family_Out = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Family_Out_BigBoss = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Family_Out_Boss = {"data":{"isDone":false,"count":3,"done":false},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Family_Out_Fight = {"data":{"isDone":false,"count":3,"done":false},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Family_Task = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Fight = {"data":{"isDone":true,"count":99,"done":true},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Fight_Endless = {"data":{"isDone":false,"count":0,"done":false},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Fight_Endless_Quick = {"data":{"isDone":false,"count":0,"done":false},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Fight_Endless_Reward = {"data":{"isDone":false,"count":0,"done":false},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Fight_VS = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Fight_VS_Quick = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Mail = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Qiyu = {"data":{"isDone":false,"count":0,"done":false},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Qiyu_find = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Qiyu_helper = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Qiyu_quest = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Role = {"data":{"isDone":false,"count":0,"done":false},"nextResetTime":1715634000000,"resetType":"DAILY"}
+SceneMain_Welfare = {"data":{"isDone":true,"count":0,"done":true},"nextResetTime":1715634000000,"resetType":"DAILY"}

BIN
opencv/scene/check.png


BIN
opencv/scene/explore/king/kings/skip2.png


BIN
opencv/scene/fight/vs/show.png


BIN
opencv/scene/fight/vs/showEvil.png


BIN
opencv/scene/fight/vs/showHero.png


BIN
opencv/scene/fight/vs/showNext.png


BIN
opencv/scene/fight/vs/showStart.png


BIN
opencv/scene/mail/extClose.png


BIN
opencv/scene/mail/extTake.png


BIN
opencv/scene/role/back.png


BIN
opencv/scene/role/canLvup.png


BIN
opencv/scene/role/check.png


BIN
opencv/scene/role/close.png


BIN
opencv/scene/role/dropPoint.png


BIN
opencv/scene/role/enter.png


BIN
opencv/scene/role/exp.png


BIN
opencv/scene/role/level.png


BIN
opencv/scene/role/ob.png


BIN
opencv/scene/role/over.png


BIN
opencv/scene/role/quick.png


BIN
opencv/scene/role/skill.png


BIN
opencv/scene/role/skillUp.png


BIN
opencv/scene/role/time3.png


BIN
opencv/scene/role/time30.png


+ 6 - 7
src/main/java/com/sencorsta/rabs/obj/ai/AiManage.java

@@ -73,9 +73,6 @@ public class AiManage {
                 if (curScene == null) {
                     //检查当前界面是否为非主场景
                     curScene = sceneMap.values().stream().filter(o -> {
-                        if (o == rootScene) {
-                            return false;
-                        }
                         try {
                             boolean check = o.check();
                             if (check) {
@@ -108,7 +105,7 @@ public class AiManage {
                 } else {
                     System.out.println("进入 think = " + curScene.getClass().getSimpleName());
                     curScene.think();
-                    Scene undoneChildren = curScene.getChildren().stream().filter(o -> !o.isDone()).max(Comparator.comparingDouble(Scene::getPriority)).orElse(null);
+                    Scene undoneChildren = curScene.getChildren().stream().filter(o -> !o.isDone() && o.isOpen()).max(Comparator.comparingDouble(Scene::getPriority)).orElse(null);
                     if (ObjectUtil.isNotNull(undoneChildren)) {
                         System.out.println("进入 open = " + undoneChildren.getClass().getSimpleName());
                         undoneChildren.open();
@@ -176,15 +173,17 @@ public class AiManage {
 
     public void save() {
         if (sceneMap != null) {
-            sceneMap.values().stream().forEach(o -> {
-                AppConfig.getInstance().getSetting().setByGroup(o.getClass().getSimpleName(), "SceneData", o.getData());
+            String sceneDataKey = "SceneData";
+            AppConfig.getInstance().getSetting().getGroupedMap().clear(sceneDataKey);
+            sceneMap.values().stream().sorted(Comparator.comparing(o -> o.getClass().getSimpleName())).forEach(o -> {
+                AppConfig.getInstance().getSetting().setByGroup(o.getClass().getSimpleName(), sceneDataKey, o.getData());
             });
             AppConfig.getInstance().saveAll();
         }
     }
 
     public void forcePass() {
-        if (curScene!=null){
+        if (curScene != null) {
             curScene.forcePass();
         }
     }

+ 40 - 8
src/main/java/com/sencorsta/rabs/obj/ai/api/BaseScene.java

@@ -113,7 +113,7 @@ public class BaseScene {
             robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
             robot.mouseMove(currentMouseX, currentMouseY);
         } else {
-            System.out.println("图像不包含相似内容。" + filename + "maxCorrelation = " + maxCorrelation);
+            System.out.println("图像不包含相似内容 ==> filename = " + filename + " similarityThreshold = " + similarityThreshold + " maxCorrelation = " + maxCorrelation);
         }
     }
 
@@ -146,23 +146,48 @@ public class BaseScene {
 
             double distance = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
             double angle = Math.atan2(y2 - y1, x2 - x1);
-            for (double t = 0; t <= distance; t += 1) {
+            for (double t = 0; t <= distance; t += 2) {
                 int newX = (int) (x1 + t * Math.cos(angle));
                 int newY = (int) (y1 + t * Math.sin(angle));
                 robot.mouseMove(newX, newY);
-                ThreadUtil.sleep(8); // 为了模拟拖动的连续性,可以调整线程休眠时间
+                ThreadUtil.sleep(4); // 为了模拟拖动的连续性,可以调整线程休眠时间
             }
             robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
+            robot.mouseMove(currentMouseX, currentMouseY);
+        } else {
+            System.out.println("图像不包含相似内容 ==> filename = " + filename + " similarityThreshold = " + similarityThreshold + " maxCorrelation = " + maxCorrelation);
+        }
+    }
 
-
+    protected void moveToHold(String filename, double similarityThreshold, Point fixPoint, long time) throws AWTException {
+        Rectangle rectangle = RobotUtil.getRectangle(AiManage.getInstance().getWindowName());
+        Mat windowMat = RobotUtil.getWindowMat(rectangle);
+        Mat template = Imgcodecs.imread(filename);
+        Mat result = new Mat();
+        Imgproc.matchTemplate(windowMat, template, result, Imgproc.TM_CCOEFF_NORMED);
+        Core.MinMaxLocResult mmr = Core.minMaxLoc(result);
+        double maxCorrelation = mmr.maxVal;
+        Point matchLoc = mmr.maxLoc; // 获取匹配区域的左上角坐标
+        // 根据需要设置相似度的阈值
+        System.out.println("moveToHold ==> filename = " + filename + " similarityThreshold = " + similarityThreshold + " maxCorrelation = " + maxCorrelation);
+        if (maxCorrelation >= similarityThreshold) {
+            // 创建 Robot 对象
+            Robot robot = AiManage.getInstance().getRobot();
+            java.awt.Point currentMouseLocation = MouseInfo.getPointerInfo().getLocation();
+            int currentMouseX = currentMouseLocation.x;
+            int currentMouseY = currentMouseLocation.y;
+            // 将鼠标移动到匹配区域的左上角坐标
+            int x1 = rectangle.x + (int) matchLoc.x + template.cols() / 2 + (int) fixPoint.x;
+            int y1 = rectangle.y + (int) matchLoc.y + template.rows() / 2 + (int) fixPoint.y;
+            AiManage.getInstance().getLastClickPoint().setLocation(x1, y1);
+            // 拖动操作
             robot.mouseMove(x1, y1);
             robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
-            robot.mouseMove(x2, y2);
+            ThreadUtil.sleep(time); // 为了模拟拖动的连续性,可以调整线程休眠时间
             robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
-
             robot.mouseMove(currentMouseX, currentMouseY);
         } else {
-            System.out.println("图像不包含相似内容。" + filename + " maxCorrelation = " + maxCorrelation);
+            System.out.println("图像不包含相似内容 ==> filename = " + filename + " similarityThreshold = " + similarityThreshold + " maxCorrelation = " + maxCorrelation);
         }
     }
 
@@ -189,7 +214,7 @@ public class BaseScene {
     }
 
     protected boolean hasChildDone() {
-        return getChildren().stream().allMatch(Scene::isDone);
+        return getChildren().stream().filter(Scene::isOpen).allMatch(Scene::isDone);
     }
 
     /**
@@ -201,6 +226,13 @@ public class BaseScene {
         return Jsons.toJsonString(record);
     }
 
+    /**
+     * 是否开启
+     */
+    public boolean isOpen() {
+        return true;
+    }
+
     /**
      * 加载持久化数据
      *

+ 6 - 0
src/main/java/com/sencorsta/rabs/obj/ai/api/Scene.java

@@ -38,6 +38,12 @@ public interface Scene {
      */
     boolean isDone();
 
+    /**
+     * 是否开启
+     * @return bool
+     */
+    boolean isOpen();
+
     /**
      * 获取上级场景
      *

+ 8 - 3
src/main/java/com/sencorsta/rabs/obj/ai/scene/SceneMain.java

@@ -4,12 +4,14 @@ import com.sencorsta.rabs.annotation.SceneAnnotation;
 import com.sencorsta.rabs.obj.ai.api.BaseScene;
 import com.sencorsta.rabs.obj.ai.api.Scene;
 
+import java.awt.AWTException;
+
 /**
  * 主场景(走道)
  */
 @SceneAnnotation("")
 public class SceneMain extends BaseScene implements Scene {
-
+    private static String PathCheck = System.getProperty("user.dir") + "\\opencv\\scene\\check.png";
     @Override
     public void back() {
     }
@@ -19,8 +21,11 @@ public class SceneMain extends BaseScene implements Scene {
     }
 
     @Override
-    public boolean check() {
-        return true;
+    public boolean check() throws AWTException {
+        if (checkHas(PathCheck, 0.9)) {
+            return true;
+        }
+        return false;
     }
 
     @Override

+ 5 - 0
src/main/java/com/sencorsta/rabs/obj/ai/scene/explore/SceneMain_Explore_King_kings.java

@@ -29,6 +29,7 @@ public class SceneMain_Explore_King_kings extends BaseScene implements Scene {
     private static String PathFight = System.getProperty("user.dir") + "\\opencv\\scene\\explore\\king\\kings\\fight.png";
     private static String PathStart = System.getProperty("user.dir") + "\\opencv\\scene\\explore\\king\\kings\\start.png";
     private static String PathSkip = System.getProperty("user.dir") + "\\opencv\\scene\\explore\\king\\kings\\skip.png";
+    private static String PathSkip2 = System.getProperty("user.dir") + "\\opencv\\scene\\explore\\king\\kings\\skip2.png";
     private static String PathOver = System.getProperty("user.dir") + "\\opencv\\scene\\explore\\king\\kings\\over.png";
     private static String PathCancle = System.getProperty("user.dir") + "\\opencv\\scene\\explore\\king\\kings\\cancle.png";
     private static String PathReward = System.getProperty("user.dir") + "\\opencv\\scene\\explore\\king\\kings\\reward.png";
@@ -119,6 +120,10 @@ public class SceneMain_Explore_King_kings extends BaseScene implements Scene {
                 moveToClick(PathSkip, 0.9);
                 ThreadUtil.sleep(2000);
             }
+            if (checkHas(PathSkip2, 0.9)) {
+                moveToClick(PathSkip2, 0.9);
+                ThreadUtil.sleep(2000);
+            }
             ThreadUtil.sleep(1000);
         }
         ThreadUtil.sleep(2000);

+ 4 - 0
src/main/java/com/sencorsta/rabs/obj/ai/scene/family/SceneMain_Family_Help.java

@@ -100,6 +100,10 @@ public class SceneMain_Family_Help extends BaseScene implements Scene {
         moveToClick(PathSendAsk, 0.9);
         ThreadUtil.sleep(3000);
 
+
+        moveToClick(PathAsk, 0.9);
+        ThreadUtil.sleep(2000);
+
         moveToClick(PathPiece2, 0.9);
         ThreadUtil.sleep(3000);
 

+ 16 - 1
src/main/java/com/sencorsta/rabs/obj/ai/scene/fight/SceneMain_Fight_Endless.java

@@ -1,5 +1,7 @@
 package com.sencorsta.rabs.obj.ai.scene.fight;
 
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.date.Week;
 import cn.hutool.core.thread.ThreadUtil;
 import com.sencorsta.rabs.annotation.SceneAnnotation;
 import com.sencorsta.rabs.obj.ai.AiManage;
@@ -8,6 +10,7 @@ import com.sencorsta.rabs.obj.ai.api.Scene;
 import org.opencv.core.Point;
 
 import java.awt.AWTException;
+import java.util.Calendar;
 
 /**
  * 无尽 TODO ice 调整规则只有周2-6
@@ -44,7 +47,7 @@ public class SceneMain_Fight_Endless extends BaseScene implements Scene {
             }
 
             if (checkHas(PathLogin, 0.9)) {
-                moveToClick(PathLogin, 0.9,new Point(-50,-200));
+                moveToClick(PathLogin, 0.9, new Point(-50, -200));
                 ThreadUtil.sleep(2000);
                 moveToClick(PathLogin, 0.9);
                 ThreadUtil.sleep(2000);
@@ -75,4 +78,16 @@ public class SceneMain_Fight_Endless extends BaseScene implements Scene {
         return hasChildDone();
     }
 
+    /**
+     * 是否开启
+     */
+    @Override
+    public boolean isOpen() {
+        int weekDay = DateUtil.dayOfWeek(DateUtil.date());
+        if (weekDay == Calendar.MONDAY||weekDay == Calendar.SUNDAY) {
+            return false;
+        }
+        return true;
+    }
+
 }

+ 35 - 2
src/main/java/com/sencorsta/rabs/obj/ai/scene/fight/SceneMain_Fight_VS.java

@@ -1,12 +1,15 @@
 package com.sencorsta.rabs.obj.ai.scene.fight;
 
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.thread.ThreadUtil;
 import com.sencorsta.rabs.annotation.SceneAnnotation;
 import com.sencorsta.rabs.obj.ai.AiManage;
 import com.sencorsta.rabs.obj.ai.api.BaseScene;
 import com.sencorsta.rabs.obj.ai.api.Scene;
+import org.opencv.core.Point;
 
 import java.awt.AWTException;
+import java.util.Calendar;
 
 /**
  * 对决赛 TODO ice 调整规则只有周1-5
@@ -23,6 +26,11 @@ public class SceneMain_Fight_VS extends BaseScene implements Scene {
     private static String PathReword2 = System.getProperty("user.dir") + "\\opencv\\scene\\fight\\vs\\reword2.png";
     private static String PathGoldOver = System.getProperty("user.dir") + "\\opencv\\scene\\fight\\vs\\goldOver.png";
     private static String PathDimonOver = System.getProperty("user.dir") + "\\opencv\\scene\\fight\\vs\\dimonOver.png";
+    private static String PathShow = System.getProperty("user.dir") + "\\opencv\\scene\\fight\\vs\\show.png";
+    private static String PathShowStart = System.getProperty("user.dir") + "\\opencv\\scene\\fight\\vs\\showStart.png";
+    private static String PathShowNext = System.getProperty("user.dir") + "\\opencv\\scene\\fight\\vs\\showNext.png";
+    private static String PathShowHero = System.getProperty("user.dir") + "\\opencv\\scene\\fight\\vs\\showHero.png";
+    private static String PathShowEvil = System.getProperty("user.dir") + "\\opencv\\scene\\fight\\vs\\showEvil.png";
 
 
     @Override
@@ -37,12 +45,25 @@ public class SceneMain_Fight_VS extends BaseScene implements Scene {
             AiManage.getInstance().updateWindow();
             ThreadUtil.sleep(2000);
             if (checkHas(PathEnter, 0.9)) {
-                System.out.println("发现游戏对决赛界面...");
                 moveToClick(PathEnter, 0.9);
-                System.out.println("点击对决赛");
                 continue;
             }
 
+            if (checkHas(PathShow, 0.9)) {
+                moveToClick(PathShowStart, 0.9);
+                ThreadUtil.sleep(3000);
+                moveToClick(PathShowNext, 0.9);
+                ThreadUtil.sleep(3000);
+                moveToClick(PathShowHero, 0.9,new Point(-40,125));
+                ThreadUtil.sleep(3000);
+                randomToClick();
+                ThreadUtil.sleep(3000);
+                moveToClick(PathShowEvil, 0.9,new Point(50,125));
+                ThreadUtil.sleep(3000);
+                randomToClick();
+                ThreadUtil.sleep(3000);
+            }
+
         }
     }
 
@@ -74,4 +95,16 @@ public class SceneMain_Fight_VS extends BaseScene implements Scene {
         return getRecord().getData().isDone();
     }
 
+    /**
+     * 是否开启
+     */
+    @Override
+    public boolean isOpen() {
+        int weekDay = DateUtil.dayOfWeek(DateUtil.date());
+        if (weekDay == Calendar.SATURDAY||weekDay == Calendar.SUNDAY) {
+            return false;
+        }
+        return true;
+    }
+
 }

+ 8 - 1
src/main/java/com/sencorsta/rabs/obj/ai/scene/mail/SceneMain_Mail.java

@@ -24,6 +24,8 @@ public class SceneMain_Mail extends BaseScene implements Scene {
     private static String PathCheck = System.getProperty("user.dir") + "\\opencv\\scene\\mail\\check.png";
     private static String PathBack = System.getProperty("user.dir") + "\\opencv\\scene\\mail\\back.png";
     private static String PathOneButton = System.getProperty("user.dir") + "\\opencv\\scene\\mail\\oneButton.png";
+    private static String PathExtTake = System.getProperty("user.dir") + "\\opencv\\scene\\mail\\extTake.png";
+    private static String PathExtClose = System.getProperty("user.dir") + "\\opencv\\scene\\mail\\extClose.png";
 
     @Override
     public void back() throws AWTException {
@@ -56,7 +58,12 @@ public class SceneMain_Mail extends BaseScene implements Scene {
             moveToClick(PathOneButton, 0.9);
             ThreadUtil.sleep(4000);
             randomToClick();
-            ThreadUtil.sleep(4000);
+            ThreadUtil.sleep(6000);
+
+            if (checkHas(PathExtTake,0.9)){
+                moveToClick(PathExtClose, 0.9);
+                ThreadUtil.sleep(3000);
+            }
 
             getRecord().getData().setDone(true);
         }

+ 169 - 0
src/main/java/com/sencorsta/rabs/obj/ai/scene/role/SceneMain_Role.java

@@ -0,0 +1,169 @@
+package com.sencorsta.rabs.obj.ai.scene.role;
+
+import cn.hutool.core.thread.ThreadUtil;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.sencorsta.rabs.annotation.SceneAnnotation;
+import com.sencorsta.rabs.obj.ai.AiManage;
+import com.sencorsta.rabs.obj.ai.api.BaseScene;
+import com.sencorsta.rabs.obj.ai.api.Scene;
+import org.opencv.core.Point;
+
+import java.awt.AWTException;
+
+/**
+ * 角色信息
+ */
+@SceneAnnotation("SceneMain")
+public class SceneMain_Role extends BaseScene implements Scene {
+    @JsonIgnore
+    @Override
+    public float getPriority() {
+        return 9.0f;
+    }
+
+    private static String PathEnter = System.getProperty("user.dir") + "\\opencv\\scene\\role\\enter.png";
+    private static String PathCheck = System.getProperty("user.dir") + "\\opencv\\scene\\role\\check.png";
+    private static String PathBack = System.getProperty("user.dir") + "\\opencv\\scene\\role\\back.png";
+    private static String PathDropPoint = System.getProperty("user.dir") + "\\opencv\\scene\\role\\dropPoint.png";
+    private static String PathLevel = System.getProperty("user.dir") + "\\opencv\\scene\\role\\level.png";
+    private static String PathCanLvup = System.getProperty("user.dir") + "\\opencv\\scene\\role\\canLvup.png";
+    private static String PathExp = System.getProperty("user.dir") + "\\opencv\\scene\\role\\exp.png";
+    private static String PathQuick = System.getProperty("user.dir") + "\\opencv\\scene\\role\\quick.png";
+    private static String PathTime3 = System.getProperty("user.dir") + "\\opencv\\scene\\role\\time3.png";
+    private static String PathTime30 = System.getProperty("user.dir") + "\\opencv\\scene\\role\\time30.png";
+    private static String PathOver = System.getProperty("user.dir") + "\\opencv\\scene\\role\\over.png";
+    private static String PathClose = System.getProperty("user.dir") + "\\opencv\\scene\\role\\close.png";
+    private static String PathOb = System.getProperty("user.dir") + "\\opencv\\scene\\role\\ob.png";
+    private static String PathSkill = System.getProperty("user.dir") + "\\opencv\\scene\\role\\skill.png";
+    private static String PathSkillUp = System.getProperty("user.dir") + "\\opencv\\scene\\role\\skillUp.png";
+
+
+    @Override
+    public void back() throws AWTException {
+        moveToClick(PathBack, 0.9);
+    }
+
+    @Override
+    public void open() throws AWTException {
+        while (!check()) {
+            AiManage.getInstance().updateWindow();
+            ThreadUtil.sleep(2000);
+            if (checkHas(PathEnter, 0.9)) {
+                moveToClick(PathEnter, 0.9);
+                continue;
+            }
+        }
+    }
+
+    @Override
+    public boolean check() throws AWTException {
+        if (checkHas(PathCheck, 0.9)) {
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public void think() throws AWTException {
+        ThreadUtil.sleep(3000);
+        for (int i = 0; i < 15; i++) {
+            //拉到最左边
+            moveToDrop(PathDropPoint, 0.9, new Point(0, 100), new Point(-850, 100));
+            ThreadUtil.sleep(100);
+        }
+        //点击等级最低的角色
+        moveToClick(PathDropPoint,0.9,new Point(0, 100));
+        ThreadUtil.sleep(2000);
+
+        moveToClick(PathLevel,0.9);
+        ThreadUtil.sleep(2000);
+
+        while(!checkHas(PathCanLvup, 0.9)){
+            moveToHold(PathExp,0.9,new Point(0,0),10);
+            ThreadUtil.sleep(2000);
+        }
+
+        //依次点击4个位置快速完成一遍
+        moveToClick(PathDropPoint,0.9,new Point(-130, -274));
+        ThreadUtil.sleep(2000);
+        moveToClick(PathQuick,0.9);
+        ThreadUtil.sleep(2000);
+        moveToClick(PathTime3,0.9);
+        ThreadUtil.sleep(2000);
+        while(!checkHas(PathOver, 0.9)){
+            ThreadUtil.sleep(2000);
+        }
+        ThreadUtil.sleep(2000);
+        moveToClick(PathClose,0.9);
+        ThreadUtil.sleep(2000);
+
+        //第二个位置
+        moveToClick(PathDropPoint,0.9,new Point(-46, -274));
+        ThreadUtil.sleep(2000);
+        moveToClick(PathOb,0.9);
+        ThreadUtil.sleep(2000);
+        moveToClick(PathTime30,0.9);
+        ThreadUtil.sleep(2000);
+        while(!checkHas(PathOver, 0.9)){
+            ThreadUtil.sleep(2000);
+        }
+        ThreadUtil.sleep(2000);
+        moveToClick(PathClose,0.9);
+        ThreadUtil.sleep(2000);
+
+        //第三个位置
+        moveToClick(PathDropPoint,0.9,new Point(42, -274));
+        ThreadUtil.sleep(2000);
+        moveToClick(PathOb,0.9);
+        ThreadUtil.sleep(2000);
+        moveToClick(PathTime30,0.9);
+        ThreadUtil.sleep(2000);
+        while(!checkHas(PathOver, 0.9)){
+            ThreadUtil.sleep(2000);
+        }
+        ThreadUtil.sleep(2000);
+        moveToClick(PathClose,0.9);
+        ThreadUtil.sleep(2000);
+
+        //第四个位置
+        moveToClick(PathDropPoint,0.9,new Point(122, -274));
+        ThreadUtil.sleep(2000);
+        moveToClick(PathOb,0.9);
+        ThreadUtil.sleep(2000);
+        moveToClick(PathTime30,0.9);
+        ThreadUtil.sleep(2000);
+        while(!checkHas(PathOver, 0.9)){
+            ThreadUtil.sleep(2000);
+        }
+        ThreadUtil.sleep(2000);
+        moveToClick(PathClose,0.9);
+        ThreadUtil.sleep(2000);
+
+
+        moveToClick(PathCanLvup,0.9);
+        ThreadUtil.sleep(3000);
+
+        randomToClick();
+        ThreadUtil.sleep(3000);
+
+        moveToClick(PathSkill,0.9);
+        ThreadUtil.sleep(3000);
+
+        //点3下技能
+        for (int i = 0; i < 3; i++) {
+            moveToClick(PathSkillUp,0.9);
+            ThreadUtil.sleep(3000);
+        }
+
+        //关闭退出
+        moveToClick(PathBack, 0.9);
+    }
+
+    @Override
+
+    public boolean isDone() {
+        //return hasChildDone();
+        return false;
+    }
+
+}

+ 43 - 1
src/main/java/com/sencorsta/rabs/util/ResettableData.java

@@ -1,12 +1,15 @@
 package com.sencorsta.rabs.util;
 
 import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.date.LocalDateTimeUtil;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.sencorsta.rabs.obj.ai.api.Status;
 import lombok.AllArgsConstructor;
 import lombok.NoArgsConstructor;
 
+import java.util.Date;
 import java.util.function.Supplier;
 
 @AllArgsConstructor
@@ -74,11 +77,14 @@ public class ResettableData<T extends Status> {
                 String resetTime20 = today + " 20:00:00";
 
                 // 将重置时间转换为时间戳
+                long resetTime10Millis = DateUtil.parse(resetTime10).getTime();
                 long resetTime16Millis = DateUtil.parse(resetTime16).getTime();
                 long resetTime20Millis = DateUtil.parse(resetTime20).getTime();
 
                 // 比较当前时间与各个重置时间,并返回最近的重置时间的时间戳
-                if (currentTime < resetTime16Millis) {
+                if (currentTime < resetTime10Millis) {
+                    return resetTime10Millis;
+                } else if (currentTime < resetTime16Millis) {
                     return resetTime16Millis;
                 } else if (currentTime < resetTime20Millis) {
                     return resetTime20Millis;
@@ -91,6 +97,42 @@ public class ResettableData<T extends Status> {
         abstract long getNextResetTime();
     }
 
+    public static void main(String[] args) {
+        Date date = new Date();
+        for (int i = 0; i < 48; i++) {
+            DateTime dateTime = DateUtil.beginOfDay(date);
+            DateTime offset = dateTime.offset(DateField.HOUR, i);
+            long test = test(offset.getTime());
+            System.out.println(offset + " = " + DateTime.of(test).toString());
+        }
+    }
+
+    private static long test(long currentTime) {
+        // 获取今天的日期
+        String today = DateUtil.today();
+
+        // 定义重置时间
+        String resetTime10 = today + " 10:00:00";
+        String resetTime16 = today + " 16:00:00";
+        String resetTime20 = today + " 20:00:00";
+
+        // 将重置时间转换为时间戳
+        long resetTime10Millis = DateUtil.parse(resetTime10).getTime();
+        long resetTime16Millis = DateUtil.parse(resetTime16).getTime();
+        long resetTime20Millis = DateUtil.parse(resetTime20).getTime();
+
+        // 比较当前时间与各个重置时间,并返回最近的重置时间的时间戳
+        if (currentTime < resetTime10Millis) {
+            return resetTime10Millis;
+        } else if (currentTime < resetTime16Millis) {
+            return resetTime16Millis;
+        } else if (currentTime < resetTime20Millis) {
+            return resetTime20Millis;
+        } else {
+            return DateUtil.offsetDay(DateUtil.parse(resetTime10), 1).getTime();
+        }
+    }
+
     // 使用枚举来构造,确定重置的类型
     public ResettableData(ResetType type, Supplier<T> dataSupplier) {
         this.data = (dataSupplier != null) ? dataSupplier.get() : null;