0

所以,我正在编写这个 Minecraft bukkit 插件,我想要一些关于如何让插件在执行一行代码之前等待特定时间的帮助。因为如果我们尝试这个:

线程.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);
    }
}

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

4

2 回答 2

3

thread.sleep(int) 使您的服务器崩溃的原因是它冻结了您的服务器线程,使程序由于不活动而停止(这样的事情您明白了)。

您可以使用 bukkit 时间表!或者,如果您想做比 bukkit 更高级和更快的事情,您可以使用普通线程(只需确保使用 thread.start() 创建一个新线程)

您可以使用其中任何一个来从 15 数到 19,延迟 1 秒。或者从 0 数到 4 并将健康设置为数字 + 15。

为此,我们不需要比 minecraft 更快,因此我们可以使用 bukkit schedulars。时间表信息

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。

如果您确实需要延迟更改,您可以将其保持在一秒钟并等待额外的迭代,然后再继续。

于 2016-03-07T23:13:58.217 回答
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();
于 2016-07-27T14:16:39.290 回答