MessageMarketBrowse(市场翻页请求)
事实基准:
harvestcraft-1.3.14-GTNH.jar(MC 1.7.10 / Forge 10.13.4.1614)CFR 0.152 反编译源码。
基本信息
| 属性 | 值 | 来源 |
|---|---|---|
| 类 | com.pam.harvestcraft.MessageMarketBrowse |
MessageMarketBrowse.java:14 |
| 实现接口 | IMessage、IMessageHandler<MessageMarketBrowse, IMessage>(自处理) |
MessageMarketBrowse.java:15-16 |
| 判别器 | 0 |
PacketHandler.java:17 |
| 通道 | harvestcraft(SimpleNetworkWrapper) |
PacketHandler.java:14 |
| 目标侧 | Side.SERVER |
PacketHandler.java:17 |
| 方向 | 客户端 → 服务端 | 由 Side.SERVER 与 onMessage 中取 EntityPlayerMP 共同确定 |
| 触发方 | 无(见下"可达性") | 全模组引用点仅 PacketHandler.java:6,17 |
承载的数据
toBytes / fromBytes(MessageMarketBrowse.java:32-44)共 4 个 int,共 16 字节:
| 顺序 | 字段 | 类型 | 字节 | 语义 |
|---|---|---|---|---|
| 1 | itemNum |
int |
4 | 请求查看的物品页码 / 物品序号 |
| 2 | x |
int |
4 | 市场方块 X 坐标 |
| 3 | y |
int |
4 | 市场方块 Y 坐标 |
| 4 | z |
int |
4 | 市场方块 Z 坐标 |
有一个无参构造器(MessageMarketBrowse.java:22-23),供 SimpleNetworkWrapper 在服务端反序列化时实例化。
服务端处理(onMessage,MessageMarketBrowse.java:46-55)
-
ctx.getServerHandler().field_147369_b取出EntityPlayerMP。field_147369_b是 SRG 名,本机无 MCP 映射表 → 未解析。语义佐证:其类型被显式转型为net.minecraft.entity.player.EntityPlayerMP,且紧随其后调用player.field_70170_p(World,由同文件:48的func_147438_o(x,y,z)取方块实体得到)——即"取得处理该包的玩家"。
-
用坐标在玩家的世界取方块实体:
player.field_70170_p.func_147438_o(x, y, z)。field_70170_p(World)、func_147438_o(getTileEntity)同为 SRG 名 → 未解析;语义佐证见上。
-
if (tile_entity instanceof TileEntityMarket)才继续:调用setBrowsingInfo(itemNum)(MessageMarketBrowse.java:51)写入翻页状态。 -
无条件执行
player.field_70170_p.func_147471_g(x, y, z)(MessageMarketBrowse.java:53)刷新该玩家看到的方块。func_147471_g→ 未解析;语义佐证:与第 2 步取方块实体用同一个World接收者和同样的三个坐标参数,在"刚改完方块状态后"调用,行为等价于原版World.markBlockForUpdate。
-
return null:不返回应答消息(MessageMarketBrowse.java:54)。
源码缺陷:处理器完整但无发送方
onMessage 是一段完整可用的服务端逻辑,不是空壳。但全模组对 MessageMarketBrowse 的引用只有三处:
PacketHandler.java:6—— importPacketHandler.java:17——registerMessage注册- 类自身定义
没有任何 new MessageMarketBrowse(...),也没有任何 sendToServer 发送它。 对比 MessageMarketBuy(GuiMarket.java:80,82,85)与 MessageMarketClosed(GuiMarket.java:93)都有明确发送点。
因此判别器 0 是一个注册了但永不触达的包。行为上无副作用(SimpleNetworkWrapper 的注册只是查表开销),但它让"市场翻页走自定义包"这一读法产生误导——实际翻页由 TileEntityMarket / ContainerMarket 自身的同步完成。
安全说明
onMessage 用 instanceof 保护了 setBrowsingInfo 调用,坐标来自客户端但被 instanceof TileEntityMarket 过滤;对任意坐标调用 func_147471_g(标记方块更新)在原版语义下是安全的世界更新通知,不写入任何方块。
相关条目
- PacketHandler —— 判别器与通道的权威来源
- MessageMarketBuy · MessageMarketClosed
- AbstractPacket · 旧版空壳包
- 兄弟维度:世界生成 · 配置 · 兼容层