跳到正文
烈焰甘蔗Wiki

旧版空壳包(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 行 + AbstractPacket 18 行 = 158 行死代码,来源是 1.6 → 1.7.10 的网络层重写未清理。
  • 危害不在运行时(永不实例化),而在阅读误导:按类名推断会以为这 5 个机器有各自的 GUI 同步包。

相关条目

浏览全部模组