diff --git a/src/main/java/net/fabricmc/loom/configuration/accesstransformer/AccessTransformerJarProcessor.java b/src/main/java/net/fabricmc/loom/configuration/accesstransformer/AccessTransformerJarProcessor.java index 0c9e5efc..45867942 100644 --- a/src/main/java/net/fabricmc/loom/configuration/accesstransformer/AccessTransformerJarProcessor.java +++ b/src/main/java/net/fabricmc/loom/configuration/accesstransformer/AccessTransformerJarProcessor.java @@ -37,6 +37,8 @@ import java.util.Set; import com.google.common.hash.Hashing; import com.google.common.io.ByteSource; import org.apache.commons.io.output.NullOutputStream; +import org.cadixdev.at.AccessTransformSet; +import org.cadixdev.at.io.AccessTransformFormats; import org.gradle.api.Project; import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.file.FileCollection; @@ -46,10 +48,13 @@ import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.tasks.SourceSet; import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; import net.fabricmc.loom.configuration.processors.JarProcessor; import net.fabricmc.loom.util.Checksum; import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.DependencyDownloader; +import net.fabricmc.lorenztiny.TinyMappingsReader; +import net.fabricmc.mappingio.tree.MemoryMappingTree; public final class AccessTransformerJarProcessor implements JarProcessor { private final Project project; @@ -112,17 +117,18 @@ public final class AccessTransformerJarProcessor implements JarProcessor { @Override public void process(File file) { try { + project.getLogger().lifecycle(":applying project access transformers"); Path tempDir = Files.createTempDirectory("loom-access-transforming"); Path tempInput = tempDir.resolve("input.jar"); Files.copy(file.toPath(), tempInput); + Path atPath = mergeAndRemapAccessTransformers(tempDir); executeAt(project, tempInput, file.toPath(), args -> { - for (File atFile : atFiles) { - args.add("--atFile"); - args.add(atFile.getAbsolutePath()); - } + args.add("--atFile"); + args.add(atPath.toAbsolutePath().toString()); }); + Files.delete(atPath); Files.delete(tempInput); Files.delete(tempDir); } catch (IOException e) { @@ -130,6 +136,35 @@ public final class AccessTransformerJarProcessor implements JarProcessor { } } + private Path mergeAndRemapAccessTransformers(Path tempDir) { + AccessTransformSet accessTransformSet = AccessTransformSet.create(); + + for (File atFile : atFiles) { + try { + accessTransformSet.merge(AccessTransformFormats.FML.read(atFile.toPath())); + } catch (IOException e) { + throw new UncheckedIOException("Could not read access transformer " + atFile, e); + } + } + + try { + MemoryMappingTree mappings = LoomGradleExtension.get(project).getMappingsProvider().getMappingsWithSrg(); + accessTransformSet = accessTransformSet.remap(new TinyMappingsReader(mappings, MappingsNamespace.SRG.toString(), MappingsNamespace.NAMED.toString()).read()); + } catch (IOException e) { + throw new UncheckedIOException("Could not remap access transformers from srg to named", e); + } + + Path accessTransformerPath = tempDir.resolve("accesstransformer.cfg"); + + try { + AccessTransformFormats.FML.write(accessTransformerPath, accessTransformSet); + } catch (IOException e) { + throw new UncheckedIOException("Could not write access transformers to " + accessTransformerPath, e); + } + + return accessTransformerPath; + } + public static void executeAt(Project project, Path input, Path output, AccessTransformerConfiguration configuration) throws IOException { boolean serverBundleMetadataPresent = LoomGradleExtension.get(project).getMinecraftProvider().getServerBundleMetadata() != null; String atDependency = Constants.Dependencies.ACCESS_TRANSFORMERS + (serverBundleMetadataPresent ? Constants.Dependencies.Versions.ACCESS_TRANSFORMERS_NEW : Constants.Dependencies.Versions.ACCESS_TRANSFORMERS); diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/forge/MinecraftPatchedProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/forge/MinecraftPatchedProvider.java index 670fbe05..7f242989 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/forge/MinecraftPatchedProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/forge/MinecraftPatchedProvider.java @@ -110,6 +110,7 @@ public class MinecraftPatchedProvider extends MergedMinecraftProvider { private File minecraftClientExtra; private boolean dirty; + private boolean serverJarInitialized = false; public static MergedMinecraftProvider createMergedMinecraftProvider(Project project) { return LoomGradleExtension.get(project).isForge() ? new MinecraftPatchedProvider(project) : new MergedMinecraftProvider(project); @@ -146,8 +147,13 @@ public class MinecraftPatchedProvider extends MergedMinecraftProvider { minecraftClientExtra = file("forge-client-extra.jar"); } - private File getEffectiveServerJar() { + private File getEffectiveServerJar() throws IOException { if (getServerBundleMetadata() != null) { + if (!serverJarInitialized) { + extractBundledServerJar(); + serverJarInitialized = true; + } + return getMinecraftExtractedServerJar(); } else { return getMinecraftServerJar(); diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/mapped/ProcessedNamedMinecraftProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/mapped/ProcessedNamedMinecraftProvider.java index 658894c1..b0009bcb 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/mapped/ProcessedNamedMinecraftProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/mapped/ProcessedNamedMinecraftProvider.java @@ -100,7 +100,7 @@ public abstract class ProcessedNamedMinecraftProvider= 38 +ordering = "NONE" # Use this if you want your mod to be loaded specifically BEFORE or AFTER another mod +side = "BOTH" # Specify where this mod is required: can be BOTH, CLIENT or SERVER + +# And another dependency, use this if you want to require a certain Minecraft version. +[[dependencies.examplemod]] +modId = "minecraft" +mandatory = true +# See above for how to read this notation, this essentially means any +# version of Minecraft from 1.18 (inclusive). +versionRange = "[1.18,)" +ordering = "NONE" +side = "BOTH" diff --git a/src/test/resources/projects/forge/accessTransformer/src/main/resources/pack.mcmeta b/src/test/resources/projects/forge/accessTransformer/src/main/resources/pack.mcmeta new file mode 100644 index 00000000..e685bfcd --- /dev/null +++ b/src/test/resources/projects/forge/accessTransformer/src/main/resources/pack.mcmeta @@ -0,0 +1,7 @@ +{ + "pack": { + "description": "Resources for examplemod", + "pack_format": 8, + "_comment": "pack_format 8 is the current format for Minecraft 1.18. Be aware may have changed by the time you use this template!" + } +}