所以,我正在编写这个Minecraft bukkit插件,我想要一些帮助,如何让插件在执行一行代码之前等待一段特定的时间。因为如果我们尝试这个:
的Thread.sleep(4000);
这实际上会暂停整个服务器4秒......
所以我想要一个可以在Bukkit中使用的代码,而不是冻结整个服务器。 这是我的代码:
@EventHandler
public void bombSymptom (PlayerInteractEvent event) throws InterruptedException{
final Player player = event.getPlayer();
if (player == Bukkit.getPlayer("Viktoracri") && event.getItem() != null && event.getItem().getType() == Material.PUMPKIN && player.isOnGround() && player.getHealth() == 20){
Location loc = event.getPlayer().getLocation();
player.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 100, 10));
event.getPlayer().getWorld().createExplosion(loc, 3);
player.setHealth(15);
//Wait 1 sec
player.setHealth(16);
//Wait 2 sec
player.setHealth(17);
//Wait 1 sec
player.setHealth(18);
//Wait 1 sec
player.setHealth(19);
}
}
有人可以给我一个如何做到这一点的代码吗?我非常感谢。
答案 0 :(得分:3)
thread.sleep(int)崩溃你的服务器的原因是它冻结了你的服务器线程,使得程序由于不活动而停止(这样你会得到这个想法)。
您可以使用bukkit日程安排! 或者如果你想做比bukkit更高级和更快的事情,你可以使用普通线程(只需确保用thread.start()创建一个新的)
您可以使用其中任何一个从15到19计数,延迟为1秒。 或者从0到4进行计数,并将健康状况设置为数字+15。
为此,我们不需要比我的世界更快,所以我们可以使用bukkit日程安排。 Schedular Info
final int run = Bukkit.getScheduler().scheduleSyncRepeatingTask(Core.getPlugin(), new Runnable()
{
int i = 0;
@Override
public void run()
{
if (i > 4)
Bukkit.getScheduler().cancelTask(run);
player.setHealth(i + 15);
i++;
}
}, initDelay, loopDelay);
初始延迟是它开始前的滴答延迟。 循环延迟是迭代之间的滴答延迟。
请记住,一秒钟内有20个滴答,所以对于初始延迟,它将为0,对于循环延迟,它将为20。
如果你真的需要延迟改变,你可以保持一秒钟,等待额外的迭代,然后再继续。
答案 1 :(得分:0)
你可以创建一个基本上与服务器一起运行的线程。您可以像这样设置线程类:
public class BombThread implements Runnable {
public Player p;
public BombThread (Player p) {
this.p = p;
}
public void run() {
p.setHealth(15);
Thread.sleep(1000);
p.setHealth(16);
Thread.sleep(2000);
p.setHealth(17);
Thread.sleep(1000);
p.setHealth(18);
Thread.sleep(1000);
p.setHealth(19);
}
}
然后运行它,在你的监听器方法中,你会这样做:
BombThread thread = new BombThread(player);
thread.start();