网络封包
基本信息
| 属性 | 值 |
|---|---|
| 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 种 |