首页 > 解决方案 > bukkit 可运行的 IllegalStateException

问题描述

伙计们,我正在制作一个 spigot 1.8 插件。它在 1.16 上工作,但在 1.8 中它抛出了这个:

[10:00:59 ERROR]: Could not pass event InventoryClickEvent to Knockback_PVP v1.0.0
.....
org.bukkit.event.EventException
Caused by: java.lang.IllegalStateException: Already scheduled as 1201
        at org.bukkit.scheduler.BukkitRunnable.checkState(BukkitRunnable.java:141) ~[spigot-1.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-c3c767f-33d5de3]
        at org.bukkit.scheduler.BukkitRunnable.runTask(BukkitRunnable.java:31) ~[spigot-1.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-c3c767f-33d5de3]
...

这是我的代码的一部分:

BukkitRunnable runnable = new BukkitRunnable() {
            @Override
            public void run() {
                if (plugin.RegenTasks.containsKey(getTaskId()) == false) return;
                Player p = plugin.RegenTasks.get(getTaskId());
                p.getInventory().setItem(3, new ItemStack(Material.DIAMOND));
                plugin.RegenTasks.remove(getTaskId());
                return;
            }
        };
        runnable.runTaskLater(plugin, 2*20*30);
        plugin.RegenTasks.put(runnable.getTaskId(),p);

当玩家死亡时在其他地方:

if (plugin.RegenTasks.containsValue(p)){ 
    for (int i: plugin.RegenTasks.keySet()) {
        if (plugin.RegenTasks.get(i) == p) {
            plugin.RegenTasks.remove(i);
                try 
                    {plugin.getServer().getScheduler().cancelTask(i);}
                finally {break;}
        }
    }
}

有什么办法解决吗?

标签: javaminecraftillegalstateexception

解决方案


您只能安排一次 BukkitRunnable。你的错误信息也告诉你。

已经预定为1201

看一下Javadoc:

IllegalStateException - 如果这已经安排好了

所以要么只调用一次runnable,要么安排你的任务,例如:

BukkitScheduler.scheduleSyncRepeatingTask(...)


推荐阅读