Access Transformers
Access Transformers 简称 ATs,作用是允许修改final的标志,类,方法,字段的作用。让你的模组可以访问。
如何使用
1 添加ATs
很简单,在你的build.gradle中添加一行
其实build.gradle中有这段内容了,只需要你取消注释
// In build.gradle:
// This block is where your mappings version is also specified
minecraft {
accessTransformers {
file('src/main/resources/META-INF/accesstransformer.cfg')
}
}
2.添加一个.cfg的文件
首先,如果你开启了ATs在build.gradle中,那么默认情况下,会寻找META-INF/accesstransformer.cfg文件。
如果你想指定其他的.cfg文件,那么你需要创建,并重复上述的操作
此外还需要在neoforge.mods.toml中添加说明cfg的字段
此这段在toml文件中也有了,你需要将注释取消
# In neoforge.mods.toml:
[[accessTransformers]]
## The file is relative to the output directory of the resources, or the root path inside the jar when compiled
## The 'resources' directory represents the root output directory of the resources
file="META-INF/accesstransformer.cfg"
这是一个多文件的例子
这是一个你如果有多个cfg文件的例子,这是有用的如果你想按照模块分功能
// In build.gradle:
minecraft {
accessTransformers {
file('src/main/resources/accesstransformer_main.cfg')
file('src/additions/resources/accesstransformer_additions.cfg')
}
}
toml文件
# In neoforge.mods.toml
[[accessTransformers]]
file="accesstransformer_main.cfg"
[[accessTransformers]]
file="accesstransformer_additions.cfg"
3. 创建cfg文件
你需要在指定的位置创建cfg文件
如果你添加或者修改了cfg文件的内容,为使其生效,你必须刷新项目。
4. cfg编写规则
1. 注解
# 使用#作为注解,该内容不会进行分析
2. 修饰符权限等级
public(公共) - 对包内和包外的所有类都可见 protected(受保护) - 仅对包内的类和子类可见 默认(无修饰符) - 仅对包内的类可见 private(私有) - 仅对类内部可见
3. 添加和删除 final字段
可以附加特殊修饰符 +f 和 -f 到上述修饰符上,以分别添加或移除 final 修饰符。
其作用是,防止子类化,或者让其可以子类化,方法覆盖以及字段修改等。
4. 修改注事项
请保持将限制严格的权限改为限制宽松的权限,例如将private改为public,不要将public改为private,因为这样会导致之前引用了public的方法无法访问到private的方法,从而导致抛出jvm异常。
示例
例如
- 转变私有方法访问权限
- 转变final的方法
- 静态方法
5.类修改
修改目标类
<access modifier> <fully qualified class name>
例如将net.minecraft.world.gen.structure.StructureVillagePieces$Village修改为public
public net.minecraft.world.gen.structure.StructureVillagePieces$Village
如果是内部类,使用$隔开,例如这里的village,加入是修改StructureVillagePieces为public
public net.minecraft.world.gen.structure.StructureVillagePieces
6.修改字段
<access modifier> <fully qualified class name> <field name>
例如将MinecraftServer下的random字段修改为public,并删除final修饰符
protected-f net.minecraft.server.MinecraftServer random
7. 修改方法
<access modifier> <fully qualified class name> <method name>(<parameter types>)<return type>
例如让UUIDUtil类中的leastMostToIntArray变为public
public net.minecraft.core.UUIDUtil leastMostToIntArray(JJ)[I
关于修改方法中的,函数参数和返回值的书写规制
如果你写过mixin,一定对这个规则不陌生。
public net.minecraft.core.UUIDUtil leastMostToIntArray(JJ)[I
例如这里的JJ 和[I 说的是这个leastMostToIntArray方法接受两个long类型的参数,返回一个一维的Int数组int[]。
下面给出规则
- B - 字节(byte),一个有符号的字节
- C - 字符(char),UTF-16编码中的一个Unicode字符代码点
- D - 双精度(double),一个双精度浮点数值
- F - 浮点(float),一个单精度浮点数值
- I - 整数(integer),一个32位整数
- J - 长整数(long),一个64位整数
- S - 短整数(short),一个有符号的短整数
- Z - 布尔(boolean),一个真(true)或假(false)的值
- [ - 表示数组的一个维度
- 例子:[[S 表示 short[][](短整型二维数组)
- L<class name>; - 表示引用类型
- 例子:Ljava/lang/String; 表示 java.lang.String 引用类型(注意使用斜线代替点)
- ( - 表示方法描述符,这里应该提供参数或者如果没有参数则为空
- 例子:<method>(I)Z 表示一个需要一个整数参数并返回布尔值的方法
- V - 表示方法不返回任何值,只能用于方法描述符的末尾
- 例子:<method>()V 表示一个没有参数且不返回任何值的方法