Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Bukkit在For循环中延迟了任务_Java_Bukkit - Fatal编程技术网

Java Bukkit在For循环中延迟了任务

Java Bukkit在For循环中延迟了任务,java,bukkit,Java,Bukkit,我一直在尝试为Bukkit制作gun插件,并尝试构建一个burst fire功能。我有一个for循环,它包含一个延迟的任务,在延迟的任务中是创建项目符号的代码。理论上,代码会添加一些项目符号,等待一个记号,然后再添加一些项目符号,等待一个记号,等等,直到for循环完成 public void fire(最终玩家p,最终玩家g){ 对于(int i=0;i来解决一个问题: Eclipse要求玩家p和g都是最终的,我不知道为什么 您正在将播放器p和枪g传递给新线程/新可运行,Eclipse告诉您,这

我一直在尝试为Bukkit制作gun插件,并尝试构建一个burst fire功能。我有一个for循环,它包含一个延迟的任务,在延迟的任务中是创建项目符号的代码。理论上,代码会添加一些项目符号,等待一个记号,然后再添加一些项目符号,等待一个记号,等等,直到for循环完成

public void fire(最终玩家p,最终玩家g){

对于(int i=0;i来解决一个问题:

Eclipse要求玩家p和g都是最终的,我不知道为什么

您正在将
播放器p
枪g
传递给
新线程
/
新可运行
,Eclipse告诉您,这两个
对象
不应该被修改或更改,因为
线程
/
可运行
也在run方法中使用这两个对象(如您所见)

我建议您直接在这里写下您的问题:因为还有一些开发人员对Minecraft的Bukkit服务器有更详细的了解

我现在会努力找到一个适合你需要的解决方案,但也许你已经在论坛上找到了一个解决方案

为您找到此链接-它可能会对您有所帮助:

要在不冻结Bukkit主线程的情况下延迟运行
for
循环,没有简单的方法。在这种情况下,最好使用:

但是,如果使用此选项,枪将只发射一次。要解决此问题,应继续运行调度程序:

public static void runTask(){
  plugin.getServer().getScheduler().runTaskLater(plugin, new Runnable(){
    public void run(){
      //shoot the gun
      runTask(); //run the task again
    }
  },1L);//run after 1 tick
}
但这样一来,枪会持续发射每一个滴答声,并且永远不会停止。因此,您应该计算它已运行的次数,并在达到该次数后停止运行任务:

public static void runTask(final int timesLeft){
  plugin.getServer().getScheduler().runTaskLater(plugin, new Runnable(){
    public void run(){
      //shoot the gun
      if(timesLeft > 0){
        runTask(timesLeft - 1); //run the task again after removing from the times left
      }
    }
  },1L);//run after 1 tick
}
因此,最终,您的循环方法可能会如下所示:

public static void fire(final Player player, final Gun gun, final int timesLeft){
  plugin.getServer().getScheduler().runTaskLater(plugin, new Runnable(){
    public void run(){
      Bullet bullet = new Bullet(player, gun);
      GunsV1.bullets.add(bullet);

      if(timesLeft > 0){
        fire(player, gun, timesLeft - 1); //run the task again after removing from the times left
      }
    }
  },1L);//run after 1 tick
}
您可以通过以下方式调用它:

fire(player, gun, shotsPerBurst);

在对一些较长的延迟进行实验并查看spiget引用后,我意识到延迟的节拍不是在下一个任务之前的节拍,而是在可运行的运行之前的节拍。知道这一点,我能够使用for循环按比例增加延迟的节拍:

public void fire(最终玩家p,最终玩家g){

对于(int i=0;iIt解决了问题,但我不知道该怎么办,因为我是这个网站的新手。你应该投票选出对你有帮助的答案。此外,如果一个答案解决了你的问题,你应该接受它(这适用于所有问题)。但无论如何,一旦你接受了解决问题的答案,你就差不多完成了。
fire(player, gun, shotsPerBurst);