diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml new file mode 100644 index 0000000..c7d46da --- /dev/null +++ b/.gitea/workflows/build.yml @@ -0,0 +1,44 @@ +name: Java CI with Maven + +# 检测到 src 文件内 .java 文件有变动执行编译 +on: + push: + paths: + - '**/*src/**/*.java' + +jobs: + build: +# 配置权限 + permissions: write-all + runs-on: ubuntu-latest + steps: +# 下载代码 + - uses: actions/checkout@v3 + - name: Set up JDK 17 +# 安装 JDK + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + cache: maven +# Maven 打包 + - name: Build with Maven + run: mvn -B package --file pom.xml +# 将打包好的 Jar 包 放到 staging 文件夹 + - run: mkdir staging && cp target/*.jar staging +# 设置 jobs Maven pom 版本环境变量 + - name: Set Release version env variable + run: | + echo "RELEASE_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)" >> $GITHUB_ENV + - name: "Build & test" + run: | + echo "done!" +# 上传文件并发布 Release + - uses: "marvinpinto/action-automatic-releases@latest" + with: + repo_token: "${{ secrets.GITHUB_TOKEN }}" + automatic_release_tag: "${{ env.RELEASE_VERSION }}" + prerelease: false + title: "Release ${{ env.RELEASE_VERSION }}" + files: | + staging/*.jar diff --git a/README.md b/README.md index 9faabe0..07629d5 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ ## 支持版本 -- 1.20.1 Folia (自2.1.3开始将不再支持Folia以外的核心) +- 1.20.1+ (Folia Paper) ## 使用方法 diff --git a/pom.xml b/pom.xml index 0504ccb..0f52c34 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ site.deercloud LiteWorldEdit - 2.1.3-Folia-1.20.1 + 2.1.4 jar LiteWorldEdit diff --git a/src/main/java/site/deercloud/liteworldedit/Commands.java b/src/main/java/site/deercloud/liteworldedit/Commands.java index fb0d801..a899b2e 100644 --- a/src/main/java/site/deercloud/liteworldedit/Commands.java +++ b/src/main/java/site/deercloud/liteworldedit/Commands.java @@ -1,6 +1,5 @@ package site.deercloud.liteworldedit; -import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.command.Command; @@ -8,6 +7,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; import site.deercloud.liteworldedit.JobGenerator.Empty; import site.deercloud.liteworldedit.JobGenerator.Fill; import site.deercloud.liteworldedit.JobGenerator.OverLay; @@ -21,8 +21,8 @@ public class Commands implements TabExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { if (args.length == 0) { - sender.sendMessage(ChatColor.GREEN + "LiteWorldEdit by DeerCloud"); - sender.sendMessage(ChatColor.GREEN + "使用 /lwe help 查看帮助。"); + Notification.info((Player) sender, "使用 /lwe help 查看帮助。"); + Notification.info((Player) sender, "使用 /lwe help 查看帮助。"); return true; } if (Objects.equals(args[0], "point") || Objects.equals(args[0], "p")) { @@ -52,7 +52,7 @@ public class Commands implements TabExecutor { resumeJobs(sender); return true; } else { - sender.sendMessage("参数错误。"); + Notification.info((Player) sender, "参数错误 使用 /lwe help 查看帮助。"); } return true; } @@ -62,12 +62,12 @@ public class Commands implements TabExecutor { Player player = (Player) sender; if (LiteWorldEdit.instance.getCache().getPlayer(player).hasJob()) { LiteWorldEdit.instance.getCache().getPlayer(player).resumeJob(); - sender.sendMessage("已恢复。"); + Notification.info(player, "已恢复。"); } else { - sender.sendMessage("你没有正在进行的任务。"); + Notification.info(player, "你没有正在进行的任务。"); } } else { - sender.sendMessage("该命令只能由玩家执行。"); + LoggerX.info("该命令只能由玩家执行。"); } } @@ -76,12 +76,12 @@ public class Commands implements TabExecutor { Player player = (Player) sender; if (LiteWorldEdit.instance.getCache().getPlayer(player).hasJob()) { LiteWorldEdit.instance.getCache().getPlayer(player).pauseJob(); - sender.sendMessage("已暂停。"); + Notification.warn(player, "已暂停。"); } else { - sender.sendMessage("你没有正在进行的任务。"); + Notification.warn(player, "你没有正在进行的任务。"); } } else { - sender.sendMessage("该命令只能由玩家执行。"); + LoggerX.info("该命令只能由玩家执行。"); } } @@ -89,14 +89,14 @@ public class Commands implements TabExecutor { if (sender instanceof Player) { Player player = (Player) sender; if (!player.isOp()) { - sender.sendMessage("你没有权限。"); + Notification.error(player, "你没有权限。"); } else { LiteWorldEdit.instance.reloadConfig(); - sender.sendMessage("已重载配置文件。"); + Notification.info(player, "已重载配置文件。"); } } else { LiteWorldEdit.instance.reloadConfig(); - sender.sendMessage("已重载配置文件。"); + LoggerX.info("已重载配置文件。"); } } @@ -105,18 +105,18 @@ public class Commands implements TabExecutor { Player player = (Player) sender; if (LiteWorldEdit.instance.getCache().getPlayer(player).hasJob()) { LiteWorldEdit.instance.getCache().getPlayer(player).cancelJob(); - sender.sendMessage("已取消。"); + Notification.warn(player, "已取消。"); } else { - sender.sendMessage("你没有正在进行的任务。"); + Notification.warn(player, "你没有正在进行的任务。"); } } else { - sender.sendMessage("该命令只能由玩家执行。"); + LoggerX.err("该命令只能由玩家执行。"); } } private static boolean emptyTask(CommandSender sender, String[] args) { if (!(sender instanceof Player)) { - sender.sendMessage("该命令只能由玩家执行。"); + LoggerX.err("该命令只能由玩家执行。"); return true; } Player player = (Player) sender; @@ -125,20 +125,20 @@ public class Commands implements TabExecutor { Vector2 diagonalPoint = getVector2(sender, args, player); if (diagonalPoint == null) return true; Empty.empty(player, player.getWorld(), diagonalPoint.pointA, diagonalPoint.pointB); - sender.sendMessage("已添加任务。"); + Notification.info(player, "已添加任务。"); } catch (NumberFormatException e) { - sender.sendMessage("参数错误。"); + Notification.error(player, "参数错误。"); } } else { - sender.sendMessage("参数错误。"); + Notification.error(player, "参数错误。"); } return true; } private static boolean overlayTask(CommandSender sender, String[] args) { if (!(sender instanceof Player)) { - sender.sendMessage("该命令只能由玩家执行。"); + LoggerX.err("该命令只能由玩家执行。"); return true; } Player player = (Player) sender; @@ -148,25 +148,25 @@ public class Commands implements TabExecutor { if (diagonalPoint == null) return true; ItemStack items_in_hand = player.getInventory().getItemInMainHand(); if (!items_in_hand.getType().isBlock() || items_in_hand.getType() == Material.AIR) { - sender.sendMessage("你手上没有方块。"); + Notification.error(player, "你手上没有方块。"); return true; } Material material = Material.getMaterial(items_in_hand.getType().name()); OverLay.overLay(player, player.getWorld(), diagonalPoint.pointA, diagonalPoint.pointB, material); - sender.sendMessage("已添加任务。"); + Notification.info(player, "已添加任务。"); return true; } catch (NumberFormatException e) { - sender.sendMessage("参数错误。"); + Notification.error(player, "参数错误。"); } } else { - sender.sendMessage("参数错误。"); + Notification.error(player, "参数错误。"); } return true; } private static boolean fillTask(CommandSender sender, String[] args) { if (!(sender instanceof Player)) { - sender.sendMessage("该命令只能由玩家执行。"); + LoggerX.err("该命令只能由玩家执行。"); return true; } Player player = (Player) sender; @@ -176,18 +176,18 @@ public class Commands implements TabExecutor { if (diagonalPoint == null) return true; ItemStack items_in_hand = player.getInventory().getItemInMainHand(); if (!items_in_hand.getType().isBlock() || items_in_hand.getType() == Material.AIR) { - sender.sendMessage("你手上没有方块。"); + Notification.error(player, "你手上没有方块。"); return true; } Material material = Material.getMaterial(items_in_hand.getType().name()); Fill.fill(player, player.getWorld(), diagonalPoint.pointA, diagonalPoint.pointB, material); - sender.sendMessage("已添加任务。"); + Notification.info(player, "已添加任务。"); return true; } catch (NumberFormatException e) { - sender.sendMessage("参数错误。"); + Notification.error(player, "参数错误。"); } } else { - sender.sendMessage("参数错误。"); + Notification.error(player, "参数错误。"); } return true; } @@ -197,17 +197,17 @@ public class Commands implements TabExecutor { Integer indexB = Integer.parseInt(args[2]); Map points = LiteWorldEdit.instance.getCache().getPlayer(player).getPoints(); if (points == null) { - sender.sendMessage("你没有设置任何点。"); + Notification.error(player, "你没有设置任何点。"); return null; } Point pointA = points.get(indexA); Point pointB = points.get(indexB); if (pointA == null || pointB == null) { - sender.sendMessage("点不存在。"); + Notification.error(player, "点不存在。"); return null; } if (out_of_region(pointA, pointB)) { - sender.sendMessage("选择的区域不可以超过 " + LiteWorldEdit.instance.getConfigMgr().getXMax() + "x" + LiteWorldEdit.instance.getConfigMgr().getYMax() + "x" + LiteWorldEdit.instance.getConfigMgr().getZMax() + "。"); + Notification.error(player, "选择的区域不可以超过 " + LiteWorldEdit.instance.getConfigMgr().getXMax() + "x" + LiteWorldEdit.instance.getConfigMgr().getYMax() + "x" + LiteWorldEdit.instance.getConfigMgr().getZMax() + "。"); return null; } return new Vector2(pointA, pointB); @@ -225,25 +225,25 @@ public class Commands implements TabExecutor { private static void listPoints(CommandSender sender) { if (!(sender instanceof Player)) { - sender.sendMessage("该命令只能由玩家执行。"); + LoggerX.err("该命令只能由玩家执行。"); return; } Player player = (Player) sender; Map points = LiteWorldEdit.instance.getCache().getPlayer(player).getPoints(); if (points != null) { - sender.sendMessage("你创建的点:"); + Notification.info(player, "你创建的点:"); for (Map.Entry entry : points.entrySet()) { Point point = entry.getValue(); - sender.sendMessage(entry.getKey() + ": " + point.x + ", " + point.y + ", " + point.z); + Notification.info(player, entry.getKey() + ": " + point.x + ", " + point.y + ", " + point.z); } } else { - sender.sendMessage("你没有设置任何点。"); + Notification.warn(player, "你没有设置任何点。"); } } private static boolean addPoint(CommandSender sender, String[] args) { if (!(sender instanceof Player)) { - sender.sendMessage("该命令只能由玩家执行。"); + LoggerX.err("该命令只能由玩家执行。"); return true; } Player player = (Player) sender; @@ -259,21 +259,21 @@ public class Commands implements TabExecutor { } Point point = new Point(x, y, z, player); if (!LiteWorldEdit.instance.getCache().getPlayer(player).addPoint(index, point)) { - sender.sendMessage("点的数量不允许超过20,请使用已有点序号覆盖已有点。"); + Notification.error(player, "点的数量不允许超过20,请使用已有点序号覆盖已有点。"); return true; } - sender.sendMessage("点 " + index + " 已设置为 " + x + ", " + y + ", " + z + "。"); + Notification.info(player, "点 " + index + " 已设置为 " + x + ", " + y + ", " + z + "。"); } catch (NumberFormatException e) { - sender.sendMessage("参数错误。"); + Notification.error(player, "参数错误。"); } } else { - sender.sendMessage("参数错误。"); + Notification.error(player, "参数错误。"); } return true; } @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { if (args.length == 1) { return Arrays.asList("point", "p", "points", "fill", "empty", "overlay", "cancel", "pause", "resume", "help", "reload"); } else if (args.length == 2) { @@ -287,16 +287,20 @@ public class Commands implements TabExecutor { } public void print_help(CommandSender sender) { - sender.sendMessage(ChatColor.GREEN + "LiteWorldEdit 帮助"); - sender.sendMessage(ChatColor.GREEN + "/lwe help - 查看帮助"); - sender.sendMessage(ChatColor.GREEN + "/lwe point|p [点序号(整数)] [x] [y] [z] - 创建点"); - sender.sendMessage(ChatColor.GREEN + "/lwe points - 查看所有点"); - sender.sendMessage(ChatColor.GREEN + "/lwe fill [点序号A] [点序号B] - (在AB点对角线间放置方块 - 需要手持被放置的方块)"); - sender.sendMessage(ChatColor.GREEN + "/lwe empty [点序号A] [点序号B] - (破坏AB点对角线间方块 - 需要拥有下届合金镐)"); - sender.sendMessage(ChatColor.GREEN + "/lwe overlay [点序号A] [点序号B] - (在选区地面上铺一层方块 - 需要手持被放置的方块)"); - sender.sendMessage(ChatColor.GREEN + "/lwe cancel - 取消所有任务"); - sender.sendMessage(ChatColor.GREEN + "/lwe pause - 暂停工作"); - sender.sendMessage(ChatColor.GREEN + "/lwe resume - 恢复工作"); + if (!(sender instanceof Player)) { + LoggerX.err("该命令只能由玩家执行。"); + return; + } + Notification.info((Player) sender, "LiteWorldEdit 帮助"); + Notification.info((Player) sender, "/lwe help - 查看帮助"); + Notification.info((Player) sender, "/lwe point|p [点序号(整数)] [x] [y] [z] - 创建点"); + Notification.info((Player) sender, "/lwe points - 查看所有点"); + Notification.info((Player) sender, "/lwe fill [点序号A] [点序号B] - (在AB点对角线间放置方块 - 需要手持被放置的方块)"); + Notification.info((Player) sender, "/lwe empty [点序号A] [点序号B] - (破坏AB点对角线间方块 - 需要拥有下届合金镐)"); + Notification.info((Player) sender, "/lwe overlay [点序号A] [点序号B] - (在AB点对角线间放置方块 - 不需要手持被放置的方块)"); + Notification.info((Player) sender, "/lwe cancel - 取消当前任务"); + Notification.info((Player) sender, "/lwe pause - 暂停当前任务"); + Notification.info((Player) sender, "/lwe resume - 恢复当前任务"); } static public boolean out_of_region(Point A, Point B) { diff --git a/src/main/java/site/deercloud/liteworldedit/LiteWorldEdit.java b/src/main/java/site/deercloud/liteworldedit/LiteWorldEdit.java index a8ab20f..e20d758 100644 --- a/src/main/java/site/deercloud/liteworldedit/LiteWorldEdit.java +++ b/src/main/java/site/deercloud/liteworldedit/LiteWorldEdit.java @@ -1,24 +1,11 @@ package site.deercloud.liteworldedit; -import io.papermc.paper.threadedregions.scheduler.ScheduledTask; import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.scheduler.BukkitScheduler; -import site.deercloud.liteworldedit.Jobs.Job; -import site.deercloud.liteworldedit.Jobs.JobErrCode; -import site.deercloud.liteworldedit.Managers.ConfigManager; import site.deercloud.liteworldedit.Managers.Cache; -import site.deercloud.liteworldedit.Task; -import io.papermc.paper.threadedregions.scheduler.AsyncScheduler; +import site.deercloud.liteworldedit.Managers.ConfigManager; import java.util.Objects; -import java.util.concurrent.TimeUnit; -import java.util.function.Consumer; - -import static site.deercloud.liteworldedit.SchedulerUtil.runAtFixedRateEntity; public final class LiteWorldEdit extends JavaPlugin { diff --git a/src/main/java/site/deercloud/liteworldedit/LoggerX.java b/src/main/java/site/deercloud/liteworldedit/LoggerX.java index 39ab307..81c3dd3 100644 --- a/src/main/java/site/deercloud/liteworldedit/LoggerX.java +++ b/src/main/java/site/deercloud/liteworldedit/LoggerX.java @@ -1,6 +1,5 @@ package site.deercloud.liteworldedit; -import org.bukkit.ChatColor; import org.bukkit.entity.Player; import java.util.logging.Logger; @@ -10,44 +9,45 @@ public class LoggerX { private static final Logger _logger = _plugin.getLogger(); public static void info(Player player, String message) { - player.sendMessage(ChatColor.GREEN + " LWE I | " + message); + Notification.info(player, "LWE I | " + message); if (_plugin.getConfigMgr().isDebug()) debug("来自玩家[ " + player.getName() + " ] 的信息 | " + message); } public static void info(String message) { - _logger.info(ChatColor.GREEN + " I | " + message); + _logger.info(" I | " + message); } public static void warn(Player player, String message) { - player.sendMessage(ChatColor.YELLOW + " LWE W | " + message); + Notification.warn(player, "LWE W | " + message); if (_plugin.getConfigMgr().isDebug()) debug("来自玩家[ " + player.getName() + " ] 的警告 | " + message); } public static void warn(String message) { - _logger.info(ChatColor.YELLOW + " W | " + message); + _logger.info(" W | " + message); } public static void err(Player player, String message) { - player.sendMessage(ChatColor.RED + " LWE E | " + message); + Notification.error(player, "LWE E | " + message); if (_plugin.getConfigMgr().isDebug()) debug("来自玩家[ " + player.getName() + " ] 的报错 | " + message); } public static void err(String message) { - _logger.info(ChatColor.RED + " E | " + message); + _logger.info(" E | " + message); } public static void debug(Player player, String message) { if (!_plugin.getConfigMgr().isDebug()) return; if (player.isOp()) - player.sendMessage(ChatColor.BLUE + " LWE D | " + message); - debug("来自玩家[ " + player.getName() + " ] 的调试 | " + message); + Notification.info(player, "LWE D | " + message); + else + debug("来自玩家[ " + player.getName() + " ] 的调试 | " + message); } public static void debug(String message) { if (!_plugin.getConfigMgr().isDebug()) return; - _logger.info(ChatColor.BLUE + " D | " + message); + _logger.info(" D | " + message); } } diff --git a/src/main/java/site/deercloud/liteworldedit/Notification.java b/src/main/java/site/deercloud/liteworldedit/Notification.java new file mode 100644 index 0000000..79d3259 --- /dev/null +++ b/src/main/java/site/deercloud/liteworldedit/Notification.java @@ -0,0 +1,25 @@ +package site.deercloud.liteworldedit; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.Style; +import net.kyori.adventure.text.format.TextColor; +import org.bukkit.entity.Player; + +public class Notification { + private static final Style i_style = Style.style(TextColor.color(139, 255, 123)); + private static final Style w_style = Style.style(TextColor.color(255, 185, 69)); + private static final Style e_style = Style.style(TextColor.color(255, 96, 72)); + + public static void info(Player player, String msg) { + player.sendMessage(Component.text("[LWE] " + msg, i_style)); + } + + + public static void warn(Player player, String msg) { + player.sendMessage(Component.text("[LWE] " + msg, w_style)); + } + + public static void error(Player player, String msg) { + player.sendMessage(Component.text("[LWE] " + msg, e_style)); + } +}