Minecraft插件scheduleSyncDelayedTask错误

时间:2018-08-15 22:01:02

标签: java plugins minecraft

我遇到了问题,并且是制作Minecraft插件和编写代码的新手。

我正在尝试制作一个在执行第二个命令之前需要等待约15秒的插件,但是我尝试执行的代码(插件,新的Runnable())现在出现了错误。人们说那是因为我的Main班上没有这个问题,问题是我不想在Main上。所以我想知道要做什么才能做到这一点。

下面的代码。在此先感谢您提供的任何帮助。 〜石头

@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {


    if (sender instanceof Player){
        //checks to see if player sent command
        Player player = (Player) sender;


        if (args.length >= 1) {
            //too many arguments message
            player.sendMessage(Utils.chat("&4There were too many arguments, I could not complete that command"));

        }


        if (player.hasPermission("reloadc.use")) {
            //reloads server, sends message, and stores variable value              
            Bukkit.broadcastMessage(Utils.chat("&6Server will be reloaded in 15 seconds by &5" + player.getDisplayName()));

            Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
                public void run() {
                    Bukkit.broadcastMessage(Utils.chat("&6This works"));
                }
            }, 20L);

            Bukkit.broadcastMessage(Utils.chat("&6IT WORKED!!!!!"));                
        }

        else if (!player.hasPermission("reloadc.use")) {

            player.sendMessage(Utils.chat("&4You do not have permission to reload the server"));
            player.sendMessage(Utils.chat("&5If you belive this is a mistake please contact an admin"));

        }
    }
    return true;
}

}

给我带来麻烦的代码就在这里(单词插件)

                Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
                public void run() {
                    Bukkit.broadcastMessage(Utils.chat("&6This works"));
                }
            }, 20L);

这里有3张图像,它带有错误信息。我没有做的唯一更改是getServer()。因为它给了我更多的错误,并且至少从我所能告诉的情况来看,没有做任何改善。

1 [Image 1: Screenshot of error Eclipse gave me] 2 [Image 2: Screenshot of error Eclipse gave me (plugin is underlined in red)] Image 3: Screenshot of the CMD from my server when I tried to excecute my reloadc command

好,所以我已经完成了更改,所有内容都表明它可以正常工作,但是现在当我运行我设置的命令时,它会执行所有操作,除了等待15秒。它一个接一个地执行文本,告诉我它将在15秒内重新加载,然后同时告诉我它可以工作。现在对我来说似乎没有什么错,它只是说它运行良好,我的等待时间是300L,这是服务器的滴答声。那应该等于15。

以下完整代码的图片。

My Main Class Image of my Reload C class with the wait 15 seconds method inside.

1 个答案:

答案 0 :(得分:0)

响应您的更新/编辑:

发生错误是因为您使用plugin对您的代码没有任何意义。您需要先将其声明为变量,然后再在其中使用,或者假设您在一个类中为插件编写了所有代码,然后可以像这样{{1}那样轻松地将plugin替换为this }。

如果它在另一个类中,则要声明该变量,您需要将其从另一个类传递或从您的Main插件类中调用。下面将向您展示如何将其传递给您的侦听器类。

在您的主插件类中,您需要执行此操作,请注意我们如何将Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() {添加到调用命令类this的函数中,请注意您的类将具有与{{1 }}:

new CommandClass(this)

然后在命令类中,我们对其进行修改以接收变量CommandClass

public class Main extends JavaPlugin{
  @Override
  public void onEnable(){
    new CommandClass(this);
  }
}

现在,您的onCommand方法将起作用,因为您在类中引用了public CommandClass(Main plugin)

public class CommandClass implements CommandExecutor{
  private Main plugin;

  public CommandClass(Main plugin){
    this.plugin = plugin;
  }
}

原始答案进行了一些编辑,以包括对屏幕截图的一些回复:

我可以看到四个问题:

  1. 发生错误是因为您没有引用实际的插件,而只是键入了plugin
  2. 请注意,延迟时间以服务器滴答声为单位,因此20L仅包含 延迟1秒。如果要延迟15秒,请使用300L。
  3. 您没有使用@Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { @Override public void run() { Bukkit.broadcastMessage(Utils.chat("&6This works")); } }, 300L); } 批注,但这对于可运行的任务非常重要。
  4. 您可以使用plugin代替@Override,以防万一您的代码中发生了一些奇怪的情况,并且您设法启动了多个服务器实例。

这是您的代码的更新版本,其中固定了1和3:

getServer().getScheduler()

这是您代码的更新版本,其中包含建议4:

Bukkit.getScheduler()