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);
+ }
+
+}