命令行
基本信息
| 属性 | 值 |
|---|---|
| 类 | BlockInfoCommand(继承 cpw.mods.fml.common.registry.GameRegistry.CommandBase) |
| 命令名 | tmech_blockInfo |
| 别名 | 无(未覆写 getCommandAliases()) |
| 权限等级 | 2(OP,硬编码 return 2;) |
| 用法文本 | /tmech_blockInfo [Issue the command while the player is above the block](未本地化的英文字面量) |
| 注册 | FMLServerStartingEvent → evt.registerServerCommand(new BlockInfoCommand())(TMechworks.java:88) |
| 参数 | 无参数;靠「玩家所站位置正下方一格」定位目标方块 |
| 命令总数 | 1 |
行为
调试命令:打印玩家脚下正下方 1 格的方块与 TileEntity 信息。
int blockY = coords.posY - 1; // 目标 = (posX, posY - 1, posZ)
输出顺序(每条一行 ChatComponentText):
| 顺序 | 输出 | 提前返回条件 |
|---|---|---|
| 1 | Checking block in X: <posX> Y: <blockY> Z: <posX> |
— |
| 2 | Block: <modId>:<name> |
仅当 GameRegistry.findUniqueIdentifierFor(block) 非 null |
| 3 | Block Unlocalizedname: <name> |
— |
| 4 | Metadata: <meta> |
— |
| 5 | Has Tile Entity: <bool> |
false 时在此返回 |
| 6 | Tile Entity NBT: {...} |
te == null 时输出 Tile Entity was not found 并返回 |
前置校验(:36-40):world == null 或 !(sender instanceof EntityPlayer) → 输出 Error: This command should be run from in game only 并返回。
坐标校验(:49-51):!world.blockExists(...) → 输出 The Block does not exists, check another location 并返回。
另有 block == null → The Block is null、block == Blocks.air → The Block is air 两个分支。
NBT 通过 te.writeToNBT(new NBTTagCompound()) 现场序列化(:92-94)—— 直接调用 TE 的写方法而非读存档,因此输出的是运行时当前值,包含未持久化的瞬时状态。
数值
| 数值 | 值 |
|---|---|
| 命令名 | tmech_blockInfo |
| 别名数 | 0 |
| 权限等级 | 2 |
| 目标 Y 偏移 | posY - 1 |
| 输出行数 | 最多 6 行 |
| 参数个数 | 0 |
| 依赖 | GameRegistry.UniqueIdentifier(FML 内建,非本 mod) |
| 唯一额外 import | 无(纯 FML / vanilla) |
交互
| 触发 | 行为 |
|---|---|
| OP 在任意方块上方执行 | 打印该方块的 ID、unlocalized 名、metadata、是否有 TE、TE 的完整 NBT |
| 非 OP 执行 | FML 的 CommandBase 拒绝,显示无权限提示 |
| 控制台执行 | 输出 Error: This command should be run from in game only |
| 悬空(下方无方块) | The Block does not exists, check another location |
| 下方是空气 | The Block is air |
| 下方方块无 TE | 打印到 Has Tile Entity: false 为止 |
源码缺陷
- Z 坐标打印错成
posX(command/BlockInfoCommand.java:45):
明确的复制粘贴 bug。后续所有sender.addChatMessage(new ChatComponentText( "Checking block in X: " + coords.posX + " Y: " + blockY + " Z: " + coords.posX)); // ^^^^^^ 应为 coords.posZ
blockExists/getBlock/getBlockMetadata/getTileEntity调用都用的是正确的coords.posZ,因此只有这一行显示错误,不影响功能。但这行正是命令的第一条输出,最容易被玩家截图报告为「命令有 bug」。 - 未本地化:
getCommandUsage返回硬编码英文字面量而非StatCollector.translateToLocal(...)(:29-31)。全仓 lang 文件中有container.*等键但无命令相关键,属未完成 i18n。 getCommandName使用驼峰:tmech_blockInfo违反 Minecraft 命令的全小写惯例(/give、/summon等),实为tmech_blockinfo之外还要注意大小写敏感。- 无别名:
/tmech与/tmi均不可用,而命令名长达 17 字符,实操不便。源码未覆写getCommandAliases()。 - 权限硬编码 2:不能配置为 0(所有人可用),也无
[命令]开关。这是合理的,因为命令会泄露 TE 的完整 NBT。 te.writeToNBT直接调用而非TileEntity.createTag():1.7.10 中writeToNBT不写id字段,且不同 mod 的 TE 若未覆写writeToNBT则输出空 NBT。属可接受的调试简化。- 输出无分页/无高亮:NBT 完整 JSON 可能很长,会刷屏;无颜色代码区分。
getEntityWorld()在 1.7.10 返回客户端世界(若在客户端执行会走 world 引用),但被instanceof EntityPlayer检查拦住大部分场景,RPC 场景下有风险。
相关条目
- Signal Bus - 可用本命令查看
byte[16]信号数组与placedSides - Signal Terminal - 可用本命令查看
sideChannel/connectedSides - Network Pipeline - 本 mod 唯一的网络包