MessageSeed
服务端 → 客户端:世界种子
基本信息
| 属性 | 值 |
|---|---|
| 路径 | com.github.lunatrius.ingameinfo.network.message.MessageSeed |
| 行数 | 41 |
| 网络 id | 0 |
| 方向 | Side.CLIENT(接收) |
| 载荷 | long(1 个定长字段) |
类声明
public class MessageSeed implements IMessage, IMessageHandler<MessageSeed, IMessage>
消息与处理器合一(见 PacketHandler 的说明)。
字段与构造器
| 成员 | 行 | 说明 |
|---|---|---|
public long seed |
:13 |
public 可变字段 |
MessageSeed() |
:15-17 |
无参,seed = 0(FML 反序列化用) |
MessageSeed(long seed) |
:19-21 |
业务构造器 |
⚠️ seed 是 public 非 final,
消息在网络线程上被填充、在客户端主线程上被读取,
字段可见性无同步保护。FML 的 SimpleNetworkWrapper
在主线程调度 handler,实际风险低,但字段本身不安全。
序列化(:23-31)
public void fromBytes(ByteBuf buf) { this.seed = buf.readLong(); }
public void toBytes(ByteBuf buf) { buf.writeLong(this.seed); }
定长 long,8 字节,无变长部分。
⚠️ 没有版本号 / 校验:
若服务端与客户端的 mod 版本不同,字段布局变化会导致静默错读。
InGameInfoXML.checkModList(主类 的 :34-37)
无条件返回 true,不做版本协商。
写入静态状态
onMessage 把种子写进 Tag 的两个 protected static 字段:
| 字段 | 作用 |
|---|---|
hasSeed |
是否已收到 |
seed |
种子值 |
消费方是 TagWorld 的 seed tag。
发送方
PlayerHandler(:14-24):
PacketHandler.INSTANCE.sendTo(new MessageSeed(event.player.worldObj.getSeed()), (EntityPlayerMP) event.player);
玩家登录时逐个发给该玩家(sendTo,非 sendToDimension),
所以换维度不会重发。
⚠️ 整段包在 try/catch (Exception) 里,
失败只 logger.error("Failed to send the seed!", ex)。
相关
- PacketHandler - 注册处(id 0)
- PlayerHandler - 发送方
- Tag - 静态字段宿主
- MessageNextRain - 另一条消息(id 1,每秒广播)