【问题标题】:Minecraft Plugin scheduleSyncDelayedTask ErrorMinecraft 插件 scheduleSyncDelayedTask 错误
【发布时间】:2018-08-15 22:01:01
【问题描述】:

我遇到了一个问题,并且在制作 Minecraft 插件和编写一般代码方面是新手。

我正在尝试制作一个插件,该插件在执行第二个命令之前等待大约 15 秒,但是当我尝试执行时,我现在的代码出现错误(插件,new 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[]2 []

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

以下已完成代码的图片。

【问题讨论】:

  • 我已经更新了我的答案,以便为您的问题提供解决方案。只需在出现问题的行上将plugin 替换为this
  • 所以我们实际上确实将所有这些都放在了一个单独的类中,我不知道如何或在哪里引用这个插件变量如果语句开始了,但它给了我“无法启动类型插件”
  • 插件插件 = new Plugin();抱歉,不知道 enter 会发送它,这是我尝试过的代码行。你会建议我做什么?
  • 您是否尝试在原始代码中将plugin 替换为this?像这样Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() {
  • OMG 没关系,它现在可以正常工作的最后一部分。我发现我只是没有等待 15 秒才能看到说这有效的文字弹出。我忘记了我在暂停后留下了一条广播消息命令,上面写着它全部大写。再次感谢您的所有帮助,非常感谢! ~石头

标签: java plugins minecraft


【解决方案1】:

响应您的更新/编辑:

您的错误发生是因为您使用 plugin 对您的代码没有任何意义。您需要在其中使用之前将其声明为变量,或者假设您为插件编写了一个类中的所有代码,那么您可以轻松地将plugin 替换为this,就像Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { 一样。

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

在您需要执行此操作的主插件类中,请注意我们如何将 this 添加到调用您的命令类 new CommandClass(this) 的函数中,注意您的类的名称将与 CommandClass 不同:

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

然后在命令类中,我们修改它来接收变量public CommandClass(Main plugin)

public class CommandClass implements CommandExecutor{
  private Main plugin;

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

现在您的 onCommand 方法将起作用,因为您在类中引用了 plugin

@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);
}

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

我可以看到四个问题:

  1. 您的错误发生是因为您没有引用您的实际插件,而只是输入了plugin
  2. 请注意,延迟是在服务器滴答声中,所以 20L 将只有 延迟 1 秒。如果您想延迟 15 秒,请使用 300L。
  3. 您没有使用@Override注解,但它对于可运行任务非常重要。
  4. 您可以使用getServer().getScheduler() 而不是Bukkit.getScheduler(),以防万一您的代码出现问题并且您已成功启动多个服务器实例。

这是您的代码的更新版本,其中 1 和 3 已修复:

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

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

        getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable() {
            @Override
            public void run() {
                Bukkit.broadcastMessage(Utils.chat("&6This works"));
            }
        }, 300L);

【讨论】:

    猜你喜欢
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多