下面这个九宫格是能点的:从材料盘拿东西放进 3×3,摆对配方产物格就会变绿。
它是纯演示工具 —— 材料无限、不消耗、也不写进任何背包,只是把游戏里的配方摆出来看。
匹配规则与游戏内 Items.matchGrid 完全一致 —— 无序匹配。
左:3×3 九宫格 · 中:产物格 · 下:材料盘。点格子里的物品可以取回,点产物格看结果 —— 怎么点都不会消耗东西。
CraftRequest → 服务端结算),
下面「一次合成在代码里发生什么」写的就是它。| 产物 | 配方(无序) | 产出 | 配方 id |
|---|---|---|---|
木板 |
原木 ×1 |
×4 | log_to_plank |
火把 |
木板 ×1 +
煤炭 ×1 |
×4 | plank_coal_to_torch |
Items.matchGrid 里按格子位置比对即可(配方表加一个 3×3 pattern 字段)。从矿脉与树,到能拿在手里的东西。
每区块 6 处脉,最常见的材料。
每区块 4 处脉。
每区块 2 处脉。
每区块 1 处脉,最稀有。
1 个原木出 4 块木板,砍树就有。
1 + 1 出 4 个火把。
ModNet.send(new CraftRequest(craftGrid)),把九个格子的物品名发过去(null 表示空)。Items.matchGrid(grid) 无序匹配;匹配不到就什么都不动,直接把背包重推一份。InventoryPacket(typeId 302)整份推给客户端,客户端在渲染线程更新背包 UI。// Items.java(两端同一份表,不会漂移) public static String matchGrid(String[] grid) { Map<String,Integer> have = new LinkedHashMap<>(); for (String s : grid) if (s != null && !s.isEmpty()) have.merge(s, 1, Integer::sum); if (have.isEmpty()) return null; for (String id : RECIPES) { // 无序:只比物品多重集 Map<String,Integer> need = inputsOf(id); if (need.equals(have)) return id; } return null; }
游戏里按 I:背包 9 列 + 3×3 合成格 + 产物格,MC 风格的紧凑灰窗口。