java - 如何在自定义命令中实现参数 - 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]
这似乎是构建器链的问题(因为控制台不打印“测试”)。
解决方案
问题是您将 .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()'
推荐阅读
- node.js - 当我在 Telegram 上分享我的网页的 HTTPS 链接时,它没有预览。如何解决这个问题?
- mobile - 为移动应用程序实施 SP 发起的 SLO -- PingFederate
- regex - SAS - 使用 regex / prxmatch 提取 8 位模式
- spring-boot - Springfox Swagger 生成不在方法签名中的字段
- php - PHP显示为文本
- javascript - Froala 编辑器禁用下拉菜单中的按钮?
- java - 为什么优化的素数计数算法运行速度较慢
- html - 我在将 .css 文件中的 id 和类引用到 .html 文件时遇到问题
- networking - 网络只有登录后才能工作?
- angular - 角度如何将整数格式化为日期格式 hh/mm/ss