好的,我这里有一个方法,当实体撞击地面时,将位置和块保存在HashMap中,定义如下:

public static HashMap<Location, Material> blocks = new HashMap<Location, Material>();


然后在服务器上打了几下勾,它将块重新设置为原始类型,而不是在它变成空块的那一刻才这样做。

@EventHandler
public void onProjecitle(ProjectileHitEvent event){
    if(event.getEntity().getType() == EntityType.ENDER_PEARL){
        Block block = event.getEntity().getLocation().getBlock();
        for (int z = -1; z <= 1; z++) {
            for (int x = -1; x <= 1; x++) {
                for (int y = -1; y <= 1; y++) {
                    final Location loc = block.getRelative(x, y, z).getLocation();
                    if(loc.getBlock().getType() != Material.AIR){
                        Aure.blocks.put(loc.getBlock().getLocation(), block.getType());
                        loc.getBlock().setType(Material.WOOL);
                        Bukkit.getScheduler().runTaskLater(plugin, new Runnable(){
                            @Override
                            public void run() {
                                loc.getBlock().setType(Aure.blocks.get(loc.getBlock().getLocation()));
                            }
                        }, 40L);
                    }
                }
            }
        }
    }
}

最佳答案

关于您的代码的问题是,您得到了玩家脚下的障碍物,因此其Material显然是Material.AIR。您需要将方块放在播放器下方,因此您应该使用

Location theRealBlock = event.getEntity().getLocation().substract(0.0D, 1.0D, 0.0D);


代替

event.getEntity().getLocation();

关于java - 无法在Hashmap中保存块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22976655/

10-12 00:05
查看更多