2017-06-16 100 views
-11

我正在嘗試創建一個minecraft插件,在射擊之間用10個刻度延遲拍攝箭頭5次。我的世界Bukkit Runnable

不幸的是,我對Java沒有太多的經驗,但我會盡我所能去理解答案。

這是我的代碼:

public void run() { 
    for (int i = 0; i <5; i++){ 
     player.playSound(player.getLocation(), Sound.SHOOT_ARROW, 1.0f, 1.0f); 
     Arrow arrow = player.launchProjectile(Arrow.class); 
     Events.removeArrows.put(arrow.getEntityId(), (byte) 1); 
    } 
} 

在此代碼段「筍」 5個箭無延遲的時刻。現在我遇到了添加延遲的問題。

+0

這段代碼是什麼,你的問題是什麼? – Pickle

+0

如何給我的世界Bukkit插件延遲?我已經給'Bukkit.getServer()。getScheduler()。scheduleAsyncDelayedTask(this,new Runnable(){'但是我得到錯誤'無法通過事件PlayerInteractEvent' –

+0

你還沒有回答我的問題。這是什麼代碼爲什麼它是不完整的)?你只是把一半的課程放入盒子中如果你希望我們幫助請至少尊重我們至少格式化你的代碼 – Pickle

回答

0
BukkitScheduler scheduler = getServer().getScheduler(); 
scheduler.scheduleSyncRepeatingTask(yourPlugin, new Runnable() { 
    @Override 
    public void run() { 
     //Execute Arrow Code here 
    } 
}, 10L); 

這將每10個滴答執行run()方法中的代碼,直到停止。爲此,請在Runnable中使用this.cancel();

0

可能做到這一點,最簡單的方法是用一個異步任務:

//Asynchronous Task 
Bukkit.getScheduler().runTaskAsynchronously(plugin,() -> { 
    for (int i = 0; i <5; i++){ 

     player.playSound(player.getLocation(), Sound.SHOOT_ARROW, 1.0f, 1.0f); 
     Arrow arrow = player.launchProjectile(Arrow.class); 
     Events.removeArrows.put(arrow.getEntityId(), (byte) 1); 

     try { 
      //pause the task for 10 ticks/half a second 
      Thread.sleep(500); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

}); 

此代碼筍然後一個箭頭等待10個蜱,直到for循環結束後重新開始。

通常情況下,您不應將Thread.sleep()放入您的代碼中,因爲它會在您定義的時間內停止整個服務器。但由於這個功能是異步的,我們不會面臨這個問題。