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) |
常量数是怎么算出来的
同样有两个陷阱:
- 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。 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 是源码显式声明的哨兵,
不是被注释掉的东西。