GregoryTweaksForCrafting
[!INFO] Git Commit:
8f17292| Updated: 2026-04-27
Gregory Tweaks For Crafting(modid craftingtweaks,GTNH 分支的 CraftingTweaks fork)
是一个纯客户端合成辅助库。它不注册任何方块、物品、实体或配方,
而是给其他模组已有的合成容器挂上一套网格搬运操作:在界面里加三个图标按钮
(旋转 / 均分 / 清空),并提供 6 个可自定义绑定的热键。
| 属性 | 值 |
|---|---|
| modid | craftingtweaks |
@Mod 类 |
net.blay09.mods.craftingtweaks.CraftingTweaks |
| 根包(现代码) | net.blay09.mods.craftingtweaks |
| 根包(Mixin/Core) | com.gtnewhorizons.craftingtweaks |
| 作者 | BlayTheNinth |
| 硬依赖 | gtnhlib@[0.9.24,) |
| 软依赖 | NotEnoughItems(仅用于热键屏蔽探测) |
| Java 文件数 | 43 |
| 登记容器数 | 22(覆盖 20 个模组 + 原版) |
| 热键数 | 6 |
| 配置项 | 3(general)+ 每模组 1 个 addons 开关 |
本 mod 提供的合成机制
它不新增任何合成配方,而是读取 CraftingManager 里已存在的配方来驱动操作。
共 6 类操作,落在两个维度上:
| 操作 | 入口 | 说明 |
|---|---|---|
| 旋转 | 按钮 / 热键 | 3×3 顺/逆时针 90°(中心格不动)或 2×2 四格循环 |
| 均分 | 按钮 / 热键 | 同种物品在网格各槽间平均分配 |
| 平铺 | 按钮 / 热键 + Shift | 先摊成每格 1 个,再均分 |
| 清空 | 按钮 / 热键 | 退回背包;Shift 为强制清空(放不下就丢地上) |
| 压缩 | 热键 | 按 CraftingManager 配方把 N 个同种物品合成 1 个(3×3 或 2×2) |
| 拆分 | 热键 | 按配方把 1 个物品还原成 N 个材料 |
| W 键投料 | 按 W + 点击 | 把背包物品投进合成网格 |
按钮定位有「网格对齐」(贴着网格左/右/上/下自动排布)与「绝对偏移」两种模式, 逐容器在 容器注册表 中登记。
热键列表
全部 6 个热键默认按键均为 Keyboard.KEY_NONE(未绑定,玩家须自行在
「选项 → 控制」中设置),分类 key.categories.craftingtweaks。
| 热键 | ID | 无修饰键 | 按住 Shift | 按住 Ctrl |
|---|---|---|---|---|
| 旋转 | key.craftingtweaks.rotate |
顺时针旋转 | 逆时针旋转 | — |
| 均分 | key.craftingtweaks.balance |
均分 | 平铺 | — |
| 清空 | key.craftingtweaks.clear |
清空(退回背包) | 强制清空(丢地上) | — |
| 绑定按键 | key.craftingtweaks.toggleButtons |
切换按钮显示 | — | — |
| 压缩物品 | key.craftingtweaks.compress |
压缩 | 只压缩一组 | 反转成拆分 |
| 拆分物品 | key.craftingtweaks.decompress |
拆分一组 | 拆分全部 | — |
⚠️ 6 个热键在 NEI 物品搜索框聚焦时全部失效
(NEIHotkeyCheck → LayoutManager.getInputFocused() != null)。
⚠️ 前 3 个受 ModSupportState 门控,后 3 个不受。
游戏设定列表
| 条目 | 内容 |
|---|---|
| 配置 | 两个配置文件、3 个选项的类型与默认值、旧配置迁移 |
| 模组支持状态 | ModSupportState 四值枚举、19 项预置表、按钮/热键门控矩阵 |
| 合成网格操作 | 旋转/均分/平铺/清空的完整算法、三套实现的分工 |
| 压缩与拆分 | InventoryCrafting 辅助容器、3×3→2×2 回退、前后端差异 |
| 容器注册表 | 22 个容器的 grid start/size/phantomItems/按钮表 + IMC 协议 |
| 网络协议 | 5 个 C→S 封包、离散 ID 0/1/2/5/6、各 handler 校验链 |
| Coremod 与 Mixin | CraftingTweaksCore + 3 个 Mixin 的目标类与签名 |
配置表
config/craftingtweaks-general.cfg(gtnhlib @Config):
| 选项 | 类型 | 默认值 | @Config.Sync |
门控 |
|---|---|---|---|---|
hideButtons |
boolean |
false |
否 | 隐藏全部 tweak 按钮;由 绑定按键 即时切换并落盘 |
hideButtonTooltips |
boolean |
false |
否 | 跳过 tweak 按钮 tooltip 绘制 |
compressAnywhere |
boolean |
false |
是 | 服务端 HandlerCompress 中放行「未登记的容器」;仅服务端有效 |
config/craftingtweaks.cfg → addons 分类(每模组一键):
| 键 | 类型 | 默认 | 合法值 |
|---|---|---|---|
minecraft + 每个已登记模组 |
String 枚举 |
enabled |
enabled / buttons_only / hotkeys_only / disabled |
| 枚举值 | 按钮 | 热键 |
|---|---|---|
enabled |
✅ | ✅ |
buttons_only |
✅ | ❌ |
hotkeys_only |
❌ | ✅ |
disabled |
❌ | ❌ |
⚠️ appliedenergistics2 被 postInit 硬覆盖为 buttons_only,
配置文件改不动。
Coremod / Mixin 摘要
| 项 | 值 |
|---|---|
coreModClass |
core.CraftingTweaksCore → com.gtnewhorizons.craftingtweaks.core.CraftingTweaksCore |
usesMixins |
true |
accessTransformersFile |
空 —— 本 mod 没有 Access Transformer |
| ASM Transformer | null(无字节码改写) |
| Mixin 数量 | 3,全部只在客户端应用 |
| Mixin | 目标类 | 关键成员 |
|---|---|---|
GuiScreenAccessor |
GuiScreen |
@Invoker(value = "func_146283_a") void drawHoveringText(List, int, int) |
GuiContainerAccessor |
GuiContainer |
getXSize/getGuiLeft/getGuiTop、@Accessor("field_146988_G") getDragSplittingButton()、callGetSlotAtPosition |
MixinGuiScreen_CraftingTweaks |
GuiScreen |
@Inject(method = "handleMouseInput", at = @At("INVOKE_ASSIGN", target = "Lorg/lwjgl/input/Mouse;getEventButton()I", remap = false), cancellable = true) |
SRG 名 field_146995_H、field_147007_t、field_146988_G、func_146283_a
在源码中逐字保留,详见 Coremod 与 Mixin。
本 mod 没有的内容(源码 grep 证据)
本分类只建了 keybinding/ 与 setting/ 两个目录,其余 11 个维度
经 grep 确认零内容,未创建空目录:
| 维度 | 证据 |
|---|---|
| 方块 / 物品 | grep -rc "registerBlock|registerItem" src/ 对全部 43 个 Java 文件零命中;无 Block*.java、无 Item*.java、无 extends Block/extends Item |
| TileEntity | grep -rn "TileEntity" src/ 零命中(全文件树无任何 *.md 资源、无方块状态) |
| 多方块结构 | grep -rni "multiblock|formation|Controller" src/ 仅命中 PlayerControllerMP / ITooltipProvider.addInformation 等无关标识符;无 multiblock/ 目录 |
| 实体 | grep -rn "registerEntity|extends Entity|registerModEntity" src/ 零命中 |
| 附魔 | grep -rn "Enchantment" src/ 零命中 |
| 维度 / 世界生成 | grep -rn "WorldProvider|DimensionManager|registerDimension|registerWorldGenerator" src/ 零命中;无 WorldProvider 实现 |
| 群系 | grep -rn "BiomeGen|BiomeProvider" src/ 零命中 |
| 结构 | grep -rn "StructureStart|MapGenStructure|WorldGen" src/ 零命中 |
| 成就 | grep -rn "registerAchievement|Achievement" src/ 零命中 |
| Buff / Debuff | grep -rn "PotionEffect|registerPotion" src/ 零命中 |
| 指令 | grep -rn "CommandBase|ICommand|getCommandName|addChatCommand" src/ 零命中 —— 无任何服务端指令 |
| 合成配方 | grep -rn "addRecipe|CraftingHelper|IRecipe" src/ 零命中;CraftingManager 只被读取(findMatchingRecipe) |
也没有 GUI / Container 实现类:src/main/java 下无任何 extends GuiContainer
或 extends Container 的类。Compatibility 登记的 22 个容器全部是外部模组的
类名(以字符串 + Class.forName 反射加载),详见
容器注册表。
因此本分类不存在的目录:block/、item/、entity/、multiblock/、
enchantment/、dimension/、biome/、structure/、achievement/、
potioneffect/、item-effect/。