首页 > 解决方案 > WorldEdit 如何处理画笔?

问题描述

我试图找出Bukkit版本的 WorldEdit 如何处理画笔。我一直在查看 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:我最好奇的是:如果您不在交互范围内,我们如何选择应用画笔的位置?

标签: minecraftbukkit

解决方案


我需要为此使用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;
                    }
                }
            }
        }
    }
}

感谢流氓的帮助!


推荐阅读