指令
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)。
详见 结构导出。