bukkit - EntityExplosionEvent#blockList()不起作用

时间:2018-03-08 17:22:00

标签: java minecraft bukkit

我要重新生成被TNT摧毁的所有街区。我使用EntityExplosionEvent做到了这一点但是当我从event.blockList()获取块时,它们的类型是AIR。

任何可以提供帮助的人?

My EntityExplosionEvent:

@EventHandler
public void onExplode(EntityExplodeEvent e) {

    Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getInstance(), new Runnable() {

        @Override
        public void run() {
            for(Block b : e.blockList()) {
                b.getLocation().getBlock().setType(b.getType());
                b.getState().update();
            }
        }
    }, 20*3);
}

1 个答案:

答案 0 :(得分:3)

您在x刻度后调用e.blockList,这将在事件发生后调用。当你这样做时,所有的块都会变成空气。解决方案是将所有块存储在调度程序之外,如下所示:

@EventHandler
public void onExplode(EntityExplodeEvent e) {

    List<Block> blocks = e.blockList();
    HashMap<Block, Material> blockMap = new HashMap<Block, Material>();
    for(Block b : e.blockList()) {
        blockMap.put(b, b.getType());
    }

    Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getInstance(), new Runnable() {

        @Override
        public void run() {
            for(Block b : blocks) {
                b.getLocation().getBlock().setType(blockMap.get(b));
                b.getState().update();
            }
        }
    }, 20*3);
}

更新:我改为使用HashMap存储每个块的先前材料。原因是块引用保持一致并且块对象不可克隆。请注意,我的方法只保存以前的材料,而不是其数据或状态,您必须自己添加该支持。希望它有所帮助!