眼镜系列(声波眼镜 / 铅笔眼镜 / 彩笔眼镜 / 全彩眼镜 / 上帝眼镜)

基本信息

五副眼镜共享同一套「查看 TileEntityImaginary 属性」的实现,ItemImaginationGlasses 用一个 Type 枚举区分 4 种能力,ItemSonicGlasses 是独立的护甲物品。

物品 注册名 类 声明位置
声波眼镜 Sonic Glasses OpenBlocks:sonicglasses ItemSonicGlasses extends ItemArmor OpenBlocks.java:416
铅笔眼镜 Pencil Glasses OpenBlocks:pencilGlasses ItemImaginationGlasses(Type.PENCIL) OpenBlocks.java:419
彩笔眼镜 Crayon Glasses OpenBlocks:crayonGlasses ItemCrayonGlasses extends ItemImaginationGlasses OpenBlocks.java:422
全彩眼镜 Technicolor Glasses OpenBlocks:technicolorGlasses ItemImaginationGlasses(Type.TECHNICOLOR) OpenBlocks.java:425
上帝眼镜 Serious Glasses OpenBlocks:seriousGlasses ItemImaginationGlasses(Type.BASTARD) OpenBlocks.java:431

功能

4 种 Type 的能力判定

ItemImaginationGlasses.Type(ItemImaginationGlasses.java:92-122)为每种眼镜覆写 checkBlock(Property, ItemStack, TileEntityImaginary):

Type 枚举行 checkBlock 逻辑 行
PENCIL :94-100 te.isPencil() ^ te.isInverted() :98
CRAYON :101-107 (!te.isPencil() && getGlassesColor(stack) == te.color) ^ te.isInverted() :105
TECHNICOLOR :108-115 Property.VISIBLE 恒真,否则 te.isInverted() :112-114
BASTARD :116-121 恒返回 true —— 看见所有幻想方块 :120

^ 是异或,所以 te.isInverted() 为真时判定结果整体取反——用铅笔在幻想方块上涂抹可以「反选」。

四种贴图由枚举构造器拼出:图标 openblocks:glasses_<name>、模型 openblocks:textures/models/glasses_<name>.png(:127-130),其中 BASTARD 的 name 是 admin(:116)——即贴图叫 glasses_admin.png。

彩笔眼镜是独立子类

ItemCrayonGlasses 是 ItemImaginationGlasses 的静态内部类(ItemImaginationGlasses.java:33),构造器硬编码 super(Type.CRAYON)(:35-37)。

  • 颜色存在 NBT 而非 meta:getGlassesColor 读 tag.getInteger(TAG_COLOR)(:28-31),createCrayonGlasses(int color) 写入(:50-57)
  • 创造模式子物品为 ColorUtils.getAllColors() 的每种颜色各生成一个(getSubItems,:41-43)
  • getColor(ItemStack) 直接返回 NBT 里的颜色(:46-48)

构造器共性

ItemImaginationGlasses(Type) 用 ArmorMaterial.GOLD、护甲值 1、槽位 ARMOR_HELMET,并设 setHasSubtypes(true) + setTextureName(type.iconName)(ItemImaginationGlasses.java:84-90)——这 4 副都是头盔位护甲。

声波眼镜

ArmorMaterial.IRON、护甲值 2、头盔位(ItemSonicGlasses.java:22),isValidArmor 只允许头盔(:26-29)。因为是 ItemArmor,它有独立的三维模型 ModelSonicGlasses,只作为头盔渲染(getArmorModel 在非头盔槽返回 null,:40-49)。护甲贴图是 openblocks:textures/models/glasses.png(:51-54),与 4 副想象眼镜共用同一张。

数值

数值名 来源 值
想象眼镜护甲值 ArmorMaterial.GOLD, 1 1(ItemImaginationGlasses.java:85)
想象眼镜槽位 ARMOR_HELMET 0(ItemImaginationGlasses.java:85)
声波眼镜护甲值 ArmorMaterial.IRON, 2 2(ItemSonicGlasses.java:22)
声波眼镜槽位 ARMOR_HELMET 0(ItemSonicGlasses.java:19)
彩笔眼镜子物品数 ColorUtils.getAllColors() 循环 随 ColorUtils 变化,无法从 openblocks 仓库单独核实(ItemImaginationGlasses.java:42)

交互

触发 行为
佩戴眼镜看向幻想方块 按 checkBlock 决定该方块是否可见
铅笔眼镜 只看 isPencil() 为真的幻想方块
彩笔眼镜 只看与自己颜色相同且非铅笔的幻想方块
全彩眼镜 所有 Property.VISIBLE 的都看
上帝眼镜 看全部,无过滤
在幻想方块上用铅笔涂抹 切换 isInverted(),反转该眼镜的过滤结果

合成配方

眼镜 获取方式 来源
铅笔眼镜 无序合成:幻想方块(铅笔态)+ 纸 Config.java:1168
彩笔眼镜 自定义 CrayonGlassesRecipe Config.java:1172
声波眼镜 配饰箱战利品,权重 1~2,条件 Config.sonicGlassesLoot Config.java:1158-1161
全彩眼镜 地牢箱 + 废弃矿井走廊战利品,权重 1~2,条件 Config.technicolorGlassesLoot Config.java:1181-1189
上帝眼镜 无配方、无战利品 全文 grep seriousGlasses 无命中

彩笔眼镜的配方被显式排到铅笔眼镜之后(Config.java:1173-1178 注释「must be after pencil」),并通过 RecipeSorter.register(..., "after:minecraft:shapeless") 挂到无序配方分类——否则同是无序合成时顺序不确定。

CrayonGlassesRecipe 继承 ShapelessRecipes 并整体覆写(common/recipe/CrayonGlassesRecipe.java:18):

  • 合成结果 = 1 个 ItemImaginary(剩余耐久 ≥ ItemImaginary.CRAFTING_COST)+ 1 张纸,颜色取自 NBT(matches,:35-54;getCraftingResult,:57-68)
  • getRecipeSize() 返回 2(:71-74)
  • 构造器传入的「假材料/假产物」(createFakeIngredientsList / createFakeResult,:20-30)注释写明 // just for NEI——只为让 NEI 显示配方,不参与实际匹配

相关条目