Mixin 挂载点
pV=nRT 通过 core mod + 4 个 early mixin 改写原版类,所有 mixin 均为 Phase.EARLY 且为 addCommonMixins(客户端/服务端都加载)。
加载机制
用 GTNHLib 的 gtnhmixins 框架,不是手写 mixin 配置清单:
pvnrt/PVNRTCore.java实现IFMLLoadingPlugin+IEarlyMixinLoader,getMixinConfig()返回mixins.pvnrt.early.json,getMixins()委托IMixins.getEarlyMixins(Mixin.class, loadedCoreMods)pvnrt/mixin/Mixin.java是一个枚举,每个枚举值为一个MixinBuilder,声明要挂哪些 mixinpvnrt/mixin/LateMixinPlugin.java实现ILateMixinLoader,走mixins.pvnrt.late.json
ℹ️ 三个
mixins.pvnrt*.json的mixins/client/server数组都是空的——这是该框架的正常形态,mixin 类名由枚举在运行时注入,不是"忘了写注册"的缺陷。
枚举声明(pvnrt/mixin/Mixin.java)
| 枚举值 | 挂载的 mixin |
|---|---|
WorldGasMixins |
MixinWorldProviderSurface |
Ext |
MixinWorld、MixinExtendedBlockStorage |
PlayerTick |
MixinEntityPlayerMP |
各 mixin 作用
| Mixin | 目标类 | 作用 |
|---|---|---|
MixinWorld |
World |
实现 WorldExt,挂 @Unique GasManager pvnrt$manager;并在 notifyBlocksOfNeighborChange 与 notifyBlockOfNeighborChange 的 HEAD 各注入一个 @Inject(用于方块变更时使周围体素失效) |
MixinExtendedBlockStorage |
ExtendedBlockStorage |
实现 EBSExt,挂 @Unique 的 byte[] pvnrt$data、EBSGasTracker pvnrt$tracker、LongArrayList updates |
MixinWorldProviderSurface |
WorldProviderSurface |
实现 WorldGasProvider,注入地表大气常量(见 大气组成) |
MixinEntityPlayerMP |
EntityPlayerMP |
在 onUpdateEntity 的 HEAD 注入:追踪玩家所在 EBS,玩家跨 EBS 时解绑/重绑 watchedTrackers,并对以玩家为中心的 3×3×3 EBS 邻域(ebsX±1, ebsY±1 且限 0 ≤ cy < 16, ebsZ±1)注册观看者,用于推送梯度 |
命名约定
@Unique 字段统一用 pvnrt$ 前缀(pvnrt$manager、pvnrt$data、pvnrt$tracker、pvnrt$getGasManager),避免与原版/其它 mod 字段冲突。