2017-01-09 36 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