diff --git a/pom.xml b/pom.xml index 8fbd2fb..9d3e98b 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ site.deercloud LiteWorldEdit - 1.5.13-SNAPSHOT + 1.6.4 jar LiteWorldEdit diff --git a/src/main/java/site/deercloud/liteworldedit/Commands.java b/src/main/java/site/deercloud/liteworldedit/Commands.java index 3aab04a..61902de 100644 --- a/src/main/java/site/deercloud/liteworldedit/Commands.java +++ b/src/main/java/site/deercloud/liteworldedit/Commands.java @@ -146,7 +146,7 @@ public class Commands implements TabExecutor { } else if (Objects.equals(args[0], "cancel")) { if (sender instanceof Player) { Player player = (Player) sender; - LiteWorldEdit.instance.getCache().deleteAllJobsOfPlayer(player); + LiteWorldEdit.instance.getCache().getQueueOf(player).cancel(); sender.sendMessage("已取消。"); } else { sender.sendMessage("该命令只能由玩家执行。"); @@ -164,6 +164,22 @@ public class Commands implements TabExecutor { LiteWorldEdit.instance.reloadConfig(); sender.sendMessage("已重载配置文件。"); } + } else if (Objects.equals(args[0], "pause")) { + if (sender instanceof Player) { + Player player = (Player) sender; + LiteWorldEdit.instance.getCache().getQueueOf(player).pause(); + sender.sendMessage("已暂停。"); + } else { + sender.sendMessage("该命令只能由玩家执行。"); + } + } else if (Objects.equals(args[0], "resume")) { + if (sender instanceof Player) { + Player player = (Player) sender; + LiteWorldEdit.instance.getCache().getQueueOf(player).resume(); + sender.sendMessage("已恢复。"); + } else { + sender.sendMessage("该命令只能由玩家执行。"); + } } else { sender.sendMessage("参数错误。"); } @@ -173,7 +189,7 @@ public class Commands implements TabExecutor { @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", "help", "reload"); + return Arrays.asList("point", "p", "points", "fill", "empty", "cancel", "pause", "resume", "help", "reload"); } else if (args.length == 2) { switch (args[1]) { case "point": @@ -195,6 +211,8 @@ public class Commands implements TabExecutor { sender.sendMessage(ChatColor.GREEN + "/lwe fill [点序号A] [点序号B] - (在AB点对角线间放置方块 - 需要手持被放置的方块)"); sender.sendMessage(ChatColor.GREEN + "/lwe empty [点序号A] [点序号B] - (破坏AB点对角线间方块 - 需要拥有下届合金镐)"); sender.sendMessage(ChatColor.GREEN + "/lwe cancel - 取消所有任务"); + sender.sendMessage(ChatColor.GREEN + "/lwe pause - 暂停工作"); + sender.sendMessage(ChatColor.GREEN + "/lwe resume - 恢复工作"); } static public boolean out_of_region(Point A, Point B) { diff --git a/src/main/java/site/deercloud/liteworldedit/JobGenerator/Empty.java b/src/main/java/site/deercloud/liteworldedit/JobGenerator/Empty.java index 121ea20..e34c32f 100644 --- a/src/main/java/site/deercloud/liteworldedit/JobGenerator/Empty.java +++ b/src/main/java/site/deercloud/liteworldedit/JobGenerator/Empty.java @@ -10,8 +10,8 @@ import site.deercloud.liteworldedit.Managers.Point; public class Empty { public static void empty(Player player, World world, Point p1, Point p2) { // 经验扣除与校验 - for (int x = Math.min(p1.x, p2.x); x <= Math.max(p1.x, p2.x); x++) { - for (int y = Math.min(p1.y, p2.y); y <= Math.max(p1.y, p2.y); y++) { + 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++) { Location location = new Location(world, (double) x, (double) y, (double) z); Remove remove_job = new Remove(location, player); diff --git a/src/main/java/site/deercloud/liteworldedit/JobGenerator/Fill.java b/src/main/java/site/deercloud/liteworldedit/JobGenerator/Fill.java index 160b466..ceeb1fe 100644 --- a/src/main/java/site/deercloud/liteworldedit/JobGenerator/Fill.java +++ b/src/main/java/site/deercloud/liteworldedit/JobGenerator/Fill.java @@ -12,8 +12,8 @@ import site.deercloud.liteworldedit.Managers.Point; public class Fill { public static void fill(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 y = Math.max(p1.y, p2.y); y >= Math.min(p1.y, p2.y); y--) { + for (int y = Math.min(p1.y, p2.y); y <= Math.max(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++) { Location location = new Location(world, (double) x, (double) y, (double) z); Place place_job = new Place(location, player, block); diff --git a/src/main/java/site/deercloud/liteworldedit/LiteWorldEdit.java b/src/main/java/site/deercloud/liteworldedit/LiteWorldEdit.java index ad10244..acaba3a 100644 --- a/src/main/java/site/deercloud/liteworldedit/LiteWorldEdit.java +++ b/src/main/java/site/deercloud/liteworldedit/LiteWorldEdit.java @@ -43,8 +43,8 @@ public final class LiteWorldEdit extends JavaPlugin { } } else { Player player = job.get_creator(); - player.sendTitle("§c错误 任务已取消", "§c" + re.getMessage(), 10, 70, 20); - _cache.deleteAllJobsOfPlayer(player); + player.sendTitle("§c错误 任务已自动暂停", "§c" + re.getMessage(), 10, 70, 20); + _cache.getQueueOf(player).pause(); return; } } diff --git a/src/main/java/site/deercloud/liteworldedit/Managers/Cache.java b/src/main/java/site/deercloud/liteworldedit/Managers/Cache.java index e32fd22..063f5f9 100644 --- a/src/main/java/site/deercloud/liteworldedit/Managers/Cache.java +++ b/src/main/java/site/deercloud/liteworldedit/Managers/Cache.java @@ -1,26 +1,19 @@ package site.deercloud.liteworldedit.Managers; -import org.bukkit.Bukkit; -import org.bukkit.boss.BarColor; -import org.bukkit.boss.BarStyle; -import org.bukkit.boss.BossBar; import org.bukkit.entity.Player; import site.deercloud.liteworldedit.Jobs.Job; import java.util.HashMap; -import java.util.LinkedList; import java.util.Map; public class Cache { private final Map> _points; - private final Map> _jobs; + private final Map _jobs; private String _last_jobs_player; // 上一次被获取任务的玩家uuid - private final Map _bars; public Cache() { _points = new HashMap>(); - _jobs = new HashMap>(); - _bars = new HashMap(); + _jobs = new HashMap(); } public boolean addPoint(Player player, Integer index, Point point) { @@ -36,7 +29,7 @@ public class Cache { public void addJob(Player player, Job job) { if (!_jobs.containsKey(player.getUniqueId().toString())) { - _jobs.put(player.getUniqueId().toString(), new LinkedList()); + _jobs.put(player.getUniqueId().toString(), new JobQueue(player)); } _jobs.get(player.getUniqueId().toString()).add(job); } @@ -49,39 +42,19 @@ public class Cache { if (!_jobs.containsKey(player)) { return null; } - if (_jobs.get(player).isEmpty()) { - _jobs.remove(player); - return null; - } - Job job = _jobs.get(player).pop(); - updateBarOfPlayer(job.get_creator()); - return job; + return _jobs.get(player).pop(); } public Map getPoints(Player player) { return _points.get(player.getUniqueId().toString()); } - public void deleteAllJobsOfPlayer(Player player) { - _jobs.get(player.getUniqueId().toString()).clear(); - updateBarOfPlayer(player); + public JobQueue getQueueOf(Player player) { + return _jobs.get(player.getUniqueId().toString()); } public void deletePlayerCache(Player player) { - // _points.remove(player.getUniqueId().toString()); _jobs.remove(player.getUniqueId().toString()); - _bars.remove(player.getUniqueId().toString()); - } - - public void updateBarOfPlayer(Player player) { - if (!_bars.containsKey(player.getUniqueId().toString())) { - _bars.put(player.getUniqueId().toString(), Bukkit.createBossBar("§a§lLiteWorldEdit 施工进度", BarColor.GREEN, BarStyle.SOLID)); - _bars.get(player.getUniqueId().toString()).addPlayer(player); - } - BossBar bar = _bars.get(player.getUniqueId().toString()); - bar.setProgress(1); - bar.setTitle("§a§lLiteWorldEdit 施工进度 剩余任务: " + _jobs.get(player.getUniqueId().toString()).size()); - bar.setVisible(_jobs.get(player.getUniqueId().toString()).size() != 0); } private String getNextPlayer() { @@ -95,6 +68,10 @@ public class Cache { boolean found = false; for (String key : _jobs.keySet()) { if (found) { + // 忽略没有任务的玩家 + if (_jobs.get(key).size() == 0) { + continue; + } _last_jobs_player = key; return key; } diff --git a/src/main/java/site/deercloud/liteworldedit/Managers/JobQueue.java b/src/main/java/site/deercloud/liteworldedit/Managers/JobQueue.java new file mode 100644 index 0000000..9b4125e --- /dev/null +++ b/src/main/java/site/deercloud/liteworldedit/Managers/JobQueue.java @@ -0,0 +1,86 @@ +package site.deercloud.liteworldedit.Managers; + +import org.bukkit.Bukkit; +import org.bukkit.boss.BarColor; +import org.bukkit.boss.BarStyle; +import org.bukkit.boss.BossBar; +import org.bukkit.entity.Player; +import site.deercloud.liteworldedit.Jobs.Job; + +import java.util.LinkedList; + +public class JobQueue { + + private final LinkedList queue = new LinkedList(); + + private final BossBar bar = Bukkit.createBossBar("§a§lLiteWorldEdit", BarColor.GREEN, BarStyle.SOLID); + + boolean paused = false; + + int total = 0; + + int ms_last_pop; + + Player player; + + public JobQueue(Player player) { + this.player = player; + this.bar.addPlayer(player); + } + + public void add(Job job) { + queue.add(job); + total++; + } + + public Job pop() { + if (queue.isEmpty()) { + total = 0; + return null; + } + if (paused) { + return null; + } + Job job = queue.pop(); + updateBarProgressBar(); + ms_last_pop = (int) System.currentTimeMillis(); + return job; + } + + public int size() { + return queue.size(); + } + + public boolean isEmpty() { + return queue.isEmpty(); + } + + public void pause() { + bar.setColor(BarColor.YELLOW); + bar.setTitle("§e§lLiteWorldEdit [暂停] 剩余任务: " + queue.size()); + paused = true; + } + + public void resume() { + bar.setColor(BarColor.GREEN); + paused = false; + } + + public void cancel() { + queue.clear(); + total = 0; + bar.setVisible(false); + paused = false; + } + + private void updateBarProgressBar() { + bar.setProgress((total - queue.size()) * 1.0 / total); + int delta_time_ms = (int) System.currentTimeMillis() - ms_last_pop; + int time_s_remaining = queue.size() * delta_time_ms / 1000; + int time_m_remaining = time_s_remaining / 60; + int time_s_remaining_mod = time_s_remaining % 60; + bar.setTitle("§a§lLiteWorldEdit [正在运行] 剩余任务: " + queue.size() + " 预计剩余时间: " + time_m_remaining + "分" + time_s_remaining_mod + "秒"); + bar.setVisible(queue.size() != 0); + } + +}