我用服务器列表做了一个胸部gui。玩家打开它时必须开始更新,并且当玩家打开其他gui /关闭当前时取消更新。首先,当玩家运行命令时,执行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
,但任务继续执行。我喜欢用它做什么。我也尝试过:
答案 0 :(得分:1)
刚刚解决了。当玩家点击其他项目时,问题在于将旧任务重写为hashmap。所以它取消了新任务但不是旧任务。我添加了取消任务,当玩家点击项目(必须打开其他gui)或关闭gui时,将其从hashmap中删除。
很抱歉浪费你的时间在我的错误上..感谢Squiddie
给我正确的方式。