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

如何将参数实现到自定义命令中-Minecraft Forge 1.16.5

秦凯旋
2023-03-14

我试图使用Forge 1.16.5 MDK在我的mod中实现简单的SetHome和Home命令。我观看了Kaupenjoe的自定义命令视频教程(https://youtu.be/bYH2i-KOLgk)但他们没有描述命令中参数的使用。我发现了关于如何使用参数类型的非常简短和有限的描述,甚至还研究了vanilla命令。我能找到的最好的资源是(https://github.com/TheGreyGhost/MinecraftByExample/blob/master/src/main/java/minecraftbyexample/mbe45_commands/MBEquoteCommand.java).

这是我的sethome命令。java类

package net.caret.goggleutils.commands;

import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.arguments.IntegerArgumentType;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import net.caret.goggleutils.GoggleUtils;
import net.minecraft.command.CommandSource;
import net.minecraft.command.Commands;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.StringTextComponent;

public class SetHomeCommand {
    public SetHomeCommand(CommandDispatcher<CommandSource> dispatcher) {
        dispatcher.register(
                Commands.literal("sethome")
                .then(Commands.argument("number", IntegerArgumentType.integer(1, 10)))
                        .executes(commandContext -> setHome(commandContext.getSource(), IntegerArgumentType.getInteger(commandContext, "number")))
        );
    }

    private int setHome(CommandSource source, int number) throws CommandSyntaxException{
        System.out.println("test");
        ServerPlayerEntity player = source.asPlayer();
        BlockPos playerPos = player.getPosition();
        String pos = "(" + playerPos.getX() + ", " + playerPos.getY() + "," + playerPos.getZ() + ")";

        player.getPersistentData().putIntArray(GoggleUtils.MODID + String.valueOf(number) + "home", new int[]{playerPos.getX(), playerPos.getY(), playerPos.getZ()});

        source.sendFeedback(new StringTextComponent("Set home at " + pos), true);
        return 1;
    }
}

一切都正常运行(我还订阅了另一个类中的RegisterCommandsEvent),游戏会自动完成,但当我尝试设置Home 1时,我得到了

Unknown or incomplete command, see below for error
/sethome 1<--[HERE]

这似乎是构建器链的问题(因为控制台不打印“test”)。

共有1个答案

储臻
2023-03-14

问题是,你把。执行()外面的。然后(Commands.argument(...))

代码的正确部分为:

.then(Commands.argument("number", IntegerArgumentType.integer(1, 10))
                    .executes(commandContext -> setHome(commandContext.getSource(), IntegerArgumentType.getInteger(commandContext, "number")))
    ));

此外,如果您有最后一个Forge 1.16.5 MDK,则setHome方法中的某些代码可能已过时。Ej:

  • '来源。新版本中的asPlayer()'将是“源”。getPlayerOrException()'
  • '来源。sendFeedback()将是“源”。sendSuccess()'
 类似资料:
  • 问题内容: 我正在建立一个新的版本。运行一个简单的shell命令非常有效,如下所示: 我一直试图将我的shell脚本“打包”到自己的类中,以使事情更加整洁。问题在于,当尝试从一个类中执行相同的完全相同的Shell脚本时,jenkins失败,并显示以下内容: org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:未分

  • 问题内容: 我有一个带有模板的指令 我的指令声明为: 我想在单击某个项目并且其值已经更改时调用。 也就是说,如果我的指令实现为: 我希望在的值已更新时致电。 使用上面给出的代码,可以成功调用,但是将使用旧值而不是新的更新值来调用它。 解决该问题的一种方法是在超时值内部调用超时,以在将来某个时刻执行该超时。但是这种解决方案使我无法控制应该执行的顺序,并且我认为应该有一个更优雅的解决方案。 我也可以在

  • 我想为Atom编写一个命令,它由两个或多个预先存在的命令组成,比如“Select Line”和“Cut”。我该怎么做?

  • 3.3 自定义命令 命令语法 定义命令与定义映射的用法其实很相似: :command {lhs} {rhs} 只不过在使用自定义命令时,{lhs} 是直接输入到命令行中的,当你按下回车时,vim 就将 {lhs} 替换为 {rhs} 再执行。所以这在形式上与下面这个映射等效: : nnoremap :{lhs}<CR> :{rhs}<CR> 当然,由于 :command 所支持的参数与 :ma

  • 问题内容: 我有一个名为“ example”的库,该库正在安装到我的全局site- packages目录中。但是,我希望能够安装两个版本,一个用于生产版本,一个用于测试版本(我有一个Web应用程序,而其他东西也都以这种方式进行了版本化)。 有没有一种方法可以指定,例如“ python setup.py stage”,它不仅可以将其他鸡蛋安装到站点程序包中,还可以将模块从“ example”重命名为

  • 我需要实现我的自定义DefaultComboxModel。这样做的原因是每次我打电话给 或者 或者 我看到它自动触发一个项目状态更改事件。这会导致一些随机项目自动从列表中选择。这不是我想要的,因为它用随机选择的项目填充可编辑的JTextField。 这是我在使用我的自定义Itemlistener中的Thread.dumpStack()进行调试时看到的stacktrace,它是我在调用上述方法时看到