【问题标题】:How does WorldEdit handle brushes?WorldEdit 如何处理画笔?
【发布时间】:2021-02-27 17:36:47
【问题描述】:

我正在尝试了解 WorldEdit 的 Bukkit 版本如何处理画笔。我一直在查看 GitHub 上的源代码,但找不到任何有用的东西。我尝试重新创建效果,但只有在目标块的交互范围内才能使其工作。

这与源代码中的内容差不多:

} else if (action == Action.RIGHT_CLICK_AIR) {
    if (we.handleRightClick(player)) {
        event.setCancelled(true);
    }
}

(WorldEdit/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditListener.java,第 143-147 行)

代码的其他一些部分非常接近。我也查看了 /worldedit-core,但那里也没有。

有人可以帮我吗?

编辑:这就是我尝试这样做的方式:

public static void onRightClick (PlayerInteractEvent event) {
        if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
            Location location = event.getClickedBlock().getLocation();
            if (event.getItem() != null) {
                if (event.getItem().getItemMeta().equals(ItemManager.wand.getItemMeta())) {
                    Player player = event.getPlayer();
                    player.getWorld().doStuff(location);
                }
            }
        }
    }

编辑#2:我最好奇的是:如果您不在交互范围内,我们如何选择应用画笔的位置?

【问题讨论】:

  • 你需要先定位interacted with块(你有一个好的开始),然后你需要用数学术语推断应用“画笔”。我们制作了自己的Brush 对象来跟踪大小和类型等。这些东西的应用真的取决于你,但它基本上只是重新应用一个数学问题。如果您对面向对象的概念不满意,那么对于超过 1 次刷子,这将变得有点困难。
  • 当然可以,但我最想知道的是,如果您不在交互范围内,我们如何选择应用画笔的位置?忘记在帖子中提及了,现在添加它
  • 这是一个简单的光线追踪,BlockIterator 将实现您所寻找的。只需朝着玩家的方向迭代,直到碰到不是 Material.AIR 的东西
  • @Rogue 谢谢,我做了一些不起作用的代码,我把它添加到帖子中
  • BlockIterator 代码看起来不错,您只需要调试其余部分。看起来不对的第一件事是您的项目比较(您不应该将对象与 == 进行比较)

标签: minecraft bukkit


【解决方案1】:

我需要为此使用BlockIterators。最终代码如下所示:

public class BoomWandEvent implements Listener {
    @EventHandler
    public static void onRightClick (PlayerInteractEvent event) {
        Player player = event.getPlayer();
        if (event.getAction() == Action.RIGHT_CLICK_BLOCK || event.getAction() == Action.RIGHT_CLICK_AIR) {
            if (player.getInventory().getItemInMainHand().equals(ItemManager.explosionWand)) {
                Location eyePos = player.getEyeLocation();
                BlockIterator raytracer = new BlockIterator(eyePos, 0.0D, player.getClientViewDistance() * 16);
                while (raytracer.hasNext()) {
                    Location location = raytracer.next().getLocation();
                    if (player.getWorld().getBlockAt(location).getType() != Material.AIR && player.getWorld().getBlockAt(location).getType() != Material.CAVE_AIR && player.getWorld().getBlockAt(location).getType() != Material.VOID_AIR) {
                        player.getWorld().createExplosion(location, 4f);
                        return;
                    }
                }
            }
        }
    }
}

感谢Rogue 的帮助!

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多