diff --git a/README.md b/README.md index 6143bae..cb02b9e 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,6 @@ Debug: false - [ ] 选区可视化 -- [ ] 可手动暂停、恢复任务 +- [x] 可手动暂停、恢复任务 - [ ] 更多的任务类型支持(如画圆、弧线) diff --git a/pom.xml b/pom.xml index 3635943..2fe3851 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ site.deercloud LiteWorldEdit - 2.0.0 + 2.1.1 jar LiteWorldEdit diff --git a/src/main/java/site/deercloud/liteworldedit/Commands.java b/src/main/java/site/deercloud/liteworldedit/Commands.java index 417a087..e297005 100644 --- a/src/main/java/site/deercloud/liteworldedit/Commands.java +++ b/src/main/java/site/deercloud/liteworldedit/Commands.java @@ -10,6 +10,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import site.deercloud.liteworldedit.JobGenerator.Empty; import site.deercloud.liteworldedit.JobGenerator.Fill; +import site.deercloud.liteworldedit.JobGenerator.OverLay; import site.deercloud.liteworldedit.Jobs.Job; import site.deercloud.liteworldedit.Managers.Point; @@ -33,6 +34,8 @@ public class Commands implements TabExecutor { return fillTask(sender, args); } else if (Objects.equals(args[0], "empty")) { return emptyTask(sender, args); + } else if (Objects.equals(args[0], "overlay")) { + return overlayTask(sender, args); } else if (Objects.equals(args[0], "help")) { print_help(sender); return true; @@ -57,8 +60,12 @@ public class Commands implements TabExecutor { private static void resumeJobs(CommandSender sender) { if (sender instanceof Player) { Player player = (Player) sender; - LiteWorldEdit.instance.getCache().getQueueOf(player).resume(); - sender.sendMessage("已恢复。"); + if (LiteWorldEdit.instance.getCache().getQueueOf(player) == null) { + sender.sendMessage("你没有正在进行的任务。"); + } else { + LiteWorldEdit.instance.getCache().getQueueOf(player).resume(); + sender.sendMessage("已恢复。"); + } } else { sender.sendMessage("该命令只能由玩家执行。"); } @@ -67,8 +74,12 @@ public class Commands implements TabExecutor { private static void pauseJobs(CommandSender sender) { if (sender instanceof Player) { Player player = (Player) sender; - LiteWorldEdit.instance.getCache().getQueueOf(player).pause(); - sender.sendMessage("已暂停。"); + if (LiteWorldEdit.instance.getCache().getQueueOf(player) == null) { + sender.sendMessage("你没有正在进行的任务。"); + } else { + LiteWorldEdit.instance.getCache().getQueueOf(player).pause(); + sender.sendMessage("已暂停。"); + } } else { sender.sendMessage("该命令只能由玩家执行。"); } @@ -92,8 +103,12 @@ public class Commands implements TabExecutor { private static void cancerJobs(CommandSender sender) { if (sender instanceof Player) { Player player = (Player) sender; - LiteWorldEdit.instance.getCache().getQueueOf(player).cancel(); - sender.sendMessage("已取消。"); + if (LiteWorldEdit.instance.getCache().getQueueOf(player) == null) { + sender.sendMessage("你没有正在进行的任务。"); + } else { + LiteWorldEdit.instance.getCache().getQueueOf(player).cancel(); + sender.sendMessage("已取消。"); + } } else { sender.sendMessage("该命令只能由玩家执行。"); } @@ -118,7 +133,35 @@ public class Commands implements TabExecutor { } else { sender.sendMessage("参数错误。"); } - return false; + return true; + } + + private static boolean overlayTask(CommandSender sender, String[] args) { + if (!(sender instanceof Player)) { + sender.sendMessage("该命令只能由玩家执行。"); + return true; + } + Player player = (Player) sender; + if (args.length == 3) { + try { + Vector2 diagonalPoint = getVector2(sender, args, player); + 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("你手上没有方块。"); + return true; + } + Material material = Material.getMaterial(items_in_hand.getType().name()); + OverLay.overLay(player, player.getWorld(), diagonalPoint.pointA, diagonalPoint.pointB, material); + sender.sendMessage("已添加任务。"); + return true; + } catch (NumberFormatException e) { + sender.sendMessage("参数错误。"); + } + } else { + sender.sendMessage("参数错误。"); + } + return true; } private static boolean fillTask(CommandSender sender, String[] args) { @@ -146,7 +189,7 @@ public class Commands implements TabExecutor { } else { sender.sendMessage("参数错误。"); } - return false; + return true; } private static Vector2 getVector2(CommandSender sender, String[] args, Player player) { @@ -226,21 +269,18 @@ public class Commands implements TabExecutor { } else { sender.sendMessage("参数错误。"); } - return false; + return true; } @Override public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { if (args.length == 1) { - return Arrays.asList("point", "p", "points", "fill", "empty", "cancel", "pause", "resume", "help", "reload"); + return Arrays.asList("point", "p", "points", "fill", "empty", "overlay", "cancel", "pause", "resume", "help", "reload"); } else if (args.length == 2) { - switch (args[1]) { - case "point": - return Collections.singletonList("[点序号(整数)] [x] [y] [z]"); - case "fill": - return Collections.singletonList("[点序号A] [点序号B] (需要手持被放置的方块)"); - case "empty": - return Collections.singletonList("[点序号A] [点序号B] (需要拥有下届合金锄)"); + if (args[0].equals("point") || args[0].equals("p")) { + return Collections.singletonList("[点序号(整数)] [x] [y] [z] - 创建点"); + } else if (args[0].equals("fill") || args[0].equals("empty") || args[0].equals("overlay")) { + return Collections.singletonList("[点序号A] [点序号B]"); } } return Collections.emptyList(); @@ -253,6 +293,7 @@ public class Commands implements TabExecutor { 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 - 恢复工作"); diff --git a/src/main/java/site/deercloud/liteworldedit/JobGenerator/Empty.java b/src/main/java/site/deercloud/liteworldedit/JobGenerator/Empty.java index e34c32f..d4ed860 100644 --- a/src/main/java/site/deercloud/liteworldedit/JobGenerator/Empty.java +++ b/src/main/java/site/deercloud/liteworldedit/JobGenerator/Empty.java @@ -9,7 +9,6 @@ import site.deercloud.liteworldedit.Managers.Point; public class Empty { public static void empty(Player player, World world, Point p1, Point p2) { - // 经验扣除与校验 for (int y = Math.max(p1.y, p2.y); y >= Math.min(p1.y, p2.y); y--) { for (int x = Math.min(p1.x, p2.x); x <= Math.max(p1.x, p2.x); x++) { for (int z = Math.min(p1.z, p2.z); z <= Math.max(p1.z, p2.z); z++) { diff --git a/src/main/java/site/deercloud/liteworldedit/JobGenerator/OverLay.java b/src/main/java/site/deercloud/liteworldedit/JobGenerator/OverLay.java new file mode 100644 index 0000000..ba9cbc6 --- /dev/null +++ b/src/main/java/site/deercloud/liteworldedit/JobGenerator/OverLay.java @@ -0,0 +1,29 @@ +package site.deercloud.liteworldedit.JobGenerator; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import site.deercloud.liteworldedit.Jobs.Place; +import site.deercloud.liteworldedit.LiteWorldEdit; +import site.deercloud.liteworldedit.Managers.Point; + +public class OverLay { + + public static void overLay(Player player, World world, Point p1, Point p2, Material block) { + for (int x = Math.min(p1.x, p2.x); x <= Math.max(p1.x, p2.x); x++) { + for (int z = Math.min(p1.z, p2.z); z <= Math.max(p1.z, p2.z); z++) { + for (int y = Math.min(p1.y, p2.y); y <= Math.max(p1.y, p2.y); y++) { + Block block1 = world.getBlockAt(x, y, z); + if (block1.getType() == Material.AIR) { + Location location = new Location(world, (double) x, (double) y, (double) z); + Place place_job = new Place(location, player, block); + LiteWorldEdit.instance.getCache().addJob(player, place_job); + break; + } + } + } + } + } +} diff --git a/src/main/java/site/deercloud/liteworldedit/Managers/Cache.java b/src/main/java/site/deercloud/liteworldedit/Managers/Cache.java index 063f5f9..452117c 100644 --- a/src/main/java/site/deercloud/liteworldedit/Managers/Cache.java +++ b/src/main/java/site/deercloud/liteworldedit/Managers/Cache.java @@ -50,6 +50,12 @@ public class Cache { } public JobQueue getQueueOf(Player player) { + if (!_jobs.containsKey(player.getUniqueId().toString())) { + return null; + } + if (_jobs.get(player.getUniqueId().toString()).isEmpty()) { + return null; + } return _jobs.get(player.getUniqueId().toString()); }