跳到正文
烈焰甘蔗Wiki

Market(市场)

事实基准:harvestcraft-1.3.14-GTNH.jar(MC 1.7.10 / Forge 10.13.4.1614)CFR 0.152 反编译源码。

基本信息

属性 值 来源
注册名 harvestcraft:market BlockRegistry.java:644
方块类 BlockPamMarket extends BlockContainer BlockPamMarket.java:19-20
字段 BlockRegistry.pamMarket BlockRegistry.java:52
构造 new BlockPamMarket(Material.field_151575_d) BlockRegistry.java:455
显示名 tile.market.name = Market en_US.lang:46
硬度 / 爆炸抗性 1.0f / 1.0f BlockRegistry.java:455
TileEntity TileEntityMarket BlockPamMarket.java:31-33
GUI ID 4 BlockPamMarket.java:41
条件注册 无,无条件注册 BlockRegistry.java:644
多方块 否,源码未定义任何多方块结构 —
朝向 不支持(无 func_149689_a),贴图 marketside/markettop/marketbottom BlockPamMarket.java:46-50

槽位布局(TileEntityMarket.java:19-21)

槽位 内容 数量
0 付款槽 paySlot 仅 1 个
  • func_70302_i_() 恒返回 1(TileEntityMarket.java:19-21)。
  • 堆叠上限 func_70297_j_() = 64(TileEntityMarket.java:56-58 据此截断)。
  • 没有任何产物槽、没有燃料槽、没有工作槽。市场不是加工机器,而是一个「投币 → 弹出商品」的交互方块。
  • 库存名称 getInvName() = "Market"(TileEntityMarket.java:62-64)。

处理什么 / 产什么

市场不加工任何东西。它通过 GUI 展示一份商品清单,玩家把货币投入付款槽,界面把商品直接塞进玩家背包。

交易流程(全部走网络包,客户端权威)

组件 作用
PacketMarket 简单的单字段包(HarvestCraft.instance.INSTANCE)
MessageMarketBrowse 客户端请求浏览;setBrowsingInfo(int stockNum) 记录清单长度(TileEntityMarket.java:91-93)
MessageMarketBuy 购买请求;服务端扣 takeEmeraldFromSlot(price)(TileEntityMarket.java:66-71)
MessageMarketClosed 关闭界面
MarketItems 商品清单数据源
MarketData 单条商品记录:ItemStack item + ItemStack currency + int price(MarketData.java:9-17)

stockNum 被序列化进 NBT(TileEntityMarket.java:79,84)——浏览状态会随存档保存。

商品条数:无法静态确定(双层配置门控)

MarketItems.registerItems()(MarketItems.java:29)有 10 个 if (BlockRegistry.marketsell*) 分组(MarketItems.java 内 marketsell* 去重后恰为 10 个开关)。

层 门控 说明
外层 marketsell<类别> 共 10 个 boolean 开关 关掉整个类别
内层 marketcurrency<类别> 共 10 个 int 开关 0/1/2/3 四种货币任选其一

因此:

  • grep registerItems(new MarketData 会得到 139 个字面调用点,但其中每个调用点都埋在两层 if 里。
  • 更关键:每个分支内还有 for (i = 0; i < 60; ++i) MarketItems.registerItems(new ItemStack(ItemRegistry.PamSeeds[i]), ...) 的循环注册(MarketItems.java:33-35 等 10 处),单次循环即产生 60 条。
  • 实际清单长度既取决于 10×10 个配置项的组合,也取决于循环展开,只能在给定配置下由 MarketItems.getSize()(MarketItems.java:25-27)得出。本仓库不含实际配置文件,不给出确定数字。

货币选择(marketcurrency* 的 4 个取值)

内层分支按 == 0 / == 1 / == 2 / == 3 组织,每种对应一件不同的原版物品作为货币(MarketItems.java:32/40/48/56 等)。这些是未反混淆的 SRG 名(如 Items.field_151166_bC、field_151045_i、field_151043_k、field_151074_bl),本仓库无 MCP 映射,不断言其原版名。

价格表(全部实测自 BlockRegistry.java:355-362)

配置键 分类 默认值 行
marketseedPrice market prices 1 :355
marketsaplingPrice market prices 3 :356
marketchickenPrice market prices 3 :360
marketbonemealPrice market prices 3 :362
marketpigPrice market prices 6 :357
marketsheepPrice market prices 6 :358
marketcowPrice market prices 9 :359
markethorsePrice market prices 12 :361

最贵的是马(12),最便宜的是种子(1) —— 这 8 个数字是价格平衡的核心,全部读自源码常量。

其它相关配置

配置键 分类 默认值 行
marketsellSeeds 等 10 个 market sales 全部 true :344-353
marketcurrencySeeds 等 10 个 market currency 全部 0 :363-372
marketblockrecipeItem miscellaneous recipes 0 :354

处理耗时 / 速率

无。 TileEntityMarket 的 func_145845_h() 只调用父类实现,没有任何 tick 逻辑、没有冷却、没有计时。市场是瞬时交易。

交互

触发 行为 来源
右键 System.out.println("Trying to open") 后 openGui(..., 4, ...) BlockPamMarket.java:35-43
破坏 由 BlockContainer 默认处理,不散落物品(本类未覆写 func_149749_a) —
放置 不设 metadata —

源码缺陷

  1. 调试输出遗留在生产代码里。BlockPamMarket.java:40:System.out.println("Trying to open"); —— 每次右键市场都会往客户端 stdout 打一行日志。
  2. func_94041_b 恒返回 false → 市场不支持漏斗自动化付款(TileEntityMarket.java)。
  3. func_149915_a(World, int) 与 createNewTileEntity(World) 两个方法都 return new TileEntityMarket()(BlockPamMarket.java:31-33 与 :65-67),行为重复。(BlockPamOven、BlockPamApiary 有同样的双实现,属同一批反编译/移植产物。)
  4. takeEmeraldFromSlot(int price) 方法名写死「Emerald(绿宝石)」,但实际货币由 marketcurrency* 配置决定,可能是另外 3 种物品之一 → 方法名与行为脱节(TileEntityMarket.java:66)。
  5. 多方块 / 控制器 / 可否旋转:源码未定义。

相关条目

  • Sink — 另一种「花钱办事」的交互方块
  • TileEntity:Market

订正记录

  • 本条目完全重写。旧版基于 MC 1.12.2 的 MatrexsVigil/harvestcraft fork,商品清单、货币种类与价格均为该 fork 的数据,行号亦不适用于 1.7.10。旧版行号一律作废;本条目的 8 个价格数字与 20 个配置项默认值均为本次对 harvestcraft-1.7.10-GTNH 源码的实测复核结果。
浏览全部模组