好的,我这里有一个方法,当实体撞击地面时,将位置和块保存在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/