2017-01-09 39 views
1

我試圖完成的是當服務器啓動/重新加載插件將檢測世界上的所有SKULLS,然後設置對它們循環並且不會結束的效果。在世界上重複對塊的影響

我當前的代碼:

@EventHandler 
public void onChunkLoad(ChunkLoadEvent event){ 
Chunk chunk = event.getChunk(); 
if(event.getWorld().getName().equals("world")){ 
    for (int x = 0; x < 16; x++){ 
     for (int y = 0; y < 256; y++){ 
      for(int z = 0; z <16; z++){ 
     Block block = chunk.getBlock(x, y, z); 
     if(block.getType() == Material.SKULL){ 
      event.getWorld().playEffect(block.getLocation(), Effect.MOBSPAWNER_FLAMES, 0); 
+1

的循環可能沒有結束,由於事實,你在塊的16 * 256 * 16(65536)量循環。這是一個塊!這樣做對所有的塊會造成大量的滯後,因此給人的印象是循環永不結束 – Kerooker

+0

另外,你還記得在你的主線程中的某個地方註冊你的事件嗎? – Kerooker

+0

我註冊了事件,除非我做錯了。我也做了一個調試,它的工作。這裏是註冊事件代碼:Bukkit.getPluginManager()。registerEvents(new ChestManager(this),this); – InfernoArtz

回答

2

循環超過65536塊每塊加載的打算把一個很大的壓力在你的服務器的處理器。

你應該嘗試Chunk#getTileEntities(),看看瓷磚實體的instanceof org.bukkit.block.Skull

此外,你只產卵一次顆粒,這是塊的負載時。重複效果的最佳方法是將加載的頭骨存儲到ArrayList中,並使用BukkitRunnable不斷循環遍歷所有頭骨並創建粒子效果。

您可以瞭解如何使用BukkitRunnablehere

+0

還應該看看[在SO的文檔](http://stackoverflow.com/documentation/bukkit/drafts/105168)進一步的時間表瞭解。 – Kerooker