Flandre923
1038 words
5 minutes
Neoforge AT access transformers 教程

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 表示一个没有参数且不返回任何值的方法

参考#

https://docs.neoforged.net/docs/advanced/accesstransformers

Neoforge AT access transformers 教程
https://fuwari.vercel.app/posts/minecraft_neoforge/027-at/
Author
Flandre923
Published at
2024-07-22