客户端运行时与事件
基本信息
| 属性 | 值 |
|---|---|
| 事件处理类 | codechicken.core.internal.CCCEventHandler |
| 注册位置 | CodeChickenCoreModContainer.java:70-71(双总线) |
| 相关类 | ClientUtils、GuiModListScroll、CCUpdateChecker、ProfileTimer、TaskProfiler |
功能
CodeChickenCoreModContainer 虽然不注册任何方块物品,但会在 init 阶段挂上若干客户端行为。全部逻辑在 event.getSide().isClient() 分支内(CodeChickenCoreModContainer.java:66),服务端不执行任何一行。
初始化时(CodeChickenCoreModContainer.java:66-72)依次做三件事:
| 调用 | 行 | 作用 |
|---|---|---|
ClientUtils.enhanceSupportersList("CodeChickenCore") |
:67 |
改写模组描述中的 “Supporters:” 为青色,并登记滚动列表 |
ClientUtils.registerLocalizedColourReloadListener() |
:68 |
注册资源重载监听器 |
new CCCEventHandler() |
:70-71 |
同一个实例同时注册到 FMLCommonHandler.instance().bus() 与 MinecraftForge.EVENT_BUS |
CCCEventHandler
codechicken.core.internal.CCCEventHandler 是全仓 5 个 @SubscribeEvent 类之一,共 3 个处理方法:
| 方法 | 行 | 逻辑 |
|---|---|---|
clientTick(TickEvent.ClientTickEvent) |
:18-22 |
phase == END 时 renderTime++ |
renderTick(TickEvent.RenderTickEvent) |
:24-26 |
phase == START 时 renderFrame = event.renderTickTime |
posGuiRender(GuiScreenEvent.DrawScreenEvent.Post) |
:30-32 |
@SideOnly(Side.CLIENT);当 event.gui instanceof GuiModList 时调用 GuiModListScroll.draw(...) |
renderTime(int)与 renderFrame(float)是公开静态字段,供 ClientUtils.getRenderFrame() / getRenderTime() 读取(ClientUtils.java:37-43),后者合成为小数渲染时刻。
本地化颜色重载
ClientUtils.registerLocalizedColourReloadListener()(ClientUtils.java:74-83)向 IReloadableResourceManager 注册一个匿名 IResourceManagerReloadListener,在 onResourceManagerReload 中调用 LocalizedColours.reloadLocalizedColours()。这条链路的落点是 codechicken.lib.colour.LocalizedColours 的 24 个常量(见 几何、颜色与数学库)。
模组列表增强
ClientUtils.enhanceSupportersList(Object mod)(ClientUtils.java:66-71)通过 FMLCommonHandler.instance().findContainerFor(mod) 找到容器,把 description 中的 "Supporters:" 替换为带 EnumChatFormatting.AQUA 的形式,然后调用 GuiModListScroll.register(mod)。
工具类
| 类 | 说明 |
|---|---|
CommonUtils |
跨端工具:isClient()、getSaveLocation(World) / (int)、getWorldName、getDimension、getMinecraftDir、getRelativePath、registerHandledEntity(Class, String)(CommonUtils.java:15-46) |
ServerUtils |
服务端工具:getPlayer、getPlayers、getPlayersInDimension、openSMPContainer、getGameProfile、isPlayerOP、isPlayerOwner、sendChatToAll(ServerUtils.java:22-98) |
ClientUtils |
客户端工具,继承 CommonUtils |
ProfileTimer / TaskProfiler |
性能计时 |
ClassDiscoverer |
生态发现,见 CodeChicken 生态契约 |
IGuiPacketSender / IStringMatcher |
接口 |
CCUpdateChecker 是空壳(已核实)
codechicken.core.CCUpdateChecker(22 行)的 6 个公开方法中,5 个是空方法体:
| 方法 | 行 | 状态 |
|---|---|---|
tick() |
:9 |
{} 空实现 |
addUpdateMessage(String s) |
:11 |
{} 空实现 |
mcVersion() |
:13-15 |
唯一有实现:返回 FMLInjectionData.data()[4] |
updateCheck(String mod, String version) |
:17 |
{} 空实现 |
updateCheck(String mod) |
:19 |
{} 空实现 |
updateCheck(String url, Function<String, Void> handler) |
:21 |
{} 空实现 |
grep -rn 'CCUpdateChecker' --include='*.java' src/ 的命中仅有其自身的类声明一处——本仓内零调用方。
连带后果:语言文件中的 codechickencore.update=Version %s of %s is available(en_US.lang:1,de_DE/it_IT/ru_RU/uk_UA 各有 1 条同键翻译)没有任何 Java 代码读取。按「死代码 ≠ 注册内容」的口径,本模组不具备更新检查功能,该语言键为残留。
相关条目
- CodeChickenCoreModContainer - 上述所有客户端逻辑的注册点
- 功能 hack -
LiquidTextures同为事件订阅类,在 preInit 阶段注册 - 渲染管线与 GUI 组件 -
GuiWidget等 GUI 基类所在