Trait 与机器 UI
MBD2 21.1.1Trait 是可配置的机器组件。请区分三套 IO:配方 handler IO、分侧方块 capability IO,以及自动世界 IO。

配置 Trait
| 设置 | 用途 |
|---|---|
| Trait name | KubeJS lookup 与生成 ui:<name> ID 使用的稳定名称 |
| Recipe handler IO | 配方逻辑是否能从 Trait 消耗或向其中产出 |
| Recipe logics | 机器的哪些配方逻辑可以使用该 Trait;为空表示全部 |
| Distinct | capability 内容是否必须不跨 handler 合并处理 |
| Slot names | 配方 slotName 引用的可选路由名 |
| Capability IO | 相对机器正面,哪些世界侧允许插入/提取 |
| GUI IO | 机器 UI 允许的操作 |
| Auto IO | 定期与相邻方块 capability 传输 |
| Filter/capacity/rate | Trait 特有存储限制 |
| Keep data on drop | 掉落的机器物品是否带上该 Trait 的数据,见下文 |
核心 Trait
| Trait type | 运行时存储 | 配方 handler | 世界 capability |
|---|---|---|---|
item_slot | Item stack transfer | item、item_durability | 分侧物品 handler |
fluid_tank | Fluid storage list | fluid | 分侧流体 handler |
forge_energy_storage | Copiable energy storage | forge_energy | Capabilities.EnergyStorage.BLOCK |
entity_handler | 实体交互配置 | entity | 面向行为,并非常规物品栏存储 |
可选 Trait 只在依赖存在时出现:chemical_tank、mek_heat_container、pneumatic_pressure_air_handler、pneumatic_heat_exchanger、aura_handler、ars_source_storage、ars_nearby_source、ae2_me_interface、ae2_me_pattern_provider、astral_lumen_storage、astral_starlight_receiver、astral_researcher。参见集成。
超过一组的物品槽
Since after 21.1.2item_slot Trait 的 Slot Limit(槽位限制)是一个槽位能放多少物品。21.1.2 及以前,一个槽位最多只能放到物品自身的堆叠上限,通常是 64。开启 Ignore item stack limit(忽略物品堆叠上限)后,它可以一直放到槽位限制,最多 2,147,483,647 个。
- 不可堆叠的物品(如工具)每个槽位仍只放一个。
- 1000 及以上的数量会缩写显示,悬停提示里是完整数量。
- 点击每次最多取出一组。漏斗、管道和自动 IO 照常搬运,配方也能消耗和产出任意数量。
- 机器被破坏时,物品按正常堆叠掉落。关闭 Drop items(掉落物品)则直接消失;开启 Keep data on drop(掉落时保留数据)则保存在机器物品里。
slot_limit和ignore_item_stack_limit都是 runtime value,单台机器可以各自修改。
掉落时保留数据
Since after 21.1.2每个 Trait 都有 Keep data on drop(掉落时保留数据)。开启后,破坏机器时会把这个 Trait 的数据——物品槽的内容、储罐的流体、能量存储的电量、Trait 的 runtime value——写进掉落的机器物品,放下这个物品时全部恢复。此时 Trait 自己不再掉落任何东西,除非机器根本不掉落物品。仍和新机器时一样的 Trait 不会往物品里写任何东西,所以空着拆下的机器照样可以堆叠。
这里的每一项设置都能按机器覆盖
Trait 的设置同时也是 runtime value:配方 handler IO、distinct、slot names、capability IO、auto IO、容量和过滤器,都可以由蓝图或脚本在单台放置的机器上覆盖,而不动定义。
生成并绑定 UI

实现 IUIProviderTrait 的 Trait 定义使用基于 ui:<trait-name> 的 ID 创建模板。SLOT 布局进入输入/输出列,BAR 布局位于其下方。UI 生成器还可添加配方进度、燃料进度、配方查看器查询和玩家物品栏;有多个配方逻辑的机器会为每个逻辑各提供一个进度条和燃料条。
Trait 名称和数量稳定后再生成 UI。重命名 Trait 时,检查所有生成组件 ID、配方 slotName/uiName 和脚本。
运行时 initTraitUI 将真实 Trait 绑定到匹配组件。存储由服务端控制;控件应发送操作或使用 data binding,不能直接信任客户端值。
跨部件 UI
多方块控制器的 UI 可以把一个控件绑定到它某个部件上的 Trait,部件的 UI 也可以绑定到控制器上的 Trait。在编辑器里给元素一个带前缀的 ID:
| 位于 | ID 形式 | 绑定到 |
|---|---|---|
| 控制器的 UI | part:<traitName>@ui:<widgetId> | 任一已成型部件上的该 Trait |
| 部件的 UI | controller:<traitName>@ui:<widgetId> | 任一控制器上的该 Trait——需要打开部件设置 |
<widgetId> 是去掉 ui: 前缀的生成控件 ID,所以部件上名为 input_items 的 Trait、其第一个槽位 ui:input_items_0,写成 part:input_items@ui:input_items_0。
绑定时 MBD2 会找到该 Trait,把元素 ID 改回 ui:input_items_0,并执行该 Trait 的 initTraitUI。如果没有部件或控制器带这个名字的 Trait,或者该 Trait 不提供 UI,元素保持原样。
用蓝图添加 UI
蓝图可以挂在 Build UI 事件上,往编辑器创作的界面里追加内容。Auto IO 面板内置蓝图就是这么做的,也是「机器不改 UI 树就白拿一块界面」的范式。