容器注册表(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)。

相关条目