gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:48:31 25 4
gpt4 key购买 nike

我打算重新生成所有被 TNT 摧毁的方 block 。我用 EntityExplosionEvent 做到了这一点,但是当我从 event.blockList() 获取 block 时,它们的类型是 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,这将在事件发生后调用。当你这样做时,所有的方 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com