diff --git a/.idea/.gitignore b/.idea/.gitignore
index 13566b8..ddc3775 100644
--- a/.idea/.gitignore
+++ b/.idea/.gitignore
@@ -1,6 +1,7 @@
# Default ignored files
/shelf/
/workspace.xml
+/misc.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index c54981c..44632e4 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -13,6 +13,7 @@
+
diff --git a/.idea/misc.xml b/.idea/misc.xml
deleted file mode 100644
index 596538b..0000000
--- a/.idea/misc.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index d1ee9fe..5a72abd 100644
--- a/build.gradle
+++ b/build.gradle
@@ -12,6 +12,7 @@ plugins {
}
dependencies {
+ api(project(':dependencies'))
api(project(':changelog'))
api(project(':maven-publishing'))
api(project(':resource-processing'))
diff --git a/examples/basic/build.gradle b/examples/basic/build.gradle
index c58532f..f568859 100644
--- a/examples/basic/build.gradle
+++ b/examples/basic/build.gradle
@@ -5,6 +5,6 @@ tableau {
group = 'com.example' // Use your own group here.
minecraftVersion = '1.21.3' // Or any other minecraft version.
publisher = 'SomePublisher' // Use your own name here.
- url = 'https://github.com/someorg/modid' // Use your own URL here.
+ repositoryUrl = uri('https://github.com/someorg/modid') // Use your own URL here.
}
-}
\ No newline at end of file
+}
diff --git a/examples/maven-publish/build.gradle b/examples/maven-publish/build.gradle
index e663b9c..9a2a3f1 100644
--- a/examples/maven-publish/build.gradle
+++ b/examples/maven-publish/build.gradle
@@ -5,7 +5,7 @@ tableau {
group = 'com.example' // Use your own group here.
minecraftVersion = '1.21.3' // Or any other minecraft version.
publisher = 'SomePublisher' // Use your own name here.
- url = 'https://github.com/someorg/modid' // Use your own URL here.
+ repositoryUrl = uri('https://github.com/someorg/modid') // Use your own URL here.
}
maven {
@@ -14,4 +14,4 @@ tableau {
usingGit()
}
}
-}
\ No newline at end of file
+}
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 9a4957e..72e6a11 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -6,6 +6,8 @@ sonarqube = "5.+"
shadow = "8.+"
jetbrainsAnnotations = "+"
curseForgeGradle = "1.+"
+fancyModLoader = "5.+"
+secureJarHandler = "3.+"
[libraries]
neogradle-userdev = { module = "net.neoforged.gradle:userdev", version.ref = "neogradle" }
@@ -15,11 +17,14 @@ sonarqube = { module = "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin",
shadow = { module = "com.gradleup.shadow:shadow-gradle-plugin", version.ref = "shadow" }
jetbrainsAnnotations = { module = "org.jetbrains:annotations", version.ref = "jetbrainsAnnotations" }
curseForgeGradle = { module = "net.darkhax.curseforgegradle:CurseForgeGradle", version.ref = "curseForgeGradle" }
+fancyModLoader = { module = "net.neoforged.fancymodloader:loader", version.ref = "fancyModLoader" }
+secureJarHandler = { module = "cpw.mods:securejarhandler", version.ref = "secureJarHandler" }
[bundles]
-neogradle = ["neogradle-userdev"]
+neogradle = ["neogradle-userdev", "fancyModLoader"]
crowdin = ["crowdin", "gradle-download"]
sonarqube = ["sonarqube"]
shadow = ["shadow"]
jetbrainsAnnotations = ["jetbrainsAnnotations"]
-curseForgeGradle = ["curseForgeGradle"]
\ No newline at end of file
+curseForgeGradle = ["curseForgeGradle"]
+fancyModLoader = ["fancyModLoader", "secureJarHandler"]
diff --git a/modules/common/src/main/java/com/ldtteam/tableau/common/extensions/ModExtension.java b/modules/common/src/main/java/com/ldtteam/tableau/common/extensions/ModExtension.java
index f8e2b08..91ccfcf 100644
--- a/modules/common/src/main/java/com/ldtteam/tableau/common/extensions/ModExtension.java
+++ b/modules/common/src/main/java/com/ldtteam/tableau/common/extensions/ModExtension.java
@@ -3,10 +3,10 @@
import com.ldtteam.tableau.scripting.extensions.TableauScriptingExtension;
import org.gradle.api.Action;
import org.gradle.api.Project;
-import org.gradle.api.provider.ListProperty;
import org.gradle.api.provider.Property;
import javax.inject.Inject;
+import java.net.URI;
/**
* Mod extension, handles the project configuration for the mod.
@@ -64,6 +64,7 @@ public void versioning(final Action action) {
* The current mod id for the mod.
*
* Not configuring the mod id, will likely result in an error during the build.
+ *
*
* @return The mod id.
*/
@@ -88,6 +89,27 @@ public void versioning(final Action action) {
*/
public abstract Property getMinecraftVersion();
+ /**
+ * The mod display name.
+ *
+ * @return The mod display name.
+ */
+ public abstract Property getModName();
+
+ /**
+ * The full mod description.
+ *
+ * @return The mod description.
+ */
+ public abstract Property getModDescription();
+
+ /**
+ * The mod logo file.
+ *
+ * @return The mod logo.
+ */
+ public abstract Property getModLogo();
+
/**
* The display name of the team or contributor who publishes the mod.
*
@@ -96,11 +118,32 @@ public void versioning(final Action action) {
public abstract Property getPublisher();
/**
- * The url of the website where documentation or source code can be found for the project.
+ * The url of the website where documentation can be found for the project.
+ *
+ * @return The website url, the location where documentation/support can be found.
+ */
+ public abstract Property getDisplayUrl();
+
+ /**
+ * The url of the website where the source code can be found for the project.
+ *
+ * @return The repository url, is the location where the source code can be found.
+ */
+ public abstract Property getRepositoryUrl();
+
+ /**
+ * The url of the website where the issue tracker can be found for the project.
+ *
+ * @return The issue tracker url, where issues may be filed for the mod.
+ */
+ public abstract Property getIssueTrackerUrl();
+
+ /**
+ * The license for the mod.
*
- * @return The mod url, is the location where documentation and support can be found.
+ * @return The license used for the mod.
*/
- public abstract Property getUrl();
+ public abstract Property getLicense();
/**
* Mod versioning configuration model.
diff --git a/modules/curseforge/src/main/java/com/ldtteam/tableau/curseforge/CurseForgeProjectPlugin.java b/modules/curseforge/src/main/java/com/ldtteam/tableau/curseforge/CurseForgeProjectPlugin.java
index af6349e..5266572 100644
--- a/modules/curseforge/src/main/java/com/ldtteam/tableau/curseforge/CurseForgeProjectPlugin.java
+++ b/modules/curseforge/src/main/java/com/ldtteam/tableau/curseforge/CurseForgeProjectPlugin.java
@@ -5,7 +5,7 @@
import com.ldtteam.tableau.common.extensions.ModExtension;
import com.ldtteam.tableau.curseforge.extensions.CurseForgeExtension;
-import com.ldtteam.tableau.extensions.NeoGradleExtension;
+import com.ldtteam.tableau.dependencies.extensions.DependenciesExtension;
import com.ldtteam.tableau.jarjar.JarJarPlugin;
import com.ldtteam.tableau.neogradle.NeoGradlePlugin;
import com.ldtteam.tableau.scripting.extensions.TableauScriptingExtension;
@@ -14,11 +14,9 @@
import net.darkhax.curseforgegradle.Constants;
import net.darkhax.curseforgegradle.TaskPublishCurseForge;
import net.darkhax.curseforgegradle.UploadArtifact;
-import org.gradle.api.GradleException;
import org.gradle.api.InvalidUserDataException;
import org.gradle.api.Project;
import org.gradle.api.Plugin;
-import org.gradle.api.internal.project.IProjectFactory;
import org.gradle.api.tasks.SourceSet;
import org.gradle.api.tasks.TaskProvider;
import org.gradle.jvm.tasks.Jar;
@@ -70,6 +68,7 @@ private void configureUploadTask(final Project project) {
final TaskProvider extends Jar> mainJar = getMainJar(project);
final CurseForgeExtension curse = CurseForgeExtension.get(project);
final SourceSetExtension sourceSets = SourceSetExtension.get(project);
+ final DependenciesExtension dependencies = DependenciesExtension.get(project);
final ModExtension mod = ModExtension.get(project);
if (!curse.getId().isPresent()) {
@@ -118,6 +117,9 @@ private void configureUploadTask(final Project project) {
}
});
+ dependencies.getAllRequiredDependencies().get().forEach(dep -> artifact.addRelation(dep.modId(), Constants.RELATION_REQUIRED));
+ dependencies.getAllOptionalDependencies().get().forEach(dep -> artifact.addRelation(dep.modId(), Constants.RELATION_OPTIONAL));
+
curse.getRelationships().get().forEach((slug, relationship) -> {
if (!Constants.VALID_RELATION_TYPES.contains(relationship)) {
throw new InvalidUserDataException("Invalid relationship type: %s for project: %s".formatted(relationship, slug));
diff --git a/modules/curseforge/src/main/java/com/ldtteam/tableau/curseforge/extensions/CurseForgeExtension.java b/modules/curseforge/src/main/java/com/ldtteam/tableau/curseforge/extensions/CurseForgeExtension.java
index f607ed9..2811b4d 100644
--- a/modules/curseforge/src/main/java/com/ldtteam/tableau/curseforge/extensions/CurseForgeExtension.java
+++ b/modules/curseforge/src/main/java/com/ldtteam/tableau/curseforge/extensions/CurseForgeExtension.java
@@ -143,8 +143,6 @@ public String toString() {
*
*
embeddedLibrary
*
incompatible
- *
optionalDependency
- *
requiredDependency
*
tool
*
* @return the relationships this project has with others
@@ -187,18 +185,18 @@ public Relationships(MapProperty relationships) {
/**
* The relationships of the project on CurseForge.
*
- * The key is the slug of the project in the relationship and the value is the kind of relationship.
- * As values, you can use:
- *
- *
embeddedLibrary
- *
incompatible
- *
optionalDependency
- *
requiredDependency
- *
tool
- *
+ * The key is the slug of the project in the relationship and the value is the kind of relationship.
+ * As values, you can use:
+ *
+ *
+ *
embeddedLibrary
+ *
incompatible
+ *
tool
+ *
* @return the relationships this project has with other published projects on CurseForge.
*/
- public MapProperty getRelationships() {
+ public MapProperty getRelationships()
+ {
return this.relationships;
}
@@ -228,23 +226,5 @@ public void embedded(String slug) {
public void incompatible(String slug) {
getRelationships().put(slug, Constants.RELATION_INCOMPATIBLE);
}
-
- /**
- * Marks the given project as an optional dependency.
- *
- * @param slug the slug of the project
- */
- public void optional(String slug) {
- getRelationships().put(slug, Constants.RELATION_OPTIONAL);
- }
-
- /**
- * Marks the given project as a required dependency.
- *
- * @param slug the slug of the project
- */
- public void required(String slug) {
- getRelationships().put(slug, Constants.RELATION_REQUIRED);
- }
}
}
diff --git a/modules/dependencies/build.gradle b/modules/dependencies/build.gradle
new file mode 100644
index 0000000..b1ad90c
--- /dev/null
+++ b/modules/dependencies/build.gradle
@@ -0,0 +1,29 @@
+/*
+ * This file was generated by the Gradle 'init' task.
+ *
+ * This generated file contains a sample Gradle plugin project to get you started.
+ * For more details on writing Custom Plugins, please refer to https://docs.gradle.org/8.10/userguide/custom_plugins.html in the Gradle documentation.
+ * This project uses @Incubating APIs which are subject to change.
+ */
+
+plugins {
+ // Apply the Java Gradle plugin development plugin to add support for developing Gradle plugins
+ id 'java-gradle-plugin'
+}
+
+dependencies {
+ api project(':scripting')
+ api project(':sourceset-management')
+
+ api libs.bundles.fancyModLoader
+}
+
+gradlePlugin {
+ // Define the plugin
+ plugins {
+ "dependencies" {
+ id = 'com.ldtteam.tableau.dependencies'
+ implementationClass = 'com.ldtteam.tableau.dependencies.DependenciesPlugin'
+ }
+ }
+}
diff --git a/modules/dependencies/src/main/java/com/ldtteam/tableau/dependencies/DependenciesPlugin.java b/modules/dependencies/src/main/java/com/ldtteam/tableau/dependencies/DependenciesPlugin.java
new file mode 100644
index 0000000..288fca6
--- /dev/null
+++ b/modules/dependencies/src/main/java/com/ldtteam/tableau/dependencies/DependenciesPlugin.java
@@ -0,0 +1,32 @@
+/*
+ * This source file was generated by the Gradle 'init' task
+ */
+package com.ldtteam.tableau.dependencies;
+
+import org.gradle.api.Plugin;
+import org.gradle.api.Project;
+import org.jetbrains.annotations.NotNull;
+
+import javax.inject.Inject;
+
+/**
+ * The root plugin for the Dependencies module.
+ *
+ * Can be applied to any {@link org.gradle.api.plugins.PluginAware} but will only interact with {@link Project projects}
+ */
+public class DependenciesPlugin implements Plugin