指令

GuideNH 共有 3 个 CommandBase 子类:2 个服务端指令,1 个客户端指令。

指令类 指令名 注册位置 端 条目
GuideCommand /guide GuideNH.java:66 服务端 guide 指令
GuideNhBridgeCommand /guidenh GuideNH.java:67 服务端 见本页下半部分
StructureExportCommand /exportStructure StructureExportBootstrap.java:14 客户端 见本页第三部分

前两个经 FMLServerStartingEvent.registerServerCommand(...) 注册; 第三个走 ClientCommandHandler.instance.registerCommand(...), 因此单机也要客户端才能用,且不随服务端下发。

三者都没有别名。


guide 指令

com.hfstudio.guidenh.guide.internal.GuideCommand。无参数时打印用法。

子命令

子命令 参数 作用
list — 列出 GuideRegistry.getAll() 里的全部指南 ID
open <guideId> 打开指定指南。guideId 按 new ResourceLocation(args[1]) 解析
reload — 重载资源。需要权限等级 3

逐条说明

list

遍历 GuideRegistry.getAll(),逐条发送 GuidebookText.CommandListEntry,参数是 guide.getId()。即列出当前已加载的指南书 ID,不是磁盘上的文件。

open

EntityPlayer player = getCommandSenderAsPlayer(sender);
var guideId = new ResourceLocation(args[1]);
Guide guide = GuideRegistry.getById(guideId);
if (guide == null) { send(sender, GuidebookText.CommandGuideNotFound, guideId); return; }
GuideMEProxy.instance().openGuide(player, guideId, null);
  • 发指令的必须是玩家(getCommandSenderAsPlayer),控制台执行会抛 CommandException。
  • guideId 用 ResourceLocation 解析,因此必须带命名空间, 写裸名会因缺少 : 而被 ResourceLocation 判为非法。
  • 第三个参数 null 表示不带「从哪一页进入」的上下文,直接进指南首页。
  • 找不到时发 CommandGuideNotFound,不抛异常。

reload

if (!sender.canCommandSenderUseCommand(
        GuideNhServerStructureAccess.STRUCTURE_PERMISSION_LEVEL, getCommandName())) {
    send(sender, GuidebookText.CommandStructurePermissionDenied);
    return;
}
boolean ok = GuideMEProxy.instance().reloadResources();

权限等级从 GuideNhServerStructureAccess.STRUCTURE_PERMISSION_LEVEL 常量取 (与结构导出共用同一个权限常量,值为 3)。失败时发 CommandStructurePermissionDenied。


guidenh 指令

com.hfstudio.guidenh.guide.internal.GuideNhBridgeCommand。 根子命令硬编码在 ROOT_SUB_COMMANDS:

public static final String[] ROOT_SUB_COMMANDS = { "importstructure", "placeallstructures" };

支持 Tab 补全(addTabCompletionOptions 在 args.length == 1 时返回该数组)。 canCommandSenderUseCommand 直接 return true——任何人可见可用, 真正的权限检查在两个子命令各自内部。

子命令

子命令 最少参数 权限 作用
importstructure 5(含指令名与子命令名) 等级 3 从文件导入结构到指定坐标
placeallstructures 4 等级 3 放置全部结构

两个子命令都用 requirePlayer(sender) 拿 EntityPlayerMP(控制台不可用), 再用 player.canCommandSenderUseCommand(3, getCommandName()) 判权限, 不足则发 CommandStructurePermissionDenied。

坐标解析

两者共用同一套坐标语义——相对玩家当前位置:

int baseX = MathHelper.floor_double(player.posX);
int baseY = MathHelper.floor_double(player.posY);
int baseZ = MathHelper.floor_double(player.posZ);
int x = GuideStructureCoordinateParser.parsePosition(baseX, args[1]);
int y = GuideStructureCoordinateParser.parsePosition(baseY, args[2]);
int z = GuideStructureCoordinateParser.parsePosition(baseZ, args[3]);

即 args[1..3] 是相对偏移而非绝对坐标,由 GuideStructureCoordinateParser.parsePosition(base, arg) 换算成绝对值。

importstructure 多一个 args[4],是结构文件路径,随后通过 GuideNhNetwork.channel().sendTo(GuideNhClientBridgeMessage.importStructure(x, y, z, filePath), player) 发给客户端——所以这条指令必须在有客户端的服上用。


exportStructure 指令

com.hfstudio.structurelibexport.StructureExportCommand——客户端指令, 由 StructureExportBootstrap.registerClientCommands() 注册,带 registered 静态标志防重复注册(StructureExportBootstrap.java:9-15)。

项目 值
指令名 exportStructure(StructureExportCommand.java:27)
用法串 /exportStructure <structureLib|gameScene> [options...]
权限 canCommandSenderUseCommand 直接 return true(:58-60)
两个子命令 structureLib(25 个选项)/ gameScene(17 个选项)

structureLib 子命令在 StructureLib 未加载时抛 CommandException("StructureLib is not loaded.");gameScene 无此依赖。

两条子命令的选项表是静态常量 STRUCTURE_LIB_OPTIONS(25 项)/ GAME_SCENE_OPTIONS(17 项),并由运行时桥接的 RuntimeSemanticSupport.addStructureExportCommandEntries() 暴露给外部 自动补全(RuntimeSemanticSupport.java:227-242)。

详见 结构导出。

相关条目

  • 网络协议 - importstructure 走的是客户端桥接封包
  • 结构导出 - 文件路径的来源与格式
  • 键位 - open_guide 是 open 子命令的按键等价物