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)

物品(1)

界面效果

设置

加载方式:既是 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:150 public void onWornTick(ItemStack, EntityLivingBase) {}——眼镜的每 tick 耗电不在此处扣除。真正的耗电由 energyMultiplier 配置描述的公式在别处计算(PowerDrain = (NumberOfWidgets / 10) * energyMultiplier)。把耗电写成 onWornTick 逻辑是幻觉。
  • getRecipeOutput() 返回 null:recipe/RecipeOpenGlassesChatBoxUpgrade.java:52-54 返回 null 是合法的——该配方用 getCraftingResult(inv) 逐槽计算,matches() 依赖输入而非固定产物。null 不代表配方失效。