diff --git a/README.md b/README.md index c4412ac..4ac1ecb 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,8 @@ This guide will show how to import the MultiLoader Template into IntelliJ IDEA. 3. Open the template's root folder as a new project in IDEA. This is the folder that contains this README file and the gradlew executable. 4. If your default JVM/JDK is not Java 17 you will encounter an error when opening the project. This error is fixed by going to `File > Settings > Build, Execution, Deployment > Build Tools > Gradle > Gradle JVM`and changing the value to a valid Java 17 JVM. You will also need to set the Project SDK to Java 17. This can be done by going to `File > Project Structure > Project SDK`. Once both have been set open the Gradle tab in IDEA and click the refresh button to reload the project. 5. Open the Gradle tab in IDEA if it has not already been opened. Navigate to `Your Project > Common > Tasks > vanilla gradle > decompile`. Run this task to decompile Minecraft. -6. Open the Gradle tab in IDEA if it has not already been opened. Navigate to `Your Project > Forge > Tasks > forgegradle runs > genIntellijRuns`. Run this task to set up run configurations for Forge. -7. Open your Run/Debug Configurations. Under the Application category there should now be options to run Forge and Fabric projects. Select one of the client options and try to run it. -8. Assuming you were able to run the game in step 7 your workspace should now be set up. +6. Open your Run/Debug Configurations. Under the Application category there should now be options to run Forge and Fabric projects. Select one of the client options and try to run it. +7. Assuming you were able to run the game in step 7 your workspace should now be set up. ### Eclipse While it is possible to use this template in Eclipse it is not recommended. During the development of this template multiple critical bugs and quirks related to Eclipse were found at nearly every level of the required build tools. While we continue to work with these tools to report and resolve issues support for projects like these are not there yet. For now Eclipse is considered unsupported by this project. The development cycle for build tools is notoriously slow so there are no ETAs available. diff --git a/build.gradle b/build.gradle index 655ff19..4258f00 100644 --- a/build.gradle +++ b/build.gradle @@ -1,82 +1,4 @@ plugins { - id 'fabric-loom' version '1.6-SNAPSHOT' apply(false) - id 'net.minecraftforge.gradle' version '[6.0,6.2)' apply(false) - id 'org.spongepowered.gradle.vanilla' version '0.2.1-SNAPSHOT' apply(false) - id("org.spongepowered.mixin") version "0.7-SNAPSHOT" apply(false) -} - -subprojects { - apply plugin: 'java' - - java.toolchain.languageVersion = JavaLanguageVersion.of(17) - java.withSourcesJar() - java.withJavadocJar() - - jar { - from(rootProject.file("LICENSE")) { - rename { "${it}_${mod_name}" } - } - manifest { - attributes([ - 'Specification-Title' : mod_name, - 'Specification-Vendor' : mod_author, - 'Specification-Version' : project.jar.archiveVersion, - 'Implementation-Title' : project.name, - 'Implementation-Version' : project.jar.archiveVersion, - 'Implementation-Vendor' : mod_author, - 'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), - 'Timestamp' : System.currentTimeMillis(), - 'Built-On-Java' : "${System.getProperty('java.vm.version')} (${System.getProperty('java.vm.vendor')})", - 'Built-On-Minecraft' : minecraft_version - ]) - } - } - - sourcesJar { - from(rootProject.file("LICENSE")) { - rename { "${it}_${mod_name}" } - } - } - - repositories { - mavenCentral() - maven { - name = 'Sponge / Mixin' - url = 'https://repo.spongepowered.org/repository/maven-public/' - } - maven { - name = 'BlameJared Maven (JEI / CraftTweaker / Bookshelf)' - url = 'https://maven.blamejared.com' - } - } - - tasks.withType(JavaCompile).configureEach { - - it.options.encoding = 'UTF-8' - it.options.getRelease().set(17) - } - - processResources { - def expandProps = [ - "version": version, - "group": project.group, //Else we target the task's group. - "minecraft_version": minecraft_version, - "forge_version": forge_version, - "forge_loader_version_range": forge_loader_version_range, - "forge_version_range": forge_version_range, - "minecraft_version_range": minecraft_version_range, - "fabric_version": fabric_version, - "fabric_loader_version": fabric_loader_version, - "mod_name": mod_name, - "mod_author": mod_author, - "mod_id": mod_id, - "license": license, - "description": project.description - ] - - filesMatching(['pack.mcmeta', 'fabric.mod.json', 'META-INF/mods.toml', '*.mixins.json']) { - expand expandProps - } - inputs.properties(expandProps) - } -} + id 'fabric-loom' version '1.9-SNAPSHOT' apply(false) + id 'net.neoforged.moddev.legacyforge' version '2.0.77' apply(false) +} \ No newline at end of file diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle new file mode 100644 index 0000000..6784052 --- /dev/null +++ b/buildSrc/build.gradle @@ -0,0 +1,3 @@ +plugins { + id 'groovy-gradle-plugin' +} diff --git a/buildSrc/src/main/groovy/multiloader-common.gradle b/buildSrc/src/main/groovy/multiloader-common.gradle new file mode 100644 index 0000000..06ed6e0 --- /dev/null +++ b/buildSrc/src/main/groovy/multiloader-common.gradle @@ -0,0 +1,131 @@ +plugins { + id 'java-library' + id 'maven-publish' +} + +base { + archivesName = "${mod_id}-${project.name}-${minecraft_version}" +} + +java { + toolchain.languageVersion = JavaLanguageVersion.of(java_version) + withSourcesJar() + withJavadocJar() +} + +repositories { + mavenCentral() + // https://docs.gradle.org/current/userguide/declaring_repositories.html#declaring_content_exclusively_found_in_one_repository + exclusiveContent { + forRepository { + maven { + name = 'Sponge' + url = 'https://repo.spongepowered.org/repository/maven-public' + } + } + filter { includeGroupAndSubgroups('org.spongepowered') } + } + exclusiveContent { + forRepositories( + maven { + name = 'ParchmentMC' + url = 'https://maven.parchmentmc.org/' + }, + maven { + name = "NeoForge" + url = 'https://maven.neoforged.net/releases' + } + ) + filter { includeGroup('org.parchmentmc.data') } + } + maven { + name = 'BlameJared' + url = 'https://maven.blamejared.com' + } +} + +// Declare capabilities on the outgoing configurations. +// Read more about capabilities here: https://docs.gradle.org/current/userguide/component_capabilities.html#sec:declaring-additional-capabilities-for-a-local-component +['apiElements', 'runtimeElements', 'sourcesElements', 'javadocElements'].each { variant -> + configurations."$variant".outgoing { + capability("$group:${project.name}:$version") + capability("$group:${base.archivesName.get()}:$version") + capability("$group:$mod_id-${project.name}-${minecraft_version}:$version") + capability("$group:$mod_id:$version") + } + publishing.publications.configureEach { + suppressPomMetadataWarningsFor(variant) + } +} + +sourcesJar { + from(rootProject.file('LICENSE')) { + rename { "${it}_${mod_name}" } + } +} + +jar { + from(rootProject.file('LICENSE')) { + rename { "${it}_${mod_name}" } + } + + manifest { + attributes([ + 'Specification-Title' : mod_name, + 'Specification-Vendor' : mod_author, + 'Specification-Version' : project.jar.archiveVersion, + 'Implementation-Title' : project.name, + 'Implementation-Version': project.jar.archiveVersion, + 'Implementation-Vendor' : mod_author, + 'Built-On-Minecraft' : minecraft_version + ]) + } +} + +processResources { + var expandProps = [ + 'version' : version, + 'group' : project.group, //Else we target the task's group. + 'minecraft_version' : minecraft_version, + 'minecraft_version_range' : minecraft_version_range, + 'fabric_version' : fabric_version, + 'fabric_loader_version' : fabric_loader_version, + 'mod_name' : mod_name, + 'mod_author' : mod_author, + 'mod_id' : mod_id, + 'license' : license, + 'description' : project.description, + "forge_version": forge_version, + "forge_loader_version_range": forge_loader_version_range, + 'credits' : credits, + 'java_version' : java_version + ] + + var jsonExpandProps = expandProps.collectEntries { + key, value -> [(key): value instanceof String ? value.replace("\n", "\\\\n") : value] + } + + filesMatching(['META-INF/mods.toml']) { + expand expandProps + } + + filesMatching(['pack.mcmeta', 'fabric.mod.json', '*.mixins.json']) { + expand jsonExpandProps + } + + inputs.properties(expandProps) +} + +publishing { + publications { + register('mavenJava', MavenPublication) { + artifactId base.archivesName.get() + from components.java + } + } + repositories { + maven { + url System.getenv('local_maven_url') + } + } +} diff --git a/buildSrc/src/main/groovy/multiloader-loader.gradle b/buildSrc/src/main/groovy/multiloader-loader.gradle new file mode 100644 index 0000000..92e2325 --- /dev/null +++ b/buildSrc/src/main/groovy/multiloader-loader.gradle @@ -0,0 +1,44 @@ +plugins { + id 'multiloader-common' +} + +configurations { + commonJava{ + canBeResolved = true + } + commonResources{ + canBeResolved = true + } +} + +dependencies { + compileOnly(project(':common')) { + capabilities { + requireCapability "$group:$mod_id" + } + } + commonJava project(path: ':common', configuration: 'commonJava') + commonResources project(path: ':common', configuration: 'commonResources') +} + +tasks.named('compileJava', JavaCompile) { + dependsOn(configurations.commonJava) + source(configurations.commonJava) +} + +processResources { + dependsOn(configurations.commonResources) + from(configurations.commonResources) +} + +tasks.named('javadoc', Javadoc).configure { + dependsOn(configurations.commonJava) + source(configurations.commonJava) +} + +tasks.named('sourcesJar', Jar) { + dependsOn(configurations.commonJava) + from(configurations.commonJava) + dependsOn(configurations.commonResources) + from(configurations.commonResources) +} diff --git a/common/build.gradle b/common/build.gradle index 9144cb4..7efbbeb 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -1,50 +1,32 @@ -/* -VanillaGradle likes to push breaking changes without updating their version -If this happens in the future, try update your gradle version on the project -If a gradle update doesn't fix the issue, you can pin the VanillaGradle version to a specific version that was working before. -You can find the versions here https://repo.spongepowered.org/#browse/browse:maven-snapshots:org%2Fspongepowered%2Fvanillagradle -and you can pin them with the following code: - -buildscript { - dependencies.add 'classpath', 'org.spongepowered:vanillagradle:0.2.1-20240507.024226-82' -} - plugins { - id 'org.spongepowered.gradle.vanilla' version '0.2.1-20240507.024226-82' + id 'multiloader-common' + id 'net.neoforged.moddev.legacyforge' } -*/ -plugins { - id 'idea' - id 'java' - id 'maven-publish' - id 'org.spongepowered.gradle.vanilla' -} -base { - archivesName = "${mod_name}-common-${minecraft_version}" -} -minecraft { - version(minecraft_version) - if(file("src/main/resources/${mod_id}.accesswidener").exists()){ - accessWideners(file("src/main/resources/${mod_id}.accesswidener")) +legacyForge { + mcpVersion = minecraft_version + if (file("src/main/resources/META-INF/accesstransformer.cfg").exists()) { + accessWideners(file("src/main/resources/META-INF/accesstransformer.cfg")) } } dependencies { - compileOnly group:'org.spongepowered', name:'mixin', version:'0.8.5' - implementation group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.1' + compileOnly group: 'org.spongepowered', name: 'mixin', version: '0.8.5' + implementation group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.1' } -publishing { - publications { - mavenJava(MavenPublication) { - artifactId base.archivesName.get() - from components.java - } +configurations { + commonJava { + canBeResolved = false + canBeConsumed = true } - repositories { - maven { - url "file://" + System.getenv("local_maven") - } + commonResources { + canBeResolved = false + canBeConsumed = true } +} + +artifacts { + commonJava sourceSets.main.java.sourceDirectories.singleFile + commonResources sourceSets.main.resources.sourceDirectories.singleFile } \ No newline at end of file diff --git a/fabric/build.gradle b/fabric/build.gradle index d1fd2e0..ca6caaf 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -1,12 +1,7 @@ plugins { - id 'java' - id 'idea' - id 'maven-publish' + id 'multiloader-loader' id 'fabric-loom' } -base { - archivesName = "${mod_name}-fabric-${minecraft_version}" -} dependencies { minecraft "com.mojang:minecraft:${minecraft_version}" mappings loom.officialMojangMappings() @@ -38,31 +33,3 @@ loom { } } } - -tasks.withType(JavaCompile).configureEach { - source(project(":common").sourceSets.main.allSource) -} -tasks.withType(Javadoc).configureEach { - source(project(":common").sourceSets.main.allJava) -} -tasks.named("sourcesJar", Jar) { - from(project(":common").sourceSets.main.allSource) -} - -processResources { - from project(":common").sourceSets.main.resources -} - -publishing { - publications { - mavenJava(MavenPublication) { - artifactId base.archivesName.get() - from components.java - } - } - repositories { - maven { - url "file://" + System.getenv("local_maven") - } - } -} diff --git a/forge/build.gradle b/forge/build.gradle index c27cc13..a4b06f2 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -1,12 +1,8 @@ plugins { - id 'idea' - id 'maven-publish' - id 'net.minecraftforge.gradle' - id 'org.spongepowered.mixin' -} -base { - archivesName = "${mod_name}-forge-${minecraft_version}" + id 'multiloader-loader' + id 'net.neoforged.moddev.legacyforge' } + mixin { add(sourceSets.main, "${mod_id}.refmap.json") @@ -14,60 +10,30 @@ mixin { config("${mod_id}.forge.mixins.json") } -minecraft { - mappings channel: 'official', version: minecraft_version +legacyForge { + version = "${minecraft_version}-${forge_version}" - copyIdeResources = true //Calls processResources when in dev + validateAccessTransformers = true - // Automatically enable forge AccessTransformers if the file exists - // This location is hardcoded in Forge and can not be changed. - // https://github.com/MinecraftForge/MinecraftForge/blob/be1698bb1554f9c8fa2f58e32b9ab70bc4385e60/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModFile.java#L123 - if (file('src/main/resources/META-INF/accesstransformer.cfg').exists()) { - accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') + def at = project(':common').file('src/main/resources/META-INF/accesstransformer.cfg') + if (at.exists()) { + accessWideners(at) } - runs { client { - workingDirectory project.file('run') - ideaModule "${rootProject.name}.${project.name}.main" - taskName 'Client' - property 'mixin.env.remapRefMap', 'true' - property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" - mods { - modClientRun { - source sourceSets.main - source project(":common").sourceSets.main - } - } + client() } - - server { - workingDirectory project.file('run') - ideaModule "${rootProject.name}.${project.name}.main" - taskName 'Server' - property 'mixin.env.remapRefMap', 'true' - property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" - mods { - modServerRun { - source sourceSets.main - source project(":common").sourceSets.main - } - } - } - data { - workingDirectory project.file('run') - ideaModule "${rootProject.name}.${project.name}.main" - args '--mod', mod_id, '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') - taskName 'Data' - property 'mixin.env.remapRefMap', 'true' - property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" - mods { - modDataRun { - source sourceSets.main - source project(":common").sourceSets.main - } - } + data() + } + server { + server() + } + } + + mods { + testproject { + sourceSet sourceSets.main } } } @@ -75,38 +41,13 @@ minecraft { sourceSets.main.resources.srcDir 'src/generated/resources' dependencies { - minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" compileOnly project(":common") annotationProcessor("org.spongepowered:mixin:0.8.5-SNAPSHOT:processor") } -tasks.withType(JavaCompile).configureEach { - source(project(":common").sourceSets.main.allSource) -} -tasks.withType(Javadoc).configureEach { - source(project(":common").sourceSets.main.allJava) -} -tasks.named("sourcesJar", Jar) { - from(project(":common").sourceSets.main.allSource) -} - -processResources { - from project(":common").sourceSets.main.resources -} - -jar.finalizedBy('reobfJar') - -publishing { - publications { - mavenJava(MavenPublication) { - artifactId base.archivesName.get() - from components.java - fg.component(it) - } - } - repositories { - maven { - url "file://" + System.getenv("local_maven") - } - } -} +jar { + finalizedBy('reobfJar') + manifest.attributes([ + "MixinConfigs": "${mod_id}.mixins.json,${mod_id}.forge.mixins.json" + ]) +} \ No newline at end of file diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml index 1325953..f820e5a 100644 --- a/forge/src/main/resources/META-INF/mods.toml +++ b/forge/src/main/resources/META-INF/mods.toml @@ -15,7 +15,7 @@ description = '''${description}''' #mandatory (Supports multiline text) [[dependencies.${mod_id}]] #optional modId = "forge" #mandatory mandatory = true #mandatory -versionRange = "${forge_version_range}" #mandatory +versionRange = "[${forge_version},)" #mandatory ordering = "NONE" # The order that this dependency should load in relation to your mod, required to be either 'BEFORE' or 'AFTER' if the dependency is not mandatory side = "BOTH" # Side this dependency is applied on - 'BOTH', 'CLIENT' or 'SERVER' [[dependencies.${mod_id}]] diff --git a/gradle.properties b/gradle.properties index e5a5fad..34c85f8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,27 +5,29 @@ # Project version=1.0.0 group=com.example.examplemod +java_version=17 # Common minecraft_version=1.20.1 +mod_name=ExampleMod +mod_author=Jared +mod_id=examplemod +license=CC0-1.0 +credits= +description=The description of your mod. \nAccepts multilines. +minecraft_version_range=[1.20.1, 1.22) +# The version of ParchmentMC that is used, see https://parchmentmc.org/docs/getting-started#choose-a-version for new versions +parchment_minecraft=1.20.1 +parchment_version=2023.09.03 + +# Fabric +fabric_version=0.92.1+1.20.1 +fabric_loader_version=0.16.9 # Forge forge_version=47.2.30 forge_loader_version_range=[47,) -forge_version_range=[47,) -minecraft_version_range=[1.20.1, 1.21) - -# Fabric -fabric_version=0.92.1+1.20.1 -fabric_loader_version=0.15.10 - -# Mod options -mod_name=ExampleMod -mod_author=Jared -mod_id=examplemod -license=C0-1.0 -description=The description of your mod. \nAccepts multilines. # Gradle org.gradle.jvmargs=-Xmx3G -org.gradle.daemon=false \ No newline at end of file +org.gradle.daemon=false diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e644113..a4b76b9 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a441313..94113f2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index b740cf1..f5feea6 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -84,7 +86,8 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/gradlew.bat b/gradlew.bat index 25da30d..9d21a21 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ##########################################################################