跳到正文
烈焰甘蔗Wiki

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)

  1. 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) 取方块实体得到)——即"取得处理该包的玩家"。
  2. 用坐标在玩家的世界取方块实体:player.field_70170_p.func_147438_o(x, y, z)。

    • field_70170_p(World)、func_147438_o(getTileEntity)同为 SRG 名 → 未解析;语义佐证见上。
  3. if (tile_entity instanceof TileEntityMarket) 才继续:调用 setBrowsingInfo(itemNum)(MessageMarketBrowse.java:51)写入翻页状态。

  4. 无条件执行 player.field_70170_p.func_147471_g(x, y, z)(MessageMarketBrowse.java:53)刷新该玩家看到的方块。

    • func_147471_g → 未解析;语义佐证:与第 2 步取方块实体用同一个 World 接收者和同样的三个坐标参数,在"刚改完方块状态后"调用,行为等价于原版 World.markBlockForUpdate。
  5. return null:不返回应答消息(MessageMarketBrowse.java:54)。

源码缺陷:处理器完整但无发送方

onMessage 是一段完整可用的服务端逻辑,不是空壳。但全模组对 MessageMarketBrowse 的引用只有三处:

  • PacketHandler.java:6 —— import
  • PacketHandler.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(标记方块更新)在原版语义下是安全的世界更新通知,不写入任何方块。

相关条目

浏览全部模组