From 9e345b6382e84c7fea1658996057bd965d27c185 Mon Sep 17 00:00:00 2001 From: Technici4n <13494793+Technici4n@users.noreply.github.com> Date: Sun, 17 Aug 2025 20:16:23 +0200 Subject: [PATCH] Fix #188: Also add NeoForm dependencies to the artifact manifest, without NeoForge's overrides --- .../internal/ModDevArtifactsWorkflow.java | 15 +++++++++ .../moddevgradle/internal/ModDevPlugin.java | 2 ++ .../internal/NeoForgeMetadataRule.java | 33 +++++++++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 src/main/java/net/neoforged/moddevgradle/internal/NeoForgeMetadataRule.java diff --git a/src/main/java/net/neoforged/moddevgradle/internal/ModDevArtifactsWorkflow.java b/src/main/java/net/neoforged/moddevgradle/internal/ModDevArtifactsWorkflow.java index f5a14cc3..77bb5eda 100644 --- a/src/main/java/net/neoforged/moddevgradle/internal/ModDevArtifactsWorkflow.java +++ b/src/main/java/net/neoforged/moddevgradle/internal/ModDevArtifactsWorkflow.java @@ -296,6 +296,21 @@ private static List configureArtifactManifestConfigurations( }); result.add(compileClasspath); + if (moddingPlatformDependency != null) { + var compileClasspath2 = configurations.create(configurationPrefix + "CompileClasspath2", spec -> { + spec.setDescription("Dependencies needed for running NeoFormRuntime for the selected NeoForge/NeoForm version (Classpath) (number 2)"); + spec.setCanBeConsumed(false); + spec.setCanBeResolved(true); + spec.getDependencies().add(moddingPlatformDependency.copy() + .capabilities(caps -> caps.requireCapability("net.neoforged:neoforge-dependencies_neoFormOnly"))); + spec.attributes(attributes -> { + setNamedAttribute(project, attributes, Usage.USAGE_ATTRIBUTE, Usage.JAVA_API); + setNamedAttribute(project, attributes, MinecraftDistribution.ATTRIBUTE, MinecraftDistribution.CLIENT); + }); + }); + result.add(compileClasspath2); + } + // Runtime-time dependencies used by NeoForm, NeoForge and Minecraft. var runtimeClasspath = configurations.create(configurationPrefix + "RuntimeClasspath", spec -> { spec.setDescription("Dependencies needed for running NeoFormRuntime for the selected NeoForge/NeoForm version (Classpath)"); diff --git a/src/main/java/net/neoforged/moddevgradle/internal/ModDevPlugin.java b/src/main/java/net/neoforged/moddevgradle/internal/ModDevPlugin.java index 26a7e3dd..4be46237 100644 --- a/src/main/java/net/neoforged/moddevgradle/internal/ModDevPlugin.java +++ b/src/main/java/net/neoforged/moddevgradle/internal/ModDevPlugin.java @@ -42,6 +42,8 @@ public void apply(Project project) { NeoForgeExtension.class, dataFileCollections.accessTransformers().extension(), dataFileCollections.interfaceInjectionData().extension()); + + project.getDependencies().getComponents().withModule("net.neoforged:neoforge", NeoForgeMetadataRule.class); } public void enable( diff --git a/src/main/java/net/neoforged/moddevgradle/internal/NeoForgeMetadataRule.java b/src/main/java/net/neoforged/moddevgradle/internal/NeoForgeMetadataRule.java new file mode 100644 index 00000000..3cf22894 --- /dev/null +++ b/src/main/java/net/neoforged/moddevgradle/internal/NeoForgeMetadataRule.java @@ -0,0 +1,33 @@ +package net.neoforged.moddevgradle.internal; + +import org.gradle.api.artifacts.ComponentMetadataContext; +import org.gradle.api.artifacts.ComponentMetadataRule; + +public class NeoForgeMetadataRule implements ComponentMetadataRule { + @Override + public void execute(ComponentMetadataContext context) { + // TODO: maybe use maybeAddVariant? + context.getDetails().addVariant( + "modDevApiElements_neoFormOnly", + "modDevApiElements", + variantMetadata -> { + variantMetadata.withDependencies(depsMetadata -> { + // Only the NeoForm dependency is endorsing strict versions. + depsMetadata.removeIf(depMetadata -> !depMetadata.isEndorsingStrictVersions()); + }); + variantMetadata.withCapabilities(capsMetadata -> { + var caps = capsMetadata.getCapabilities(); + if (caps.size() != 1) { + throw new RuntimeException("Could not adapt NeoForge metadata: expected exactly one capability for modDevApiElements, found " + caps.size()); + } + var cap = caps.get(0); + if (!cap.getGroup().equals("net.neoforged") || !cap.getName().equals("neoforge-dependencies")) { + throw new RuntimeException("Could not adapt NeoForge metadata: expected capability net.neoforged:neoforge-dependencies for modDevApiElements, found " + cap.getGroup() + ":" + cap.getName()); + } + capsMetadata.removeCapability("net.neoforged", "neoforge-dependencies"); + capsMetadata.addCapability("net.neoforged", "neoforge-dependencies_neoFormOnly", cap.getVersion()); + }); + } + ); + } +}