From 00f3f80ef94a08d867d9cdd5107c35777712050f Mon Sep 17 00:00:00 2001
From: Matyrobbrt <65940752+Matyrobbrt@users.noreply.github.com>
Date: Sat, 7 Dec 2024 15:22:16 +0200
Subject: [PATCH] Add task to generate ats (#1719)
---
.github/workflows/check-local-changes.yml | 4 +-
buildSrc/build.gradle | 2 +
.../neodev/ApplyAccessTransformer.java | 25 +-
.../neodev/GenerateAccessTransformers.java | 179 +++++++++
.../net/neoforged/neodev/NeoDevPlugin.java | 51 ++-
.../neodev/utils/SerializablePredicate.java | 10 +
.../neodev/utils/structure/ClassInfo.java | 27 ++
.../structure/ClassStructureVisitor.java | 83 ++++
.../neodev/utils/structure/FieldInfo.java | 10 +
.../neodev/utils/structure/MethodInfo.java | 10 +
projects/neoforge/build.gradle | 61 +++
settings.gradle | 1 +
.../resources/META-INF/accesstransformer.cfg | 206 +---------
.../META-INF/accesstransformergenerated.cfg | 380 ++++++++++++++++++
.../resources/META-INF/neoforge.mods.toml | 5 +
15 files changed, 823 insertions(+), 231 deletions(-)
create mode 100644 buildSrc/src/main/java/net/neoforged/neodev/GenerateAccessTransformers.java
create mode 100644 buildSrc/src/main/java/net/neoforged/neodev/utils/SerializablePredicate.java
create mode 100644 buildSrc/src/main/java/net/neoforged/neodev/utils/structure/ClassInfo.java
create mode 100644 buildSrc/src/main/java/net/neoforged/neodev/utils/structure/ClassStructureVisitor.java
create mode 100644 buildSrc/src/main/java/net/neoforged/neodev/utils/structure/FieldInfo.java
create mode 100644 buildSrc/src/main/java/net/neoforged/neodev/utils/structure/MethodInfo.java
create mode 100644 src/main/resources/META-INF/accesstransformergenerated.cfg
diff --git a/.github/workflows/check-local-changes.yml b/.github/workflows/check-local-changes.yml
index 0609d67e89d..3af8b101d08 100644
--- a/.github/workflows/check-local-changes.yml
+++ b/.github/workflows/check-local-changes.yml
@@ -40,8 +40,8 @@ jobs:
- name: Gen package infos
run: ./gradlew generatePackageInfos
- - name: Gen patches
- run: ./gradlew :neoforge:genPatches
+ - name: Gen patches and ATs
+ run: ./gradlew :neoforge:genPatches :neoforge:generateAccessTransformers
- name: Run datagen with Gradle
run: ./gradlew :neoforge:runData :tests:runData
diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle
index 6d0ce4c5af1..7c272aa20ad 100644
--- a/buildSrc/build.gradle
+++ b/buildSrc/build.gradle
@@ -23,4 +23,6 @@ dependencies {
implementation "com.google.code.gson:gson:${gradle.parent.ext.gson_version}"
implementation "io.codechicken:DiffPatch:${gradle.parent.ext.diffpatch_version}"
+
+ implementation "org.ow2.asm:asm:${gradle.parent.ext.asm_version}"
}
diff --git a/buildSrc/src/main/java/net/neoforged/neodev/ApplyAccessTransformer.java b/buildSrc/src/main/java/net/neoforged/neodev/ApplyAccessTransformer.java
index 7131cc8fddc..2456766cef4 100644
--- a/buildSrc/src/main/java/net/neoforged/neodev/ApplyAccessTransformer.java
+++ b/buildSrc/src/main/java/net/neoforged/neodev/ApplyAccessTransformer.java
@@ -7,6 +7,7 @@
import org.gradle.api.tasks.Classpath;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.InputFile;
+import org.gradle.api.tasks.InputFiles;
import org.gradle.api.tasks.Internal;
import org.gradle.api.tasks.JavaExec;
import org.gradle.api.tasks.OutputFile;
@@ -17,6 +18,8 @@
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Arrays;
/**
* Runs JavaSourceTransformer to apply
@@ -28,8 +31,8 @@ abstract class ApplyAccessTransformer extends JavaExec {
@InputFile
public abstract RegularFileProperty getInputJar();
- @InputFile
- public abstract RegularFileProperty getAccessTransformer();
+ @InputFiles
+ public abstract ConfigurableFileCollection getAccessTransformers();
@Input
public abstract Property getValidate();
@@ -59,13 +62,23 @@ public void exec() {
throw new UncheckedIOException("Failed to write libraries for JST.", exception);
}
- args(
+ var args = new ArrayList<>(Arrays.asList(
"--enable-accesstransformers",
- "--access-transformer", getAccessTransformer().getAsFile().get().getAbsolutePath(),
"--access-transformer-validation", getValidate().get() ? "error" : "log",
- "--libraries-list", getLibrariesFile().getAsFile().get().getAbsolutePath(),
+ "--libraries-list", getLibrariesFile().getAsFile().get().getAbsolutePath()
+ ));
+
+ for (var file : getAccessTransformers().getFiles()) {
+ args.addAll(Arrays.asList(
+ "--access-transformer", file.getAbsolutePath()
+ ));
+ }
+
+ args.addAll(Arrays.asList(
getInputJar().getAsFile().get().getAbsolutePath(),
- getOutputJar().getAsFile().get().getAbsolutePath());
+ getOutputJar().getAsFile().get().getAbsolutePath()));
+
+ args(args);
super.exec();
}
diff --git a/buildSrc/src/main/java/net/neoforged/neodev/GenerateAccessTransformers.java b/buildSrc/src/main/java/net/neoforged/neodev/GenerateAccessTransformers.java
new file mode 100644
index 00000000000..0158087e5a5
--- /dev/null
+++ b/buildSrc/src/main/java/net/neoforged/neodev/GenerateAccessTransformers.java
@@ -0,0 +1,179 @@
+package net.neoforged.neodev;
+
+import net.neoforged.neodev.utils.FileUtils;
+import net.neoforged.neodev.utils.SerializablePredicate;
+import net.neoforged.neodev.utils.structure.ClassInfo;
+import net.neoforged.neodev.utils.structure.ClassStructureVisitor;
+import net.neoforged.neodev.utils.structure.FieldInfo;
+import net.neoforged.neodev.utils.structure.MethodInfo;
+import org.gradle.api.DefaultTask;
+import org.gradle.api.Named;
+import org.gradle.api.file.RegularFileProperty;
+import org.gradle.api.provider.ListProperty;
+import org.gradle.api.tasks.Input;
+import org.gradle.api.tasks.InputFile;
+import org.gradle.api.tasks.OutputFile;
+import org.gradle.api.tasks.TaskAction;
+import org.objectweb.asm.Opcodes;
+
+import javax.annotation.Nullable;
+import java.io.IOException;
+import java.io.Serializable;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * This task is used to generate access transformers based on a set of rules defined in the buildscript.
+ */
+public abstract class GenerateAccessTransformers extends DefaultTask {
+ public static final Modifier PUBLIC = new Modifier("public", false, Opcodes.ACC_PUBLIC);
+ public static final Modifier PROTECTED = new Modifier("protected", false, Opcodes.ACC_PUBLIC, Opcodes.ACC_PROTECTED);
+
+ @InputFile
+ public abstract RegularFileProperty getInput();
+
+ @OutputFile
+ public abstract RegularFileProperty getAccessTransformer();
+
+ @Input
+ public abstract ListProperty getGroups();
+
+ @TaskAction
+ public void exec() throws IOException {
+ // First we collect all classes
+ var targets = ClassStructureVisitor.readJar(getInput().getAsFile().get());
+
+ var groupList = getGroups().get();
+
+ List[] groups = new List[groupList.size()];
+ for (int i = 0; i < groupList.size(); i++) {
+ groups[i] = new ArrayList<>();
+ }
+
+ // Now we check each class against each group and see if the group wants to handle it
+ for (ClassInfo value : targets.values()) {
+ for (int i = 0; i < groupList.size(); i++) {
+ var group = groupList.get(i);
+ if (group.classMatch.test(value)) {
+ var lastInner = value.name().lastIndexOf("$");
+ // Skip anonymous classes
+ if (lastInner >= 0 && Character.isDigit(value.name().charAt(lastInner + 1))) {
+ continue;
+ }
+
+ // fieldMatch is non-null only for field ATs
+ if (group.fieldMatch != null) {
+ for (var field : value.fields()) {
+ if (group.fieldMatch.test(field) && !group.modifier.test(field.access())) {
+ groups[i].add(group.modifier.name + " " + value.name().replace('/', '.') + " " + field.name());
+ }
+ }
+ }
+ // methodMatch is non-null only for group ATs
+ else if (group.methodMatch != null) {
+ for (var method : value.methods()) {
+ if (group.methodMatch.test(method) && !group.modifier.test(method.access())) {
+ groups[i].add(group.modifier.name + " " + value.name().replace('/', '.') + " " + method.name() + method.descriptor());
+ }
+ }
+ }
+ // If there's neither a field nor a method predicate, this is a class AT
+ else if (!group.modifier.test(value.access().intValue())) {
+ groups[i].add(group.modifier.name + " " + value.name().replace('/', '.'));
+
+ // If we AT a record we must ensure that its constructors have the same AT
+ if (value.hasSuperclass("java/lang/Record")) {
+ for (MethodInfo method : value.methods()) {
+ if (method.name().equals("")) {
+ groups[i].add(group.modifier.name + " " + value.name().replace('/', '.') + " " + method.name() + method.descriptor());
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // Dump the ATs
+ var text = new StringBuilder();
+
+ text.append("# This file is generated based on the rules defined in the buildscript. DO NOT modify it manually.\n# Add more rules in the buildscript and then run the generateAccessTransformers task to update this file.\n\n");
+
+ for (int i = 0; i < groups.length; i++) {
+ // Check if the group found no targets. If it didn't, there's probably an error in the test and it should be reported
+ if (groups[i].isEmpty()) {
+ throw new IllegalStateException("Generated AT group '" + groupList.get(i).name + "' found no entries!");
+ }
+ text.append("# ").append(groupList.get(i).name).append('\n');
+ text.append(groups[i].stream().sorted().collect(Collectors.joining("\n")));
+ text.append('\n');
+
+ if (i < groups.length - 1) text.append('\n');
+ }
+
+ var outFile = getAccessTransformer().getAsFile().get().toPath();
+ if (!Files.exists(outFile.getParent())) {
+ Files.createDirectories(outFile.getParent());
+ }
+
+ FileUtils.writeStringSafe(outFile, text.toString(), StandardCharsets.UTF_8);
+ }
+
+ public void classGroup(String name, Modifier modifier, SerializablePredicate match) {
+ getGroups().add(new AtGroup(name, modifier, match, null, null));
+ }
+
+ public void methodGroup(String name, Modifier modifier, SerializablePredicate targetTest, SerializablePredicate methodTest) {
+ getGroups().add(new AtGroup(name, modifier, targetTest, methodTest, null));
+ }
+
+ public void fieldGroup(String name, Modifier modifier, SerializablePredicate targetTest, SerializablePredicate fieldTest) {
+ getGroups().add(new AtGroup(name, modifier, targetTest, null, fieldTest));
+ }
+
+ public SerializablePredicate named(String name) {
+ return target -> target.getName().equals(name);
+ }
+
+ public SerializablePredicate classesWithSuperclass(String superClass) {
+ return target -> target.hasSuperclass(superClass);
+ }
+
+ public SerializablePredicate innerClassesOf(String parent) {
+ var parentFullName = parent + "$";
+ return target -> target.name().startsWith(parentFullName);
+ }
+
+ public SerializablePredicate methodsReturning(String type) {
+ var endMatch = ")L" + type + ";";
+ return methodInfo -> methodInfo.descriptor().endsWith(endMatch);
+ }
+
+ public SerializablePredicate fieldsOfType(SerializablePredicate type) {
+ return value -> type.test(value.type());
+ }
+
+ public SerializablePredicate matchAny() {
+ return value -> true;
+ }
+
+ public record AtGroup(String name, Modifier modifier, SerializablePredicate classMatch,
+ @Nullable SerializablePredicate methodMatch, @Nullable SerializablePredicate fieldMatch) implements Serializable {
+ }
+
+ public record Modifier(String name, boolean isFinal, int... validOpcodes) implements Serializable {
+ public boolean test(int value) {
+ if (isFinal && (value & Opcodes.ACC_FINAL) == 0) return false;
+
+ for (int validOpcode : validOpcodes) {
+ if ((value & validOpcode) != 0) {
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+}
diff --git a/buildSrc/src/main/java/net/neoforged/neodev/NeoDevPlugin.java b/buildSrc/src/main/java/net/neoforged/neodev/NeoDevPlugin.java
index d38f91f46bb..0a5afa25390 100644
--- a/buildSrc/src/main/java/net/neoforged/neodev/NeoDevPlugin.java
+++ b/buildSrc/src/main/java/net/neoforged/neodev/NeoDevPlugin.java
@@ -70,14 +70,42 @@ public void apply(Project project) {
// Task must run on sync to have MC resources available for IDEA nondelegated builds.
NeoDevFacade.runTaskOnProjectSync(project, createSourceArtifacts);
+ // Obtain clean binary artifacts, needed to be able to generate ATs
+ var createCleanArtifacts = tasks.register("createCleanArtifacts", CreateCleanArtifacts.class, task -> {
+ task.setGroup(INTERNAL_GROUP);
+ task.setDescription("This task retrieves various files for the Minecraft version without applying NeoForge patches to them");
+ var cleanArtifactsDir = neoDevBuildDir.map(dir -> dir.dir("artifacts/clean"));
+ task.getRawClientJar().set(cleanArtifactsDir.map(dir -> dir.file("raw-client.jar")));
+ task.getCleanClientJar().set(cleanArtifactsDir.map(dir -> dir.file("client.jar")));
+ task.getRawServerJar().set(cleanArtifactsDir.map(dir -> dir.file("raw-server.jar")));
+ task.getCleanServerJar().set(cleanArtifactsDir.map(dir -> dir.file("server.jar")));
+ task.getCleanJoinedJar().set(cleanArtifactsDir.map(dir -> dir.file("joined.jar")));
+ task.getMergedMappings().set(cleanArtifactsDir.map(dir -> dir.file("merged-mappings.txt")));
+ task.getNeoFormArtifact().set(mcAndNeoFormVersion.map(version -> "net.neoforged:neoform:" + version + "@zip"));
+ });
+
+ var genAts = project.getRootProject().file("src/main/resources/META-INF/accesstransformergenerated.cfg");
+
+ var genAtsTask = tasks.register("generateAccessTransformers", GenerateAccessTransformers.class, task -> {
+ task.setGroup(GROUP);
+ task.setDescription("Generate access transformers based on a set of rules defined in the buildscript");
+ task.getInput().set(createCleanArtifacts.flatMap(CreateCleanArtifacts::getCleanJoinedJar));
+ task.getAccessTransformer().set(genAts);
+ });
+
// 2. Apply AT to the source jar from 1.
- var atFile = project.getRootProject().file("src/main/resources/META-INF/accesstransformer.cfg");
+ var atFiles = List.of(
+ project.getRootProject().file("src/main/resources/META-INF/accesstransformer.cfg"),
+ genAts
+ );
var applyAt = configureAccessTransformer(
project,
configurations,
createSourceArtifacts,
neoDevBuildDir,
- atFile);
+ atFiles);
+
+ applyAt.configure(task -> task.mustRunAfter(genAtsTask));
// 3. Apply patches to the source jar from 2.
var patchesFolder = project.getRootProject().file("patches");
@@ -212,19 +240,6 @@ public void apply(Project project) {
jarJarTask.configure(task -> task.setGroup(INTERNAL_GROUP));
universalJar.configure(task -> task.from(jarJarTask));
- var createCleanArtifacts = tasks.register("createCleanArtifacts", CreateCleanArtifacts.class, task -> {
- task.setGroup(INTERNAL_GROUP);
- task.setDescription("This task retrieves various files for the Minecraft version without applying NeoForge patches to them");
- var cleanArtifactsDir = neoDevBuildDir.map(dir -> dir.dir("artifacts/clean"));
- task.getRawClientJar().set(cleanArtifactsDir.map(dir -> dir.file("raw-client.jar")));
- task.getCleanClientJar().set(cleanArtifactsDir.map(dir -> dir.file("client.jar")));
- task.getRawServerJar().set(cleanArtifactsDir.map(dir -> dir.file("raw-server.jar")));
- task.getCleanServerJar().set(cleanArtifactsDir.map(dir -> dir.file("server.jar")));
- task.getCleanJoinedJar().set(cleanArtifactsDir.map(dir -> dir.file("joined.jar")));
- task.getMergedMappings().set(cleanArtifactsDir.map(dir -> dir.file("merged-mappings.txt")));
- task.getNeoFormArtifact().set(mcAndNeoFormVersion.map(version -> "net.neoforged:neoform:" + version + "@zip"));
- });
-
var binaryPatchOutputs = configureBinaryPatchCreation(
project,
configurations,
@@ -390,7 +405,7 @@ public void apply(Project project) {
task.from(writeUserDevConfig.flatMap(CreateUserDevConfig::getUserDevConfig), spec -> {
spec.rename(s -> "config.json");
});
- task.from(atFile, spec -> {
+ task.from(atFiles, spec -> {
spec.into("ats/");
});
task.from(binaryPatchOutputs.binaryPatchesForMerged(), spec -> {
@@ -434,7 +449,7 @@ private static TaskProvider configureAccessTransformer(
NeoDevConfigurations configurations,
TaskProvider createSourceArtifacts,
Provider neoDevBuildDir,
- File atFile) {
+ List atFiles) {
// Pass -PvalidateAccessTransformers to validate ATs.
var validateAts = project.getProviders().gradleProperty("validateAccessTransformers").map(p -> true).orElse(false);
@@ -442,7 +457,7 @@ private static TaskProvider configureAccessTransformer(
task.setGroup(INTERNAL_GROUP);
task.classpath(configurations.getExecutableTool(Tools.JST));
task.getInputJar().set(createSourceArtifacts.flatMap(CreateMinecraftArtifacts::getSourcesArtifact));
- task.getAccessTransformer().set(atFile);
+ task.getAccessTransformers().from(atFiles);
task.getValidate().set(validateAts);
task.getOutputJar().set(neoDevBuildDir.map(dir -> dir.file("artifacts/access-transformed-sources.jar")));
task.getLibraries().from(configurations.neoFormClasspath);
diff --git a/buildSrc/src/main/java/net/neoforged/neodev/utils/SerializablePredicate.java b/buildSrc/src/main/java/net/neoforged/neodev/utils/SerializablePredicate.java
new file mode 100644
index 00000000000..9a42b1669e3
--- /dev/null
+++ b/buildSrc/src/main/java/net/neoforged/neodev/utils/SerializablePredicate.java
@@ -0,0 +1,10 @@
+package net.neoforged.neodev.utils;
+
+import java.io.Serializable;
+import java.util.function.Predicate;
+
+@FunctionalInterface
+public interface SerializablePredicate extends Serializable, Predicate {
+ @Override
+ boolean test(T value);
+}
diff --git a/buildSrc/src/main/java/net/neoforged/neodev/utils/structure/ClassInfo.java b/buildSrc/src/main/java/net/neoforged/neodev/utils/structure/ClassInfo.java
new file mode 100644
index 00000000000..a9a4102f12c
--- /dev/null
+++ b/buildSrc/src/main/java/net/neoforged/neodev/utils/structure/ClassInfo.java
@@ -0,0 +1,27 @@
+package net.neoforged.neodev.utils.structure;
+
+import org.apache.commons.lang3.mutable.MutableInt;
+import org.gradle.api.Named;
+
+import java.util.List;
+
+public record ClassInfo(String name, MutableInt access, List parents, List methods,
+ List fields) implements Named {
+ public void addMethod(String name, String desc, int access) {
+ this.methods.add(new MethodInfo(name, desc, access));
+ }
+
+ public boolean hasSuperclass(String name) {
+ for (ClassInfo parent : parents) {
+ if (parent.hasSuperclass(name)) {
+ return true;
+ }
+ }
+ return this.name.equals(name);
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+}
diff --git a/buildSrc/src/main/java/net/neoforged/neodev/utils/structure/ClassStructureVisitor.java b/buildSrc/src/main/java/net/neoforged/neodev/utils/structure/ClassStructureVisitor.java
new file mode 100644
index 00000000000..ae6f99ef5b8
--- /dev/null
+++ b/buildSrc/src/main/java/net/neoforged/neodev/utils/structure/ClassStructureVisitor.java
@@ -0,0 +1,83 @@
+package net.neoforged.neodev.utils.structure;
+
+import org.apache.commons.lang3.mutable.MutableInt;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.zip.ZipFile;
+
+public final class ClassStructureVisitor extends ClassVisitor {
+ private final Map classes;
+ ClassInfo current;
+
+ private ClassStructureVisitor(Map classes) {
+ super(Opcodes.ASM9);
+ this.classes = classes;
+ }
+
+ public static Map readJar(File file) throws IOException {
+ var map = new HashMap();
+ var visitor = new ClassStructureVisitor(map);
+ try (var zip = new ZipFile(file)) {
+ var entries = zip.entries();
+ while (entries.hasMoreElements()) {
+ var next = entries.nextElement();
+ if (next.isDirectory() || !next.getName().endsWith(".class")) continue;
+
+ try (var in = zip.getInputStream(next)) {
+ var reader = new ClassReader(in);
+ reader.accept(visitor, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
+ }
+ }
+ }
+ return map;
+ }
+
+ @Override
+ public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
+ current = getClass(name);
+ current.access().setValue(access);
+ if (superName != null) {
+ current.parents().add(getClass(superName));
+ }
+ for (String iface : interfaces) {
+ current.parents().add(getClass(iface));
+ }
+ }
+
+ @Override
+ public void visitInnerClass(String name, String outerName, String innerName, int access) {
+ if (name.equals(current.name())) {
+ current.access().setValue(access);
+ }
+ }
+
+ @Override
+ public FieldVisitor visitField(int access, String name, String descriptor, String signature, Object value) {
+ current.fields().add(new FieldInfo(name, getClass(Type.getType(descriptor).getInternalName()), access));
+ return null;
+ }
+
+ @Override
+ public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) {
+ current.addMethod(name, descriptor, access);
+ return null;
+ }
+
+ private ClassInfo getClass(String name) {
+ var existing = classes.get(name);
+ if (existing != null) return existing;
+ existing = new ClassInfo(name, new MutableInt(0), new ArrayList<>(), new ArrayList<>(), new ArrayList<>());
+ classes.put(name, existing);
+ return existing;
+ }
+}
diff --git a/buildSrc/src/main/java/net/neoforged/neodev/utils/structure/FieldInfo.java b/buildSrc/src/main/java/net/neoforged/neodev/utils/structure/FieldInfo.java
new file mode 100644
index 00000000000..378c634a8e0
--- /dev/null
+++ b/buildSrc/src/main/java/net/neoforged/neodev/utils/structure/FieldInfo.java
@@ -0,0 +1,10 @@
+package net.neoforged.neodev.utils.structure;
+
+import org.gradle.api.Named;
+
+public record FieldInfo(String name, ClassInfo type, int access) implements Named {
+ @Override
+ public String getName() {
+ return name;
+ }
+}
diff --git a/buildSrc/src/main/java/net/neoforged/neodev/utils/structure/MethodInfo.java b/buildSrc/src/main/java/net/neoforged/neodev/utils/structure/MethodInfo.java
new file mode 100644
index 00000000000..8ec02e36780
--- /dev/null
+++ b/buildSrc/src/main/java/net/neoforged/neodev/utils/structure/MethodInfo.java
@@ -0,0 +1,10 @@
+package net.neoforged.neodev.utils.structure;
+
+import org.gradle.api.Named;
+
+public record MethodInfo(String name, String descriptor, int access) implements Named {
+ @Override
+ public String getName() {
+ return name;
+ }
+}
diff --git a/projects/neoforge/build.gradle b/projects/neoforge/build.gradle
index bc5638d3ed4..6fb662a1621 100644
--- a/projects/neoforge/build.gradle
+++ b/projects/neoforge/build.gradle
@@ -161,6 +161,67 @@ neoDev {
}
}
+generateAccessTransformers {
+ // Make all state shards public
+ classGroup(
+ 'render state shard classes', PUBLIC,
+ innerClassesOf('net/minecraft/client/renderer/RenderStateShard')
+ )
+ // Make all state shard fields public
+ fieldGroup(
+ 'render state shards', PUBLIC,
+ named('net/minecraft/client/renderer/RenderStateShard'),
+ fieldsOfType(classesWithSuperclass('net/minecraft/client/renderer/RenderStateShard'))
+ )
+
+ // Make all block constructors public so they can be used by mods
+ methodGroup(
+ 'block constructors', PUBLIC,
+ classesWithSuperclass('net/minecraft/world/level/block/Block'),
+ named('')
+ )
+ // Make all particle constructors public so they can be used by mods
+ methodGroup(
+ 'particle constructors', PUBLIC,
+ classesWithSuperclass('net/minecraft/client/particle/Particle'),
+ named('')
+ )
+
+ // Make all criteria methods in the recipe provider protected so mods can use them
+ methodGroup(
+ 'recipe criteria', PROTECTED,
+ named('net/minecraft/data/recipes/RecipeProvider'),
+ methodsReturning('net/minecraft/advancements/Criterion')
+ )
+
+ // getStepSound is package-private and abstract, so mods couldn't otherwise extend from AbstractSkeleton
+ methodGroup(
+ 'skeleton step sound', PROTECTED,
+ classesWithSuperclass('net/minecraft/world/entity/monster/AbstractSkeleton'),
+ named('getStepSound')
+ )
+
+ // Make all noise generator setting factories public so mods can use them for custom dimensions
+ methodGroup(
+ 'noise generator', PUBLIC,
+ named('net/minecraft/world/level/levelgen/NoiseGeneratorSettings'),
+ methodsReturning('net/minecraft/world/level/levelgen/NoiseGeneratorSettings')
+ )
+
+ fieldGroup(
+ 'biome effects builder', PROTECTED,
+ named('net/minecraft/world/level/biome/BiomeSpecialEffects$Builder'),
+ matchAny()
+ )
+
+ // Make all creative tab ids accessible
+ fieldGroup(
+ 'creative tabs', PUBLIC,
+ named('net/minecraft/world/item/CreativeModeTabs'),
+ fieldsOfType(named('net/minecraft/resources/ResourceKey'))
+ )
+}
+
tasks.withType(Javadoc.class).configureEach {
options.tags = [
'apiNote:a:API Note:',
diff --git a/settings.gradle b/settings.gradle
index aff93fdd4ca..8ebcc3b576f 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -15,6 +15,7 @@ plugins {
gradle.ext.moddevgradle_plugin_version = moddevgradle_plugin_version
gradle.ext.gson_version = gson_version
gradle.ext.diffpatch_version = diffpatch_version
+gradle.ext.asm_version = asm_version
dependencyResolutionManagement {
repositoriesMode = RepositoriesMode.FAIL_ON_PROJECT_REPOS
diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg
index 1f3cdb8df4a..0497cdda0e8 100644
--- a/src/main/resources/META-INF/accesstransformer.cfg
+++ b/src/main/resources/META-INF/accesstransformer.cfg
@@ -1,3 +1,4 @@
+# Note: This file is for manually added ATs. When AT entries can be programmatically generated based on fixed rules you may define those rules in the build.gradle file
public net.minecraft.advancements.CriteriaTriggers register(Ljava/lang/String;Lnet/minecraft/advancements/CriterionTrigger;)Lnet/minecraft/advancements/CriterionTrigger; # register
default net.minecraft.client.KeyMapping isDown # isDown
public-f net.minecraft.client.Options keyMappings # keyMappings
@@ -47,27 +48,9 @@ public net.minecraft.client.renderer.RenderType create(Ljava/lang/String;Lcom/mo
public net.minecraft.client.renderer.RenderType create(Ljava/lang/String;Lcom/mojang/blaze3d/vertex/VertexFormat;Lcom/mojang/blaze3d/vertex/VertexFormat$Mode;IZZLnet/minecraft/client/renderer/RenderType$CompositeState;)Lnet/minecraft/client/renderer/RenderType$CompositeRenderType; # create
public net.minecraft.client.renderer.RenderType$OutlineProperty
public net.minecraft.client.renderer.RenderType$CompositeState
-public net.minecraft.client.renderer.RenderStateShard *
protected-f net.minecraft.client.renderer.RenderStateShard$TextureStateShard blur # blur
protected-f net.minecraft.client.renderer.RenderStateShard$TextureStateShard mipmap # mipmap
public net.minecraft.client.renderer.RenderStateShard setupGlintTexturing(F)V
-public net.minecraft.client.renderer.RenderStateShard$BooleanStateShard
-public net.minecraft.client.renderer.RenderStateShard$ColorLogicStateShard
-public net.minecraft.client.renderer.RenderStateShard$CullStateShard
-public net.minecraft.client.renderer.RenderStateShard$DepthTestStateShard
-public net.minecraft.client.renderer.RenderStateShard$EmptyTextureStateShard
-public net.minecraft.client.renderer.RenderStateShard$LayeringStateShard
-public net.minecraft.client.renderer.RenderStateShard$LightmapStateShard
-public net.minecraft.client.renderer.RenderStateShard$LineStateShard
-public net.minecraft.client.renderer.RenderStateShard$MultiTextureStateShard
-public net.minecraft.client.renderer.RenderStateShard$OffsetTexturingStateShard
-public net.minecraft.client.renderer.RenderStateShard$OutputStateShard
-public net.minecraft.client.renderer.RenderStateShard$OverlayStateShard
-public net.minecraft.client.renderer.RenderStateShard$ShaderStateShard
-public net.minecraft.client.renderer.RenderStateShard$TextureStateShard
-public net.minecraft.client.renderer.RenderStateShard$TexturingStateShard
-public net.minecraft.client.renderer.RenderStateShard$TransparencyStateShard
-public net.minecraft.client.renderer.RenderStateShard$WriteMaskStateShard
#endgroup
default net.minecraft.client.renderer.chunk.RenderChunk wrapped
public net.minecraft.client.renderer.block.model.BlockElement uvsByFace(Lnet/minecraft/core/Direction;)[F # uvsByFace
@@ -118,9 +101,6 @@ public net.minecraft.core.particles.SimpleParticleType (Z)V # constructor
protected net.minecraft.data.loot.BlockLootSubProvider createSilkTouchOnlyTable(Lnet/minecraft/world/level/ItemLike;)Lnet/minecraft/world/level/storage/loot/LootTable$Builder; # createSilkTouchOnlyTable
protected net.minecraft.data.loot.BlockLootSubProvider createPotFlowerItemTable(Lnet/minecraft/world/level/ItemLike;)Lnet/minecraft/world/level/storage/loot/LootTable$Builder; # createPotFlowerItemTable
protected net.minecraft.data.loot.BlockLootSubProvider createSelfDropDispatchTable(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/storage/loot/predicates/LootItemCondition$Builder;Lnet/minecraft/world/level/storage/loot/entries/LootPoolEntryContainer$Builder;)Lnet/minecraft/world/level/storage/loot/LootTable$Builder; # createSelfDropDispatchTable
-protected net.minecraft.data.recipes.RecipeProvider insideOf(Lnet/minecraft/world/level/block/Block;)Lnet/minecraft/advancements/Criterion; # insideOf
-protected net.minecraft.data.recipes.RecipeProvider inventoryTrigger([Lnet/minecraft/advancements/critereon/ItemPredicate;)Lnet/minecraft/advancements/Criterion; # inventoryTrigger
-protected net.minecraft.data.recipes.RecipeProvider has(Lnet/minecraft/advancements/critereon/MinMaxBounds$Ints;Lnet/minecraft/world/level/ItemLike;)Lnet/minecraft/advancements/Criterion; # has
protected net.minecraft.data.recipes.RecipeProvider getBaseBlock(Lnet/minecraft/data/BlockFamily;Lnet/minecraft/data/BlockFamily$Variant;)Lnet/minecraft/world/level/block/Block; # getBaseBlock
protected net.minecraft.data.recipes.RecipeProvider buttonBuilder(Lnet/minecraft/world/level/ItemLike;Lnet/minecraft/world/item/crafting/Ingredient;)Lnet/minecraft/data/recipes/RecipeBuilder; # buttonBuilder
protected net.minecraft.data.recipes.RecipeProvider fenceBuilder(Lnet/minecraft/world/level/ItemLike;Lnet/minecraft/world/item/crafting/Ingredient;)Lnet/minecraft/data/recipes/RecipeBuilder; # fenceBuilder
@@ -134,7 +114,6 @@ protected net.minecraft.data.recipes.RecipeProvider polishedBuilder(Lnet/minecra
protected net.minecraft.data.recipes.RecipeProvider pressurePlateBuilder(Lnet/minecraft/data/recipes/RecipeCategory;Lnet/minecraft/world/level/ItemLike;Lnet/minecraft/world/item/crafting/Ingredient;)Lnet/minecraft/data/recipes/RecipeBuilder; # pressurePlateBuilder
protected net.minecraft.data.recipes.RecipeProvider nineBlockStorageRecipes(Lnet/minecraft/data/recipes/RecipeCategory;Lnet/minecraft/world/level/ItemLike;Lnet/minecraft/data/recipes/RecipeCategory;Lnet/minecraft/world/level/ItemLike;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V # nineBlockStorageRecipes
protected net.minecraft.data.recipes.RecipeProvider simpleCookingRecipe(Ljava/lang/String;Lnet/minecraft/world/item/crafting/RecipeSerializer;Lnet/minecraft/world/item/crafting/AbstractCookingRecipe$Factory;ILnet/minecraft/world/level/ItemLike;Lnet/minecraft/world/level/ItemLike;F)V # simpleCookingRecipe
-protected net.minecraft.data.recipes.RecipeProvider inventoryTrigger([Lnet/minecraft/advancements/critereon/ItemPredicate$Builder;)Lnet/minecraft/advancements/Criterion; # inventoryTrigger
public net.minecraft.data.recipes.RecipeProvider$Runner
protected net.minecraft.data.recipes.packs.VanillaRecipeProvider (Lnet/minecraft/core/HolderLookup$Provider;Lnet/minecraft/data/recipes/RecipeOutput;)V
public net.minecraft.data.recipes.packs.VanillaRecipeProvider COAL_SMELTABLES # COAL_SMELTABLES
@@ -196,10 +175,6 @@ public net.minecraft.world.entity.Mob goalSelector # goalSelector
public net.minecraft.world.entity.Mob targetSelector # targetSelector
public net.minecraft.world.entity.ai.sensing.SensorType (Ljava/util/function/Supplier;)V # constructor
protected net.minecraft.world.entity.item.PrimedTnt explode()V # explode - make it easier to extend TNTEntity with custom explosion logic
-protected net.minecraft.world.entity.monster.AbstractSkeleton getStepSound()Lnet/minecraft/sounds/SoundEvent; # getStepSound - make AbstractSkeletonEntity implementable
-protected net.minecraft.world.entity.monster.Skeleton getStepSound()Lnet/minecraft/sounds/SoundEvent; # getStepSound - make AbstractSkeletonEntity implementable
-protected net.minecraft.world.entity.monster.Stray getStepSound()Lnet/minecraft/sounds/SoundEvent; # getStepSound - make AbstractSkeletonEntity implementable
-protected net.minecraft.world.entity.monster.WitherSkeleton getStepSound()Lnet/minecraft/sounds/SoundEvent; # getStepSound - make AbstractSkeletonEntity implementable
public net.minecraft.world.entity.npc.VillagerType (Ljava/lang/String;)V # constructor
public net.minecraft.world.entity.player.Player closeContainer()V # closeContainer
protected net.minecraft.world.entity.projectile.Projectile (Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/level/Level;)V # constructor
@@ -211,20 +186,6 @@ public net.minecraft.world.inventory.AnvilMenu repairItemCountCost # repairItemC
public net.minecraft.world.inventory.MenuType (Lnet/minecraft/world/inventory/MenuType$MenuSupplier;Lnet/minecraft/world/flag/FeatureFlagSet;)V # constructor
public net.minecraft.world.inventory.MenuType$MenuSupplier
public net.minecraft.world.item.CreativeModeTab$TabVisibility
-public net.minecraft.world.item.CreativeModeTabs COLORED_BLOCKS # COLORED_BLOCKS
-public net.minecraft.world.item.CreativeModeTabs SPAWN_EGGS # SPAWN_EGGS
-public net.minecraft.world.item.CreativeModeTabs SEARCH # SEARCH
-public net.minecraft.world.item.CreativeModeTabs NATURAL_BLOCKS # NATURAL_BLOCKS
-public net.minecraft.world.item.CreativeModeTabs BUILDING_BLOCKS # BUILDING_BLOCKS
-public net.minecraft.world.item.CreativeModeTabs FUNCTIONAL_BLOCKS # FUNCTIONAL_BLOCKS
-public net.minecraft.world.item.CreativeModeTabs COMBAT # COMBAT
-public net.minecraft.world.item.CreativeModeTabs OP_BLOCKS # OP_BLOCKS
-public net.minecraft.world.item.CreativeModeTabs FOOD_AND_DRINKS # FOOD_AND_DRINKS
-public net.minecraft.world.item.CreativeModeTabs TOOLS_AND_UTILITIES # TOOLS_AND_UTILITIES
-public net.minecraft.world.item.CreativeModeTabs HOTBAR # HOTBAR
-public net.minecraft.world.item.CreativeModeTabs INGREDIENTS # INGREDIENTS
-public net.minecraft.world.item.CreativeModeTabs REDSTONE_BLOCKS # REDSTONE_BLOCKS
-public net.minecraft.world.item.CreativeModeTabs INVENTORY # INVENTORY
#group public net.minecraft.world.item.Item
public net.minecraft.world.item.DiggerItem (Lnet/minecraft/world/item/ToolMaterial;Lnet/minecraft/tags/TagKey;FFLnet/minecraft/world/item/Item$Properties;)V
#endgroup
@@ -252,124 +213,9 @@ public net.minecraft.world.level.biome.BiomeGenerationSettings (Lnet/minec
protected net.minecraft.world.level.biome.BiomeGenerationSettings$PlainBuilder features # features
protected net.minecraft.world.level.biome.BiomeGenerationSettings$PlainBuilder carvers # carvers
protected net.minecraft.world.level.biome.BiomeGenerationSettings$PlainBuilder addFeatureStepsUpTo(I)V # addFeatureStepsUpTo
-#group protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder *
-protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder fogColor # fogColor
-protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder waterColor # waterColor
-protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder waterFogColor # waterFogColor
-protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder skyColor # skyColor
-protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder foliageColorOverride # foliageColorOverride
-protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder grassColorOverride # grassColorOverride
-protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder grassColorModifier # grassColorModifier
-protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder ambientParticle # ambientParticle
-protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder ambientLoopSoundEvent # ambientLoopSoundEvent
-protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder ambientMoodSettings # ambientMoodSettings
-protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder ambientAdditionsSettings # ambientAdditionsSettings
-protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder backgroundMusic # backgroundMusic
-#endgroup
protected net.minecraft.world.level.biome.MobSpawnSettings$Builder spawners # spawners
protected net.minecraft.world.level.biome.MobSpawnSettings$Builder mobSpawnCosts # mobSpawnCosts
protected net.minecraft.world.level.biome.MobSpawnSettings$Builder creatureGenerationProbability # creatureGenerationProbability
-#group public net.minecraft.world.level.block.Block
-public net.minecraft.world.level.block.AttachedStemBlock (Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.AzaleaBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.BarrierBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.BaseCoralFanBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.BaseCoralPlantBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.BaseCoralPlantTypeBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.BaseCoralWallFanBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.BigDripleafBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.BigDripleafStemBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.BlastFurnaceBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.ButtonBlock (Lnet/minecraft/world/level/block/state/properties/BlockSetType;ILnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.CactusBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.CakeBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.CandleCakeBlock (Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.CartographyTableBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.CarvedPumpkinBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.ChestBlock (Ljava/util/function/Supplier;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.ChorusFlowerBlock (Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.ChorusPlantBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.CoralFanBlock (Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.CoralPlantBlock (Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.CoralWallFanBlock (Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.CraftingTableBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.CropBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.DeadBushBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.DecoratedPotBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.DirtPathBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.DispenserBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.DoorBlock (Lnet/minecraft/world/level/block/state/properties/BlockSetType;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.EnchantingTableBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.EndGatewayBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.EndPortalBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.EndRodBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.EnderChestBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.FarmBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.FletchingTableBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.FungusBlock (Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.FurnaceBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.GrindstoneBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.HalfTransparentBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.HangingRootsBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.IronBarsBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.JigsawBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.JukeboxBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.KelpBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.KelpPlantBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.LadderBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.LecternBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.LeverBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.LiquidBlock (Lnet/minecraft/world/level/material/FlowingFluid;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.LoomBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.MangroveRootsBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.NetherWartBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.NyliumBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.PinkPetalsBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.PipeBlock (FLnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.PlayerHeadBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.PlayerWallHeadBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.PoweredRailBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.PressurePlateBlock (Lnet/minecraft/world/level/block/state/properties/BlockSetType;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.PumpkinBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.RailBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.RedstoneTorchBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.RedstoneWallTorchBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.RepeaterBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.RodBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.RootsBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.SaplingBlock (Lnet/minecraft/world/level/block/grower/TreeGrower;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.ScaffoldingBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.SeaPickleBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.SeagrassBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.SkullBlock (Lnet/minecraft/world/level/block/SkullBlock$Type;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.SmithingTableBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.SmokerBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.SnowLayerBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.SnowyDirtBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.SpawnerBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.SpongeBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.StairBlock (Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.StemBlock (Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.StructureBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.StructureVoidBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.SugarCaneBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.TallGrassBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.TorchBlock (Lnet/minecraft/core/particles/SimpleParticleType;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.TransparentBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.TrapDoorBlock (Lnet/minecraft/world/level/block/state/properties/BlockSetType;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.WallSkullBlock (Lnet/minecraft/world/level/block/SkullBlock$Type;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.WallTorchBlock (Lnet/minecraft/core/particles/SimpleParticleType;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.WaterlilyBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.WaterloggedTransparentBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.WeatheringCopperDoorBlock (Lnet/minecraft/world/level/block/state/properties/BlockSetType;Lnet/minecraft/world/level/block/WeatheringCopper$WeatherState;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.WeatheringCopperGrateBlock (Lnet/minecraft/world/level/block/WeatheringCopper$WeatherState;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.WeatheringCopperTrapDoorBlock (Lnet/minecraft/world/level/block/state/properties/BlockSetType;Lnet/minecraft/world/level/block/WeatheringCopper$WeatherState;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.WeightedPressurePlateBlock (ILnet/minecraft/world/level/block/state/properties/BlockSetType;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.WetSpongeBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.WitherSkullBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.WitherWallSkullBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-public net.minecraft.world.level.block.WoolCarpetBlock (Lnet/minecraft/world/item/DyeColor;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor
-#endgroup
public net.minecraft.world.level.block.Block popExperience(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;I)V # popExperience
public net.minecraft.world.level.block.Blocks always(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/entity/EntityType;)Ljava/lang/Boolean; # always
public net.minecraft.world.level.block.Blocks never(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/entity/EntityType;)Ljava/lang/Boolean; # never
@@ -411,13 +257,6 @@ private-f net.minecraft.world.level.levelgen.DebugLevelSource GRID_WIDTH # GRID_
private-f net.minecraft.world.level.levelgen.DebugLevelSource GRID_HEIGHT # GRID_HEIGHT
public-f net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator
protected net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator iterateNoiseColumn(Lnet/minecraft/world/level/LevelHeightAccessor;Lnet/minecraft/world/level/levelgen/RandomState;IILorg/apache/commons/lang3/mutable/MutableObject;Ljava/util/function/Predicate;)Ljava/util/OptionalInt; # iterateNoiseColumn
-#group public net.minecraft.world.level.levelgen.NoiseGeneratorSettings *()
-public net.minecraft.world.level.levelgen.NoiseGeneratorSettings caves(Lnet/minecraft/data/worldgen/BootstrapContext;)Lnet/minecraft/world/level/levelgen/NoiseGeneratorSettings; # caves
-public net.minecraft.world.level.levelgen.NoiseGeneratorSettings end(Lnet/minecraft/data/worldgen/BootstrapContext;)Lnet/minecraft/world/level/levelgen/NoiseGeneratorSettings; # end
-public net.minecraft.world.level.levelgen.NoiseGeneratorSettings overworld(Lnet/minecraft/data/worldgen/BootstrapContext;ZZ)Lnet/minecraft/world/level/levelgen/NoiseGeneratorSettings; # overworld
-public net.minecraft.world.level.levelgen.NoiseGeneratorSettings floatingIslands(Lnet/minecraft/data/worldgen/BootstrapContext;)Lnet/minecraft/world/level/levelgen/NoiseGeneratorSettings; # floatingIslands
-public net.minecraft.world.level.levelgen.NoiseGeneratorSettings nether(Lnet/minecraft/data/worldgen/BootstrapContext;)Lnet/minecraft/world/level/levelgen/NoiseGeneratorSettings; # nether
-#endgroup
public net.minecraft.world.level.levelgen.feature.featuresize.FeatureSizeType (Lcom/mojang/serialization/MapCodec;)V # constructor
public net.minecraft.world.level.levelgen.feature.foliageplacers.FoliagePlacerType (Lcom/mojang/serialization/MapCodec;)V # constructor
public net.minecraft.world.level.levelgen.feature.rootplacers.RootPlacerType (Lcom/mojang/serialization/MapCodec;)V # constructor
@@ -433,49 +272,6 @@ private-f net.minecraft.world.level.storage.loot.LootPool bonusRolls # bonusRoll
public net.minecraft.server.network.ServerConfigurationPacketListenerImpl finishCurrentTask(Lnet/minecraft/server/network/ConfigurationTask$Type;)V
public com.mojang.blaze3d.vertex.VertexFormatElement$Usage$SetupState
-# Below you will find particle constructor ATs
-protected net.minecraft.client.particle.AttackSweepParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDLnet/minecraft/client/particle/SpriteSet;)V # constructor
-protected net.minecraft.client.particle.BlockMarker (Lnet/minecraft/client/multiplayer/ClientLevel;DDDLnet/minecraft/world/level/block/state/BlockState;)V # constructor
-protected net.minecraft.client.particle.BreakingItemParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/renderer/item/ItemStackRenderState;)V # constructor
-protected net.minecraft.client.particle.BubbleColumnUpParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V # constructor
-protected net.minecraft.client.particle.BubbleParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V # constructor
-protected net.minecraft.client.particle.BubblePopParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V # constructor
-protected net.minecraft.client.particle.CampfireSmokeParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDZ)V # constructor
-protected net.minecraft.client.particle.CritParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V # constructor
-protected net.minecraft.client.particle.DragonBreathParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V # constructor
-protected net.minecraft.client.particle.DripParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDLnet/minecraft/world/level/material/Fluid;)V # constructor
-protected net.minecraft.client.particle.EndRodParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V # constructor
-protected net.minecraft.client.particle.FallingDustParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDFFFLnet/minecraft/client/particle/SpriteSet;)V # constructor
-protected net.minecraft.client.particle.FireworkParticles$OverlayParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDD)V # constructor
-protected net.minecraft.client.particle.FireworkParticles$SparkParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/ParticleEngine;Lnet/minecraft/client/particle/SpriteSet;)V # constructor
-protected net.minecraft.client.particle.FlameParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V # constructor
-protected net.minecraft.client.particle.FlyStraightTowardsParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDII)V # constructor
-protected net.minecraft.client.particle.FlyTowardsPositionParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V # constructor
-protected net.minecraft.client.particle.GlowParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V # constructor
-protected net.minecraft.client.particle.GustSeedParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDII)V # constructor
-protected net.minecraft.client.particle.HeartParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDD)V # constructor
-protected net.minecraft.client.particle.HugeExplosionSeedParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDD)V # constructor
-protected net.minecraft.client.particle.LavaParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDD)V # constructor
-protected net.minecraft.client.particle.MobAppearanceParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDD)V # constructor
-protected net.minecraft.client.particle.NoteParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDD)V # constructor
-protected net.minecraft.client.particle.PlayerCloudParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V # constructor
-protected net.minecraft.client.particle.ReversePortalParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V # constructor
-protected net.minecraft.client.particle.SculkChargeParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V # constructor
-protected net.minecraft.client.particle.SculkChargePopParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V # constructor
-protected net.minecraft.client.particle.ShriekParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDI)V # constructor
-protected net.minecraft.client.particle.SoulParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V # constructor
-protected net.minecraft.client.particle.SpellParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V # constructor
-protected net.minecraft.client.particle.SpitParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V # constructor
-protected net.minecraft.client.particle.SplashParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V # constructor
-protected net.minecraft.client.particle.SquidInkParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDILnet/minecraft/client/particle/SpriteSet;)V # constructor
-protected net.minecraft.client.particle.SuspendedParticle (Lnet/minecraft/client/multiplayer/ClientLevel;Lnet/minecraft/client/particle/SpriteSet;DDD)V # constructor
-protected net.minecraft.client.particle.SuspendedTownParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V # constructor
-protected net.minecraft.client.particle.TotemParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V # constructor
-protected net.minecraft.client.particle.VibrationSignalParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDLnet/minecraft/world/level/gameevent/PositionSource;I)V # constructor
-protected net.minecraft.client.particle.WakeParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V # constructor
-protected net.minecraft.client.particle.WaterCurrentDownParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDD)V # constructor
-# End of particle constructor ATs group
-
# EnchantmentHelper methods needed for adding custom enchantments
public net.minecraft.world.item.enchantment.EnchantmentHelper runIterationOnItem(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/item/enchantment/EnchantmentHelper$EnchantmentVisitor;)V
public net.minecraft.world.item.enchantment.EnchantmentHelper runIterationOnItem(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/entity/EquipmentSlot;Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/item/enchantment/EnchantmentHelper$EnchantmentInSlotVisitor;)V
diff --git a/src/main/resources/META-INF/accesstransformergenerated.cfg b/src/main/resources/META-INF/accesstransformergenerated.cfg
new file mode 100644
index 00000000000..76f5e7fedd5
--- /dev/null
+++ b/src/main/resources/META-INF/accesstransformergenerated.cfg
@@ -0,0 +1,380 @@
+# This file is generated based on the rules defined in the buildscript. DO NOT modify it manually.
+# Add more rules in the buildscript and then run the generateAccessTransformers task to update this file.
+
+# render state shard classes
+public net.minecraft.client.renderer.RenderStateShard$BooleanStateShard
+public net.minecraft.client.renderer.RenderStateShard$ColorLogicStateShard
+public net.minecraft.client.renderer.RenderStateShard$CullStateShard
+public net.minecraft.client.renderer.RenderStateShard$DepthTestStateShard
+public net.minecraft.client.renderer.RenderStateShard$EmptyTextureStateShard
+public net.minecraft.client.renderer.RenderStateShard$LayeringStateShard
+public net.minecraft.client.renderer.RenderStateShard$LightmapStateShard
+public net.minecraft.client.renderer.RenderStateShard$LineStateShard
+public net.minecraft.client.renderer.RenderStateShard$MultiTextureStateShard
+public net.minecraft.client.renderer.RenderStateShard$MultiTextureStateShard$Entry
+public net.minecraft.client.renderer.RenderStateShard$MultiTextureStateShard$Entry (Lnet/minecraft/resources/ResourceLocation;ZZ)V
+public net.minecraft.client.renderer.RenderStateShard$OffsetTexturingStateShard
+public net.minecraft.client.renderer.RenderStateShard$OutputStateShard
+public net.minecraft.client.renderer.RenderStateShard$OverlayStateShard
+public net.minecraft.client.renderer.RenderStateShard$ShaderStateShard
+public net.minecraft.client.renderer.RenderStateShard$TextureStateShard
+public net.minecraft.client.renderer.RenderStateShard$TexturingStateShard
+public net.minecraft.client.renderer.RenderStateShard$TransparencyStateShard
+public net.minecraft.client.renderer.RenderStateShard$WriteMaskStateShard
+
+# render state shards
+public net.minecraft.client.renderer.RenderStateShard ADDITIVE_TRANSPARENCY
+public net.minecraft.client.renderer.RenderStateShard BLOCK_SHEET
+public net.minecraft.client.renderer.RenderStateShard BLOCK_SHEET_MIPPED
+public net.minecraft.client.renderer.RenderStateShard CLOUDS_TARGET
+public net.minecraft.client.renderer.RenderStateShard COLOR_DEPTH_WRITE
+public net.minecraft.client.renderer.RenderStateShard COLOR_WRITE
+public net.minecraft.client.renderer.RenderStateShard CROSSHAIR_TRANSPARENCY
+public net.minecraft.client.renderer.RenderStateShard CRUMBLING_TRANSPARENCY
+public net.minecraft.client.renderer.RenderStateShard CULL
+public net.minecraft.client.renderer.RenderStateShard DEFAULT_LINE
+public net.minecraft.client.renderer.RenderStateShard DEFAULT_TEXTURING
+public net.minecraft.client.renderer.RenderStateShard DEPTH_WRITE
+public net.minecraft.client.renderer.RenderStateShard ENTITY_GLINT_TEXTURING
+public net.minecraft.client.renderer.RenderStateShard EQUAL_DEPTH_TEST
+public net.minecraft.client.renderer.RenderStateShard GLINT_TEXTURING
+public net.minecraft.client.renderer.RenderStateShard GLINT_TRANSPARENCY
+public net.minecraft.client.renderer.RenderStateShard GREATER_DEPTH_TEST
+public net.minecraft.client.renderer.RenderStateShard ITEM_ENTITY_TARGET
+public net.minecraft.client.renderer.RenderStateShard LEQUAL_DEPTH_TEST
+public net.minecraft.client.renderer.RenderStateShard LIGHTMAP
+public net.minecraft.client.renderer.RenderStateShard LIGHTNING_TRANSPARENCY
+public net.minecraft.client.renderer.RenderStateShard MAIN_TARGET
+public net.minecraft.client.renderer.RenderStateShard MOJANG_LOGO_TRANSPARENCY
+public net.minecraft.client.renderer.RenderStateShard NAUSEA_OVERLAY_TRANSPARENCY
+public net.minecraft.client.renderer.RenderStateShard NO_COLOR_LOGIC
+public net.minecraft.client.renderer.RenderStateShard NO_CULL
+public net.minecraft.client.renderer.RenderStateShard NO_DEPTH_TEST
+public net.minecraft.client.renderer.RenderStateShard NO_LAYERING
+public net.minecraft.client.renderer.RenderStateShard NO_LIGHTMAP
+public net.minecraft.client.renderer.RenderStateShard NO_OVERLAY
+public net.minecraft.client.renderer.RenderStateShard NO_SHADER
+public net.minecraft.client.renderer.RenderStateShard NO_TEXTURE
+public net.minecraft.client.renderer.RenderStateShard NO_TRANSPARENCY
+public net.minecraft.client.renderer.RenderStateShard OR_REVERSE_COLOR_LOGIC
+public net.minecraft.client.renderer.RenderStateShard OUTLINE_TARGET
+public net.minecraft.client.renderer.RenderStateShard OVERLAY
+public net.minecraft.client.renderer.RenderStateShard OVERLAY_TRANSPARENCY
+public net.minecraft.client.renderer.RenderStateShard PARTICLES_TARGET
+public net.minecraft.client.renderer.RenderStateShard PARTICLE_SHADER
+public net.minecraft.client.renderer.RenderStateShard POLYGON_OFFSET_LAYERING
+public net.minecraft.client.renderer.RenderStateShard POSITION_COLOR_LIGHTMAP_SHADER
+public net.minecraft.client.renderer.RenderStateShard POSITION_COLOR_SHADER
+public net.minecraft.client.renderer.RenderStateShard POSITION_COLOR_TEX_LIGHTMAP_SHADER
+public net.minecraft.client.renderer.RenderStateShard POSITION_SHADER
+public net.minecraft.client.renderer.RenderStateShard POSITION_TEXTURE_COLOR_SHADER
+public net.minecraft.client.renderer.RenderStateShard POSITION_TEX_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ARMOR_CUTOUT_NO_CULL_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ARMOR_ENTITY_GLINT_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ARMOR_TRANSLUCENT_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_BEACON_BEAM_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_BREEZE_WIND_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_CLOUDS_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_CRUMBLING_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_CUTOUT_MIPPED_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_CUTOUT_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_END_GATEWAY_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_END_PORTAL_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ENERGY_SWIRL_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ENTITY_ALPHA_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ENTITY_CUTOUT_NO_CULL_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ENTITY_CUTOUT_NO_CULL_Z_OFFSET_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ENTITY_CUTOUT_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ENTITY_DECAL_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ENTITY_GLINT_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ENTITY_NO_OUTLINE_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ENTITY_SHADOW_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ENTITY_SMOOTH_CUTOUT_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ENTITY_SOLID_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ENTITY_TRANSLUCENT_EMISSIVE_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ENTITY_TRANSLUCENT_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_EYES_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_GLINT_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_GLINT_TRANSLUCENT_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_GUI_GHOST_RECIPE_OVERLAY_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_GUI_OVERLAY_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_GUI_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_GUI_TEXT_HIGHLIGHT_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ITEM_ENTITY_TRANSLUCENT_CULL_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_LEASH_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_LIGHTNING_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_LINES_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_OUTLINE_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_SOLID_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_TEXT_BACKGROUND_SEE_THROUGH_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_TEXT_BACKGROUND_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_TEXT_INTENSITY_SEE_THROUGH_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_TEXT_INTENSITY_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_TEXT_SEE_THROUGH_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_TEXT_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_TRANSLUCENT_MOVING_BLOCK_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_TRANSLUCENT_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_TRIPWIRE_SHADER
+public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_WATER_MASK_SHADER
+public net.minecraft.client.renderer.RenderStateShard TRANSLUCENT_TARGET
+public net.minecraft.client.renderer.RenderStateShard TRANSLUCENT_TRANSPARENCY
+public net.minecraft.client.renderer.RenderStateShard VIEW_OFFSET_Z_LAYERING
+public net.minecraft.client.renderer.RenderStateShard VIEW_OFFSET_Z_LAYERING_FORWARD
+public net.minecraft.client.renderer.RenderStateShard VIGNETTE_TRANSPARENCY
+public net.minecraft.client.renderer.RenderStateShard WEATHER_TARGET
+public net.minecraft.client.renderer.RenderStateShard WORLD_BORDER_LAYERING
+
+# block constructors
+public net.minecraft.world.level.block.AbstractBannerBlock (Lnet/minecraft/world/item/DyeColor;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.AbstractCandleBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.AbstractChestBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;Ljava/util/function/Supplier;)V
+public net.minecraft.world.level.block.AbstractFurnaceBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.AttachedStemBlock (Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.AzaleaBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.BarrierBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.BaseCoralFanBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.BaseCoralPlantBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.BaseCoralPlantTypeBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.BaseCoralWallFanBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.BaseEntityBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.BasePressurePlateBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;Lnet/minecraft/world/level/block/state/properties/BlockSetType;)V
+public net.minecraft.world.level.block.BaseRailBlock (ZLnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.BaseTorchBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.BigDripleafBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.BigDripleafStemBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.BlastFurnaceBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.BushBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.ButtonBlock (Lnet/minecraft/world/level/block/state/properties/BlockSetType;ILnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.CactusBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.CakeBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.CandleCakeBlock (Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.CartographyTableBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.CarvedPumpkinBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.ChestBlock (Ljava/util/function/Supplier;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.ChorusFlowerBlock (Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.ChorusPlantBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.CoralFanBlock (Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.CoralPlantBlock (Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.CoralWallFanBlock (Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.CraftingTableBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.CreakingHeartBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.CropBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.CrossCollisionBlock (FFFFFLnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.DeadBushBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.DecoratedPotBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.DiodeBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.DirectionalBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.DirtPathBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.DispenserBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.DoorBlock (Lnet/minecraft/world/level/block/state/properties/BlockSetType;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.EnchantingTableBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.EndGatewayBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.EndPortalBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.EndRodBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.EnderChestBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.FaceAttachedHorizontalDirectionalBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.FarmBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.FletchingTableBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.FungusBlock (Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.FurnaceBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.GrindstoneBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.GrowingPlantBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;Lnet/minecraft/core/Direction;Lnet/minecraft/world/phys/shapes/VoxelShape;Z)V
+public net.minecraft.world.level.block.GrowingPlantBodyBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;Lnet/minecraft/core/Direction;Lnet/minecraft/world/phys/shapes/VoxelShape;Z)V
+public net.minecraft.world.level.block.GrowingPlantHeadBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;Lnet/minecraft/core/Direction;Lnet/minecraft/world/phys/shapes/VoxelShape;ZD)V
+public net.minecraft.world.level.block.HalfTransparentBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.HangingRootsBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.HorizontalDirectionalBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.IronBarsBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.JigsawBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.JukeboxBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.KelpBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.KelpPlantBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V
+public net.minecraft.world.level.block.LadderBlock