容器注册表(Container Registry)
基本信息
| 属性 | 值 |
|---|---|
| 注册入口 | net.blay09.mods.craftingtweaks.Compatibility(postInit 中逐一调用) |
| 数据结构 | CraftingTweaks.providerMap:Map<Class<? extends Container>, TweakProvider> |
| 查表方式 | getProvider(container):先精确类相等匹配,再退化为 isAssignableFrom |
| 对外 API | CraftingTweaksAPI.registerSimpleProvider / registerProvider |
| 跨 mod IMC | 键 RegisterProvider,isNBTMessage() |
| 已登记容器总数 | 22 个(20 个 SimpleTweakProvider + 2 个自定义 TweakProvider) |
本 mod 不含任何 GUI 屏幕或 Container 实现类 —— 下表全部是外部模组的容器类, 本 mod 只为它们挂上「合成网格起点 / 大小 / 按钮行为」的描述。
网格参数表
图例:S = grid start(槽位索引),Z = grid size,P = phantomItems,
A = alignToGrid(按钮对齐方向),按钮列为「旋转/均分/清空」的
启用·显示(未标注即 configureStandardTweakButtons = 全 true·true)。
| # | modid | Container 类 | S | Z | P | A | 按钮 | 备注 |
|---|---|---|---|---|---|---|---|---|
| 1 | minecraft |
net.minecraft.inventory.ContainerWorkbench |
1 | 9 | false | WEST | 全开 | 默认工作台 |
| 2 | minecraft |
net.minecraft.inventory.ContainerPlayer |
1 | 4 | false | null | 全开但全不显示按钮 | 玩家背包 2×2,仅热键 |
| 3 | TwilightForest |
twilightforest.inventory.ContainerTFUncrafting |
2 | 9 | false | WEST | 全开 | |
| 4 | TConstruct |
tconstruct.tools.inventory.CraftingStationContainer |
1 | 9 | false | WEST | 全开 | start/size 用默认值 |
| 5 | ThermalExpansion |
cofh.thermalexpansion.gui.container.device.ContainerWorkbench |
58 | 9 | true | WEST | 旋✓均✗清✓ | 旋转与清空按钮均隐藏 |
| 6 | Thaumcraft |
thaumcraft.common.container.ContainerArcaneWorkbench |
2 | 9 | false | null | 全开,绝对坐标 | 按钮偏移 (-12,40)/(-12,58)/(-12,76) |
| 7 | RotaryCraft |
Reika.RotaryCraft.Containers.ContainerHandCraft |
1 | 9 | false | WEST | 全开 | |
| 8 | Natura |
mods.natura.gui.WorkbenchContainer |
1 | 9 | false | WEST | 全开 | |
| 9 | MineFactoryReloaded |
powercrystals.minefactoryreloaded.gui.container.ContainerLiquiCrafter |
0 | 9 | true | WEST | 旋✓均✗清✓ | |
| 10 | jacb |
tv.vanhal.jacb.gui.BenchContainer |
1 | 9 | false | WEST | 全开 | |
| 11 | DraconicEvolution |
com.brandon3055.draconicevolution.common.container.ContainerDraconiumChest |
241 | 9 | false | WEST | 旋✓均✗清✓ | start 索引极大 |
| 12 | BuildCraft|Factory |
buildcraft.factory.gui.ContainerAutoWorkbench |
2 | 9 | true | WEST | 全开 | 先 setPhantomItems 再配按钮 |
| 13 | bluepower |
com.bluepowermod.container.ContainerProjectTable |
0 | 9 | false | null | 旋✓均✓清✗ | 绝对坐标 (14,35)/(14,52)/(0,0) |
| 14 | BiblioCraft |
jds.bibliocraft.blocks.ContainerFancyWorkbench |
10 | 9 | false | null | 全开,绝对坐标 | (42,16)/(42,34)/(42,52) |
| 15 | Backpack |
de.eydamos.backpack.inventory.container.ContainerWorkbenchBackpack |
1 | 9 | true | WEST | 旋✓均✗清✓ | |
| 16 | Railcraft |
mods.railcraft.common.gui.containers.ContainerCartWork |
1 | 9 | false | WEST | 全开 | |
| 17 | Railcraft |
mods.railcraft.common.gui.containers.ContainerRollingMachine |
2 | 9 | false | WEST | 旋✓均✗清✓ | 清空按钮显示 |
| 18 | ganyssurface |
ganymedes01.ganyssurface.inventory.ContainerWorkTable |
1 | 9 | false | WEST | 全开 | |
| 19 | appliedenergistics2 |
appeng.container.implementations.ContainerCraftingTerm |
5 | 9 | false | WEST | 全开 | 状态被硬设为 buttons_only |
| 20 | appliedenergistics2 |
appeng.container.implementations.ContainerPatternTerm |
5 | 9 | true | WEST | 旋✓均✗清✓ | |
| 21 | Avaritia |
fox.spiteful.avaritia.gui.ContainerExtremeCrafting |
1 | 81 | false | WEST | 旋✗均✓清✓ | 9×9 终极合成矩阵 |
| 22 | Forestry |
forestry.factory.gui.ContainerWorktable |
54 | 9 | true | WEST | 旋✓均✗清✓ |
网格尺寸分布
| grid size | 容器数 | 说明 |
|---|---|---|
| 9 | 19 | 标准 3×3 |
| 4 | 1 | 玩家背包 2×2(#2) |
| 81 | 1 | Avaritia 终极合成 9×9(#21) |
| 其他 | 2 | #19 Gany’s 双工作台(按 id 返回 2 或 11,size 恒 9)、#20 TFC 玩家背包(size 4) |
⚠️ Avaritia 的 size=81 会让 ClientProvider.canRotate 的
size == 9 判定失败 —— 纯客户端下旋转在终极合成台不可用;
但其 tweakRotate.enabled 本身也是 false,按钮与热键双保险。
phantomItems = true 的 7 个容器
ThermalExpansion、MineFactoryReloaded、BuildCraft|Factory、Backpack、
appliedenergistics2/PatternTerm、Forestry、MineFactoryReloaded/LiquiCrafter
—— 共 6 个 SimpleTweakProvider 加去重后 6 个不同模组。
phantomItems = true 的连锁影响:requiresServerSide() 返回 true,
于是该容器的旋转/均分/平铺/清空/投料只能走服务端,
纯客户端环境下这些按钮点下去无反应。
两个自定义 TweakProvider
GanysDualWorktableTweakProvider(modid ganyssurface)
目标容器 ganymedes01.ganyssurface.inventory.ContainerDualWorkTable ——
一个界面里有两个 3×3 网格,故用 tweakId 区分:
| tweakId | grid start | grid size |
|---|---|---|
0 |
2 | 9 |
1 |
11 | 9 |
initGui 加 6 个按钮(其余容器都是 3 个):左栏
guiLeft - 16、右栏 guiLeft + xSize,纵向 guiTop + 16 / +34 / +52,
tweakId 分别为 0 和 1。
getCraftMatrix 直接取 inventorySlots.get(start).inventory。
TerraFirmaCraftTweakProvider(modid terrafirmacraft)
目标容器 com.bioxx.tfc.Containers.ContainerPlayerTFC:
| 属性 | 值 |
|---|---|
| grid start | 0 |
| grid size | 4(2×2) |
| craftMatrix | 强转 (ContainerPlayer) container).craftMatrix,不走 slot 索引 |
| 旋转 handler | smallRotationHandler(4 格专用) |
requiresServerSide() |
false |
initGui 加 3 个按钮,横排于顶部:
(guiLeft + xSize/2 + 1, guiTop - 16) 起,x 方向依次 +0 / +18 / +36。
⚠️ 该 provider 的 getCraftMatrix 无条件强转 ContainerPlayer,
若该类名被其他容器占用会在运行时报 ClassCastException。
按钮定位规则
SimpleTweakProviderImpl.initGui 按 alignToGrid 分两路:
| alignToGrid | 行为 |
|---|---|
WEST |
三个按钮竖排在网格左侧:x = firstSlot.xDisplayPosition - 19,y = firstSlot.yDisplayPosition + 18*index |
EAST |
竖排在网格右侧:x = firstSlot.xDisplayPosition + 18*3 + 1 |
UP / NORTH |
横排在网格上方:y = firstSlot.yDisplayPosition - 18 - 1,x = + 18*index |
DOWN / SOUTH |
横排在网格下方:y = firstSlot.yDisplayPosition + 18*3 + 1 |
null |
使用配置的绝对偏移(buttonX/buttonY),不做网格对齐 |
未显式设置 alignToGrid 的 4 个容器走绝对偏移:
Thaumcraft、bluepower、BiblioCraft(以及 ContainerPlayer,
但它三个按钮都不显示)。
IMC 注册协议(第三方模组接入)
CraftingTweaks.imc 处理 key = RegisterProvider 的 NBT 消息。
字段与默认值:
| NBT 字段 | 类型 | 默认 | 作用 |
|---|---|---|---|
ContainerClass |
String | 必填 | 目标容器类全名 |
ButtonOffsetX |
int | -16 |
全局按钮 X 基址 |
ButtonOffsetY |
int | 16 |
全局按钮 Y 基址 |
AlignToGrid |
String | null |
north/up→UP,south/down→DOWN,east/right→EAST,west/left→WEST;其它值 → null(走绝对偏移) |
GridSlotNumber |
int | 1 |
grid start |
GridSize |
int | 9 |
grid size |
HideButtons |
boolean | false |
界面级隐藏,无配置项,游戏内不可改 |
PhantomItems |
boolean | false |
同 合成网格操作 |
TweakRotate.Enabled |
boolean | true |
旋转可用 |
TweakRotate.ShowButton |
boolean | true |
旋转按钮显示 |
TweakRotate.ButtonX / ButtonY |
int | 0 / 0 |
相对基址的偏移(累加到 ButtonOffset) |
TweakBalance.Enabled |
boolean | true |
均分/平铺可用 |
TweakBalance.ShowButton |
boolean | true |
均分按钮显示 |
TweakBalance.ButtonX / ButtonY |
int | 0 / 18 |
默认 Y 偏移 18 |
TweakClear.Enabled |
boolean | true |
清空可用 |
TweakClear.ShowButton |
boolean | true |
清空按钮显示 |
TweakClear.ButtonX / ButtonY |
int | 0 / 36 |
默认 Y 偏移 36 |
所以默认按钮基址为 (-16, 16) / (-16, 34) / (-16, 52)。
非 NBT 消息或 key 不匹配的 IMC 会打一条 warn 日志。
按钮贴图与 ID
GuiTweakButton extends GuiImageButton,贴图
assets/craftingtweaks/gui.png,按钮尺寸 16×16,
GuiButton 构造传入的 id 恒为 -1(不参与原版按钮 id 分配)。
| 操作 | 普通态 texCoordX | 按住 Shift 时 | 切换含义 |
|---|---|---|---|
| 旋转 | 16 | 64(+48) | — |
| 均分 | 48 | 96(+48) | 均分 → 平铺(Spread) |
| 清空 | 32 | 80(+48) | 清空 → 强制清空 |
texCoordY 偏移:0 常态、+16 悬停、+32 禁用。
GuiTweakButton.drawButton 每帧重算
xPosition = relativePosition.x + guiLeft、
yPosition = relativePosition.y + guiTop,用于应对某些模组
持续改动 guiLeft/guiTop 的情况(源码注释:mods that do hacky things)。