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)。

相关