OC Glasses
[!INFO] modid:
openglasses| 源码:com.bymarcin.openglasses| 1.7.10
OC Glasses 是 OpenComputers 的附属模组:它提供一副可穿戴的 AR 眼镜,让玩家把 OpenComputers 终端的界面以全息 3D 形式渲染在眼前,并可通过 Lua 脚本绘制 12 种图元。
modid 陷阱
| 项 | 值 | 证据 |
|---|---|---|
| 注册 modid | openglasses(全小写、无连字符) |
OpenGlasses.java:50 public static final String MODID = "openglasses"; |
| 分类名 | ocglasses(data/relation.md:244) |
缩写形式 |
| 仓库目录 | OCGlasses(PascalCase) |
— |
| 资源域 | openglasses |
src/main/resources/assets/openglasses/ |
| 主类 | OpenGlasses |
OpenGlasses.java:48 |
三者互不相同:modid openglasses、目录 OCGlasses、分类 ocglasses。游戏内命令需用 openglasses:*,不是 ocglasses:*。
依赖
| 依赖 | 声明 | 收录状态 |
|---|---|---|
| OpenComputers | required-after:OpenComputers@[1.4.0, |
✓ 已完成 |
| Computronics | after:computronics |
✓ 已完成 |
(OpenGlasses.java:47)
运行时探测的软依赖(OpenGlasses.java:90-92):
| 静态标志 | 判定 | 收录状态 |
|---|---|---|
baubles |
Loader.isModLoaded("Baubles") |
不在收录范围 |
tinkers |
Loader.isModLoaded("TConstruct") |
已登记未成文,前向引用 tinkersconstruct |
computronics |
Loader.isModLoaded("computronics") |
✓ 已完成 |
三个标志声明在
@Mod的 dependencies 之外,是纯运行时isModLoaded探测。只读dependencies字符串会漏掉 Baubles 与 Tinkers。
内容清单
方块(1)
- Glasses Terminal - 眼镜终端方块
物品(1)
- AR Glasses - AR 眼镜,可绑定终端 UUID
界面效果
- Widget System - 12 种图元 + 3D 世界渲染
- Lua API - 30 个 OpenComputers Lua 函数
- Free Cursor - 自由光标按键
设置
- Config - 3 项配置
加载方式:既是 coremod 又是 Mixin 容器
OCGlassesCore 同时实现两个接口(mixins/OCGlassesCore.java:12-13):
@IFMLLoadingPlugin.MCVersion("1.7.10")
public class OCGlassesCore implements IFMLLoadingPlugin, IEarlyMixinLoader {
| 角色 | 作用 |
|---|---|
IFMLLoadingPlugin |
coremod——在模组类加载前运行 |
IEarlyMixinLoader |
早期 Mixin 加载器(UniMixins) |
唯一的 Mixin 是 MinecraftResizeMixin(目标 net.minecraft.client.Minecraft,Phase.EARLY,配置名 resize_hook,mixins/Mixins.java:11),用于窗口缩放时同步 AR 覆盖层尺寸。
与 Thaumcraft Research Tweaks 形成对照:TRT 只有一个普通 Mixin,OCGlasses 则需要 coremod + 早期 Mixin。
网络封包(10 个)
在 init 阶段按 ID 0–9 注册(OpenGlasses.java:94-104):
| ID | 封包 | 方向 |
|---|---|---|
| 0 | BlockInteractPacket |
SERVER |
| 1 | CloseOverlayPacket |
SERVER |
| 2 | EquipGlassesPacket |
SERVER |
| 3 | InteractOverlayPacket |
SERVER |
| 4 | KeyboardInteractOverlayPacket |
SERVER |
| 5 | OpenOverlayPacket |
SERVER |
| 6 | UnequipGlassesPacket |
SERVER |
| 7 | WidgetUpdatePacket |
CLIENT |
| 8 | TerminalStatusPacket |
CLIENT |
| 9 | ScreenResizePacket |
SERVER |
8 个客户端→服务端,2 个服务端→客户端。
源码缺陷
onWornTick是空实现:item/OpenGlassesItem.java:150public void onWornTick(ItemStack, EntityLivingBase) {}——眼镜的每 tick 耗电不在此处扣除。真正的耗电由energyMultiplier配置描述的公式在别处计算(PowerDrain = (NumberOfWidgets / 10) * energyMultiplier)。把耗电写成onWornTick逻辑是幻觉。getRecipeOutput()返回null:recipe/RecipeOpenGlassesChatBoxUpgrade.java:52-54返回null是合法的——该配方用getCraftingResult(inv)逐槽计算,matches()依赖输入而非固定产物。null不代表配方失效。