本帖最后由 凉凉丶 于 2021-6-13 16:05 编辑
使用计划任务给予玩家东西如何去检测玩家掉线,是必须写在监听中吗?不检测玩家掉线的话指令会继续执行,所以需要取消这个玩家的所进行的线程
复制代码
使用计划任务给予玩家东西如何去检测玩家掉线,是必须写在监听中吗?不检测玩家掉线的话指令会继续执行,所以需要取消这个玩家的所进行的线程
- new BukkitRunnable(){}.runTaskTimer(plugin,10,10),
本帖最后由 南外丶仓鼠 于 2021-6-13 18:35 编辑
在run函数开头检测一遍Player#isOnline()
如果为false,cancel
(假设你没有runnable套runnable)
在run函数开头检测一遍Player#isOnline()
如果为false,cancel
(假设你没有runnable套runnable)
本帖最后由 RarityEG 于 2021-6-13 19:47 编辑
当然,监听玩家退出事件,然后调用这个 BukkitRunnable 的 cancel 方法
(所以建议用一个 Map 将玩家 UUID 与 BukkitRunnable 对应起来,当然这可能不是最高效的方法)
EDIT:沙发方法更有效,确实
(所以建议用一个 Map 将玩家 UUID 与 BukkitRunnable 对应起来,当然这可能不是最高效的方法)
EDIT:沙发方法更有效,确实
RarityEG 发表于 2021-6-13 16:12
当然,监听玩家退出事件,然后调用这个 BukkitRunnable 的 cancel 方法
(所以建议用一个 Map 将玩家 UUID ...
方法有用,但是 在退出的时候线程成功结束,然后提示了一个空指针
at me.kg.skillhook.SkillHook.onQuit(SkillHook.java:69) ~[?:?]
这是为什么呢
本帖最后由 Rothes 于 2021-6-14 11:22 编辑
BukkitTask task = Bukkit.getScheduler().runTaskTimerAsynchronously(instrance, () -> {}, 0L, 10L);
Bukkit.getScheduler().cancelTask(task.getTaskId());
task.cancel();
BukkitTask task = Bukkit.getScheduler().runTaskTimerAsynchronously(instrance, () -> {}, 0L, 10L);
task.cancel();