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/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
index 8a7375f..ed31708 100644
--- a/.idea/inspectionProfiles/Project_Default.xml
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -61,6 +61,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index f63dcb6..b5edd2c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,7 +13,7 @@
UTF-8
UTF-8
- 11
+ 8
true
@@ -49,15 +49,6 @@
jintellitype
1.4.0
-
-
-
- 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 0bd888a..625abb2 100644
--- a/src/main/java/com/example/jmacro/wjdr/JMacro.java
+++ b/src/main/java/com/example/jmacro/wjdr/JMacro.java
@@ -39,6 +39,7 @@ public class JMacro {
// 机器人初始化
this.robot = new Robot();
this.robot.setAutoDelay(100);
+ this.legend = new File("legend");
}
public JMacro(File legend) throws AWTException {
@@ -46,6 +47,14 @@ public class JMacro {
this.legend = legend;
}
+ public File getLegend() {
+ return legend;
+ }
+
+ public void setLegend(File legend) {
+ this.legend = legend;
+ }
+
/**
* 键盘按键组
*/
diff --git a/src/main/java/com/example/jmacro/wjdr/JMacroThread.java b/src/main/java/com/example/jmacro/wjdr/JMacroThread.java
index 1ddf42f..3d7fbc6 100644
--- a/src/main/java/com/example/jmacro/wjdr/JMacroThread.java
+++ b/src/main/java/com/example/jmacro/wjdr/JMacroThread.java
@@ -1,9 +1,10 @@
package com.example.jmacro.wjdr;
+import com.example.jmacro.wjdr.base.ScreenRect;
+
/**
* 脚本执行线程
*
- *
* @author wangbing
* @version 0.0.1
* @since 1.8
@@ -15,4 +16,11 @@ public abstract class JMacroThread implements Runnable {
public JMacroThread(JMacro jMacro) {
this.jMacro = jMacro;
}
+
+ /**
+ * 获取视口区域
+ *
+ * @return 视口区域
+ */
+ public abstract ScreenRect getScreen();
}
diff --git a/src/main/java/com/example/jmacro/wjdr/JMainApplication.java b/src/main/java/com/example/jmacro/wjdr/JMainApplication.java
new file mode 100644
index 0000000..4a0173b
--- /dev/null
+++ b/src/main/java/com/example/jmacro/wjdr/JMainApplication.java
@@ -0,0 +1,42 @@
+package com.example.jmacro.wjdr;
+
+import com.example.jmacro.wjdr.demo.DemoThread;
+import com.example.jmacro.wjdr.ui.FXMLUtil;
+import com.example.jmacro.wjdr.util.ResourceUtil;
+import javafx.application.Application;
+import javafx.fxml.FXMLLoader;
+import javafx.scene.Scene;
+import javafx.scene.image.Image;
+import javafx.stage.Stage;
+
+/**
+ * UI入口
+ */
+public class JMainApplication extends Application {
+
+ @Override
+ public void start(Stage stage) throws Exception {
+ stage.setTitle("无限工具");
+ stage.setMinWidth(400);
+ stage.setMinHeight(300);
+ FXMLLoader mainLoader = FXMLUtil.load("main.fxml");
+ stage.setScene(new Scene(mainLoader.getRoot()));
+ stage.centerOnScreen();
+ stage.show();
+ stage.setOnCloseRequest(event -> {
+ stage.close();
+ System.exit(0);
+ });
+ // 设置图标
+ Image icon = new Image(ResourceUtil.getInput("/icon.png"));
+ stage.getIcons().add(icon);
+ // 展示UI
+ stage.show();
+ // 启动服务
+ JMainService.start();
+ }
+
+ public static void main(String[] args) {
+ launch(args);
+ }
+}
diff --git a/src/main/java/com/example/jmacro/wjdr/JMainController.java b/src/main/java/com/example/jmacro/wjdr/JMainController.java
new file mode 100644
index 0000000..258236b
--- /dev/null
+++ b/src/main/java/com/example/jmacro/wjdr/JMainController.java
@@ -0,0 +1,30 @@
+package com.example.jmacro.wjdr;
+
+import com.example.jmacro.wjdr.base.ScreenRect;
+import com.example.jmacro.wjdr.util.Capture;
+import com.example.jmacro.wjdr.util.Logger;
+import javafx.fxml.FXML;
+
+import java.awt.*;
+import java.io.File;
+
+public class JMainController {
+
+ /**
+ * 截图
+ */
+ @FXML
+ private void onCapture() throws AWTException {
+ ScreenRect screen = JMainService.getInstance().getThread().getScreen();
+ File legend = JMainService.getInstance().getMacro().getLegend();
+ if (screen == null) {
+ Logger.error("请等待窗口定位");
+ return;
+ }
+ try {
+ new Capture(screen.getLeft(), screen.getTop(), legend);
+ } 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
new file mode 100644
index 0000000..9075eb0
--- /dev/null
+++ b/src/main/java/com/example/jmacro/wjdr/JMainService.java
@@ -0,0 +1,124 @@
+package com.example.jmacro.wjdr;
+
+import cn.hutool.core.thread.ThreadUtil;
+import com.example.jmacro.wjdr.demo.DemoThread;
+import com.example.jmacro.wjdr.util.Logger;
+
+import java.awt.*;
+import java.io.File;
+
+/**
+ * 主线程
+ *
+ * @author wangbing
+ * @version 0.0.1
+ * @since 1.8
+ */
+public class JMainService {
+
+ private static JMainService instance;
+
+ private JMacroThread thread;
+
+ private JMainService() throws AWTException {
+ // 脚本初始化
+ Logger.info("初始化脚本");
+ jMacro = new JMacro();
+ thread = new DemoThread(jMacro);
+ }
+
+ public static synchronized JMainService getInstance() throws AWTException {
+ if (instance == null) {
+ JMainService.instance = new JMainService();
+ }
+ return instance;
+ }
+
+ public JMacroThread getThread() {
+ return thread;
+ }
+
+ public JMacro getMacro() {
+ return jMacro;
+ }
+
+ /**
+ * 脚本对象
+ */
+ private final JMacro jMacro;
+
+ /**
+ * 服务运行状态
+ */
+ private boolean run;
+
+ public static void start() throws AWTException {
+ // 启动服务
+ Logger.info("启动服务");
+ JMainService.getInstance().run = true;
+ // 启动后台线程
+ JMainService.getInstance().serviceThread.start();
+ }
+
+ public static void stop() throws AWTException {
+ Logger.info("停止服务");
+ JMainService.getInstance().run = false;
+ JMainService.getInstance().serviceThread.interrupt();
+ }
+
+ /**
+ * 设置图例路径
+ *
+ * @param legend 图例路径
+ */
+ public void setLegend(File legend) {
+ if (this.jMacro != null) {
+ this.jMacro.setLegend(legend);
+ }
+ }
+
+ /**
+ * 服务线程
+ */
+ public Thread serviceThread = new Thread() {
+
+ @Override
+ public void run() {
+ while (run) {
+ ThreadUtil.sleep(1000);
+ if (thread == null) {
+ Logger.error("脚本线程未设置");
+ continue;
+ }
+ thread.run();
+ // 立即执行
+// if (noDelay) {
+// if (schedule != null) {
+// schedule.cancel(true);
+// }
+//
+// noDelay = false;
+// Logger.info("启动线程");
+// schedule = TaskUtil.schedule(new MacroThread(jMacro), 0, TimeUnit.SECONDS);
+// continue;
+// }
+// if (schedule != null) {
+// continue;
+// }
+//
+// if (DateUtil.isIn(DateUtil.date(), DateUtil.parse(workStart), DateUtil.parse(workEnd))) {
+// int delay = RandomUtil.randomInt(5, 20);
+// Logger.info("等待{}分钟后,重新启动线程", delay);
+// schedule = TaskUtil.schedule(new MacroThread(jMacro), delay, TimeUnit.MINUTES);
+// }
+ }
+ }
+ };
+
+ /**
+ * 启动入口
+ */
+ public static void main(String[] args) throws AWTException {
+ new JMainService().start();
+ }
+}
diff --git a/src/main/java/com/example/jmacro/wjdr/MainTask.java b/src/main/java/com/example/jmacro/wjdr/MainTask.java
deleted file mode 100644
index e616c3e..0000000
--- a/src/main/java/com/example/jmacro/wjdr/MainTask.java
+++ /dev/null
@@ -1,258 +0,0 @@
-package com.example.jmacro.wjdr;
-
-import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.img.ImgUtil;
-import cn.hutool.core.thread.ThreadUtil;
-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;
-
-import javax.swing.*;
-import java.awt.*;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.io.File;
-import java.net.URL;
-import java.util.concurrent.ScheduledFuture;
-import java.util.concurrent.TimeUnit;
-
-/**
- * 主线程
- *
- * @author wangbing
- * @version 0.0.1
- * @since 1.8
- */
-public class MainTask extends JFrame {
-
- /**
- * 脚本线程
- */
- private static ScheduledFuture> schedule;
-
- /**
- * 工作开始时间
- */
- private final String workStart = "08:00:00";
-
- /**
- * 工作结束时间
- */
- private final String workEnd = "24:00:00";
-
- private boolean noDelay = true;
-
- /**
- * 脚本对象
- */
- private JMacro jMacro;
-
- /**
- * 主屏幕区域
- */
- private ScreenRect gameScreen;
-
- public void start() throws AWTException {
- // 加载主题
- try {
- org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF();
- } catch (Exception e) {
- e.printStackTrace();
- }
- // 设置标题
- setTitle("无限工具");
- // 设置图标
- URL icon = this.getClass().getClassLoader().getResource("icon.png");
- setIconImage(ImgUtil.read(icon));
- // 脚本初始化
- Logger.info("初始化脚本");
- jMacro = new JMacro(new File("legend"));
- // 设置窗口的宽度和高度
- setSize(400, 300); // 设置窗口的宽度为400像素,高度为300像素
- // 添加一个标签作为示例内容
- JButton button = new JButton();
- button.setText("采图");
- button.setSize(100, 40);
- button.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(MouseEvent e) {
- super.mouseClicked(e);
- if (gameScreen == null) {
- Logger.error("请等待窗口定位");
- return;
- }
- try {
- new Capture(gameScreen.getLeft(), gameScreen.getTop(), new File("legend"));
- } catch (AWTException awtException) {
- awtException.printStackTrace();
- }
- }
- });
- getContentPane().add(button);
- // 设置窗口关闭时的操作
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- // 启动后台线程
- startBack();
- center();
- // 显示窗口
- setVisible(true);
- }
-
- /**
- * 居中
- */
- private void center() {
- // 获取屏幕尺寸
- java.awt.Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
- // 获取窗口尺寸
- java.awt.Dimension frameSize = getSize();
- // 计算窗口居中位置
- setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
- }
-
- /**
- * 后台线程
- */
- public void startBack() {
- Logger.setDebug(true);
-
- new Thread(() -> {
- while (true) {
- ThreadUtil.sleep(1000);
-
- // 立即执行
- if (noDelay) {
- if (schedule != null) {
- schedule.cancel(true);
- }
-
- noDelay = false;
- Logger.info("启动线程");
- schedule = TaskUtil.schedule(new MacroThread(jMacro), 0, TimeUnit.SECONDS);
- continue;
- }
- if (schedule != null) {
- continue;
- }
-
- if (DateUtil.isIn(DateUtil.date(), DateUtil.parse(workStart), DateUtil.parse(workEnd))) {
- int delay = RandomUtil.randomInt(5, 20);
- Logger.info("等待{}分钟后,重新启动线程", delay);
- schedule = TaskUtil.schedule(new MacroThread(jMacro), delay, TimeUnit.MINUTES);
- }
- }
- }).start();
- }
-
- /**
- * 主线程实现
- */
- public class MacroThread extends JMacroThread {
-
- public MacroThread(JMacro jMacro) {
- super(jMacro);
- }
-
- @Override
- public void run() {
- // 定位mumu bar
- Logger.info("定位慕慕窗口");
- ScreenRect mumu = jMacro.findPic("慕慕_工具栏", 0.95d);
- if (mumu == null) {
- throw new IllegalStateException("未检测到MuMu,请开启MuMu模拟器");
- }
- Logger.info("定位慕慕窗口成功");
- // 计算应用窗口返回
- gameScreen = new ScreenRect();
- 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());
- // 获取启动图标
- Logger.info("定位启动图标");
- ScreenRect launch = jMacro.waitAndFindPic(gameScreen, "启动图标", 0.8);
- if (launch != null) {
- Logger.info("启动图标坐标:", launch.toString());
- Logger.info("启动程序");
- jMacro.delay();
- jMacro.mouseLeftClick(launch);
- } else {
- Logger.info("启动图标失败,继续定位主界面");
- }
- Logger.info("定位主界面");
- ScreenRect 城镇 = TaskUtil.timeTask(() -> {
- while (true) {
- jMacro.delay();
- { // 定位弹框,关闭弹框
- Logger.info("检测到广告弹框");
- ScreenRect rect = jMacro.matchPic(gameScreen, "城镇_充值_L448,36", 0.8d);
- if (rect != null) {
- jMacro.mouseLeftClick(rect);
- Logger.info("检测到广告弹框,关闭弹框");
- }
- }
-
- jMacro.delay();
- { // 定位离线收益弹框,关闭弹框
- ScreenRect rect = jMacro.matchPic(gameScreen, "城镇_离线收益_L204,734", 0.9);
- if (rect != null) {
- jMacro.mouseLeftClick(rect);
- Logger.info("检测到离线收益弹框,关闭弹框");
- }
- }
-
- jMacro.delay();
- // 定位主程序
- ScreenRect rect = jMacro.matchPic(gameScreen, "野外_L444,888", 0.9);
- if (rect != null) {
- Logger.info("程序主界面已就绪");
- return rect;
- }
- }
- }, 30, TimeUnit.SECONDS);
-
- if (城镇 == null) {
- schedule.cancel(true);
- schedule = null;
- Logger.info("未扫描到主界面:退出线程");
-
- return;
- }
-
- Logger.info("进入主界面");
-
- Logger.info("进入任务线程");
- TaskUtil.timeTask((Runnable) () -> {
- while (true) {
-
- // 矿场攻击检测任务
- jMacro.delayNormal();
- new TaskMineAttack(jMacro, gameScreen).run();
-
- // 矿场攻击检测任务
- jMacro.delayNormal();
- new TaskRewards(jMacro, gameScreen).run();
-
- // 自动采矿任务
- jMacro.delayNormal();
- new TaskMining(jMacro, gameScreen).run();
-
- }
- }, 10, TimeUnit.MINUTES);
- }
- }
-
- /**
- * 启动入口
- */
- public static void main(String[] args) throws AWTException {
- new MainTask().start();
- }
-}
diff --git a/src/main/java/com/example/jmacro/wjdr/demo/DemoThread.java b/src/main/java/com/example/jmacro/wjdr/demo/DemoThread.java
new file mode 100644
index 0000000..42580d7
--- /dev/null
+++ b/src/main/java/com/example/jmacro/wjdr/demo/DemoThread.java
@@ -0,0 +1,138 @@
+package com.example.jmacro.wjdr.demo;
+
+import com.example.jmacro.wjdr.JMacro;
+import com.example.jmacro.wjdr.JMacroThread;
+import com.example.jmacro.wjdr.base.ScreenRect;
+import com.example.jmacro.wjdr.demo.task.TaskMineAttack;
+import com.example.jmacro.wjdr.demo.task.TaskMining;
+import com.example.jmacro.wjdr.demo.task.TaskRewards;
+import com.example.jmacro.wjdr.util.Logger;
+import com.example.jmacro.wjdr.util.TaskUtil;
+
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+public class DemoThread extends JMacroThread {
+
+ /**
+ * 视口
+ */
+ private ScreenRect gameScreen;
+
+ /**
+ * 脚本线程
+ */
+ private static ScheduledFuture> schedule;
+
+ /**
+ * 工作开始时间
+ */
+ private final String workStart = "08:00:00";
+
+ /**
+ * 工作结束时间
+ */
+ private final String workEnd = "24:00:00";
+
+ /**
+ * 是否立即执行
+ */
+ private boolean noDelay = true;
+
+ public DemoThread(JMacro jMacro) {
+ super(jMacro);
+ }
+
+ @Override
+ public ScreenRect getScreen() {
+ return gameScreen;
+ }
+
+ @Override
+ public void run() {
+ // 定位mumu bar
+ Logger.info("定位慕慕窗口");
+ ScreenRect mumu = jMacro.findPic("慕慕_工具栏", 0.95d);
+ if (mumu == null) {
+ throw new IllegalStateException("未检测到MuMu,请开启MuMu模拟器");
+ }
+ Logger.info("定位慕慕窗口成功");
+ // 计算应用窗口返回
+ gameScreen = new ScreenRect();
+ 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());
+ // 获取启动图标
+ Logger.info("定位启动图标");
+ ScreenRect launch = jMacro.waitAndFindPic(gameScreen, "启动图标", 0.8);
+ if (launch != null) {
+ Logger.info("启动图标坐标:", launch.toString());
+ Logger.info("启动程序");
+ jMacro.delay();
+ jMacro.mouseLeftClick(launch);
+ } else {
+ Logger.info("启动图标失败,继续定位主界面");
+ }
+ Logger.info("定位主界面");
+ ScreenRect 城镇 = TaskUtil.timeTask(() -> {
+ while (true) {
+ jMacro.delay();
+ { // 定位弹框,关闭弹框
+ Logger.info("检测到广告弹框");
+ ScreenRect rect = jMacro.matchPic(gameScreen, "城镇_充值_L448,36", 0.8d);
+ if (rect != null) {
+ jMacro.mouseLeftClick(rect);
+ Logger.info("检测到广告弹框,关闭弹框");
+ }
+ }
+
+ jMacro.delay();
+ { // 定位离线收益弹框,关闭弹框
+ ScreenRect rect = jMacro.matchPic(gameScreen, "城镇_离线收益_L204,734", 0.9);
+ if (rect != null) {
+ jMacro.mouseLeftClick(rect);
+ Logger.info("检测到离线收益弹框,关闭弹框");
+ }
+ }
+
+ jMacro.delay();
+ // 定位主程序
+ ScreenRect rect = jMacro.matchPic(gameScreen, "野外_L444,888", 0.9);
+ if (rect != null) {
+ Logger.info("程序主界面已就绪");
+ return rect;
+ }
+ }
+ }, 30, TimeUnit.SECONDS);
+
+ if (城镇 == null) {
+ schedule.cancel(true);
+ schedule = null;
+ Logger.info("未扫描到主界面:退出线程");
+
+ return;
+ }
+
+ Logger.info("进入主界面");
+
+ Logger.info("进入任务线程");
+ TaskUtil.timeTask((Runnable) () -> {
+ while (true) {
+ // 矿场攻击检测任务
+ jMacro.delayNormal();
+ new TaskMineAttack(jMacro, gameScreen).run();
+
+ // 矿场攻击检测任务
+ jMacro.delayNormal();
+ new TaskRewards(jMacro, gameScreen).run();
+
+ // 自动采矿任务
+ jMacro.delayNormal();
+ new TaskMining(jMacro, gameScreen).run();
+ }
+ }, 10, TimeUnit.MINUTES);
+ }
+}
diff --git a/src/main/java/com/example/jmacro/wjdr/task/BaseTask.java b/src/main/java/com/example/jmacro/wjdr/demo/task/BaseTask.java
similarity index 90%
rename from src/main/java/com/example/jmacro/wjdr/task/BaseTask.java
rename to src/main/java/com/example/jmacro/wjdr/demo/task/BaseTask.java
index 1b6de0a..71d0391 100644
--- a/src/main/java/com/example/jmacro/wjdr/task/BaseTask.java
+++ b/src/main/java/com/example/jmacro/wjdr/demo/task/BaseTask.java
@@ -1,4 +1,4 @@
-package com.example.jmacro.wjdr.task;
+package com.example.jmacro.wjdr.demo.task;
import com.example.jmacro.wjdr.JMacro;
import com.example.jmacro.wjdr.base.ScreenRect;
diff --git a/src/main/java/com/example/jmacro/wjdr/task/TaskMineAttack.java b/src/main/java/com/example/jmacro/wjdr/demo/task/TaskMineAttack.java
similarity index 92%
rename from src/main/java/com/example/jmacro/wjdr/task/TaskMineAttack.java
rename to src/main/java/com/example/jmacro/wjdr/demo/task/TaskMineAttack.java
index da9b6c5..4ccf0c4 100644
--- a/src/main/java/com/example/jmacro/wjdr/task/TaskMineAttack.java
+++ b/src/main/java/com/example/jmacro/wjdr/demo/task/TaskMineAttack.java
@@ -1,4 +1,4 @@
-package com.example.jmacro.wjdr.task;
+package com.example.jmacro.wjdr.demo.task;
import com.example.jmacro.wjdr.JMacro;
import com.example.jmacro.wjdr.base.ScreenRect;
diff --git a/src/main/java/com/example/jmacro/wjdr/task/TaskMining.java b/src/main/java/com/example/jmacro/wjdr/demo/task/TaskMining.java
similarity index 99%
rename from src/main/java/com/example/jmacro/wjdr/task/TaskMining.java
rename to src/main/java/com/example/jmacro/wjdr/demo/task/TaskMining.java
index 8e93f72..57af0b0 100644
--- a/src/main/java/com/example/jmacro/wjdr/task/TaskMining.java
+++ b/src/main/java/com/example/jmacro/wjdr/demo/task/TaskMining.java
@@ -1,4 +1,4 @@
-package com.example.jmacro.wjdr.task;
+package com.example.jmacro.wjdr.demo.task;
import cn.hutool.json.JSONUtil;
import com.example.jmacro.wjdr.JMacro;
diff --git a/src/main/java/com/example/jmacro/wjdr/task/TaskRewards.java b/src/main/java/com/example/jmacro/wjdr/demo/task/TaskRewards.java
similarity index 98%
rename from src/main/java/com/example/jmacro/wjdr/task/TaskRewards.java
rename to src/main/java/com/example/jmacro/wjdr/demo/task/TaskRewards.java
index 229aeb8..27b52a0 100644
--- a/src/main/java/com/example/jmacro/wjdr/task/TaskRewards.java
+++ b/src/main/java/com/example/jmacro/wjdr/demo/task/TaskRewards.java
@@ -1,4 +1,4 @@
-package com.example.jmacro.wjdr.task;
+package com.example.jmacro.wjdr.demo.task;
import com.example.jmacro.wjdr.JMacro;
import com.example.jmacro.wjdr.base.ScreenRect;
diff --git a/src/main/java/com/example/jmacro/wjdr/ui/FXMLUtil.java b/src/main/java/com/example/jmacro/wjdr/ui/FXMLUtil.java
new file mode 100644
index 0000000..2d55f94
--- /dev/null
+++ b/src/main/java/com/example/jmacro/wjdr/ui/FXMLUtil.java
@@ -0,0 +1,31 @@
+package com.example.jmacro.wjdr.ui;
+
+import com.example.jmacro.wjdr.util.ResourceUtil;
+import javafx.fxml.FXMLLoader;
+
+import java.io.IOException;
+import java.net.URL;
+
+/**
+ * FXML工具
+ */
+public class FXMLUtil {
+
+ /**
+ * 加载FXMLLoader
+ *
+ * @param fxml 资源路径
+ * @return
+ */
+ public static FXMLLoader load(String fxml) throws IOException {
+ if (!fxml.startsWith("classpath:")) {
+ fxml = "classpath:" + fxml;
+ }
+ URL resource = ResourceUtil.getURL(fxml);
+ FXMLLoader fxmlLoader = new FXMLLoader(resource);
+ fxmlLoader.load();
+ return fxmlLoader;
+ }
+
+
+}
diff --git a/src/main/java/com/example/jmacro/wjdr/util/ResourceUtil.java b/src/main/java/com/example/jmacro/wjdr/util/ResourceUtil.java
new file mode 100644
index 0000000..510d97e
--- /dev/null
+++ b/src/main/java/com/example/jmacro/wjdr/util/ResourceUtil.java
@@ -0,0 +1,58 @@
+package com.example.jmacro.wjdr.util;
+
+import cn.hutool.core.io.resource.ClassPathResource;
+import javafx.fxml.FXMLLoader;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+/**
+ * 资源工具
+ */
+public class ResourceUtil extends cn.hutool.core.io.resource.ResourceUtil {
+
+ /**
+ * 获取资源输入流,以/开始
+ *
+ * @return 资源路径
+ */
+ public static InputStream getInput(String resourceLocation) {
+ if (resourceLocation.startsWith("/")) {
+ resourceLocation = "/" + resourceLocation;
+ }
+ ClassPathResource classPathResource = new ClassPathResource(resourceLocation);
+ return classPathResource.getStream();
+ }
+
+ /**
+ * 获取资源路径
+ *
+ * @param resourceLocation 资源
+ */
+ public static URL getURL(String resourceLocation) throws FileNotFoundException {
+ if (resourceLocation.startsWith("classpath:")) {
+ String path = resourceLocation.substring("classpath:".length());
+ ClassLoader cl = FXMLLoader.getDefaultClassLoader();
+ URL url = cl != null ? cl.getResource(path) : ClassLoader.getSystemResource(path);
+ if (url == null) {
+ String description = "class path resource [" + path + "]";
+ throw new FileNotFoundException(description + " cannot be resolved to URL because it does not exist");
+ } else {
+ return url;
+ }
+ } else {
+ try {
+ return new URL(resourceLocation);
+ } catch (MalformedURLException var6) {
+ try {
+ return (new File(resourceLocation)).toURI().toURL();
+ } catch (MalformedURLException var5) {
+ throw new FileNotFoundException("Resource location [" + resourceLocation + "] is neither a URL not a well-formed file path");
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/resources/lib/beautyeye_lnf.jar b/src/main/resources/lib/beautyeye_lnf.jar
deleted file mode 100644
index b539624..0000000
Binary files a/src/main/resources/lib/beautyeye_lnf.jar and /dev/null differ
diff --git a/src/main/resources/main.fxml b/src/main/resources/main.fxml
new file mode 100644
index 0000000..c145989
--- /dev/null
+++ b/src/main/resources/main.fxml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+