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 之后, 本类的两个判定方法完全不会被调用。

相关