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 四种货币任选其一 |
因此:
grepregisterItems(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 | — |
源码缺陷
- 调试输出遗留在生产代码里。
BlockPamMarket.java:40:System.out.println("Trying to open");—— 每次右键市场都会往客户端 stdout 打一行日志。 func_94041_b恒返回 false → 市场不支持漏斗自动化付款(TileEntityMarket.java)。func_149915_a(World, int)与createNewTileEntity(World)两个方法都return new TileEntityMarket()(BlockPamMarket.java:31-33与:65-67),行为重复。(BlockPamOven、BlockPamApiary有同样的双实现,属同一批反编译/移植产物。)takeEmeraldFromSlot(int price)方法名写死「Emerald(绿宝石)」,但实际货币由marketcurrency*配置决定,可能是另外 3 种物品之一 → 方法名与行为脱节(TileEntityMarket.java:66)。- 多方块 / 控制器 / 可否旋转:源码未定义。
相关条目
订正记录
- 本条目完全重写。旧版基于 MC 1.12.2 的
MatrexsVigil/harvestcraftfork,商品清单、货币种类与价格均为该 fork 的数据,行号亦不适用于 1.7.10。旧版行号一律作废;本条目的 8 个价格数字与 20 个配置项默认值均为本次对harvestcraft-1.7.10-GTNH源码的实测复核结果。