getPoints(Player player) {
- return _points.get(player.getUniqueId().toString());
- }
-
- 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());
- }
-
- public void deletePlayerCache(Player player) {
- _jobs.remove(player.getUniqueId().toString());
- }
-
- private String getNextPlayer() {
- if (_jobs.size() == 0) {
- return null;
- }
- if (_last_jobs_player == null) {
- _last_jobs_player = _jobs.keySet().iterator().next();
- return _last_jobs_player;
- }
- boolean found = false;
- for (String key : _jobs.keySet()) {
- if (found) {
- // 忽略没有任务的玩家
- if (_jobs.get(key).size() == 0) {
- continue;
- }
- _last_jobs_player = key;
- return key;
- }
- if (key.equals(_last_jobs_player)) {
- found = true;
- }
- }
- _last_jobs_player = _jobs.keySet().iterator().next();
- return _last_jobs_player;
+ public XPlayer getPlayer(Player player) {
+ String name = player.getName();
+ if (!players.containsKey(name)) playerJoin(player);
+ return players.get(name);
}
}
diff --git a/src/main/java/site/deercloud/liteworldedit/Managers/JobQueue.java b/src/main/java/site/deercloud/liteworldedit/Managers/JobQueue.java
index 9b4125e..3755973 100644
--- a/src/main/java/site/deercloud/liteworldedit/Managers/JobQueue.java
+++ b/src/main/java/site/deercloud/liteworldedit/Managers/JobQueue.java
@@ -26,6 +26,7 @@ public class JobQueue {
public JobQueue(Player player) {
this.player = player;
this.bar.addPlayer(player);
+ this.bar.setVisible(false);
}
public void add(Job job) {
diff --git a/src/main/java/site/deercloud/liteworldedit/SchedulerUtil.java b/src/main/java/site/deercloud/liteworldedit/SchedulerUtil.java
new file mode 100644
index 0000000..ccdd4c7
--- /dev/null
+++ b/src/main/java/site/deercloud/liteworldedit/SchedulerUtil.java
@@ -0,0 +1,35 @@
+package site.deercloud.liteworldedit;
+
+import org.bukkit.Bukkit;
+import org.bukkit.entity.Entity;
+import org.bukkit.plugin.Plugin;
+import org.bukkit.scheduler.BukkitTask;
+
+public class SchedulerUtil {
+
+ private static Boolean IS_FOLIA = null;
+
+ private static boolean tryFolia() {
+ try {
+ Bukkit.getAsyncScheduler();
+ return true;
+ } catch (Throwable ignored) {
+ }
+ return false;
+ }
+
+ public static Boolean isFolia() {
+ if (IS_FOLIA == null) IS_FOLIA = tryFolia();
+ return IS_FOLIA;
+ }
+
+ public static void runLaterEntity(Entity entity, Plugin plugin, Runnable runnable, int ticks) {
+ if (isFolia()) entity.getScheduler().runDelayed(plugin, (task) -> runnable.run(), null, ticks);
+ else Bukkit.getScheduler().runTaskLater(plugin, runnable, ticks);
+ }
+
+ public static void runAtFixedRateEntity(Entity entity, Plugin plugin, Runnable runnable, int ticks) {
+ if (isFolia()) entity.getScheduler().runAtFixedRate(plugin, (task) -> runnable.run(), null, ticks, ticks);
+ else Bukkit.getScheduler().runTaskTimer(plugin, runnable, ticks, ticks);
+ }
+}
diff --git a/src/main/java/site/deercloud/liteworldedit/Task.java b/src/main/java/site/deercloud/liteworldedit/Task.java
new file mode 100644
index 0000000..4994ae8
--- /dev/null
+++ b/src/main/java/site/deercloud/liteworldedit/Task.java
@@ -0,0 +1,54 @@
+package site.deercloud.liteworldedit;
+
+import org.bukkit.entity.Player;
+import site.deercloud.liteworldedit.Jobs.Job;
+import site.deercloud.liteworldedit.Jobs.JobErrCode;
+
+public class Task implements Runnable{
+ /**
+ * When an object implementing interface {@code Runnable} is used
+ * to create a thread, starting the thread causes the object's
+ * {@code run} method to be called in that separately executing
+ * thread.
+ *
+ * The general contract of the method {@code run} is that it may
+ * take any action whatsoever.
+ *
+ * @see Thread#run()
+ */
+
+ private final XPlayer xPlayer;
+
+ Task(XPlayer player) {
+ this.xPlayer = player;
+ }
+
+ @Override
+ public void run() {
+ Job job = this.xPlayer.popJob();
+ if (job == null) {
+ return;
+ }
+ // 如果任务不可执行 允许在一个tick内多次执行直到任务可执行
+ int max_retries = 100;
+ JobErrCode re;
+ while ((re = job.Do()) != JobErrCode.OK) {
+ max_retries--;
+ if (max_retries <= 0) {
+ break;
+ }
+ if (re.canContinue()) {
+ job.get_creator().sendTitle("§e警告", "§e" + re.getMessage(), 10, 70, 20);
+ job = this.xPlayer.popJob();
+ if (job == null) {
+ return;
+ }
+ } else {
+ Player player = job.get_creator();
+ player.sendTitle("§c错误 任务已自动暂停", "§c" + re.getMessage(), 10, 70, 20);
+ this.xPlayer.pauseJob();
+ return;
+ }
+ }
+ }
+}
diff --git a/src/main/java/site/deercloud/liteworldedit/XPlayer.java b/src/main/java/site/deercloud/liteworldedit/XPlayer.java
new file mode 100644
index 0000000..662f16b
--- /dev/null
+++ b/src/main/java/site/deercloud/liteworldedit/XPlayer.java
@@ -0,0 +1,63 @@
+package site.deercloud.liteworldedit;
+
+import org.bukkit.entity.Player;
+import site.deercloud.liteworldedit.Jobs.Job;
+import site.deercloud.liteworldedit.Managers.JobQueue;
+import site.deercloud.liteworldedit.Managers.Point;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static site.deercloud.liteworldedit.SchedulerUtil.runAtFixedRateEntity;
+
+public class XPlayer {
+
+ private final Map points;
+ private final Player player;
+ private final JobQueue queue;
+ private final Task task;
+
+ public XPlayer(Player player) {
+ this.player = player;
+ this.points = new HashMap<>();
+ this.queue = new JobQueue(player);
+ this.task = new Task(this);
+ runAtFixedRateEntity(player, LiteWorldEdit.instance, task, 1);
+ }
+
+ public void addJob(Job job) {
+ queue.add(job);
+ }
+
+ public Job popJob() {
+ return queue.pop();
+ }
+
+ public void pauseJob() {
+ queue.pause();
+ }
+
+ public void resumeJob() {
+ queue.resume();
+ }
+
+ public void cancelJob() {
+ queue.cancel();
+ }
+
+ public boolean hasJob() {
+ return !queue.isEmpty();
+ }
+
+ public boolean addPoint(Integer index, Point point) {
+ if (points.size() >= 20) {
+ return false;
+ }
+ points.put(index, point);
+ return true;
+ }
+
+ public Map getPoints() {
+ return points;
+ }
+}
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index ccb4c28..1a1e146 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -7,6 +7,7 @@ load: STARTUP
authors: [ Luming ]
description: 生存用简易创世神。
website: https://blog.deercloud.site
+folia-supported: true
commands:
LiteWorldEdit:
description: 简易创世神命令