2016-03-07 26 views
0

因此,我正在编写这个Minecraft bukkit插件,并且我想要一些帮助,让插件在执行一行代码之前等待一定的时间。因为如果我们试试这个:BUKKIT:如何等待X行时间X前

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); 
    } 
} 

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

回答

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。

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

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