Java Bukkit在For循环中延迟了任务
我一直在尝试为Bukkit制作gun插件,并尝试构建一个burst fire功能。我有一个for循环,它包含一个延迟的任务,在延迟的任务中是创建项目符号的代码。理论上,代码会添加一些项目符号,等待一个记号,然后再添加一些项目符号,等待一个记号,等等,直到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告诉您,这
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);