旧版空壳包(5 个)
事实基准:
harvestcraft-1.3.14-GTNH.jar(MC 1.7.10 / Forge 10.13.4.1614)CFR 0.152 反编译源码。
概览
这 5 个类继承 AbstractPacket,四个方法全部是空方法体,且在全模组中从不被实例化。它们是 1.6 时代旧版 FMLEmbeddedChannel 网络方案在 1.7.10 移植后遗留的死代码。
| 类 | 文件 | 行数 | 注册判别器 | 实例化点 | 四个方法体 |
|---|---|---|---|---|---|
PacketMarket |
PacketMarket.java |
28 | 无 | 无 | 全空 |
PacketAnimalTrap |
PacketAnimalTrap.java |
28 | 无 | 无 | 全空 |
PacketApairy |
PacketApairy.java |
28 | 无 | 无 | 全空 |
PacketFishTrap |
PacketFishTrap.java |
28 | 无 | 无 | 全空 |
PacketPresser |
PacketPresser.java |
28 | 无 | 无 | 全空 |
逐字节同构(已验证)
把类名替换为占位符后,5 个文件内容完全相同:
| 类 | 归一化后 MD5(前 12 位) |
|---|---|
PacketMarket |
a31bd3d7c623 |
PacketAnimalTrap |
a31bd3d7c623 |
PacketApairy |
a31bd3d7c623 |
PacketFishTrap |
a31bd3d7c623 |
PacketPresser |
a31bd3d7c623 |
归一化后长度均为 631 字节。即:5 个类之间唯一的差别就是类名。
PacketMarket.java 的完整归一化形态:
public class __CLASS__
extends AbstractPacket {
@Override
public void encodeInto(ChannelHandlerContext ctx, ByteBuf buffer) {
}
@Override
public void decodeInto(ChannelHandlerContext ctx, ByteBuf buffer) {
}
@Override
public void handleClientSide(EntityPlayer player) {
}
@Override
public void handleServerSide(EntityPlayer player) {
}
}
判定依据
1. 未注册到任何通道
PacketHandler.init()(PacketHandler.java:16-20)只有 3 条 registerMessage,全部是 MessageMarket* 前缀。5 个空壳包一个都没有被注册,因此它们连"有判别器"这件事都不成立。
2. 从未实例化
对 5 个类名做全仓库检索,命中的位置只有两类:
- 该文件自身的
public class X extends AbstractPacket {(类声明) - 该文件自身的
import com.pam.harvestcraft.AbstractPacket;
没有 new PacketXxx(...),没有 PacketXxx.class 形式的注册表条目,没有任何方法把它当参数类型。
3. 空方法体不是反编译伪影
CFR 输出了完整的 @Override 注解、方法签名与空的花括号。若 class 文件里存在方法体,CFR 一定会输出其语句。因此空体在字节码层面即为真(每个方法仅一条 return)。这一点与 世界生成 里 switch 的情况正相反——那里是真实的 fallthrough,而这里是真实的空实现。
各包"本应"负责的机器(实际由什么同步)
| 空壳包 | 对应机器 | 实际同步机制 |
|---|---|---|
PacketMarket |
市场方块 | 原版 TileEntity / Container 同步;翻页另有判别器 0 的 MessageMarketBrowse(但无发送方,见 MessageMarketBrowse) |
PacketAnimalTrap |
动物诱捕机 | TileEntityPamAnimalTrap + ContainerPamAnimalTrap,原版同步 |
PacketApairy |
蜂箱 | TileEntityPamApiary + ContainerPamApiary,原版同步 |
PacketFishTrap |
鱼 Trap | TileEntityPamFishTrap + ContainerPamFishTrap,原版同步 |
PacketPresser |
压榨机 | TileEntityPamPresser + ContainerPamPresser,原版同步 |
这 5 个机器没有任何一个使用自定义网络包。
源码缺陷
- 5 个类共 140 行 +
AbstractPacket18 行 = 158 行死代码,来源是 1.6 → 1.7.10 的网络层重写未清理。 - 危害不在运行时(永不实例化),而在阅读误导:按类名推断会以为这 5 个机器有各自的 GUI 同步包。
相关条目
- AbstractPacket —— 抽象基类
- PacketHandler —— 实际生效的通道与 3 条注册
- 兄弟维度:世界生成 · 配置 · 兼容层