diff --git a/common/src/main/java/net/neoforged/gradle/common/CommonProjectPlugin.java b/common/src/main/java/net/neoforged/gradle/common/CommonProjectPlugin.java index e33e84ec5..e81be60bf 100644 --- a/common/src/main/java/net/neoforged/gradle/common/CommonProjectPlugin.java +++ b/common/src/main/java/net/neoforged/gradle/common/CommonProjectPlugin.java @@ -23,7 +23,9 @@ import net.neoforged.gradle.dsl.common.extensions.dependency.replacement.DependencyReplacement; import net.neoforged.gradle.dsl.common.extensions.repository.Repository; import net.neoforged.gradle.dsl.common.extensions.subsystems.Conventions; +import net.neoforged.gradle.dsl.common.extensions.subsystems.DevLogin; import net.neoforged.gradle.dsl.common.extensions.subsystems.Subsystems; +import net.neoforged.gradle.dsl.common.extensions.subsystems.Tools; import net.neoforged.gradle.dsl.common.extensions.subsystems.conventions.Configurations; import net.neoforged.gradle.dsl.common.extensions.subsystems.conventions.IDE; import net.neoforged.gradle.dsl.common.extensions.subsystems.conventions.Runs; @@ -36,10 +38,7 @@ import net.neoforged.gradle.util.UrlConstants; import org.gradle.StartParameter; import org.gradle.TaskExecutionRequest; -import org.gradle.api.Action; -import org.gradle.api.NamedDomainObjectContainer; -import org.gradle.api.Plugin; -import org.gradle.api.Project; +import org.gradle.api.*; import org.gradle.api.artifacts.Configuration; import org.gradle.api.artifacts.repositories.MavenArtifactRepository; import org.gradle.api.attributes.AttributeContainer; @@ -47,6 +46,7 @@ import org.gradle.api.component.AdhocComponentWithVariants; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.tasks.Delete; +import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.SourceSetContainer; import org.gradle.api.tasks.TaskProvider; import org.gradle.internal.DefaultTaskExecutionRequest; @@ -346,6 +346,10 @@ private void applyAfterEvaluate(final Project project) { } } + if (run.getModSources().get().isEmpty()) { + throw new GradleException("Run: " + run.getName() + " has no source sets configured. Please configure at least one source set."); + } + if (run.getConfigureFromDependencies().get()) { final RunImpl runImpl = (RunImpl) run; @@ -374,6 +378,28 @@ private void applyAfterEvaluate(final Project project) { definitionSet.forEach((identifier, definition) -> { definition.configureRun(runImpl); }); + + //Handle dev login. + final DevLogin devLogin = project.getExtensions().getByType(Subsystems.class).getDevLogin(); + final Tools tools = project.getExtensions().getByType(Subsystems.class).getTools(); + if (devLogin.getEnabled().get()) { + //Dev login is only supported on the client side + if (runImpl.getIsClient().get()) { + final String mainClass = runImpl.getMainClass().get(); + + //We add the dev login tool to the runtime only configuration, of the first source set, this should suffice + final SourceSet defaultSourceSet = runImpl.getModSources().get().get(0); + final Configuration defaultRuntimeOnlyConfiguration = project.getConfigurations().maybeCreate(defaultSourceSet.getRuntimeOnlyConfigurationName()); + defaultRuntimeOnlyConfiguration.getDependencies().add(project.getDependencies().create(tools.getDevLogin().get())); + + //Update the program arguments to properly launch the dev login tool + run.getProgramArguments().add("--launch_target"); + run.getProgramArguments().add(mainClass); + + //Set the main class to the dev login tool + run.getMainClass().set("net.covers1624.devlogin.DevLogin"); + } + } } } }); diff --git a/common/src/main/java/net/neoforged/gradle/common/extensions/subsystems/SubsystemsExtension.java b/common/src/main/java/net/neoforged/gradle/common/extensions/subsystems/SubsystemsExtension.java index c59958b78..3e44fe01f 100644 --- a/common/src/main/java/net/neoforged/gradle/common/extensions/subsystems/SubsystemsExtension.java +++ b/common/src/main/java/net/neoforged/gradle/common/extensions/subsystems/SubsystemsExtension.java @@ -13,11 +13,7 @@ import java.util.Collections; import java.util.Locale; -import static net.neoforged.gradle.dsl.common.util.Constants.DEFAULT_PARCHMENT_ARTIFACT_PREFIX; -import static net.neoforged.gradle.dsl.common.util.Constants.DEFAULT_PARCHMENT_GROUP; -import static net.neoforged.gradle.dsl.common.util.Constants.DEFAULT_PARCHMENT_MAVEN_URL; -import static net.neoforged.gradle.dsl.common.util.Constants.JST_TOOL_ARTIFACT; -import static net.neoforged.gradle.dsl.common.util.Constants.DEFAULT_RECOMPILER_MAX_MEMORY; +import static net.neoforged.gradle.dsl.common.util.Constants.*; public abstract class SubsystemsExtension extends WithPropertyLookup implements ConfigurableDSLElement, Subsystems { @@ -33,6 +29,32 @@ public SubsystemsExtension(Project project) { configureRecompilerDefaults(); configureParchmentDefaults(); configureToolsDefaults(); + configureDevLoginDefaults(); + } + + private void configureDevLoginDefaults() { + DevLogin devLogin = getDevLogin(); + devLogin.getEnabled().convention( + getBooleanProperty("devLogin.enabled").orElse(true) + ); + devLogin.getAddRepository().convention( + getBooleanProperty("devLogin.addRepository").orElse(true) + ); + + // Add a filtered dev login repository automatically if enabled + project.afterEvaluate(p -> { + if (!devLogin.getEnabled().get() || !devLogin.getAddRepository().get()) { + return; + } + MavenArtifactRepository repo = p.getRepositories().maven(m -> { + m.setName("DevLogin Tool"); + m.setUrl(URI.create(DEFAULT_DEVLOGIN_MAVEN_URL)); + m.mavenContent(mavenContent -> mavenContent.includeGroup(DEFAULT_DEVLOGIN_GROUP)); + }); + // Make sure it comes first due to its filtered group, that should speed up resolution + p.getRepositories().remove(repo); + p.getRepositories().addFirst(repo); + }); } private void configureToolsDefaults() { @@ -40,6 +62,9 @@ private void configureToolsDefaults() { tools.getJST().convention( getStringProperty("tools.jst").orElse(JST_TOOL_ARTIFACT) ); + tools.getDevLogin().convention( + getStringProperty("tools.devlogin").orElse(DEVLOGIN_TOOL_ARTIFACT) + ); } private void configureDecompilerDefaults() { diff --git a/dsl/common/src/main/groovy/net/neoforged/gradle/dsl/common/extensions/subsystems/DevLogin.groovy b/dsl/common/src/main/groovy/net/neoforged/gradle/dsl/common/extensions/subsystems/DevLogin.groovy new file mode 100644 index 000000000..c5bebad67 --- /dev/null +++ b/dsl/common/src/main/groovy/net/neoforged/gradle/dsl/common/extensions/subsystems/DevLogin.groovy @@ -0,0 +1,31 @@ +package net.neoforged.gradle.dsl.common.extensions.subsystems + +import groovy.transform.CompileStatic +import net.minecraftforge.gdi.ConfigurableDSLElement +import net.minecraftforge.gdi.annotations.DSLProperty +import org.gradle.api.provider.Property +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.Optional + +/** + * Allows configuration of the dev login system. + */ +@CompileStatic +interface DevLogin extends ConfigurableDSLElement { + + /** + * @return Whether or not dev login is enabled on launch. + */ + @Input + @Optional + @DSLProperty + Property getEnabled(); + + /** + * @return Whether or not to add the dev login repository to the project. + */ + @Input + @Optional + @DSLProperty + Property getAddRepository(); +} \ No newline at end of file diff --git a/dsl/common/src/main/groovy/net/neoforged/gradle/dsl/common/extensions/subsystems/Subsystems.groovy b/dsl/common/src/main/groovy/net/neoforged/gradle/dsl/common/extensions/subsystems/Subsystems.groovy index 3691258fe..637cba847 100644 --- a/dsl/common/src/main/groovy/net/neoforged/gradle/dsl/common/extensions/subsystems/Subsystems.groovy +++ b/dsl/common/src/main/groovy/net/neoforged/gradle/dsl/common/extensions/subsystems/Subsystems.groovy @@ -45,4 +45,11 @@ interface Subsystems extends BaseDSLElement { @Nested @DSLProperty Tools getTools(); + + /** + * @return settings for the dev login subsystem + */ + @Nested + @DSLProperty + DevLogin getDevLogin(); } diff --git a/dsl/common/src/main/groovy/net/neoforged/gradle/dsl/common/extensions/subsystems/Tools.groovy b/dsl/common/src/main/groovy/net/neoforged/gradle/dsl/common/extensions/subsystems/Tools.groovy index a8d92bfec..1ad297387 100644 --- a/dsl/common/src/main/groovy/net/neoforged/gradle/dsl/common/extensions/subsystems/Tools.groovy +++ b/dsl/common/src/main/groovy/net/neoforged/gradle/dsl/common/extensions/subsystems/Tools.groovy @@ -23,4 +23,12 @@ interface Tools extends ConfigurableDSLElement { @DSLProperty Property getJST(); + /** + * Artifact coordinates for the NeoGradle decompiler. + * Used by the runs subsystem to allow login to the dev environment. + */ + @Input + @Optional + @DSLProperty + Property getDevLogin(); } \ No newline at end of file diff --git a/dsl/common/src/main/groovy/net/neoforged/gradle/dsl/common/util/Constants.groovy b/dsl/common/src/main/groovy/net/neoforged/gradle/dsl/common/util/Constants.groovy index b6b620f60..c5b91adbb 100644 --- a/dsl/common/src/main/groovy/net/neoforged/gradle/dsl/common/util/Constants.groovy +++ b/dsl/common/src/main/groovy/net/neoforged/gradle/dsl/common/util/Constants.groovy @@ -28,6 +28,11 @@ class Constants { public static final String DEFAULT_PARCHMENT_ARTIFACT_PREFIX = "parchment-" public static final String DEFAULT_PARCHMENT_MAVEN_URL = "https://maven.parchmentmc.org/" public static final String JST_TOOL_ARTIFACT = "net.neoforged.jst:jst-cli-bundle:1.0.36" + public static final String DEFAULT_DEVLOGIN_GROUP = "net.covers1624" + public static final String DEFAULT_DEVLOGIN_ARTIFACT = "DevLogin" + public static final String DEFAULT_DEVLOGIN_MAVEN_URL = "https://maven.covers1624.net/" + public static final String DEVLOGIN_TOOL_ARTIFACT = "net.covers1624:DevLogin:0.1.0.3" + public static final String DEVLOGIN_MAIN_CLASS = "net.covers1624.devlogin.DevLogin" public static final String DEFAULT_RECOMPILER_MAX_MEMORY = "1g"