【发布时间】: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 代码看起来不错,您只需要调试其余部分。看起来不对的第一件事是您的项目比较(您不应该将对象与
==进行比较)