BUKKIT:如何在行前等待X个时间

时间:2016-03-07 18:57:52

标签: methods wait minecraft bukkit pause

所以,我正在编写这个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);
    }
}

有人可以给我一个如何做到这一点的代码吗?我非常感谢。

2 个答案:

答案 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();