Java bukkit-EntityExplosionEvent#blockList()赢得';行不通

Java bukkit-EntityExplosionEvent#blockList()赢得';行不通,java,minecraft,bukkit,Java,Minecraft,Bukkit,我打算重建所有被TNT摧毁的街区。我使用EntityExplosionEvent实现了这一点,但是当我从event.blockList()获取块时,它们的类型是AIR 有人能帮忙吗 我的实体爆炸事件: @EventHandler public void onExplode(EntityExplodeEvent e) { Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getInstance(), new Runnable() {

我打算重建所有被TNT摧毁的街区。我使用EntityExplosionEvent实现了这一点,但是当我从event.blockList()获取块时,它们的类型是AIR

有人能帮忙吗

我的实体爆炸事件:

@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);
}

您在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);
}
@EventHandler
公共无效onExplode(实体爆炸事件){
列表块=如blockList();
HashMap blockMap=新HashMap();
对于(块b:e.块列表()){
blockMap.put(b,b.getType());
}
Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getInstance(),new Runnable()){
@凌驾
公开募捐{
适用于(b区:b区){
b、 getLocation().getBlock().setType(blockMap.get(b));
b、 getState().update();
}
}
}, 20*3);
}

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

您确定所有的块类型都是空气块吗?这似乎是正确的做法。你能核实一下吗?