From f8b2f1d84baa850af29d1129188c237306255d17 Mon Sep 17 00:00:00 2001 From: Giovanni Date: Tue, 11 Nov 2025 13:09:20 +0100 Subject: [PATCH 01/13] Refactor build.gradle to include Git hash and build number; update sourceSets.main configuration --- build.gradle | 44 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index ab8ef641..505989f9 100644 --- a/build.gradle +++ b/build.gradle @@ -7,12 +7,15 @@ plugins { id 'org.parchmentmc.librarian.forgegradle' version "${librarian_version}" } -version = mod_version + '-forge' -group = mod_group_id +boolean dev = System.getenv("RELEASE") == null || System.getenv("RELEASE") == "false" +ext.buildNumber = System.getenv("BUILD_NUMBER") +String gitHash = calculateGitHash() + (hasUnstaged() ? "-modified" : "") base { archivesName = 'createnuclear' + group = mod_group_id + version = mod_version + '-forge' } // Mojang ships Java 17 to end users in 1.18+, so your mod should target Java 17. @@ -144,7 +147,14 @@ minecraft { } // Include resources generated by data generators. -sourceSets.main.resources { srcDir 'src/generated/resources' } +sourceSets.main { + resources { srcDir 'src/generated/resources' } + + blossom.javaSources { + property("version", mod_version) + property("gitCommint", gitHash.toString()) + } +} repositories { maven { @@ -248,6 +258,34 @@ tasks.named('jar', Jar).configure { finalizedBy 'reobfJar' } +String calculateGitHash() { + try { + ExecOutput output = providers.exec { + commandLine("git", "rev-parse", "HEAD") + } + + return output.standardOutput.asText.get().trim() + } catch (Throwable ignored) { + return "unknown" + } +} + +boolean hasUnstaged() { + try { + ExecOutput output = providers.exec { + commandLine("git", "status", "--porcelain") + } + String result = output.standardOutput.asText.get().replace("/M gradlew(\\.bat)?/", "").trim() + if (!result.isEmpty()) + println("Found stageable results:\n ${result}\n") + return !result.isEmpty() + } catch (Throwable ignored) { + return false + } +} + + + // However if you are in a multi-project build, dev time needs unobfed jar files, so you can delay the obfuscation until publishing by doing: // tasks.named('publish').configure { // dependsOn 'reobfJar' From 19373216e4d8fa80f82581d6bd9938b10da1093e Mon Sep 17 00:00:00 2001 From: Giovanni Date: Fri, 14 Nov 2025 23:26:23 +0100 Subject: [PATCH 02/13] Add GitHub Actions workflow and VSCode launch configurations; update Gradle build scripts --- .github/workflows/workflow.yml | 42 ++++ .vscode/launch.json | 77 +++++++ build.gradle | 387 ++++++++++++++++----------------- gradle.properties | 7 +- gradle/java.gradle | 39 ++++ 5 files changed, 356 insertions(+), 196 deletions(-) create mode 100644 .github/workflows/workflow.yml create mode 100644 .vscode/launch.json create mode 100644 gradle/java.gradle diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml new file mode 100644 index 00000000..68150836 --- /dev/null +++ b/.github/workflows/workflow.yml @@ -0,0 +1,42 @@ +name: BuildMod.yml +on: + push: + pull_request: + workflow_dispatch: + inputs: + is-release: + description: 'Publish release to Github' + required: true + default: false + type: boolean + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Setup Java 17 + run: echo "JAVA_HOME=$JAVA_HOME_17_X64" >> "$GITHUB_ENV" + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + with: + cache-disabled: ${{ inputs.is-release }} + cache-read-only: false + + - name: Build + run: ./gradlew build + + - name: Run Gametests + if: ${{ !inputs.is-release }} + run: ./gradlew runGameTestServer + + - name: Publish + if: ${{ inputs.is-release }} + env: +# MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }} +# CURSEFORGE_TOKEN: ${{ secrets.CURSEFORGE_TOKEN }} + GITHUB_TOKEN: ${{ secrets.BUILD_GITHUB_TOKEN }} + run: ./gradlew publishMods \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..0b5296bf --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,77 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "java", + "request": "launch", + "name": "Client", + "presentation": { + "group": "Mod Development - CreateNuclearForge", + "order": 0 + }, + "projectName": "CreateNuclearForge", + "mainClass": "net.neoforged.devlaunch.Main", + "args": [ + "@C:\\Users\\giova\\bureau\\mod-fabric\\CreateNuclearForge\\build\\moddev\\clientRunProgramArgs.txt" + ], + "vmArgs": [ + "@C:\\Users\\giova\\bureau\\mod-fabric\\CreateNuclearForge\\build\\moddev\\clientRunVmArgs.txt", + "-Dfml.modFolders\u003dcreatenuclear%%C:\\Users\\giova\\bureau\\mod-fabric\\CreateNuclearForge\\bin\\main" + ], + "cwd": "${workspaceFolder}\\run", + "env": { + "MOD_CLASSES": "createnuclear%%C:\\Users\\giova\\bureau\\mod-fabric\\CreateNuclearForge\\bin\\main" + }, + "console": "internalConsole", + "shortenCommandLine": "none" + }, + { + "type": "java", + "request": "launch", + "name": "Data", + "presentation": { + "group": "Mod Development - CreateNuclearForge", + "order": 1 + }, + "projectName": "CreateNuclearForge", + "mainClass": "net.neoforged.devlaunch.Main", + "args": [ + "@C:\\Users\\giova\\bureau\\mod-fabric\\CreateNuclearForge\\build\\moddev\\dataRunProgramArgs.txt" + ], + "vmArgs": [ + "@C:\\Users\\giova\\bureau\\mod-fabric\\CreateNuclearForge\\build\\moddev\\dataRunVmArgs.txt", + "-Dfml.modFolders\u003dcreatenuclear%%C:\\Users\\giova\\bureau\\mod-fabric\\CreateNuclearForge\\bin\\main" + ], + "cwd": "${workspaceFolder}\\run", + "env": { + "MOD_CLASSES": "createnuclear%%C:\\Users\\giova\\bureau\\mod-fabric\\CreateNuclearForge\\bin\\main" + }, + "console": "internalConsole", + "shortenCommandLine": "none" + }, + { + "type": "java", + "request": "launch", + "name": "Server", + "presentation": { + "group": "Mod Development - CreateNuclearForge", + "order": 2 + }, + "projectName": "CreateNuclearForge", + "mainClass": "net.neoforged.devlaunch.Main", + "args": [ + "@C:\\Users\\giova\\bureau\\mod-fabric\\CreateNuclearForge\\build\\moddev\\serverRunProgramArgs.txt" + ], + "vmArgs": [ + "@C:\\Users\\giova\\bureau\\mod-fabric\\CreateNuclearForge\\build\\moddev\\serverRunVmArgs.txt", + "-Dfml.modFolders\u003dcreatenuclear%%C:\\Users\\giova\\bureau\\mod-fabric\\CreateNuclearForge\\bin\\main" + ], + "cwd": "${workspaceFolder}\\run\\server", + "env": { + "MOD_CLASSES": "createnuclear%%C:\\Users\\giova\\bureau\\mod-fabric\\CreateNuclearForge\\bin\\main" + }, + "console": "internalConsole", + "shortenCommandLine": "none" + } + ] +} \ No newline at end of file diff --git a/build.gradle b/build.gradle index 505989f9..f07dbfa8 100644 --- a/build.gradle +++ b/build.gradle @@ -1,37 +1,35 @@ plugins { - id 'eclipse' - id 'idea' - id 'maven-publish' - id 'net.minecraftforge.gradle' version '[6.0,6.2)' - id 'org.spongepowered.mixin' version "${mixingradle_version}" - id 'org.parchmentmc.librarian.forgegradle' version "${librarian_version}" + id("idea") + id("eclipse") + id("maven-publish") + id("net.kyori.blossom") version "2.1.0" // https://github.com/KyoriPowered/blossom + id("dev.ithundxr.silk") version "0.11.15" // https://github.com/ithundxr/silk + id("me.modmuss50.mod-publish-plugin") version "0.8.4" // https://github.com/modmuss50/mod-publish-plugin + id("net.neoforged.moddev.legacyforge") version "2.0.107" // https://projects.neoforged.net/neoforged/ModDevGradle + id("org.jetbrains.gradle.plugin.idea-ext") version "1.1.8" // https://github.com/JetBrains/gradle-idea-ext-plugin } +apply(from: "./gradle/java.gradle") + boolean dev = System.getenv("RELEASE") == null || System.getenv("RELEASE") == "false" ext.buildNumber = System.getenv("BUILD_NUMBER") String gitHash = calculateGitHash() + (hasUnstaged() ? "-modified" : "") - base { - archivesName = 'createnuclear' + archivesName = "createnuclear-${artifact_minecraft_version}" group = mod_group_id - version = mod_version + '-forge' + version = mod_version + '-forge' + (dev && buildNumber != null ? "-${buildNumber}" : "") } -// Mojang ships Java 17 to end users in 1.18+, so your mod should target Java 17. -java.toolchain.languageVersion = JavaLanguageVersion.of(17) - println "Java: ${System.getProperty 'java.version'}, " + "JVM: ${System.getProperty 'java.vm.version'} (${System.getProperty 'java.vendor'}), " + "Arch: ${System.getProperty 'os.arch'}" +Provider refmap mixin { - // add sourceSets.main, 'createnuclear.forge.refmap.json' - config 'createnuclear.forge.mixins.json' - - debug.verbose = true - debug.export = true + refmap = add(sourceSets.main, "createnuclear.refmap.json") + config "createnuclear.mixins.json" } idea { @@ -41,121 +39,70 @@ idea { } } -minecraft { - // The mappings can be changed at any time and must be in the following format. - // Channel: Version: - // official MCVersion Official field/method names from Mojang mapping files - // parchment YYYY.MM.DD-MCVersion Open community-sourced parameter names and javadocs layered on top of official - // - // You must be aware of the Mojang license when using the 'official' or 'parchment' mappings. - // See more information here: https://github.com/MinecraftForge/MCPConfig/blob/master/Mojang.md - // - // Parchment is an unofficial project maintained by ParchmentMC, separate from MinecraftForge - // Additional setup is needed to use their mappings: https://parchmentmc.org/docs/getting-started - // - // Use non-default mappings at your own risk. They may not always work. - // Simply re-run your setup task after changing the mappings to update your workspace. - mappings channel: mapping_channel, version: mapping_version - mappings channel: 'parchment', version: '2023.09.03-1.20.1' - - accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') - - // When true, this property will have all Eclipse/IntelliJ IDEA run configurations run the "prepareX" task for the given run configuration before launching the game. - // In most cases, it is not necessary to enable. - // enableEclipsePrepareRuns = true - // enableIdeaPrepareRuns = true - - // This property allows configuring Gradle's ProcessResources task(s) to run on IDE output locations before launching the game. - // It is REQUIRED to be set to true for this template to function. - // See https://docs.gradle.org/current/dsl/org.gradle.language.jvm.tasks.ProcessResources.html - copyIdeResources = true - - // When true, this property will add the folder name of all declared run configurations to generated IDE run configurations. - // The folder name can be set on a run configuration using the "folderName" property. - // By default, the folder name of a run configuration is the name of the Gradle project containing it. - // generateRunFolders = true - - // This property enables access transformers for use in development. - // They will be applied to the Minecraft artifact. - // The access transformer file can be anywhere in the project. - // However, it must be at "META-INF/accesstransformer.cfg" in the final mod jar to be loaded by Forge. - // This default location is a best practice to automatically put the file in the right place in the final jar. - // See https://docs.minecraftforge.net/en/latest/advanced/accesstransformers/ for more information. - // accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') - - // Default run configurations. - // These can be tweaked, removed, or duplicated as needed. +legacyForge { + version = "$minecraft_version-$forge_version" + + // TODO - Try turning this on later + validateAccessTransformers = false + + if (file("src/main/resources/META-INF/accesstransformer.cfg").exists()) { + accessTransformers.from "src/main/resources/META-INF/accesstransformer.cfg" + } + + parchment { + minecraftVersion = minecraft_version + mappingsVersion = mapping_version + } + + mods { + createnuclear { + sourceSet(sourceSets.main) + } + } + runs { // applies to all the run configs below - configureEach { - workingDirectory project.file('run') - - // Recommended logging data for a userdev environment - // The markers can be added/remove as needed separated by commas. - // "SCAN": For mods scan. - // "REGISTRIES": For firing of registry events. - // "REGISTRYDUMP": For getting the contents of all registries. - property 'forge.logging.markers', 'REGISTRIES' - // Recommended logging level for the console - // You can set various levels here. - // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels - property 'forge.logging.console.level', 'debug' - - property 'mixin.env.remapRefMap', 'true' - property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" - - mods { - "${mod_id}" { - source sourceSets.main - } - } + systemProperty("forge.logging.markers", "REGISTRIES") + systemProperty("forge.logging.console.level", "info") + jvmArguments = ["-XX:+IgnoreUnrecognizedVMOptions", "-XX:+AllowEnhancedClassRedefinition"] + //jvmArgs("-XX:-OmitStackTraceInFastThrow") // uncomment when you get exceptions with null messages etc + //jvmArgs "-XX:+UnlockCommercialFeatures" // uncomment for profiling + + systemProperty("mixin.debug.export", "true") + systemProperty("mixin.debug.verbose", "true") + + programArgument("-mixin.config=createnuclear.forge.mixins.json") } + client { - workingDirectory project.file('run') - // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. - //property 'mixin.env.remapRefMap', 'true' - //property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" - property("mixin.env.remapRefMap", "true") - property("mixin.env.refMapRemappingFile", "${projectDir}/build/createSrgToMcp/output.srg") + client() + + gameDirectory = project.file("run") } server { - workingDirectory project.file('run/server') - //property 'forge.enabledGameTestNamespaces', mod_id - //args '--nogui' - } + server() - // This run config launches GameTestServer and runs all registered gametests, then exits. - // By default, the server will crash when no gametests are provided. - // The gametest system is also enabled by default for other run configs under the /test command. - gameTestServer { - workingDirectory project.file('run/gametest') - //property 'forge.enabledGameTestNamespaces', mod_id + gameDirectory = project.file("run/server") } data { - // example of overriding the workingDirectory set in configureEach above - workingDirectory project.file('run') - property 'forge.logging.markers', 'REGISTRIES,REGISTRYDUMP' - property 'forge.logging.console.level', 'debug' - - // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. - args '--mod', mod_id, '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') + data() + + gameDirectory = project.file("run") + systemProperty("forge.logging.markers", "REGISTRIES,REGISTRYDUMP") + systemProperty("forge.logging.console.level", "debug") + programArguments.addAll( + "--mod", mod_id as String, + "--all", + "--output", file("src/generated/resources/").getAbsolutePath(), + "--existing", file("src/main/resources").getAbsolutePath() + ) } } } -// Include resources generated by data generators. -sourceSets.main { - resources { srcDir 'src/generated/resources' } - - blossom.javaSources { - property("version", mod_version) - property("gitCommint", gitHash.toString()) - } -} - repositories { maven { // location of the maven that hosts JEI files before January 2023 @@ -182,80 +129,158 @@ repositories { } dependencies { - - /** Setup **/ - minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" - - /* other minecraft dependencies are here */ - implementation fg.deobf("curse.maven:jade-324717:6106101") + modImplementation("curse.maven:jade-324717:6106101") + // compile against the JEI API but do not include it at runtime - compileOnly fg.deobf("mezz.jei:jei-${minecraft_version}-common-api:${jei_version}") - compileOnly fg.deobf("mezz.jei:jei-${minecraft_version}-forge-api:${jei_version}") + modCompileOnly("mezz.jei:jei-${minecraft_version}-common-api:${jei_version}") + modCompileOnly("mezz.jei:jei-${minecraft_version}-forge-api:${jei_version}") + // at runtime, use the full JEI jar for Forge - - implementation(fg.deobf("com.simibubi.create:create-${minecraft_version}:${create_version}:slim") { transitive = false }) - implementation(fg.deobf("net.createmod.ponder:Ponder-Forge-${minecraft_version}:${ponder_version}")) - compileOnly(fg.deobf("dev.engine-room.flywheel:flywheel-forge-api-${minecraft_version}:${flywheel_version}")) - runtimeOnly(fg.deobf("dev.engine-room.flywheel:flywheel-forge-${minecraft_version}:${flywheel_version}")) - implementation(fg.deobf("com.tterrag.registrate:Registrate:${registrate_version}")) - compileOnly(annotationProcessor("io.github.llamalad7:mixinextras-common:0.4.1")) - implementation("io.github.llamalad7:mixinextras-forge:0.4.1") - - switch (recipe_viewer.toLowerCase(Locale.ROOT)) { - case 'jei': runtimeOnly(fg.deobf("mezz.jei:jei-${minecraft_version}-forge:${jei_version}")); break + case 'jei': modRuntimeOnly("mezz.jei:jei-${minecraft_version}-forge:${jei_version}"); break case "disabled": break default: println("Unknown recipe viewer specified: $recipe_viewer. Must be JEI or disabled.") } - //runtimeOnly(fg.deobf("mezz.jei:jei-${create_minecraft_version}-forge:${flywheel_minecraft_version}")) + modImplementation("com.simibubi.create:create-${minecraft_version}:${create_version}:slim") { transitive = false } + modImplementation("net.createmod.ponder:Ponder-Forge-${minecraft_version}:${ponder_version}") + modCompileOnly("dev.engine-room.flywheel:flywheel-forge-api-${minecraft_version}:${flywheel_version}") + modRuntimeOnly("dev.engine-room.flywheel:flywheel-forge-${minecraft_version}:${flywheel_version}") + modImplementation("com.tterrag.registrate:Registrate:${registrate_version}") + + implementation("io.github.llamalad7:mixinextras-forge:${mixin_extras_version}") + compileOnly(annotationProcessor("io.github.llamalad7:mixinextras-common:${mixin_extras_version}")) // https://discord.com/channels/313125603924639766/725850371834118214/910619168821354497 // Prevent Mixin annotation processor from getting into IntelliJ's annotation processor settings // This allows 'Settings > Build, Execution, and Deployment > Build Tools > Gradle > Build and run using' set to IntelliJ to work correctly - /*if (!Boolean.getBoolean('idea.sync.active')) { - annotationProcessor 'org.spongepowered:mixin:0.8.5:processor' - }*/ - annotationProcessor "org.spongepowered:mixin:${mixin_version}:processor" + if (!Boolean.getBoolean("idea.sync.active")) { + annotationProcessor "org.spongepowered:mixin:${mixin_version}:processor" + } } -// This block of code expands all declared replace properties in the specified resource targets. -// A missing property will result in an error. Properties are expanded using ${} Groovy notation. -// When "copyIdeResources" is enabled, this will also run before the game launches in IDE environments. -// See https://docs.gradle.org/current/dsl/org.gradle.language.jvm.tasks.ProcessResources.html -tasks.named('processResources', ProcessResources).configure { +sourceSets.main { + resources { + srcDir("src/generated/resources") + exclude(".cache/") + } + + blossom.javaSources { + property("version", mod_version) + property("gitCommit", gitHash.toString()) + } +} + +processResources { var replaceProperties = [ - minecraft_version: minecraft_version, minecraft_version_range: minecraft_version_range, - forge_version: forge_version, forge_version_range: forge_version_range, - loader_version_range: loader_version_range, - mod_id: mod_id, mod_name: mod_name, mod_license: mod_license, mod_version: mod_version, - mod_authors: mod_authors, mod_description: mod_description, - create_version_range: create_version_range, ponder_version: ponder_version + mod_id : mod_id, + mod_name : mod_name, + mod_author : mod_authors, + mod_description: mod_description, + mod_license : mod_license, ] - inputs.properties replaceProperties - filesMatching(['META-INF/mods.toml', 'pack.mcmeta']) { - expand replaceProperties + [project: project] + // Replaces FML's magic file.jarVersion string with the correct version at build time. + replaceProperties.put("file", [jarVersion: project.version]) + + filesMatching(["META-INF/mods.toml"]) { + expand(replaceProperties) } } -// Example for how to get properties into the manifest for reading at runtime. -tasks.named('jar', Jar).configure { - manifest { - attributes([ - 'Specification-Title' : mod_id, - 'Specification-Vendor' : mod_authors, - 'Specification-Version' : '1', // We are version 1 of ourselves - 'Implementation-Title' : project.name, - 'Implementation-Version' : project.jar.archiveVersion, - 'Implementation-Vendor' : mod_authors, - 'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") - ]) +jar { + String name = base.archivesName.get() + + from("LICENSE") { + rename { "${it}_${name}" } } - // This is the preferred method to reobfuscate your jar file - finalizedBy 'reobfJar' + manifest.attributes([ + "MixinConfigs": "createnuclear.mixins.json", + "Git-Hash" : gitHash + ]) +} + +tasks.named("sourcesJar") { + manifest.attributes([ + "Git-Hash": gitHash + ]) +} + +final slimJar = tasks.register("slimJar", Jar) { + archiveClassifier = "slim" + from(sourceSets.main.output) + from(refmap) + manifest.attributes([ + "MixinConfigs": "createnuclear.mixins.json", + "Git-Hash" : gitHash + ]) +} +obfuscation.reobfuscate(slimJar, sourceSets.main) + +project.publishing { + publications { + mavenJava(MavenPublication) { + artifactId base.archivesName.get() + from components.java + + artifact(tasks.reobfJar) { + classifier = "all" + } + } + } + + repositories { + if (project.hasProperty("mavenUsername") && project.hasProperty("mavenPassword") && project.hasProperty("mavenURL")) { + project.logger.lifecycle("Adding maven from secrets") + + maven { + credentials { + username = project.property("mavenUsername") as String + password = project.property("mavenPassword") as String + } + url = URI.create(project.property("mavenURL") as String) + } + } + + if (project.hasProperty("mavendir")) { + maven { url mavendir } + } + } +} + +publishMods { + file = reobfJar.archiveFile + changelog = "Release ${mod_version}" + type = STABLE + version = "mc$minecraft_version-$mod_version" + displayName = "$mod_name $mod_version for mc$minecraft_version" + modLoaders.add("forge") + // modLoaders.add("neoforge") + + // curseforge { + // accessToken = providers.environmentVariable("CURSEFORGE_TOKEN") + // projectId = "328085" + // minecraftVersions.add(minecraft_version) + // } + + // modrinth { + // accessToken = providers.environmentVariable("MODRINTH_TOKEN") + // projectId = "LNytGWDc" + // minecraftVersions.add(minecraft_version) + // } + + github { + accessToken = providers.environmentVariable("GITHUB_TOKEN") + repository = "Create-Nuclear-Team/TestExportJar" + commitish = gitHash + tagName = "mc$minecraft_version-$mod_version" + file.unset() + file.unsetConvention() + + allowEmptyFiles = true + } } String calculateGitHash() { @@ -263,7 +288,6 @@ String calculateGitHash() { ExecOutput output = providers.exec { commandLine("git", "rev-parse", "HEAD") } - return output.standardOutput.asText.get().trim() } catch (Throwable ignored) { return "unknown" @@ -283,28 +307,3 @@ boolean hasUnstaged() { return false } } - - - -// However if you are in a multi-project build, dev time needs unobfed jar files, so you can delay the obfuscation until publishing by doing: -// tasks.named('publish').configure { -// dependsOn 'reobfJar' -// } - -// Example configuration to allow publishing using the maven-publish plugin -publishing { - publications { - register('mavenJava', MavenPublication) { - artifact jar - } - } - repositories { - maven { - url "file://${project.projectDir}/mcmodsrepo" - } - } -} - -tasks.withType(JavaCompile).configureEach { - options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation -} diff --git a/gradle.properties b/gradle.properties index 54279035..289fb16c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -21,6 +21,7 @@ registrate_version = MC1.20-1.3.3 # The Minecraft version must agree with the Forge version to get a valid artifact minecraft_version=1.20.1 +artifact_minecraft_version = 1.20.1 # The Minecraft version range can use any release version of Minecraft as bounds. # Snapshots, pre-releases, and release candidates are not guaranteed to sort properly # as they do not follow standard versioning conventions. @@ -45,12 +46,14 @@ loader_version_range=[47,) # # Parchment is an unofficial project maintained by ParchmentMC, separate from Minecraft Forge. # Additional setup is needed to use their mappings, see https://parchmentmc.org/docs/getting-started -mapping_channel=official +mapping_channel=2023.09.03 +use_parchment = true # The mapping version to query from the mapping channel. # This must match the format required by the mapping channel. -mapping_version=1.20.1 +mapping_version=2023.09.03 mixingradle_version = 0.7.+ mixin_version = 0.8.5 +mixin_extras_version = 0.4.1 librarian_version = 1.+ ## Compact diff --git a/gradle/java.gradle b/gradle/java.gradle new file mode 100644 index 00000000..0d4e7bb9 --- /dev/null +++ b/gradle/java.gradle @@ -0,0 +1,39 @@ +apply plugin: 'java' + +java.toolchain.languageVersion = JavaLanguageVersion.of(17) +java.withSourcesJar() +java.withJavadocJar() + +jar { + manifest { + attributes([ + 'Specification-Title' : mod_name, + 'Specification-Vendor' : mod_authors, + 'Specification-Version' : project.jar.archiveVersion, + 'Implementation-Title' : project.name, + 'Implementation-Version' : project.jar.archiveVersion, + 'Implementation-Vendor' : mod_authors, + 'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), + 'Timestampe' : System.currentTimeMillis(), + 'Built-On-Java' : "${System.getProperty('java.vm.version')} (${System.getProperty('java.vm.vendor')})", + 'Built-On-Minecraft' : minecraft_version + ]) + } +} + +tasks.withType(JavaCompile).configureEach { + it.options.encoding = "UTF-8" + it.options.release = 17 +} + +// Disables Gradle's custom module metadata from being published to maven. The +// metadata includes mapped dependencies which are not reasonably consumable by +// other mod developers. +tasks.withType(GenerateModuleMetadata) { + enabled = false +} + +javadoc { + // Suppress annoying warnings when generating JavaDoc files. + options.addStringOption('Xdoclint:none', '-quiet') +} \ No newline at end of file From 88e26fab82ca22adaae49df9691237467411e26a Mon Sep 17 00:00:00 2001 From: Giovanni Date: Fri, 14 Nov 2025 23:28:53 +0100 Subject: [PATCH 03/13] Add workflow_call trigger to GitHub Actions workflow --- .github/workflows/workflow.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 68150836..a25b8784 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -2,6 +2,7 @@ name: BuildMod.yml on: push: pull_request: + workflow_call: workflow_dispatch: inputs: is-release: From 47fbdc725c244e2563b9aadaa176e587307281e0 Mon Sep 17 00:00:00 2001 From: Giovanni Date: Fri, 14 Nov 2025 23:31:17 +0100 Subject: [PATCH 04/13] Make gradlew executable in GitHub Actions workflow --- .github/workflows/workflow.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index a25b8784..efdedcc1 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -27,6 +27,9 @@ jobs: cache-disabled: ${{ inputs.is-release }} cache-read-only: false + - name: Make gradlew executable + run: chmod +x ./gradlew + - name: Build run: ./gradlew build From e6f3af8f440052e08071b6dd0c04574e2100690a Mon Sep 17 00:00:00 2001 From: Giovanni Date: Fri, 14 Nov 2025 23:38:01 +0100 Subject: [PATCH 05/13] Update processResources to include additional version properties --- build.gradle | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index f07dbfa8..64beee69 100644 --- a/build.gradle +++ b/build.gradle @@ -174,11 +174,12 @@ sourceSets.main { processResources { var replaceProperties = [ - mod_id : mod_id, - mod_name : mod_name, - mod_author : mod_authors, - mod_description: mod_description, - mod_license : mod_license, + minecraft_version: minecraft_version, minecraft_version_range: minecraft_version_range, + forge_version: forge_version, forge_version_range: forge_version_range, + loader_version_range: loader_version_range, + mod_id: mod_id, mod_name: mod_name, mod_license: mod_license, mod_version: mod_version, + mod_authors: mod_authors, mod_description: mod_description, + create_version_range: create_version_range, ponder_version: ponder_version ] // Replaces FML's magic file.jarVersion string with the correct version at build time. From 6d9fea04db33d41364c4e8764f5c581d48f296b2 Mon Sep 17 00:00:00 2001 From: Giovanni Date: Fri, 14 Nov 2025 23:48:42 +0100 Subject: [PATCH 06/13] Comment out Gametests step in GitHub Actions workflow --- .github/workflows/workflow.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index efdedcc1..5ae0b73e 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -33,9 +33,9 @@ jobs: - name: Build run: ./gradlew build - - name: Run Gametests - if: ${{ !inputs.is-release }} - run: ./gradlew runGameTestServer + # - name: Run Gametests + # if: ${{ !inputs.is-release }} + # run: ./gradlew runGameTestServer - name: Publish if: ${{ inputs.is-release }} From ff62d191d52ee574504da37accaea671ad2c7349 Mon Sep 17 00:00:00 2001 From: Giovanni Date: Fri, 14 Nov 2025 23:55:48 +0100 Subject: [PATCH 07/13] Set default value of is-release input to true in GitHub Actions workflow --- .github/workflows/workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 5ae0b73e..a01b6d1f 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -8,7 +8,7 @@ on: is-release: description: 'Publish release to Github' required: true - default: false + default: true type: boolean jobs: From 187e7ab9a09992e659fd6dc69125e1c5de52e0f1 Mon Sep 17 00:00:00 2001 From: Giovanni Date: Fri, 14 Nov 2025 23:57:43 +0100 Subject: [PATCH 08/13] Comment out push, pull_request, and workflow_call triggers in GitHub Actions workflow --- .github/workflows/workflow.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index a01b6d1f..60bc8ef2 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -1,8 +1,8 @@ name: BuildMod.yml on: - push: - pull_request: - workflow_call: + # push: + # pull_request: + # workflow_call: workflow_dispatch: inputs: is-release: From b18c98c9b361896c177e398da0eff9ba7f9b5cb5 Mon Sep 17 00:00:00 2001 From: Giovanni Date: Fri, 14 Nov 2025 23:58:39 +0100 Subject: [PATCH 09/13] Re-enable push, pull_request, and workflow_call triggers in GitHub Actions workflow; comment out conditional publish step --- .github/workflows/workflow.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 60bc8ef2..9565de7a 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -1,8 +1,8 @@ name: BuildMod.yml on: - # push: - # pull_request: - # workflow_call: + push: + pull_request: + workflow_call: workflow_dispatch: inputs: is-release: @@ -38,7 +38,7 @@ jobs: # run: ./gradlew runGameTestServer - name: Publish - if: ${{ inputs.is-release }} + # if: ${{ inputs.is-release }} env: # MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }} # CURSEFORGE_TOKEN: ${{ secrets.CURSEFORGE_TOKEN }} From 7d0bf1b33b4309643e4c6f81bf7e3ea6ba1cab67 Mon Sep 17 00:00:00 2001 From: Giovanni Date: Sat, 15 Nov 2025 00:02:36 +0100 Subject: [PATCH 10/13] Update repository name in GitHub Actions and modify mod version for testing --- build.gradle | 2 +- gradle.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 64beee69..8d7a27bf 100644 --- a/build.gradle +++ b/build.gradle @@ -274,7 +274,7 @@ publishMods { github { accessToken = providers.environmentVariable("GITHUB_TOKEN") - repository = "Create-Nuclear-Team/TestExportJar" + repository = "Create-Nuclear-Team/CreateNuclearForge" commitish = gitHash tagName = "mc$minecraft_version-$mod_version" file.unset() diff --git a/gradle.properties b/gradle.properties index 289fb16c..078585eb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -72,7 +72,7 @@ mod_name=Create Nuclear # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=All Rights Reserved # The mod version. See https://semver.org/ -mod_version=1.3.0 +mod_version=1.3.0-test # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # This should match the base package used for the mod sources. # See https://maven.apache.org/guides/mini/guide-naming-conventions.html From 0e105327b1d9fbed81773b0d755197e88f165e1b Mon Sep 17 00:00:00 2001 From: Giovanni Date: Sat, 15 Nov 2025 01:11:38 +0100 Subject: [PATCH 11/13] Refactor GitHub Actions workflow triggers and update mod version format in build.gradle --- .github/workflows/workflow.yml | 2 +- build.gradle | 28 ++++++++++++++++++++-------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 9565de7a..d7097998 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -1,7 +1,7 @@ name: BuildMod.yml on: - push: pull_request: + branches: [ main ] workflow_call: workflow_dispatch: inputs: diff --git a/build.gradle b/build.gradle index 8d7a27bf..c6cc9826 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ String gitHash = calculateGitHash() + (hasUnstaged() ? "-modified" : "") base { archivesName = "createnuclear-${artifact_minecraft_version}" group = mod_group_id - version = mod_version + '-forge' + (dev && buildNumber != null ? "-${buildNumber}" : "") + version = 'forge' + (dev && buildNumber != null ? "-${buildNumber}" : "") } println "Java: ${System.getProperty 'java.version'}, " + @@ -253,32 +253,44 @@ project.publishing { publishMods { file = reobfJar.archiveFile - changelog = "Release ${mod_version}" + changelog = file("CHANGELOG.md").text type = STABLE - version = "mc$minecraft_version-$mod_version" + version = "$mod_version" displayName = "$mod_name $mod_version for mc$minecraft_version" modLoaders.add("forge") // modLoaders.add("neoforge") // curseforge { // accessToken = providers.environmentVariable("CURSEFORGE_TOKEN") - // projectId = "328085" + // projectId = "" // minecraftVersions.add(minecraft_version) + + // javaVersions.add(JavaVersion.VERSION_17) + + // clientRequired = true + // serverRequired = true // } // modrinth { // accessToken = providers.environmentVariable("MODRINTH_TOKEN") - // projectId = "LNytGWDc" + // projectId = "" // minecraftVersions.add(minecraft_version) + + // requires { + // id = "LNytGWDc" + // slug = "Create" + // } + // optional { + // id = "u6dRKJwZ" + // slug = "JEI" + // } // } github { accessToken = providers.environmentVariable("GITHUB_TOKEN") repository = "Create-Nuclear-Team/CreateNuclearForge" commitish = gitHash - tagName = "mc$minecraft_version-$mod_version" - file.unset() - file.unsetConvention() + tagName = "v${mod_version}-${gitHash.substring(0,7)}" allowEmptyFiles = true } From 44fa34d32329c63be0f45a10edd988cef3885979 Mon Sep 17 00:00:00 2001 From: Giovanni Date: Sat, 15 Nov 2025 01:13:24 +0100 Subject: [PATCH 12/13] Update GitHub Actions workflow to make 'is-release' input optional and set default to false --- .github/workflows/workflow.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index d7097998..94e3ee59 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -1,14 +1,11 @@ name: BuildMod.yml on: - pull_request: - branches: [ main ] - workflow_call: workflow_dispatch: inputs: is-release: description: 'Publish release to Github' - required: true - default: true + required: false + default: false type: boolean jobs: From db00abc8f5e28ba93fafdf53a8ffffdb9cd1dc52 Mon Sep 17 00:00:00 2001 From: Giovanni Date: Sat, 15 Nov 2025 01:40:58 +0100 Subject: [PATCH 13/13] Update mixin configuration to use 'createnuclear.forge.mixins.json' --- build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index c6cc9826..ead357de 100644 --- a/build.gradle +++ b/build.gradle @@ -29,7 +29,7 @@ println "Java: ${System.getProperty 'java.version'}, " + Provider refmap mixin { refmap = add(sourceSets.main, "createnuclear.refmap.json") - config "createnuclear.mixins.json" + config "createnuclear.forge.mixins.json" } idea { @@ -198,7 +198,7 @@ jar { } manifest.attributes([ - "MixinConfigs": "createnuclear.mixins.json", + "MixinConfigs": "createnuclear.forge.mixins.json", "Git-Hash" : gitHash ]) } @@ -214,7 +214,7 @@ final slimJar = tasks.register("slimJar", Jar) { from(sourceSets.main.output) from(refmap) manifest.attributes([ - "MixinConfigs": "createnuclear.mixins.json", + "MixinConfigs": "createnuclear.forge.mixins.json", "Git-Hash" : gitHash ]) }