diff --git a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java index a7869ac4..457ba7d4 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java +++ b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java @@ -84,6 +84,8 @@ public interface LoomGradleExtension extends LoomGradleExtensionAPI { void setIntermediaryMinecraftProvider(IntermediaryMinecraftProvider intermediaryMinecraftProvider); + MappingsNamespace getProductionNamespaceEnum(); + default List getMinecraftJars(MappingsNamespace mappingsNamespace) { return switch (mappingsNamespace) { case NAMED -> getNamedMinecraftProvider().getMinecraftJarPaths(); diff --git a/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java b/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java index 120a48e2..68d1c169 100644 --- a/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java +++ b/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java @@ -242,6 +242,11 @@ public interface LoomGradleExtensionAPI { */ Property getIntermediaryUrl(); + /** + * @return the production namespace + */ + Property getProductionNamespace(); + @ApiStatus.Experimental Property> getMinecraftJarConfiguration(); diff --git a/src/main/java/net/fabricmc/loom/api/processor/MappingProcessorContext.java b/src/main/java/net/fabricmc/loom/api/processor/MappingProcessorContext.java index ff2d3fca..d3a2eeb1 100644 --- a/src/main/java/net/fabricmc/loom/api/processor/MappingProcessorContext.java +++ b/src/main/java/net/fabricmc/loom/api/processor/MappingProcessorContext.java @@ -30,4 +30,6 @@ import net.fabricmc.tinyremapper.TinyRemapper; public interface MappingProcessorContext { LazyCloseable createRemapper(MappingsNamespace from, MappingsNamespace to); + + MappingsNamespace getProductionNamespace(); } diff --git a/src/main/java/net/fabricmc/loom/api/processor/ProcessorContext.java b/src/main/java/net/fabricmc/loom/api/processor/ProcessorContext.java index f0b2403d..756beaba 100644 --- a/src/main/java/net/fabricmc/loom/api/processor/ProcessorContext.java +++ b/src/main/java/net/fabricmc/loom/api/processor/ProcessorContext.java @@ -44,4 +44,6 @@ public interface ProcessorContext { MemoryMappingTree getMappings(); boolean disableObfuscation(); + + MappingsNamespace getProductionNamespace(); } diff --git a/src/main/java/net/fabricmc/loom/api/processor/SpecContext.java b/src/main/java/net/fabricmc/loom/api/processor/SpecContext.java index 0469d869..51924e8b 100644 --- a/src/main/java/net/fabricmc/loom/api/processor/SpecContext.java +++ b/src/main/java/net/fabricmc/loom/api/processor/SpecContext.java @@ -31,6 +31,7 @@ import java.util.stream.Stream; import org.gradle.api.Project; import org.gradle.api.plugins.JavaPlugin; +import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; import net.fabricmc.loom.configuration.processors.speccontext.ProjectView; import net.fabricmc.loom.util.fmj.FabricModJson; @@ -52,6 +53,8 @@ public interface SpecContext { */ List modDependenciesCompileRuntimeClient(); + MappingsNamespace productionNamespace(); + default List allMods() { return Stream.concat(modDependencies().stream(), localMods().stream()).toList(); } diff --git a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java index c551b2da..901c1337 100644 --- a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java +++ b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java @@ -53,6 +53,7 @@ import org.gradle.api.tasks.javadoc.Javadoc; import org.gradle.api.tasks.testing.Test; import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; import net.fabricmc.loom.api.InterfaceInjectionExtensionAPI; import net.fabricmc.loom.build.mixin.GroovyApInvoker; import net.fabricmc.loom.build.mixin.JavaApInvoker; @@ -74,6 +75,7 @@ import net.fabricmc.loom.configuration.providers.minecraft.mapped.NamedMinecraft import net.fabricmc.loom.extension.MixinExtension; import net.fabricmc.loom.task.service.ClasspathGroupService; import net.fabricmc.loom.util.Checksum; +import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.ExceptionUtil; import net.fabricmc.loom.util.ProcessUtil; import net.fabricmc.loom.util.gradle.GradleUtils; @@ -172,6 +174,14 @@ public abstract class CompileConfiguration implements Runnable { final MinecraftMetadataProvider metadataProvider = MinecraftMetadataProvider.create(configContext); extension.setMetadataProvider(metadataProvider); + if (metadataProvider.getVersionMeta().isVersionOrNewer(Constants.RELEASE_TIME_1_21_11_UNOBFUSCATED_SNAPSHOTS) && !metadataProvider.getVersionMeta().downloads().containsKey("client_mappings")) { + extension.getProductionNamespace().convention(MappingsNamespace.OFFICIAL.toString()); + } else { + extension.getProductionNamespace().convention(MappingsNamespace.INTERMEDIARY.toString()); + } + + extension.getProductionNamespace().finalizeValue(); + var jarConfiguration = extension.getMinecraftJarConfiguration().get(); // Provide the vanilla mc jars diff --git a/src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerEntry.java b/src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerEntry.java index 4e914816..1b279cd0 100644 --- a/src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerEntry.java +++ b/src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerEntry.java @@ -28,6 +28,7 @@ import java.io.IOException; import org.jspecify.annotations.Nullable; +import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; import net.fabricmc.classtweaker.api.visitor.ClassTweakerVisitor; import net.fabricmc.loom.util.LazyCloseable; import net.fabricmc.loom.util.fmj.ModEnvironment; @@ -44,7 +45,7 @@ public interface AccessWidenerEntry { String getSortKey(); - void read(ClassTweakerVisitor visitor, LazyCloseable remapper) throws IOException; + void read(ClassTweakerVisitor visitor, LazyCloseable remapper, MappingsNamespace productionNamespace) throws IOException; void readOfficial(ClassTweakerVisitor visitor) throws IOException; } diff --git a/src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerJarProcessor.java b/src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerJarProcessor.java index a0a2c637..06886fff 100644 --- a/src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerJarProcessor.java +++ b/src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerJarProcessor.java @@ -147,9 +147,9 @@ public class AccessWidenerJarProcessor implements MinecraftJarProcessor remapper = context.createRemapper(MappingsNamespace.INTERMEDIARY, MappingsNamespace.NAMED)) { + try (LazyCloseable remapper = context.createRemapper(context.getProductionNamespace(), MappingsNamespace.NAMED)) { for (AccessWidenerEntry widener : accessWideners) { - widener.read(classTweaker, remapper); + widener.read(classTweaker, remapper, context.getProductionNamespace()); } } diff --git a/src/main/java/net/fabricmc/loom/configuration/accesswidener/LocalAccessWidenerEntry.java b/src/main/java/net/fabricmc/loom/configuration/accesswidener/LocalAccessWidenerEntry.java index 06cadb5a..b4b1794c 100644 --- a/src/main/java/net/fabricmc/loom/configuration/accesswidener/LocalAccessWidenerEntry.java +++ b/src/main/java/net/fabricmc/loom/configuration/accesswidener/LocalAccessWidenerEntry.java @@ -44,7 +44,7 @@ public record LocalAccessWidenerEntry(Path path, String hash) implements AccessW } @Override - public void read(ClassTweakerVisitor visitor, LazyCloseable remapper) throws IOException { + public void read(ClassTweakerVisitor visitor, LazyCloseable remapper, MappingsNamespace productionNamespace) throws IOException { var reader = ClassTweakerReader.create(visitor); reader.read(Files.readAllBytes(path), null); } diff --git a/src/main/java/net/fabricmc/loom/configuration/accesswidener/ModAccessWidenerEntry.java b/src/main/java/net/fabricmc/loom/configuration/accesswidener/ModAccessWidenerEntry.java index 5a218f2f..e8e083b1 100644 --- a/src/main/java/net/fabricmc/loom/configuration/accesswidener/ModAccessWidenerEntry.java +++ b/src/main/java/net/fabricmc/loom/configuration/accesswidener/ModAccessWidenerEntry.java @@ -67,7 +67,7 @@ public record ModAccessWidenerEntry(FabricModJson mod, String path, ModEnvironme } @Override - public void read(ClassTweakerVisitor visitor, LazyCloseable remapper) throws IOException { + public void read(ClassTweakerVisitor visitor, LazyCloseable remapper, MappingsNamespace productionNamespace) throws IOException { if (transitiveOnly) { // Filter for only transitive rules visitor = new TransitiveOnlyFilter(visitor); @@ -78,7 +78,7 @@ public record ModAccessWidenerEntry(FabricModJson mod, String path, ModEnvironme if (!header.getNamespace().equals(MappingsNamespace.NAMED.toString())) { // Remap the AW if needed - visitor = getRemapper(visitor, remapper.get()); + visitor = getRemapper(visitor, remapper.get(), productionNamespace); } var reader = ClassTweakerReader.create(visitor); @@ -103,11 +103,11 @@ public record ModAccessWidenerEntry(FabricModJson mod, String path, ModEnvironme reader.read(data, mod.getId()); } - private static ClassTweakerRemapperVisitor getRemapper(ClassTweakerVisitor visitor, TinyRemapper tinyRemapper) { + private static ClassTweakerRemapperVisitor getRemapper(ClassTweakerVisitor visitor, TinyRemapper tinyRemapper, MappingsNamespace productionNamespace) { return new ClassTweakerRemapperVisitor( visitor, tinyRemapper.getEnvironment().getRemapper(), - MappingsNamespace.INTERMEDIARY.toString(), + productionNamespace.toString(), MappingsNamespace.NAMED.toString() ); } diff --git a/src/main/java/net/fabricmc/loom/configuration/accesswidener/TransitiveAccessWidenerMappingsProcessor.java b/src/main/java/net/fabricmc/loom/configuration/accesswidener/TransitiveAccessWidenerMappingsProcessor.java index 1df5cbc4..40f20762 100644 --- a/src/main/java/net/fabricmc/loom/configuration/accesswidener/TransitiveAccessWidenerMappingsProcessor.java +++ b/src/main/java/net/fabricmc/loom/configuration/accesswidener/TransitiveAccessWidenerMappingsProcessor.java @@ -59,14 +59,14 @@ public final class TransitiveAccessWidenerMappingsProcessor implements Minecraft return false; } - if (!MappingsNamespace.INTERMEDIARY.toString().equals(mappings.getSrcNamespace())) { - throw new IllegalStateException("Mapping tree must have intermediary src mappings not " + mappings.getSrcNamespace()); + if (!context.getProductionNamespace().toString().equals(mappings.getSrcNamespace())) { + throw new IllegalStateException("Mapping tree must have " + context.getProductionNamespace().toString() + " src mappings not " + mappings.getSrcNamespace()); } - try (LazyCloseable remapper = context.createRemapper(MappingsNamespace.INTERMEDIARY, MappingsNamespace.NAMED)) { + try (LazyCloseable remapper = context.createRemapper(context.getProductionNamespace(), MappingsNamespace.NAMED)) { for (AccessWidenerEntry accessWidener : accessWideners) { var visitor = new MappingCommentClassTweakerVisitor(accessWidener.mappingId(), mappings); - accessWidener.read(visitor, remapper); + accessWidener.read(visitor, remapper, context.getProductionNamespace()); } } catch (IOException e) { throw new UncheckedIOException("Failed to transform access widener mappings", e); diff --git a/src/main/java/net/fabricmc/loom/configuration/ifaceinject/InterfaceInjectionProcessor.java b/src/main/java/net/fabricmc/loom/configuration/ifaceinject/InterfaceInjectionProcessor.java index 4333a418..67050399 100644 --- a/src/main/java/net/fabricmc/loom/configuration/ifaceinject/InterfaceInjectionProcessor.java +++ b/src/main/java/net/fabricmc/loom/configuration/ifaceinject/InterfaceInjectionProcessor.java @@ -125,12 +125,12 @@ public abstract class InterfaceInjectionProcessor implements MinecraftJarProcess return spec.injectedInterfaces(); } - // Remap from intermediary->named + // Remap from productionNamespace->named final MemoryMappingTree mappings = context.getMappings(); - final int intermediaryIndex = mappings.getNamespaceId(MappingsNamespace.INTERMEDIARY.toString()); + final int productionIndex = mappings.getNamespaceId(context.getProductionNamespace().toString()); final int namedIndex = mappings.getNamespaceId(MappingsNamespace.NAMED.toString()); - try (LazyCloseable tinyRemapper = context.createRemapper(MappingsNamespace.INTERMEDIARY, MappingsNamespace.NAMED)) { + try (LazyCloseable tinyRemapper = context.createRemapper(context.getProductionNamespace(), MappingsNamespace.NAMED)) { final List remappedInjectedInterfaces = spec.injectedInterfaces().stream() .filter(injectedInterface -> { return context.includesClient() // The client jar depends on the server, so always apply all to it @@ -138,7 +138,7 @@ public abstract class InterfaceInjectionProcessor implements MinecraftJarProcess }) .map(injectedInterface -> remap( injectedInterface, - s -> mappings.mapClassName(s, intermediaryIndex, namedIndex), + s -> mappings.mapClassName(s, productionIndex, namedIndex), tinyRemapper.get().getEnvironment().getRemapper() )) .toList(); diff --git a/src/main/java/net/fabricmc/loom/configuration/mods/AccessWidenerUtils.java b/src/main/java/net/fabricmc/loom/configuration/mods/AccessWidenerUtils.java index 8b2cb86d..3ebf7834 100644 --- a/src/main/java/net/fabricmc/loom/configuration/mods/AccessWidenerUtils.java +++ b/src/main/java/net/fabricmc/loom/configuration/mods/AccessWidenerUtils.java @@ -33,7 +33,6 @@ import org.objectweb.asm.commons.Remapper; import net.fabricmc.classtweaker.api.ClassTweakerReader; import net.fabricmc.classtweaker.api.ClassTweakerWriter; import net.fabricmc.classtweaker.visitors.ClassTweakerRemapperVisitor; -import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; import net.fabricmc.loom.util.fmj.FabricModJson; import net.fabricmc.loom.util.fmj.FabricModJsonFactory; @@ -41,15 +40,15 @@ public class AccessWidenerUtils { /** * Remap a mods access widener from intermediary to named, so that loader can apply it in our dev-env. */ - public static byte[] remapAccessWidener(byte[] input, Remapper remapper) { + public static byte[] remapAccessWidener(byte[] input, Remapper remapper, String fromNamespace, String toNamespace) { int version = ClassTweakerReader.readVersion(input); ClassTweakerWriter writer = ClassTweakerWriter.create(version); ClassTweakerRemapperVisitor awRemapper = new ClassTweakerRemapperVisitor( writer, remapper, - MappingsNamespace.INTERMEDIARY.toString(), - MappingsNamespace.NAMED.toString() + fromNamespace, + toNamespace ); ClassTweakerReader reader = ClassTweakerReader.create(awRemapper); reader.read(input, null); // TODO pass modid diff --git a/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java b/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java index 603e5362..28385f8b 100644 --- a/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java +++ b/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java @@ -71,7 +71,6 @@ import net.fabricmc.tinyremapper.OutputConsumerPath; import net.fabricmc.tinyremapper.TinyRemapper; public class ModProcessor { - private static final String fromM = MappingsNamespace.INTERMEDIARY.toString(); private static final String toM = MappingsNamespace.NAMED.toString(); private static final Logger LOGGER = LoggerFactory.getLogger(ModProcessor.class); @@ -140,6 +139,8 @@ public class ModProcessor { final LoomGradleExtension extension = LoomGradleExtension.get(project); final MappingConfiguration mappingConfiguration = extension.getMappingConfiguration(); + MappingsNamespace productionNamespace = extension.getProductionNamespaceEnum(); + Set knownIndyBsms = new HashSet<>(extension.getKnownIndyBsms().get()); for (ModDependency modDependency : remapList) { @@ -148,9 +149,9 @@ public class ModProcessor { TinyRemapper.Builder builder = TinyRemapper.newRemapper(TinyRemapperLoggerAdapter.INSTANCE) .withKnownIndyBsm(knownIndyBsms) - .withMappings(TinyRemapperHelper.create(mappingConfiguration.getMappingsService(project, serviceFactory).getMappingTree(), fromM, toM, false)) + .withMappings(TinyRemapperHelper.create(mappingConfiguration.getMappingsService(project, serviceFactory).getMappingTree(), productionNamespace.toString(), toM, false)) .renameInvalidLocals(false) - .extraAnalyzeVisitor(AccessWidenerAnalyzeVisitorProvider.createFromMods(fromM, remapList)); + .extraAnalyzeVisitor(AccessWidenerAnalyzeVisitorProvider.createFromMods(productionNamespace.toString(), remapList)); final KotlinClasspathService kotlinClasspathService = serviceFactory.getOrNull(KotlinClasspathService.createOptions(project)); KotlinRemapperClassloader kotlinRemapperClassloader = null; @@ -164,7 +165,7 @@ public class ModProcessor { final List activeExtensions = ModProcessorExtension.EXTENSIONS.stream() .filter(e -> remapList.stream().anyMatch(e::appliesTo)) .toList(); - final ModProcessorExtension.Context context = new ModProcessorExtension.Context(fromM, toM, remapList); + final ModProcessorExtension.Context context = new ModProcessorExtension.Context(productionNamespace.toString(), toM, remapList); for (ModProcessorExtension modProcessorExtension : activeExtensions) { LOGGER.info("Applying mod processor extension: {}", modProcessorExtension.getClass().getSimpleName()); @@ -178,12 +179,12 @@ public class ModProcessor { } for (RemapperExtensionHolder holder : extension.getRemapperExtensions().get()) { - holder.apply(builder, fromM, toM); + holder.apply(builder, productionNamespace.toString(), toM); } final TinyRemapper remapper = builder.build(); - remapper.readClassPath(extension.getMinecraftJars(MappingsNamespace.INTERMEDIARY).toArray(Path[]::new)); + remapper.readClassPath(extension.getMinecraftJars(productionNamespace).toArray(Path[]::new)); final Map outputConsumerMap = new HashMap<>(); final Map> accessWidenerMap = new HashMap<>(); @@ -220,7 +221,7 @@ public class ModProcessor { if (accessWidenerData != null) { LOGGER.debug("Remapping access widener in {}", dependency.getInputFile()); - byte[] remappedAw = AccessWidenerUtils.remapAccessWidener(accessWidenerData.content(), remapper.getEnvironment().getRemapper()); + byte[] remappedAw = AccessWidenerUtils.remapAccessWidener(accessWidenerData.content(), remapper.getEnvironment().getRemapper(), productionNamespace.toString(), toM); accessWidenerMap.put(dependency, new Pair<>(remappedAw, accessWidenerData.path())); } diff --git a/src/main/java/net/fabricmc/loom/configuration/processors/ContextImplHelper.java b/src/main/java/net/fabricmc/loom/configuration/processors/ContextImplHelper.java index 87c70445..ada21edc 100644 --- a/src/main/java/net/fabricmc/loom/configuration/processors/ContextImplHelper.java +++ b/src/main/java/net/fabricmc/loom/configuration/processors/ContextImplHelper.java @@ -43,7 +43,7 @@ public final class ContextImplHelper { try { TinyRemapper tinyRemapper = TinyRemapperHelper.getTinyRemapper(configContext.project(), configContext.serviceFactory(), from.toString(), to.toString()); - for (Path minecraftJar : configContext.extension().getMinecraftJars(MappingsNamespace.INTERMEDIARY)) { + for (Path minecraftJar : configContext.extension().getMinecraftJars(from)) { tinyRemapper.readClassPath(minecraftJar); } diff --git a/src/main/java/net/fabricmc/loom/configuration/processors/MappingProcessorContextImpl.java b/src/main/java/net/fabricmc/loom/configuration/processors/MappingProcessorContextImpl.java index 6a1ba3a5..2845ee63 100644 --- a/src/main/java/net/fabricmc/loom/configuration/processors/MappingProcessorContextImpl.java +++ b/src/main/java/net/fabricmc/loom/configuration/processors/MappingProcessorContextImpl.java @@ -35,4 +35,9 @@ public record MappingProcessorContextImpl(ConfigContext configContext) implement public LazyCloseable createRemapper(MappingsNamespace from, MappingsNamespace to) { return ContextImplHelper.createRemapper(configContext, from, to); } + + @Override + public MappingsNamespace getProductionNamespace() { + return configContext().extension().getProductionNamespaceEnum(); + } } diff --git a/src/main/java/net/fabricmc/loom/configuration/processors/ModJavadocProcessor.java b/src/main/java/net/fabricmc/loom/configuration/processors/ModJavadocProcessor.java index 21261936..5a5a1977 100644 --- a/src/main/java/net/fabricmc/loom/configuration/processors/ModJavadocProcessor.java +++ b/src/main/java/net/fabricmc/loom/configuration/processors/ModJavadocProcessor.java @@ -80,7 +80,7 @@ public abstract class ModJavadocProcessor implements MinecraftJarProcessor javadocs = new ArrayList<>(); for (FabricModJson fabricModJson : context.allMods()) { - ModJavadoc javadoc = ModJavadoc.create(fabricModJson); + ModJavadoc javadoc = ModJavadoc.create(fabricModJson, context.productionNamespace()); if (javadoc != null) { javadocs.add(javadoc); @@ -116,7 +116,7 @@ public abstract class ModJavadocProcessor implements MinecraftJarProcessor fallbackNamespaceReplacements = Map.of( - MappingUtil.NS_SOURCE_FALLBACK, MappingsNamespace.INTERMEDIARY.toString(), + MappingUtil.NS_SOURCE_FALLBACK, productionNamespace.toString(), MappingUtil.NS_TARGET_FALLBACK, MappingsNamespace.NAMED.toString() ); final MappingNsRenamer renamer = new MappingNsRenamer(mappings, fallbackNamespaceReplacements); @@ -148,8 +148,8 @@ public abstract class ModJavadocProcessor implements MinecraftJarProcessor modDependencies, copy.removeAll(right); return copy; } + + @Override + public MappingsNamespace productionNamespace() { + return MappingsNamespace.OFFICIAL; + } } diff --git a/src/main/java/net/fabricmc/loom/configuration/processors/speccontext/RemappedProjectView.java b/src/main/java/net/fabricmc/loom/configuration/processors/speccontext/RemappedProjectView.java index d9bdf882..ba0915ea 100644 --- a/src/main/java/net/fabricmc/loom/configuration/processors/speccontext/RemappedProjectView.java +++ b/src/main/java/net/fabricmc/loom/configuration/processors/speccontext/RemappedProjectView.java @@ -35,6 +35,7 @@ import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; import org.gradle.api.attributes.Usage; +import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; import net.fabricmc.loom.api.RemapConfigurationSettings; public interface RemappedProjectView extends ProjectView { @@ -46,6 +47,8 @@ public interface RemappedProjectView extends ProjectView { List getRuntimeRemapConfigurations(); + MappingsNamespace getProductionNamespace(); + class Impl extends AbstractProjectView implements RemappedProjectView { public Impl(Project project) { super(project); @@ -77,5 +80,10 @@ public interface RemappedProjectView extends ProjectView { public List getRuntimeRemapConfigurations() { return extension.getRuntimeRemapConfigurations(); } + + @Override + public MappingsNamespace getProductionNamespace() { + return extension.getProductionNamespaceEnum(); + } } } diff --git a/src/main/java/net/fabricmc/loom/configuration/processors/speccontext/RemappedSpecContext.java b/src/main/java/net/fabricmc/loom/configuration/processors/speccontext/RemappedSpecContext.java index 61db8d16..00aec308 100644 --- a/src/main/java/net/fabricmc/loom/configuration/processors/speccontext/RemappedSpecContext.java +++ b/src/main/java/net/fabricmc/loom/configuration/processors/speccontext/RemappedSpecContext.java @@ -42,6 +42,7 @@ import org.gradle.api.plugins.JavaPlugin; import org.jspecify.annotations.Nullable; import org.jetbrains.annotations.VisibleForTesting; +import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; import net.fabricmc.loom.api.RemapConfigurationSettings; import net.fabricmc.loom.api.processor.SpecContext; import net.fabricmc.loom.configuration.providers.minecraft.MinecraftSourceSets; @@ -58,7 +59,8 @@ import net.fabricmc.loom.util.fmj.FabricModJsonHelpers; public record RemappedSpecContext( List modDependencies, List localMods, - List compileRuntimeMods) implements SpecContext { + List compileRuntimeMods, + MappingsNamespace productionNamespace) implements SpecContext { public static RemappedSpecContext create(Project project) { return create(new RemappedProjectView.Impl(project)); } @@ -69,7 +71,8 @@ public record RemappedSpecContext( return new RemappedSpecContext( getDependentMods(projectView, fmjCache), projectView.getMods(), - getCompileRuntimeMods(projectView, fmjCache) + getCompileRuntimeMods(projectView, fmjCache), + projectView.getProductionNamespace() ); } diff --git a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java index 0b894722..48cb1a52 100644 --- a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java +++ b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java @@ -95,6 +95,7 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA protected final Property modProvidedJavadoc; protected final Property intermediary; protected final Property intermediateMappingsProvider; + private final Property productionNamespace; private final Property runtimeOnlyLog4j; private final Property splitModDependencies; private final Property> minecraftJarConfiguration; @@ -139,6 +140,8 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA this.modProvidedJavadoc.finalizeValueOnRead(); this.intermediary = project.getObjects().property(String.class) .convention(DEFAULT_INTERMEDIARY_URL); + this.productionNamespace = project.getObjects().property(String.class); + this.productionNamespace.finalizeValueOnRead(); this.intermediateMappingsProvider = project.getObjects().property(IntermediateMappingsProvider.class); this.intermediateMappingsProvider.finalizeValueOnRead(); @@ -341,6 +344,11 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA return intermediary; } + @Override + public Property getProductionNamespace() { + return productionNamespace; + } + @Override public IntermediateMappingsProvider getIntermediateMappingsProvider() { if (LoomGradleExtension.get(getProject()).disableObfuscation()) { diff --git a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionImpl.java b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionImpl.java index 23542e77..bad52036 100644 --- a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionImpl.java +++ b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionImpl.java @@ -345,6 +345,11 @@ public abstract class LoomGradleExtensionImpl extends LoomGradleExtensionApiImpl return disableObfuscation.get(); } + @Override + public MappingsNamespace getProductionNamespaceEnum() { + return Objects.requireNonNull(MappingsNamespace.of(getProductionNamespace().get()), "Invalid production namespace"); + } + @Override public void nestJars(TaskProvider jarTask, FileCollection jars) { jarTask.configure(task -> { diff --git a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java index 0fe1784f..0c0fa39d 100644 --- a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java +++ b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java @@ -99,16 +99,19 @@ public abstract class RemapJarTask extends AbstractRemapJarTask { @Inject public RemapJarTask() { super(); + LoomGradleExtension extension = LoomGradleExtension.get(getProject()); final ConfigurationContainer configurations = getProject().getConfigurations(); getClasspath().from(configurations.getByName(JavaPlugin.COMPILE_CLASSPATH_CONFIGURATION_NAME)); getAddNestedDependencies().convention(true).finalizeValueOnRead(); getOptimizeFabricModJson().convention(false).finalizeValueOnRead(); + getTargetNamespace().set(extension.getProductionNamespace()); + TaskProvider processIncludeJars = getProject().getTasks().named(Constants.Task.PROCESS_INCLUDE_JARS, NestableJarGenerationTask.class); getNestedJars().from(processIncludeJars.map(task -> getProject().fileTree(task.getOutputDirectory()))); getNestedJars().builtBy(processIncludeJars); - getUseMixinAP().set(LoomGradleExtension.get(getProject()).getMixin().getUseLegacyMixinAp()); + getUseMixinAP().set(extension.getMixin().getUseLegacyMixinAp()); // Make outputs reproducible by default setReproducibleFileOrder(true); diff --git a/src/main/java/net/fabricmc/loom/task/launch/GenerateDLIConfigTask.java b/src/main/java/net/fabricmc/loom/task/launch/GenerateDLIConfigTask.java index 8e04873a..a55e3d94 100644 --- a/src/main/java/net/fabricmc/loom/task/launch/GenerateDLIConfigTask.java +++ b/src/main/java/net/fabricmc/loom/task/launch/GenerateDLIConfigTask.java @@ -88,6 +88,9 @@ public abstract class GenerateDLIConfigTask extends AbstractLoomTask { @Input protected abstract Property getNativesDirectoryPath(); + @Input + protected abstract Property getProductionNamespace(); + @InputFile @Optional public abstract RegularFileProperty getRemapClasspathFile(); @@ -116,6 +119,7 @@ public abstract class GenerateDLIConfigTask extends AbstractLoomTask { getAssetsDirectoryPath().set(new File(getExtension().getFiles().getUserCache(), "assets").getAbsolutePath()); getNativesDirectoryPath().set(getExtension().getFiles().getNativesDirectory(getProject()).getAbsolutePath()); getDevLauncherConfig().set(getExtension().getFiles().getDevLauncherConfig()); + getProductionNamespace().set(getExtension().getProductionNamespaceEnum().toString()); } @TaskAction @@ -131,6 +135,7 @@ public abstract class GenerateDLIConfigTask extends AbstractLoomTask { .property("fabric.development", "true") .property("log4j.configurationFile", getLog4jConfigPaths().get()) .property("log4j2.formatMsgNoLookups", "true") + .property("fabric.defaultModDistributionNamespace", getProductionNamespace().get()) .argument("client", "--assetIndex") .argument("client", versionInfo.assetIndex().fabricId(getMinecraftVersion().get())) diff --git a/src/main/java/net/fabricmc/loom/task/launch/GenerateRemapClasspathTask.java b/src/main/java/net/fabricmc/loom/task/launch/GenerateRemapClasspathTask.java index 8a9263a1..87449cf0 100644 --- a/src/main/java/net/fabricmc/loom/task/launch/GenerateRemapClasspathTask.java +++ b/src/main/java/net/fabricmc/loom/task/launch/GenerateRemapClasspathTask.java @@ -40,7 +40,6 @@ import org.gradle.api.tasks.OutputFile; import org.gradle.api.tasks.TaskAction; import net.fabricmc.loom.api.RemapConfigurationSettings; -import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; import net.fabricmc.loom.task.AbstractLoomTask; import net.fabricmc.loom.util.Constants; @@ -60,7 +59,7 @@ public abstract class GenerateRemapClasspathTask extends AbstractLoomTask { .map(configurations::named) .forEach(getRemapClasspath()::from); - for (Path minecraftJar : getExtension().getMinecraftJars(MappingsNamespace.INTERMEDIARY)) { + for (Path minecraftJar : getExtension().getMinecraftJars(getExtension().getProductionNamespaceEnum())) { getRemapClasspath().from(minecraftJar.toFile()); } diff --git a/src/main/java/net/fabricmc/loom/task/prod/ClientProductionRunTask.java b/src/main/java/net/fabricmc/loom/task/prod/ClientProductionRunTask.java index 6a8ff514..bf0d0086 100644 --- a/src/main/java/net/fabricmc/loom/task/prod/ClientProductionRunTask.java +++ b/src/main/java/net/fabricmc/loom/task/prod/ClientProductionRunTask.java @@ -39,6 +39,7 @@ import org.gradle.api.tasks.Optional; import org.gradle.process.ExecSpec; import org.jetbrains.annotations.ApiStatus; +import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.Platform; @@ -99,7 +100,11 @@ public abstract non-sealed class ClientProductionRunTask extends AbstractProduct getClasspath().from(getExtension().getMinecraftProvider().getMinecraftClientJar()); getClasspath().from(detachedConfigurationProvider("net.fabricmc:fabric-loader:%s", getProjectLoaderVersion())); - getClasspath().from(detachedConfigurationProvider("net.fabricmc:intermediary:%s", getExtension().getMinecraftVersion())); + + if (getExtension().getProductionNamespaceEnum() == MappingsNamespace.INTERMEDIARY) { + getClasspath().from(detachedConfigurationProvider("net.fabricmc:intermediary:%s", getExtension().getMinecraftVersion())); + } + getClasspath().from(getProject().getConfigurations().named(Constants.Configurations.MINECRAFT_TEST_CLIENT_RUNTIME_LIBRARIES)); dependsOn("downloadAssets"); diff --git a/src/main/java/net/fabricmc/loom/util/Constants.java b/src/main/java/net/fabricmc/loom/util/Constants.java index 8565c59f..89a38a9b 100644 --- a/src/main/java/net/fabricmc/loom/util/Constants.java +++ b/src/main/java/net/fabricmc/loom/util/Constants.java @@ -35,6 +35,7 @@ public class Constants { public static final String FABRIC_REPOSITORY = "https://maven.fabricmc.net/"; public static final int ASM_VERSION = Opcodes.ASM9; + public static final String RELEASE_TIME_1_21_11_UNOBFUSCATED_SNAPSHOTS = "2025-11-01T00:00:00+00:00"; public static final String RELEASE_TIME_1_3 = "2012-07-25T22:00:00+00:00"; public static final String RELEASE_TIME_BETA_1_0 = "2010-12-19T22:00:00+00:00"; diff --git a/src/main/java/net/fabricmc/loom/util/SourceRemapper.java b/src/main/java/net/fabricmc/loom/util/SourceRemapper.java index 6c54bab0..0da65dd1 100644 --- a/src/main/java/net/fabricmc/loom/util/SourceRemapper.java +++ b/src/main/java/net/fabricmc/loom/util/SourceRemapper.java @@ -166,8 +166,8 @@ public class SourceRemapper { LorenzMappingService lorenzMappingService = serviceFactory.get(LorenzMappingService.createOptions( project, mappingConfiguration, - toNamed ? MappingsNamespace.INTERMEDIARY : MappingsNamespace.NAMED, - toNamed ? MappingsNamespace.NAMED : MappingsNamespace.INTERMEDIARY)); + toNamed ? extension.getProductionNamespaceEnum() : MappingsNamespace.NAMED, + toNamed ? MappingsNamespace.NAMED : extension.getProductionNamespaceEnum())); MappingSet mappings = lorenzMappingService.getMappings(); Mercury mercury = createMercuryWithClassPath(project, toNamed); @@ -182,8 +182,8 @@ public class SourceRemapper { } } - for (Path intermediaryJar : extension.getMinecraftJars(MappingsNamespace.INTERMEDIARY)) { - mercury.getClassPath().add(intermediaryJar); + for (Path productionJar : extension.getMinecraftJars(extension.getProductionNamespaceEnum())) { + mercury.getClassPath().add(productionJar); } for (Path intermediaryJar : extension.getMinecraftJars(MappingsNamespace.NAMED)) { diff --git a/src/test/groovy/net/fabricmc/loom/test/unit/processor/InterfaceInjectionProcessorTest.groovy b/src/test/groovy/net/fabricmc/loom/test/unit/processor/InterfaceInjectionProcessorTest.groovy index 75da7cf5..d868868a 100644 --- a/src/test/groovy/net/fabricmc/loom/test/unit/processor/InterfaceInjectionProcessorTest.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/unit/processor/InterfaceInjectionProcessorTest.groovy @@ -74,9 +74,11 @@ class InterfaceInjectionProcessorTest extends Specification { specContext.localMods() >> [fmj] specContext.modDependenciesCompileRuntime() >> [] specContext.modDependenciesCompileRuntimeClient() >> [] + specContext.productionNamespace() >> MappingsNamespace.INTERMEDIARY def processorContext = Mock(ProcessorContext) processorContext.getMappings() >> createMappings() + processorContext.getProductionNamespace() >> MappingsNamespace.INTERMEDIARY def jar = tempDir.resolve("test.jar") packageJar(jar)