【问题标题】:How would I detect cobblestone being generated with Bukkit?我如何检测 Bukkit 生成的圆石?
【发布时间】:2017-05-21 11:56:31
【问题描述】:

好的,所以我正在制作一个 Bukkit 插件,它应该可以检测圆石生成器,请记住,我不想阻止玩家制作圆石生成器,我只是想从事件中获取块,所以我可以用那块鹅卵石做其他事情。

到目前为止我已经尝试过:

  • BlockFromToEvent(没有找到鹅卵石,只找到 STATIONARY_LAVA 到 AIR)
  • BlockFormEvent(只发现地上有雪)

我想做什么:

  • 我想检测由水+熔岩组合生成的圆石块
  • 我想获取他们的位置/位置/坐标

请您至少给我指出正确的方向吗?我已经拔了将近 3 个小时的头发了。

感谢大家的帮助!

编辑:下图中的解决方案,如果需要,将重新输入!

【问题讨论】:

    标签: java plugins minecraft bukkit


    【解决方案1】:

    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;
    }
    

    【讨论】:

    • 好的,首先,感谢您的回答,但在帖子中我指定了一些内容:“好的,所以我正在制作一个 Bukkit 插件,它应该检测鹅卵石生成器,请记住,我不想阻止玩家制作圆石生成器,”仍然感谢您的回答。
    • 我不明白这怎么不能回答你的问题?它明确表示您应该用代码中需要的任何内容替换event.setCancelled(true)
    • 因此,不取消它
    • @Kerooker 我已将您的答案编辑为使用 Material 而不是数字 ID,希望您不介意。
    • @MGlolenstine 您应该使用这种方法而不是您制作的方法。它比你的更清洁并且可以处理更多的情况(例如,平滑的石头生成,以及熔岩在水中流动而不是相反的情况)。尽管它可能没有涵盖其他一些情况(例如,水流入火炬并用鹅卵石代替 - 检查它是否为AIR 可能不正确)。您需要做的就是调整setCancelled 部分。
    【解决方案2】:

    我认为您必须使用 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
        }
    

    【讨论】:

    • 嗯...遗憾的是这行不通...This 会发生这种情况。
    【解决方案3】:

    当 Cobble 被创建时,有一些特定的事件可以赶上。矿山事件、手工艺事件、拾取事件。这些事件中的每一个都应该让您获取哪个块被破坏并检查它是否是鹅卵石的实例或材质。

    【讨论】:

    • 我需要在它生成时得到它,而不是在它被开采、制作(不知道你可以制作圆石)或拾取时。我想在它生成时用其他东西替换它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 2017-07-01
    • 2019-01-18
    • 2021-03-08
    • 1970-01-01
    相关资源
    最近更新 更多