PatternHelper
图纸合法材料枚举(遍历 TConstructRegistry.customMaterials)
基本信息
| 属性 | 值 |
|---|---|
| 路径 | squeek.tictooltips.helpers.PatternHelper |
| 行数 | 56 |
图纸名判定(:16-29)
| 方法 | 实现 |
|---|---|
isBowstringPattern(item, meta) |
getPatternName(item, meta).equals("bowstring") |
isFletchingPattern(item, meta) |
getPatternName(item, meta).equals("fletching") |
getPatternName(item, meta) |
item instanceof Pattern ? ((Pattern) item).unlocalizedNames[meta] : "" |
⚠️ 走的是 TCon Pattern 类的 unlocalizedNames 数组(不是本地化文本),
所以比对的是英文内部名 "bowstring" / "fletching"。
装了改写这些内部名的附属会失配。
⚠️ getPatternName 越界风险:直接 unlocalizedNames[meta],
meta 超界会抛 ArrayIndexOutOfBoundsException,
没有边界检查。调用方 TooltipHandler 传的是
itemStack.getItemDamage(),正常范围内。
合法材料枚举(:31-54)
for (CustomMaterial customMat : TConstructRegistry.customMaterials) {
customMat = TConstructRegistry.getCustomMaterial(customMat.materialID, matClass);
if (customMat != null) { ... }
}
外层遍历所有 customMaterials,内层再按目标类型取一次 ——
matClass 不匹配的条目会在内层返回 null 并被跳过。
所以这个方法返回的是「所有已注册自定义材料中,属于该类型的」输入列表。
两种输入来源
| 情况 | 取名方式 |
|---|---|
customMat.input != null |
直接用 customMat.input.getDisplayName() |
customMat.input == null && customMat.oredict != null |
OreDictionary.getOres(oredict) 取第一项 |
⚠️ 走 oreDict 分支时只取 items.get(0)(:41),
且若该项 getItemDamage() == WILDCARD_VALUE 会 copy 一份并把 meta 设为 0(:42-45)。
oreDict 列表顺序取决于注册顺序,同一个 oreDict 在不同存档可能显示不同物品名。
oreDict 分支的输出格式是 名称 (oreDict名)(:47),
input 分支只输出名称——两种情况文本形态不一致。
⚠️ 循环体内有 if / else if(:36/:38),
所以 input != null 时 oreDict 分支被完全跳过。
若某材料同时设了 input 和 oredict,只显示 input。
去重
用 List.contains 去重(:36、:48),O(n²)。
大型整合包里自定义材料上千条时这段会明显卡(每次悬停图纸都重算一遍)。
结果没有缓存,每次调用都重新遍历全表。
调用方
TooltipHandler 的 getPatternTooltip(:425-458):
- 弓弦图纸 →
getValidCustomMaterialsOfType(BowstringMaterial.class) - 箭羽图纸 →
FletchingMaterial.class加FletchlingLeafMaterial.class(:430-432,两个 list 用addAll合并,不排序)
其余图纸类型(如镐头图纸)不显示任何合法材料。
⚠️ 整个图纸 tooltip 分支被 !ModTiCTooltips.hasIguanaTweaks 门控
(TooltipHandler.java:65)—— 装了
iguanatweakstconstruct 之后,
本类的两个判定方法完全不会被调用。
相关
- CompatibilityHelper -
FletchlingLeaf兼容的同源实现 - TooltipHandler - 唯一调用方