2016-03-07 66 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();