眼镜系列(声波眼镜 / 铅笔眼镜 / 彩笔眼镜 / 全彩眼镜 / 上帝眼镜)
基本信息
五副眼镜共享同一套「查看 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 显示配方,不参与实际匹配
相关条目
- 方块 / 设备类方块 - 幻想方块
OpenBlocks:imaginary - 配置项全表 -
soSerious等与眼镜相关的配置