首页 > 解决方案 > 如何在自定义命令中实现参数 - Minecraft Forge 1.16.5

问题描述

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

这是我的 SetHomeCommand.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)并且游戏自动完成,但是当我尝试时/sethome 1我得到

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

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

标签: javaminecraftminecraft-forge

解决方案


问题是您将 .execute() 放在 .then(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 中的某些代码可能已过时。乙:

  • 新版本中的“source.asPlayer()”将是“source.getPlayerOrException()”
  • 'source.sendFeedback() 将是'source.sendSuccess()'

推荐阅读