Proxy(CommonProxy / ClientProxy)

文件

类 路径 行数
CommonProxy src/main/java/com/gtnewhorizons/angelica/proxy/CommonProxy.java 26
ClientProxy src/main/java/com/gtnewhorizons/angelica/proxy/ClientProxy.java 446

proxy 包共 2 个文件。NotFine 另有自己的一套(jss.notfine.proxy,2 个文件)。

CommonProxy:唯一的方块注册点

// CommonProxy.java:12-16
public void preInit(FMLPreInitializationEvent event) {
    if (AngelicaConfig.enableTestBlocks) {
        GameRegistry.registerBlock(new BlockTest(), "test_block");
    }
}

init / postInit 均为空实现(:18、:20)。

两个方法在服务端直接抛异常,防止服务端误调:

方法 行 行为
putFrametime(long) :23 throw new UnsupportedOperationException()
putTicktime(long) :25 throw new UnsupportedOperationException()

注释 :22 标明「Only present on the client!」—— ClientProxy 覆写了这两个方法。

ClientProxy:真正的行为集中地

ClientProxy extends CommonProxy,final 类,构造即持有 Minecraft.getMinecraft()(:109)。它 import 了 Sodium、Iris、Reese’s Sodium Options、BOP、gtnhlib 的 VAOManager/ModelRegistry 等 40 余个类型 —— Angelica 把多个渲染库揉进了一个 jar,Proxy 是它们的装配点。

preInit(:132-147)

行 动作
:134 ModStatus.preInit() —— 探测各 mod 是否加载
:135 遍历 AngelicaConfig.dynamicBoundsTileEntities,调 TileEntityRenderBoundsRegistry.registerDynamicClass(name)
:137-138 把 this 注册到 FML bus 与 Forge EVENT_BUS
:139 注册 EmissiveTextureAutoloader
:140 注册 AngelicaTesrMeshCache.ReloadListener
:141 ModelRegistry.registerModid(MOD_ID) —— 向 gtnhlib 登记 modid,供 JSON ISBRH 模型用
:142 blockError = new BlockError()
:143-146 enableIris 时:IrisGLSMBridge.installImmediateExtendedHandler() + Iris.warmupShaderTransforms()

init(:149-212)

行 动作
:153-155 enableHudCaching 时 HUDCaching.init()
:156 CeleritasSetup.ensureInitialized()
:157-162 读 SodiumGameOptions,为 null 则取 FrameRateOptions.defaultMode(),同步到 gameSettings.enableVsync 与 GLStateManager.setVSyncPreference
:163-166 FramePacer.setIdleWork(...) —— 把空闲帧工作接到 CeleritasWorldRenderer.runFrameIdleWork
:168-175 enableIris 时:注册 IrisGLSMBridge / IrisDebugScreenHandler,并把 Iris.INSTANCE 同时注册到 FML bus 与 EVENT_BUS
:176-178 !enableVAO 时 VAOManager.disableVao()
:183-185(preInit 段内) BetterCrashes 已加载则 BetterCrashesCompat.init()
:187-189 enableZoom 时 Zoom.init()
:189 FpsReducer.init()
:190 注册 DebugKeyHandler
:191 AngelicaConfig.applyGpuCullingMode()
:192-194 enableDynamicLights 时 EntityLightConfig.init(mc.mcDataDir/config)
:195-198 optimizeInWorldItemRendering 时注册 Item/Block 两个 RenderListManager 的 reload listener
:201-203 debugTooling() 或 Tracy 开启时注册 /angelica 命令
:204-208 debugTooling() 时挂 FlybyRunner / FlybyFallGuard
:209-211 Tracy 开启时 TracyCaptureNotifier.INSTANCE.register()

postInit(:215-231)

  • :218-227 若 ModStatus.isLotrLoaded && CompatConfig.fixLotr,用 ReflectionHelper.setPrivateValue 把 LOTR BlockRendering 的三个私有缓存字段替换为 ConcurrentHashMap,换成线程安全版本;找不到类则打 ERROR 日志「Could not replace LOTR handle render code with thread safe version」。
  • :228-230 若 ModStatus.isBOPLoaded,取 BOPCBlocks.newBopGrass 存入静态字段 bopGrass。

这是整个 mod 里唯一对第三方 mod 私有字段做反射替换的地方,且用的是 Mixin 之外的第二条路径。

视频设置界面的三方分叉

onGuiInit(:385-403)拦截 GuiVideoSettings 并 event.setCanceled(true),然后按优先级弹出不同界面:

条件 弹出界面
enableNotFineOptions 或 按住 Shift GuiCustomMenu,带 5 个分页:general / detail / atmosphere / particles / other
!enableReesesSodiumOptions 或 按住 Ctrl SodiumOptionsGUI(原版 Sodium)
其余(默认) ReeseSodiumVideoOptionsScreen

三者互斥,Shift / Ctrl 是强制覆盖快捷键。

其它事件处理

方法 行 行为
onF3Update :320-367 modernizeF3Screen 时重写 F3 调试屏:合并 x:/y:/z:/f: 四行为 XYZ: / Block: / Chunk: / Facing: / lc:,并在启用 FPS 图时绘制 frametime 与 TPS 曲线
onGuiOpen :372-383 首次打开主菜单时打印游戏加载耗时;enableZoom 且打开任意 GUI 时 Zoom.resetZoom()
onFogColor :406-411 把 NaN 雾色钳回 0(注释标明来自 ArchaicFix,对应 Mojang bug MC-10480)
onTick :413-418 ClientTick END 阶段 CloudRenderer.getCloudRenderer().checkSettings()
onFOVModifierUpdateEarly :421-427 FOVMode.MODS 时把原版 FOV 效果清零(priority = HIGHEST)
onFOVModifierUpdateLate :430-435 FOVMode.NONE 时清零全部 FOV 动态(priority = LOWEST)

两个 FOV 处理器用不同优先级实现三级模式(vanilla / mods / none),注释明确说明「only disables FOV changes from vanilla, leaving mod FOV changes untouched」。

相关条目