2016-07-11 21 views
2

私のコードでは、tntやクリーパーが爆発したときにブロックがどこにでも飛びますが、ブロックがすべて上がったときにすべてが再生する必要がありますが、それは起こりません。結論が出た人は誰ですか?ここで Bukkit EntityExplode物理学とブロックの再生

が私のコードです:私はあなたが作成したEntitysを格納し、場所を取り戻すために持っているだろうと思い

 @EventHandler 
     void onExplode1(EntityExplodeEvent event) { 

    for(Block block : event.blockList()) { 

     if(block.getType() != Material.TNT) { 
      float x = -0.4F + (float) (Math.random() * 0.9D); 
      float y = -1.2F + (float) (Math.random() * 1.9D); 
      float z = -0.9F + (float) (Math.random() * 1.4D); 

      FallingBlock falling = block.getWorld().spawnFallingBlock(block.getLocation(), block.getType(), block.getData()); 
      falling.setVelocity(new Vector(x, y, z)); 
      falling.setDropItem(true); 

      block.setType(Material.AIR); 

     } 

     if(block.getType() != Material.AIR) { 

      final BlockState state = block.getState(); 

      int delay; 

      if(block.getType().hasGravity()) { 

       delay = 80; 

      } else { 

       delay = 80 + (int)(Math.random()*60); 

      } 

      // Set block to air so that no blocks drop 
      block.setType(Material.AIR); 

      // Regenerate all the blocks in a random order 
      Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable() { 

       public void run() { 

        state.update(true, false); 

       } 

      }, delay); 

     } 

    } 

} 
} 
+0

?ブロックが爆発の前にあった場所、またはブロックがどこに来たのか? –

+0

はい、ブロックを正確な位置に戻したいと思います。 – InfernoArtz

答えて

0

...ここでのコード例である...それはする必要はありません。他の人たちと同じように仕事をしていますが、それは試練です。

package me.mcplayhd.testt; 

import java.util.HashMap; 
import java.util.Iterator; 

import org.bukkit.Location; 
import org.bukkit.Material; 
import org.bukkit.block.Block; 
import org.bukkit.entity.FallingBlock; 
import org.bukkit.event.EventHandler; 
import org.bukkit.event.Listener; 
import org.bukkit.event.entity.EntityChangeBlockEvent; 
import org.bukkit.event.entity.EntityDamageEvent; 
import org.bukkit.event.entity.EntityDeathEvent; 
import org.bukkit.event.entity.EntityExplodeEvent; 
import org.bukkit.plugin.java.JavaPlugin; 
import org.bukkit.util.Vector; 

public class ExplodeBlocks extends JavaPlugin implements Listener { 

    public void onEnable() { 
     getServer().getPluginManager().registerEvents(this, this); 
    } 

    HashMap<FallingBlock, Location> blocks = new HashMap<FallingBlock, Location>(); 

    @SuppressWarnings("deprecation") 
    @EventHandler 
    void onEntityExplode(EntityExplodeEvent e) { 
     Iterator<Block> bi = e.blockList().iterator(); 
     while(bi.hasNext()) { 
      Block b = bi.next(); 
      if(b.getType() != Material.TNT) { 
       bi.remove(); 

       Material m = b.getType(); 
       byte d = b.getData(); 

       b.setType(Material.AIR); 

       float x = -0.4F + (float) (Math.random() * 0.9D); 
       float y = -1.2F + (float) (Math.random() * 1.9D); 
       float z = -0.9F + (float) (Math.random() * 1.4D); 

       FallingBlock falling = b.getWorld().spawnFallingBlock(b.getLocation(), m, d); 
       falling.setVelocity(new Vector(x, y, z)); 
       falling.setDropItem(false); 

       blocks.put(falling, b.getLocation()); 
      } 
     } 
    } 

    @EventHandler 
    public void onEntityDamage(EntityDamageEvent e) { 
     if(e.getEntity() instanceof FallingBlock) { 
      FallingBlock fb = (FallingBlock) e.getEntity(); 
      if(blocks.containsKey(fb)) { 
       e.setCancelled(true); 
      } 
     } 
    } 

    @SuppressWarnings("deprecation") 
    @EventHandler 
    public void onEneityDeath(EntityDeathEvent e) { 
     if(e.getEntity() instanceof FallingBlock) { 
      FallingBlock fb = (FallingBlock) e.getEntity(); 
      if(blocks.containsKey(fb)) { 
       Location loc = blocks.get(fb); 
       loc.getBlock().setType(fb.getMaterial()); 
       loc.getBlock().setData(fb.getBlockData()); 
       blocks.remove(fb); 
       fb.remove(); 
      } 
     } 
    } 

    @SuppressWarnings("deprecation") 
    @EventHandler 
    public void onEntityChangeBlock(EntityChangeBlockEvent e) { 
     if(e.getEntity() instanceof FallingBlock) { 
      FallingBlock fb = (FallingBlock) e.getEntity(); 
      if(blocks.containsKey(fb)) { 
       e.setCancelled(true); 
       Location loc = blocks.get(fb); 
       loc.getBlock().setType(fb.getMaterial()); 
       loc.getBlock().setData(fb.getBlockData()); 
       blocks.remove(fb); 
       fb.remove(); 
      } 
     } 
    } 

} 

問題は100%は機能しませんが、ほとんどのブロックが復元されます。これは全く役に立たない場合

SRY ...他の人が私は知らないが、私はあなたが原因を見つけることになると思い

あなたはそれが上陸した後のブロックが表示されるようにしたいん
関連する問題