MaterialType

基本信息

属性 值
枚举类型 appeng.items.materials.MaterialType
源码 appeng/items/materials/MaterialType.java(共 244 行)
所属 modid appliedenergistics2
常量总数 70(实测,含 1 个哨兵)
已注册变体 69
物品注册名 item.ItemMultiMaterial(全部常量共用)
注册点 appeng/core/api/definitions/ApiMaterials.java:111-112
构造器 5 个(:138、:143、:148、:163、:179)

常量数是怎么算出来的

同样有两个陷阱:

  1. 5 个构造器声明不是常量。 文本匹配 名称( 会命中 MaterialType(int)(:138)、MaterialType(int, AEFeature)(:143)、 MaterialType(int, AEFeature, Class)(:148)、 MaterialType(int, AEFeature, String, Class)(:163)、 MaterialType(int, AEFeature, String)(:179),得出 75。减去这 5 行才是 70。
  2. InvalidType(:33)是哨兵,meta -1,不是已注册材料。

集合运算:70 − 1 = 69

  • MaterialType.java 真实常量:70(去重后仍为 70,无 meta 重复)。
  • ApiMaterials.java 中 itemMultiMaterial.createMaterial(MaterialType.X) 调用:69 处。
  • 差集 = {InvalidType},恰为 1 个。
  • 反向差集(ApiMaterials 有但枚举没有)= 空集。

三处独立佐证:

  • ItemMultiMaterial.createMaterial()(items/materials/ItemMultiMaterial.java:153) 首行即 Preconditions.checkState(!mat.isRegistered(), "Cannot create the same material twice.")。
  • getCheckedSubItems()(:253-259)只收 getDamageValue() >= 0 的项, registerIcons()(:262-271)只处理 != -1 的项——两处都跳过 InvalidType。
  • 源码自带注释 :122 // the last meta is 69。

meta 值域为 0..69,其中 62 是空缺(无任何常量使用),所以 0..69 共 70 个槽位实际用了 69 个,与上面的 69 吻合。InvalidType 的 -1 在域外。

所有常量共用一个物品

ApiMaterials 构造函数先造实例并注册(ApiMaterials.java:111-112), 再用 itemMultiMaterial.createMaterial(MaterialType.XXX) 逐个造出变体。 这些变体不是独立的 GameRegistry 注册,因此本维度的「条目数」(70) 不等于物品数(1)。命名沿用 NameResolver 的改名逻辑 (core/features/NameResolver.java:38-40):类简名 ItemMultiMaterial 先被 改写成 ItemMaterial(ItemMultiPart → ItemPart),而 ItemFeatureHandler.java:66-68 在 GameRegistry.registerItem 之前又把 ItemMaterial 还原回 ItemMultiMaterial,ItemPart 还原回 ItemMultiPart。 最终注册名因此是 item.ItemMultiMaterial。

AEJSONConfig.java:122-142 有 4 处 "appliedenergistics2:item.ItemMultiMaterial" 字面量(硅质压印机等配方用),其中 meta 13/14/15/19 分别对应 CalcProcessorPress / EngProcessorPress / LogicProcessorPress / SiliconPress, 可作为「meta 即 damage 值」这一读法的独立佐证。

⚠️ 本版本没有「矿石 / 粉碎 / 精准采集」变体

这一点必须写死,因为它与 AE2 其它版本的记忆冲突:

  • 全仓 src/main/java 检索 crushed 出现 0 次。
  • 唯一的精准采集相关定义是 parts/automation/PartIdentityAnnihilationPlane.java:32 的 private static final float SILK_TOUCH_FACTOR = 16;(用于同化湮灭平面的能量计算), 与 MaterialType 无关。
  • 矿石在 1.7.10 这版是独立方块,不是 MaterialType 的变体: ApiBlocks.java:206 的 new OreQuartz()、:207 的 new OreQuartzCharged()。 下界石英则直接用原版方块。

所以 MaterialType 上不存在原矿/粉碎/精准采集三件套; CertusQuartzCrystal 的矿物形态要去 block 维度找。

⚠️ 本枚举不携带密度 / 能量 / 容量

MaterialType 的实例字段只有(:124-136):

public static final MaterialType[] VALUES = values();
private final EnumSet<AEFeature> features;
private IIcon IIcon;              // @SideOnly(Side.CLIENT)
private Item itemInstance;
private int damageValue;
private MaterialStackSrc stackSrc;
private String oreName;
private Class<? extends Entity> droppedEntity;
private boolean isRegistered;

没有密度、容量、能量字段。

Cell*Part 系列只是胞体的组件(component),只带 meta; 真正的容量在外壳物品上,由 ApiItems.java:170-180 以 kilobytes 实参给出:

this.cell1k  = constructor.registerItemDefinition(new ItemBasicStorageCell(MaterialType.Cell1kPart, 1));
this.cell4k  = ... new ItemBasicStorageCell(MaterialType.Cell4kPart, 4));
this.cell16k = ... new ItemBasicStorageCell(MaterialType.Cell16kPart, 16));
this.cell64k = ... new ItemBasicStorageCell(MaterialType.Cell64kPart, 64));
this.cell256k    = ... new ItemAdvancedStorageCell(MaterialType.Cell256kPart, 256));
this.cell1024k   = ... new ItemAdvancedStorageCell(MaterialType.Cell1024kPart, 1024));
this.cell4096k   = ... new ItemAdvancedStorageCell(MaterialType.Cell4096kPart, 4096));
this.cell16384k  = ... new ItemAdvancedStorageCell(MaterialType.Cell16384kPart, 16384));

第二个实参经 ItemBasicStorageCell → AEBaseCell(items/AEBaseCell.java:68) 保存,容量以「每种物品占多少字节」形式出现在 getBytesPerType()。 把容量记在 MaterialType 上是错误的。

特性门控

每个常量经 features 字段绑定一个 AEFeature(EnumSet,实际都是单元素)。 5 个构造器中:

  • MaterialType(int)(:138)隐式使用 EnumSet.of(AEFeature.Core)。
  • 其余 4 个显式传入。

ItemMultiMaterial.createMaterial()(:157-161)在构造时检查该特性, 关闭则不设 itemInstance、不 markReady(),该 damage 值在游戏里就不存在。

本枚举引用到的特性共 8 个:Core(多数)、Flour、GrindStone、 SpatialIO(3 个空间胞体)、StorageCells(5 个常规胞体/空胞体)、 XtremeStorageCells(5 个高级胞体/空胞体)、WirelessAccessTerminal(2 个)、 QuantumNetworkBridge(3 个)。

枚举内的注释

MaterialType.java 中只有分组性注释,没有注释掉的常量:

  • :73 // Basic Cards
  • :81 // Adv Cards
  • :122 // the last meta is 69

69 个已注册常量全部有效,无隐藏/废弃成员。InvalidType 是源码显式声明的哨兵, 不是被注释掉的东西。

相关条目