AbstractPacket(未使用的旧版包基类)
事实基准:
harvestcraft-1.3.14-GTNH.jar(MC 1.7.10 / Forge 10.13.4.1614)CFR 0.152 反编译源码。
概览
| 属性 | 值 | 来源 |
|---|---|---|
| 类 | com.pam.harvestcraft.AbstractPacket |
AbstractPacket.java:10 |
| 修饰 | public abstract class |
AbstractPacket.java:10 |
| 抽象方法 | 4 个,全部无实现 | AbstractPacket.java:11-17 |
| 子类 | 5 个 | 见下表 |
| 实际使用 | 无 —— 详见"可达性" | — |
抽象方法
| 方法 | 签名 | 行 |
|---|---|---|
encodeInto |
void encodeInto(ChannelHandlerContext, ByteBuf) |
AbstractPacket.java:11 |
decodeInto |
void decodeInto(ChannelHandlerContext, ByteBuf) |
AbstractPacket.java:13 |
handleClientSide |
void handleClientSide(EntityPlayer) |
AbstractPacket.java:15 |
handleServerSide |
void handleServerSide(EntityPlayer) |
AbstractPacket.java:17 |
四个方法都是纯抽象(无方法体),且不带 @Override 以外的任何注解。
这个形状对应 Forge 1.7.10 之前的老式自定义 payload 写法:模组自建 FMLEmbeddedChannel,注册一个判别器 → AbstractPacket 子类的映射表,再手工在 ChannelHandler 里分派 handleClientSide / handleServerSide。
子类(全部为空壳)
| 子类 | 文件 | 行数 | 四个方法是否为空 |
|---|---|---|---|
PacketMarket |
PacketMarket.java |
28 | 全部空 |
PacketAnimalTrap |
PacketAnimalTrap.java |
28 | 全部空 |
PacketApairy |
PacketApairy.java |
28 | 全部空 |
PacketFishTrap |
PacketFishTrap.java |
28 | 全部空 |
PacketPresser |
PacketPresser.java |
28 | 全部空 |
五个文件除类名外逐字节同构。逐个说明见 旧版空壳包。
可达性:整条继承链是死代码
AbstractPacket 与其 5 个子类在全模组范围内的引用点,只有:
- 各自的
import com.pam.harvestcraft.AbstractPacket; - 各自的
extends AbstractPacket AbstractPacket自身的类声明
具体地,对 AbstractPacket 的引用共 11 处(com/pam/harvestcraft/ 下):5 个子类各 1 处 import + 1 处 extends = 10 处,加类声明 1 处。
没有任何一处出现 new PacketMarket() / new PacketPresser() 等实例化,没有任何 FMLEmbeddedChannel 字段,没有任何 sendTo 调用。
而真正在用的三个包(MessageMarketBrowse / MessageMarketBuy / MessageMarketClosed)实现的是 IMessage + IMessageHandler,完全不继承 AbstractPacket。
源码缺陷
- 整条继承链(1 个抽象类 + 5 个实现,共 6 个类、约 175 行)是残留死代码。 它们对应的是 Pam’s HarvestCraft 1.6 时代(单块
FMLEmbeddedChannel)的包结构;1.7.10 移植时改用了SimpleNetworkWrapper,旧类没有删除。 - 保留它们不会产生运行时行为(CFR 反编译保留,
new指令存在但永不执行),但会让人误以为"诱捕机/蜂箱/鱼 Trap/压榨机/市场各有独立网络包"。实际上这 5 个机器没有任何自定义包——它们的容器/方块实体同步靠原版机制。
反编译伪影说明
这 6 个类的空方法体不是 CFR 伪影。判据:CFR 对有方法体的方法一定会输出方法体;这里 5 个子类的 20 个方法全部输出为 {\n},且 AbstractPacket 的 4 个方法被识别为 abstract(CFR 依据 class 文件的 ACC_ABSTRACT 标志得出,与方法体无关)。空方法体在 class 文件层面即为空(单条 return 指令)。
相关条目
- 旧版空壳包 —— 5 个空壳子类的逐个说明
- PacketHandler —— 实际生效的
SimpleNetworkWrapper通道 - 兄弟维度:世界生成 · 配置 · 兼容层