网络封包

基本信息

属性 值
modid RandomThings
频道名 randomthings(Reference.MOD_ID.toLowerCase())
频道实现 RandomThingsNetworkWrapper extends SimpleNetworkWrapper
编解码器 SimpleIndexedCodec
处理器 RTMessageHandler(双端注册)
消息接口 IRTMessage extends IMessage
已注册封包 13

功能

本 mod 使用 FML 的 SimpleIndexedCodec 体系。频道在 RandomThingsNetworkWrapper 构造时建立(Network/RandomThingsNetworkWrapper.java:31-43):

super(Reference.MOD_ID.toLowerCase());
packetCodec = new SimpleIndexedCodec();
channels = NetworkRegistry.INSTANCE.newChannel(Reference.MOD_ID.toLowerCase(), packetCodec);

同一个处理器同时挂在服务端与客户端管线上,两端都通过 addAfter 插在 SimpleIndexedCodec 之后(:38-43),统一处理 IRTMessage 类型。

封包注册

PacketHandler.init() 顺序注册 13 个消息(Network/PacketHandler.java:21-37)。判别值由 registerMessage 内部自增分配(RandomThingsNetworkWrapper.java:57-59):

public <REQ extends IMessage, REPLY extends IMessage> void registerMessage(Class<REQ> requestMessageType) {
    packetCodec.addDiscriminator(discriminator++, requestMessageType);
}

13 个封包

判别值 消息类 用途
0 MessageItemCollector 物品收集器 状态同步
1 MessageItemFilter 过滤器 内容同步
2 MessageNotification 屏幕通知(/rt notify 与通知接口)
3 MessageOnlineDetector 在线侦测器 玩家列表
4 MessagePaintBiome 生物群系画刷 全维度广播
5 MessageWhitestone 白石 充能同步
6 MessageRequestTeleport 请求进入灵魂世界
7 MessageAnswerTeleport 传送许可答复
8 MessageMagneticForceParticle 磁力仪 粒子
9 MessageChangeItemProperty 物品属性变更
10 MessageSpectreData 灵魂世界数据(操作者权限等)
11 MessageBloodmoon 血月客户端同步
12 MessageContainerProperty 能量分配器 GUI 数值同步

MessageContainerProperty 的三个固定下标在 能量分配器 页面有详细说明:0 = 缓冲区存量、1 = 上 tick 分发电量、2 = 已连接机器数(Container/ContainerEnergyDistributor.java:38-43)。

发送方式

封装类覆写了 SimpleNetworkWrapper 的全部发送方法(RandomThingsNetworkWrapper.java):

方法 目标 覆写位置
sendTo 指定玩家 :105-110
sendToAll 全部玩家 :95-100
sendToAllAround 半径内玩家 :117-121
sendToDimension 指定维度 :129-133
sendToServer 服务端 :141-144
getPacketFrom 转为原版 Packet :82-85

每个方法都显式设置 FML_MESSAGETARGET 与 FML_MESSAGETARGETARGS,并挂 ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE。

缺陷:一条被注释的注册

PacketHandler.init() 开头有一段注释掉的注册(Network/PacketHandler.java:22-23):

// INSTANCE.registerMessage(MessageEnderLetter.class,
// MessageEnderLetter.class, 0, Side.SERVER);

MessageEnderLetter 类在本仓库中不存在 —— Network/Messages/ 下共 13 个 .java 文件,无此文件(全仓 grep -rn 'MessageEnderLetter' 仅命中这段注释本身)。因此这是一条指向不存在类的历史遗留注释,不影响运行。

后果是末影邮件 没有任何专用封包,其数据依赖 RandomThings.dat NBT 文件。

数值

数值名 值
频道名 randomthings
判别值范围 0–12
已注册封包 13
注释掉的注册 1(类不存在)
处理器 1 个(双端共用)
发送方式 5 种

相关条目