当前位置: 首页 > 知识库问答 >
问题:

如何正确取消PlayerInteracteVent.RightClickBlock中的块放置?

呼延河
2023-03-14

我刚刚进入Minecraft的moding,我正在写一个简单的mod,你可以控制和右键点击黑曜石上的鹅卵石获得一个“岩石”项目。预期的功能是当玩家执行此动作时,他们将消耗一块鹅卵石并获得一块岩石,而不需要放下鹅卵石。这是相当有效的,虽然我得到一个奇怪的效果,当我激活它。在服务器移除块之前,客户机似乎会让它看起来像是放置了一个刻度左右的块。(至少,反正看起来就是这样。)

这是我的代码

    @SubscribeEvent
    public static void onStoneSmash(final PlayerInteractEvent.RightClickBlock event) {

        System.out.println("Is Server: " + event.getSide().isServer());

        final World world = event.getWorld();

        if (world.isRemote()) {
            return;
        }

        if (world != null && event.getUseBlock() != Result.DENY) {
            final PlayerEntity player = event.getPlayer();

            if (player != null && !player.isSpectator() && !world.isAirBlock(event.getPos())) {
                final BlockPos pos = event.getPos();

                if (InputMappings.isKeyDown(Minecraft.getInstance().getMainWindow().getHandle(), GLFW.GLFW_KEY_LEFT_CONTROL) && world.getBlockState(pos).getBlock().equals(Blocks.OBSIDIAN) && player.inventory.getCurrentItem().getItem().equals(Blocks.COBBLESTONE.asItem())) {
                    player.inventory.addItemStackToInventory(new ItemStack(ItemInit.ROCK.get(), 1));
                    if (!player.isCreative()) {
                        player.inventory.decrStackSize(player.inventory.currentItem, 1);
                    }

                    System.out.println("Rock smashed.");

                    event.setCanceled(true);

                }
            }
        }

        System.out.println("Use Block: " + event.getUseBlock());
        System.out.println("Use Item: " + event.getUseItem());

    }

正如我所说的,我是一个很新的造型场景,所以我肯定有很多在这里看起来不那么漂亮。

其他信息:

MC版本:1.16.4

伪造版本:1.16.4-35.1.4

如果需要的话,我会提供更多的信息。

谢谢!

编辑:这是一个我所提到的问题的gif。

https://imgur.com/ix5v7cb

共有1个答案

公宜春
2023-03-14

您可以执行event.setCancelled(true)如果我拼错了Cancel,请原谅,因为对我来说已经很晚了。

Edit:event.setCanceled(true)应该起作用,如果你想要停止一个放置,比如橡木板,那么你想要检查它是不是,然后将事件设置为Canceled

编辑2:哦,等待你使用交互事件,为什么?等待另一个编辑我可以回答这个

编辑3:

好的,这里有一个块放置事件,这是你应该用来放置块的,所以这应该帮助你,也推荐学习更多关于Spigot API的知识,然后再学习Forge

    @EventHandler // this is spigot you could replace this and find the block place event using forge api
    public void onBlockPlace(BlockPlaceEvent e) {
        
    }
 类似资料:
  • 我试图放大我的mandelbrot集,我读到了这个问题:如何简单地放大mandelbrot集,但我很难理解它,它不起作用。当我这样计算新的实数和复数时: 新的mandelbrot在两个轴上都有点变形?怎么了?以下是一个例子:http://www.phpdevpad.de/index.php?id=190.

  • 问题内容: 从Python标准库的组件中获取异常消息的最佳方法是什么? 我注意到在某些情况下,您可以通过如下字段获取它: 但在某些情况下(例如在套接字错误的情况下),您必须执行以下操作: 我想知道是否有标准方法可以涵盖大多数情况? 问题答案: 如果查看内置错误的文档,则会看到大多数类将其第一个参数分配为属性。并非所有人都这样做。 值得注意的是,(与子类和)具有的第一自变量,第二的。没有…大致类似于

  • 我是一个初学者程序员,我试图做一个简单的计算器,但由于某种原因,按钮似乎不能正常工作,它们要么消失,填满整个面板,要么设置在错误的位置。奇怪的是,当我悬停并在按钮上点击鼠标时,按钮就会出现。我可能会错过一些非常明显的东西,但请帮助(此外,代码不是很干净)。谢谢你! 主要的 计算器按钮 窗

  • 问题内容: 在我们的项目中,我们正在编写测试以检查控制器是否返回正确的模型视图 这将返回异常null。 现在,我们正在配置@contextconfiguration,但是我们不知道如何加载位于src \ main \ webapp \ root \ WEB- INF \ root-context.xml的正确xml。 该文档不够清晰,难以理解 关于如何确保contextannotation加载正确

  • 我正在使用ScheduledExecutorService并提交一个这样的任务: 然而,某个事件可能会在不确定的时间后发生,这表明不再需要这个任务。所以我需要取消这个任务,我正在使用 行。 取消之后,我必须根据提交的runnable是否实际运行来采取不同的操作。这里,让我们首先进入Oracle文档,了解< code>cancelled标志的含义: https://docs.oracle.com/j

  • 不管怎样,我在我的项目中使用了registfit/OkHttp,并认为这应该是Okio的一个很好的用法。这就是我目前所拥有的,它似乎起作用了。但是我是Okio的新手,不知道我是否遗漏了一些明显的东西,或者这是否可以用更好的方式来完成。 您可以看到,我正在绑定upload一个块,等待成功响应(来自Java8),然后使用更新的和再次调用方法。就像我说的,它很有效,但我是Okio的新手,我想知道我是否错