2015-04-05 79 views
1

我一直在試圖爲Bukkit製作槍插件,並且我正在嘗試構建突發式火災功能。我有一個包含延遲任務的for循環,並且在那個延遲任務中是創建子彈的代碼以及所有這些。理論上,代碼會添加一些項目符號,等待一個記號,然後添加更多項目符號,等待一個記號等,直到完成for循環。Bukkit延遲任務在For Loop中

public void fire(final Player p, final Gun g) { 
    for(int i=0; i<shotsPerBurst; i++) { 
     Bukkit.getServer().getScheduler().scheduleAsyncDelayedTask(plugin, new Runnable() { 
      public void run() { 
       for(int i=0; i<bulletsPerShot; i++) { 
        Bullet b = new Bullet(p, g); 
        GunsV1.bullets.add(b); 
       } 
      } 
     }, 1L); 
    } 
} 

Eclipse中要求該玩家p和槍摹都爲最後的,我不知道爲什麼,當我嘗試運行火(P,G),沒有任何反應。如何設置我的代碼,以便for循環在循環之間延遲1個tick?

回答

0

一些較長的延遲實驗和看龍頭引用後,我意識到,延遲的蜱蜱不是直到下一個任務,但直到可運行的運行。知道了這一點,我可以使用for循環,增加延遲的蜱比例:

public void fire(final Player p, final Gun g) { 
    for(int i=0; i<shotsPerBurst; i++) { 
     Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { 
      public void run() { 
       for(int i=0; i<bulletsPerShot; i++) { 
        Bullet b = new Bullet(p, g); 
        GunsV1.bullets.add(b); 
       } 
      } 
     }, i*3); 
    } 
} 

現在運行的每個任務前一個經過三對蜱和火災突發

+0

它解決了這個問題,但我不知道該從哪裏出發,因爲我是這個網站的新手 – Javed 2015-04-09 00:49:21

+0

你應該提供幫助你的答案。另外,如果答案解決了你的問題,你應該接受它(這適用於所有問題)。但無論如何,一旦你接受解決你的問題的答案,你就完成了。 – Jojodmo 2015-04-09 00:55:19

0

要解決一個問題:

Eclipse中要求該玩家p和槍摹都爲最後的,我不知道爲什麼

您傳遞Player pGun gnew Thread/new Runnable和Eclipse告訴你這些2 Object不應該被修改或更改,因爲Thread/Runnable也在run方法內部使用這兩個Object(如您所見)。

我建議你直接在這裏寫下你的問題:http://bukkit.org/forums/plugin-development.5/,因爲還有開發人員對Bukkit Server for Minecraft有更多詳細的瞭解。

我會盡力找到適合您現在需求的解決方案 - 但也許您已經嘗試在論壇中找到解決方案。

發現這個鏈接,你 - 它可以幫助你一點點:http://www.programcreek.com/java-api-examples/index.php?api=org.bukkit.scheduler.BukkitScheduler

0

有運行for循環與延遲不結冰Bukkit的主線程沒有容易方式。在這種情況下,最好的辦法是使用plugin.getServer().getScheduler().runTaskLater()

plugin.getServer().getScheduler().runTaskLater(plugin, new Runnable(){ 
    public void run(){ 
    //shoot the gun 
    } 
},1L);//run after 1 tick 

但是,如果你用這個,槍只會火一槍。要解決這個問題,你應該繼續運行調度程序:

public static void runTask(){ 
    plugin.getServer().getScheduler().runTaskLater(plugin, new Runnable(){ 
    public void run(){ 
     //shoot the gun 
     runTask(); //run the task again 
    } 
    },1L);//run after 1 tick 
} 

但是這樣,槍會保持每嘀嗒一聲,並且永不停止。所以,你應該算的時候,它已經跑了號碼,並停止運行任務一旦達到數量:

public static void runTask(final int timesLeft){ 
    plugin.getServer().getScheduler().runTaskLater(plugin, new Runnable(){ 
    public void run(){ 
     //shoot the gun 
     if(timesLeft > 0){ 
     runTask(timesLeft - 1); //run the task again after removing from the times left 
     } 
    } 
    },1L);//run after 1 tick 
} 

那麼,到底,你的循環方法可以是這個樣子:

public static void fire(final Player player, final Gun gun, final int timesLeft){ 
    plugin.getServer().getScheduler().runTaskLater(plugin, new Runnable(){ 
    public void run(){ 
     Bullet bullet = new Bullet(player, gun); 
     GunsV1.bullets.add(bullet); 

     if(timesLeft > 0){ 
     fire(player, gun, timesLeft - 1); //run the task again after removing from the times left 
     } 
    } 
    },1L);//run after 1 tick 
} 

,你可以通過調用它:

fire(player, gun, shotsPerBurst);