java - bukkit - EntityExplosionEvent#blockList() 不起作用

标签 java minecraft bukkit

我打算重新生成所有被 TNT 摧毁的方 block 。我使用 EntityExplosionEvent 做到了这一点,但是当我从 event.blockList() 获取 block 时,它们的类型是 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,这将在事件发生后调用。当你这样做时,所有的方 block 都会变成空气。一个解决方案是将所有 block 存储在调度程序之外,如下所示:

@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 来存储每个 block 以前的 Material 。原因是 block 引用保持一致并且 block 对象不可克隆。请注意,我的方法仅保存以前的 Material ,而不保存其数据或状态,您必须自己添加该支持。希望对您有帮助!

关于java - bukkit - EntityExplosionEvent#blockList() 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49178966/

相关文章:

java - 如何从 CompletableFuture 返回主线程

java - Bukkit 生成世界

java - 如何检查Java函数的返回值来更改该函数执行的操作?

java - 如何通过 bukkit 中的配置添加消息?

variables - Bukkit 通过类传递变量

java - 可以向 Java 小程序添加什么安全性?

java - 如何在 Windows 上永久更改 java 的默认语言环境

java - m2eclipse 可以使用其他目录结构吗?

java - 尝试解码 xml 时出现类强制转换异常?

java - 如何为您的 Java 应用程序创建 native 二进制文件?