访问变换器

基本信息

属性 值
文件 spark-forge1710/src/main/resources/META-INF/spark_at.cfg
挂载方式 spark-forge1710/build.gradle —— jar { manifest { attributes 'FMLAT': 'spark_at.cfg' } }
规则数 1
适用侧 仅客户端

spark 在 1.7.10 上附带一条 Forge 访问变换器规则。

规则内容

文件全文只有一行:

public net.minecraft.client.Minecraft field_152352_aC # mcThread
字段 值
可见性 public
目标类 net.minecraft.client.Minecraft
MCP 字段名 field_152352_aC
映射名 mcThread
规则数 1

field_152352_aC 是 MCP 混淆名,mcThread 是 Forge 开发环境(MCP stable_12,对应 spark-forge1710/build.gradle 的 mappings = 'stable_12')中的映射名。

为什么需要它

Minecraft.mcThread 在 1.7.10 中是 protected 字段,spark 需要读它来定位客户端主线程。全部引用点只有一处:

this.gameThreadDumper = new ThreadDumper.Specific(minecraft.mcThread);

—— Forge1710ClientSparkPlugin.java:56

该字段被用于构造客户端的默认 ThreadDumper,也就是 线程分组与导出 中 1.7.10 客户端默认采样的那个线程。ThreadDumper.Specific 需要一个确定的主线程才能把采样数据归因到「客户端主线程」这一行。

全仓穷举 field_152352_aC 与 mcThread 在 spark-forge1710 + spark-common 下的命中:

spark-forge1710/.../Forge1710ClientSparkPlugin.java:56:  this.gameThreadDumper = new ThreadDumper.Specific(minecraft.mcThread);

仅此一处。

服务端不需要

Forge1710ServerSparkPlugin 不需要访问变换器:它在 FMLServerStartingEvent 期间构造,直接用 ThreadDumper.GameThread 捕获 Thread.currentThread()(Forge1710ServerSparkPlugin.java:83-84),不触碰任何混淆字段。

这条规则随 jar 内所有环境加载(服务端亦然),但在服务端不产生作用。

与依赖访问变换器的区分

不要与 Forge 依赖的 FMLAT 混淆。spark-forge1710/build.gradle 只声明了本模块自己的这一条;依赖(Guava、okhttp、adventure 等)随 shadow 打包但不携带各自的访问变换器。

数值

数值名 值 来源
规则数 1 META-INF/spark_at.cfg 全文
目标字段 net.minecraft.client.Minecraft.field_152352_aC 同上
引用点数量 1 grep -rn 'mcThread' spark-forge1710 spark-common

相关条目