我如何检测 Bukkit 生成的鹅卵石?
How would I detect cobblestone being generated with Bukkit?
好的,所以我正在制作一个 Bukkit 插件,它应该检测圆石生成器,请记住,我不想阻止玩家制作圆石生成器,我只是想从事件中获取方块,所以我可以用那块鹅卵石做其他事情。
到目前为止我尝试过的:
- BlockFromToEvent(没有找到鹅卵石,只找到 STATIONARY_LAVA 到 AIR)
- BlockFormEvent(只发现地上有积雪)
我想做的事情:
- 我想检测由水+熔岩组合生成的鹅卵石块
- 我想得到他们的location/position/coordinates
你能至少给我指明正确的方向吗?我已经拔了将近 3 个小时的头发了。
感谢大家的帮助!
编辑:下图中的解决方案,如果需要,将重新输入!
我认为您必须使用 BlockFromToEvent 并执行类似
的操作
if ((
(event.getBlock().getType()==Material.LAVA)||
(event.getBlock().getType()==Material.WATER)||
(event.getBlock().getType()==Material.STATIONARY_LAVA)||
(event.getBlock().getType()==Material.STATIONARY_WATER)
) && event.getToBlock().getType()==Material.COBBLESTONE) {
//do what you want
}
Good answer from FireBlast709 at Bukkit Forums
这将取消任何鹅卵石生成。基本上,如果你想操纵鹅卵石,你可以将取消线(指示)更改为你需要的任何东西。
@EventHandler
public void onFromTo(BlockFromToEvent event){
Material type = event.getBlock().getType();
if (type == Material.WATER || type == Material.STATIONARY_WATER || type == Material.LAVA || type == Material.STATIONARY_LAVA){
Block b = event.getToBlock();
if (b.getType() == Material.AIR){
if (generatesCobble(type, b)){
/* DO WHATEVER YOU NEED WITH THE COBBLE */
event.setCancelled(true);
}
}
}
}
private final BlockFace[] faces = new BlockFace[]{
BlockFace.SELF,
BlockFace.UP,
BlockFace.DOWN,
BlockFace.NORTH,
BlockFace.EAST,
BlockFace.SOUTH,
BlockFace.WEST
};
public boolean generatesCobble(Material type, Block b){
Material mirrorID1 = (type == Material.WATER || type == Material.STATIONARY_WATER ? Material.LAVA : Material.WATER);
Material mirrorID2 = (type == Material.WATER || type == Material.STATIONARY_WATER ? Material.STATIONARY_LAVA : Material.STATIONARY_WATER);
for (BlockFace face : faces){
Block r = b.getRelative(face, 1);
if (r.getType() == mirrorID1 || r.getType() == mirrorID2){
return true;
}
}
return false;
}
创建 Cobble 时有特定事件可以赶上。矿山活动、制作活动、拾取活动。这些事件中的每一个都应该让您获取哪个块被破坏并检查它是否是一个实例或 Cobblestone 的 material。
好的,所以我正在制作一个 Bukkit 插件,它应该检测圆石生成器,请记住,我不想阻止玩家制作圆石生成器,我只是想从事件中获取方块,所以我可以用那块鹅卵石做其他事情。
到目前为止我尝试过的:
- BlockFromToEvent(没有找到鹅卵石,只找到 STATIONARY_LAVA 到 AIR)
- BlockFormEvent(只发现地上有积雪)
我想做的事情:
- 我想检测由水+熔岩组合生成的鹅卵石块
- 我想得到他们的location/position/coordinates
你能至少给我指明正确的方向吗?我已经拔了将近 3 个小时的头发了。
感谢大家的帮助!
编辑:下图中的解决方案,如果需要,将重新输入!
我认为您必须使用 BlockFromToEvent 并执行类似
的操作if ((
(event.getBlock().getType()==Material.LAVA)||
(event.getBlock().getType()==Material.WATER)||
(event.getBlock().getType()==Material.STATIONARY_LAVA)||
(event.getBlock().getType()==Material.STATIONARY_WATER)
) && event.getToBlock().getType()==Material.COBBLESTONE) {
//do what you want
}
Good answer from FireBlast709 at Bukkit Forums
这将取消任何鹅卵石生成。基本上,如果你想操纵鹅卵石,你可以将取消线(指示)更改为你需要的任何东西。
@EventHandler
public void onFromTo(BlockFromToEvent event){
Material type = event.getBlock().getType();
if (type == Material.WATER || type == Material.STATIONARY_WATER || type == Material.LAVA || type == Material.STATIONARY_LAVA){
Block b = event.getToBlock();
if (b.getType() == Material.AIR){
if (generatesCobble(type, b)){
/* DO WHATEVER YOU NEED WITH THE COBBLE */
event.setCancelled(true);
}
}
}
}
private final BlockFace[] faces = new BlockFace[]{
BlockFace.SELF,
BlockFace.UP,
BlockFace.DOWN,
BlockFace.NORTH,
BlockFace.EAST,
BlockFace.SOUTH,
BlockFace.WEST
};
public boolean generatesCobble(Material type, Block b){
Material mirrorID1 = (type == Material.WATER || type == Material.STATIONARY_WATER ? Material.LAVA : Material.WATER);
Material mirrorID2 = (type == Material.WATER || type == Material.STATIONARY_WATER ? Material.STATIONARY_LAVA : Material.STATIONARY_WATER);
for (BlockFace face : faces){
Block r = b.getRelative(face, 1);
if (r.getType() == mirrorID1 || r.getType() == mirrorID2){
return true;
}
}
return false;
}
创建 Cobble 时有特定事件可以赶上。矿山活动、制作活动、拾取活动。这些事件中的每一个都应该让您获取哪个块被破坏并检查它是否是一个实例或 Cobblestone 的 material。