我将重新生成所有被TNT破坏的块。我使用EntityExplosionEvent做到了这一点,但是当我从event.blockList()获取块时,它们的类型为AIR。
谁能帮忙?
我的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);
}
最佳答案
您在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来存储每个块的先前材料。块引用保持一致且块对象不可克隆的原因。请注意,我的方法仅保存以前的材料,而不保存其数据或状态,您必须自己添加支持。希望能帮助到你!