命令行

基本信息

属性 值
类 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):
    sender.addChatMessage(new ChatComponentText(
        "Checking block in X: " + coords.posX + " Y: " + blockY + " Z: " + coords.posX));
    //                                                                      ^^^^^^ 应为 coords.posZ
    
    明确的复制粘贴 bug。后续所有 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 场景下有风险。

相关条目