我试图创建一个我的游戏插件,它会射击箭头5次,两次射击之间有10个刻度延迟。
不幸的是,我对Java并不熟悉,但我会尽力理解答案。
这是我的代码:
public void run() {
for (int i = 0; i <5; i++){
player.playSound(player.getLocation(), Sound.SHOOT_ARROW, 1.0f, 1.0f);
Arrow arrow = player.launchProjectile(Arrow.class);
Events.removeArrows.put(arrow.getEntityId(), (byte) 1);
}
}
目前此代码段&#34;拍摄&#34; 5箭无延迟。现在我在添加延迟时陷入困境。
答案 0 :(得分:0)
BukkitScheduler scheduler = getServer().getScheduler();
scheduler.scheduleSyncRepeatingTask(yourPlugin, new Runnable() {
@Override
public void run() {
//Execute Arrow Code here
}
}, 10L);
这将每隔10个滴答在run()
方法中执行代码,直到停止。为此,请在Runnable中使用this.cancel();
。
答案 1 :(得分:0)
可能最简单的方法是使用异步任务:
//Asynchronous Task
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
for (int i = 0; i <5; i++){
player.playSound(player.getLocation(), Sound.SHOOT_ARROW, 1.0f, 1.0f);
Arrow arrow = player.launchProjectile(Arrow.class);
Events.removeArrows.put(arrow.getEntityId(), (byte) 1);
try {
//pause the task for 10 ticks / half a second
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
}
});
此代码射出一个箭头然后等待10个刻度并重新开始直到for
循环结束。
通常,您不应该在代码中放置Thread.sleep()
,因为它会在您定义的时间内停止整个服务器。但由于这个函数是异步的,我们不会遇到这个问题。