我用服务器列表做了一个胸部图。当player打开它时,它必须开始更新,当player打开其他gui /闭合当前时,它必须取消更新。首先,当player运行命令时,执行openMenu(Player)
方法:
public void openMenu(Player player) {
// Creating inv, filling, etc
player.openInventory(inv);
updateMenu(player, inv);
}
因此,打开菜单,开始更新:
public void updateMenu(Player player, Inventory inv) {
BukkitTask task = Bukkit.getServer().getScheduler().runTaskTimer(ServerSelect.instance, new Runnable() {
@Override
public void run() {
Bukkit.getServer().getLogger().log(Level.INFO, "Trying to update menu.");
if (!player.getOpenInventory().getTopInventory().getTitle().equals(inv.getTitle())) {
Bukkit.getServer().getLogger().log(Level.INFO, "Closed.");
MenuManager.menuUpdaters.get(player.getName()).cancel(); // Does not work? :/
}
Bukkit.getServer().getLogger().log(Level.INFO, "Updating menu.");
// Updating inventory ...
}
}, 60L, 60L);
MenuManager.menuUpdaters.put(player.getName(), task);
}
问题是即使在取消任务继续运行之后,日志:
Trying to update menu.
Closed.
Updating menu.
Trying to update menu.
Closed.
Updating menu.
运行PaperSpigot 1.12.1我打印了isCancelled()
,第一次运行时它说是false
,然后每次是true
,但是任务继续执行。想想看我能做什么。我也试过:
发布于 2017-10-16 10:23:36
刚解决了。当玩家单击其他项目时,问题是将旧任务重写为hashmap。所以它取消了新的任务,而不是旧的任务。我添加了取消任务,并在玩家单击项目(必须打开其他gui)或关闭gui时从hashmap中删除它。抱歉,把你的时间浪费在我的错误上。感谢Squiddie
给了我正确的方式。
https://stackoverflow.com/questions/46775724
复制