Skip to content

Commit fdca813

Browse files
committed
update to 1.21.11, optimize/update gradle build and gh actions scripts, disable moddevgradle recomp, drop parchment mappings, make merging jars fast, use jar-optimizer and prepare for 26.1
1 parent a0715b5 commit fdca813

File tree

74 files changed

+417
-443
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

74 files changed

+417
-443
lines changed

.github/workflows/build.yml

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,31 +17,22 @@ jobs:
1717
build:
1818
runs-on: ubuntu-latest
1919
steps:
20-
- uses: actions/checkout@v4
21-
- name: Set up JDK 21
22-
uses: actions/setup-java@v4
20+
- uses: actions/checkout@v6
21+
- name: Set up JDK 25
22+
uses: actions/setup-java@v5
2323
with:
2424
distribution: 'temurin'
25-
java-version: 21
25+
java-version: 25
2626

27-
- name: Cache gradle files
28-
uses: actions/cache@v4
27+
- name: Setup Gradle
28+
uses: gradle/actions/setup-gradle@v5
2929
with:
30-
path: |
31-
~/.gradle/caches
32-
~/.gradle/wrapper
33-
./.gradle/loom-cache
34-
key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle.kts', '**/gradle-wrapper.properties', '**/gradle.properties', '**/*.accesswidener', 'settings.json') }}
35-
restore-keys: |
36-
gradle-${{ runner.os }}
37-
gradle
38-
39-
- name: Build with gradle
30+
cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
31+
- name: Execute Gradle build
4032
run: |
4133
chmod +x gradlew
4234
if [ -z "${{ inputs.target_subproject }}" ]; then
4335
echo "Building all subprojects"
44-
./gradlew clean
4536
./gradlew build
4637
else
4738
args=$(echo "${{ inputs.target_subproject }}" | tr ',' '\n' | sed 's/$/:build/' | paste -sd ' ')
@@ -53,7 +44,7 @@ jobs:
5344
BUILD_RELEASE: ${{ inputs.release }}
5445

5546
- name: Upload artifacts
56-
uses: actions/upload-artifact@v4
47+
uses: actions/upload-artifact@v6
5748
with:
5849
name: build-artifacts
5950
path: merged

.github/workflows/release.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ jobs:
6565
matrix: ${{ fromJson(needs.matrix_prep.outputs.matrix) }}
6666

6767
steps:
68-
- uses: actions/checkout@v4
68+
- uses: actions/checkout@v6
6969

7070
- name: Display context
7171
run: |
@@ -143,7 +143,7 @@ jobs:
143143
done
144144
145145
- name: Prepare changelog
146-
uses: actions/github-script@v6
146+
uses: actions/github-script@v8
147147
id: changelog
148148
with:
149149
script: return process.env.CHANGELOG

.github/workflows/tests.yml

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,18 @@ jobs:
66
tests:
77
runs-on: windows-latest
88
steps:
9-
- uses: actions/checkout@v4
10-
- name: Set up JDK 21
11-
uses: actions/setup-java@v4
9+
- uses: actions/checkout@v6
10+
- name: Set up JDK 25
11+
uses: actions/setup-java@v5
1212
with:
1313
distribution: 'temurin'
14-
java-version: 21
14+
java-version: 25
1515

16-
- name: Cache gradle files
17-
uses: actions/cache@v4
16+
- name: Setup Gradle
17+
uses: gradle/actions/setup-gradle@v5
1818
with:
19-
path: |
20-
~/.gradle/wrapper
21-
./.gradle/loom-cache
22-
key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle.kts', '**/gradle-wrapper.properties', '**/gradle.properties', '**/*.accesswidener', 'settings.json') }}
23-
restore-keys: |
24-
gradle-${{ runner.os }}
19+
cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
2520
- name: Run tests
2621
run: |
2722
chmod +x gradlew
28-
./gradlew test
23+
./gradlew core:test

build.fabric.gradle.kts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,7 @@ dependencies {
2020
implementation(project(":loader-core"))
2121

2222
minecraft("com.mojang:minecraft:${property("deps.minecraft")}")
23-
mappings(loom.layered {
24-
officialMojangMappings()
25-
if (hasProperty("deps.parchment"))
26-
parchment("org.parchmentmc.data:parchment-${property("deps.parchment")}@zip")
27-
})
23+
mappings(loom.officialMojangMappings())
2824

2925
modImplementation("net.fabricmc:fabric-loader:${property("deps.fabric-loader")}")
3026

@@ -38,20 +34,24 @@ dependencies {
3834
}
3935

4036
// Required for commands
41-
if (stonecutter.eval(stonecutter.current.version, "<1.19.2")) {
37+
if (sc.current.parsed < "1.19.2") {
4238
include(modImplementation(fabricApi.module("fabric-command-api-v1", property("deps.fabric-api") as String))!!)
4339
} else {
4440
include(modImplementation(fabricApi.module("fabric-command-api-v2", property("deps.fabric-api") as String))!!)
4541
}
4642

4743
// Required for translatable texts in 1.21.9+ for some reason i need both v0 and v1?
48-
if (stonecutter.eval(stonecutter.current.version, ">=1.21.9")) {
44+
if (sc.current.parsed >= "1.21.9") {
4945
include(modImplementation(fabricApi.module("fabric-resource-loader-v1", property("deps.fabric-api") as String))!!)
5046
}
5147
}
5248

5349
java {
54-
if (stonecutter.eval(stonecutter.current.version, ">=1.20.5")) {
50+
if (sc.current.parsed >= "26.1") {
51+
sourceCompatibility = JavaVersion.VERSION_25
52+
targetCompatibility = JavaVersion.VERSION_25
53+
toolchain.languageVersion.set(JavaLanguageVersion.of(25))
54+
} else if (sc.current.parsed >= "1.20.5") {
5555
sourceCompatibility = JavaVersion.VERSION_21
5656
targetCompatibility = JavaVersion.VERSION_21
5757
toolchain.languageVersion.set(JavaLanguageVersion.of(21))
@@ -66,7 +66,7 @@ java {
6666
tasks {
6767
processResources {
6868
exclude("**/neoforge.mods.toml", "**/mods.toml", "**/accesstransformer.cfg")
69-
if (stonecutter.eval(stonecutter.current.version, ">=1.21.9")) {
69+
if (sc.current.parsed >= "1.21.9") {
7070
exclude("**/pack.mcmeta")
7171
rename("new-pack.mcmeta", "pack.mcmeta")
7272
} else {

build.forge.gradle.kts

Lines changed: 26 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,10 @@ group = "${property("mod.group")}"
1414
base.archivesName.set("${property("mod_name")}-mc${property("deps.minecraft")}-forge".lowercase())
1515

1616
legacyForge {
17-
version = property("deps.forge") as String
1817
validateAccessTransformers = true
19-
20-
if (hasProperty("deps.parchment")) parchment {
21-
val (mc, ver) = (property("deps.parchment") as String).split(':')
22-
mappingsVersion = ver
23-
minecraftVersion = mc
18+
enable {
19+
forgeVersion = property("deps.forge") as String
20+
isDisableRecompilation = true
2421
}
2522
}
2623

@@ -40,7 +37,27 @@ mixin { // Add mixins
4037
tasks.getByName<Copy>("processResources") {
4138
doLast { // Add refmap to the mixin config
4239
val mixinConfigFile = File(destinationDir, "automodpack-main.mixins.json")
43-
addRefmapToJsonFile(mixinConfigFile, "automodpack-main.mixins.refmap.json")
40+
41+
// Inline the refmap addition to avoid configuration cache issues
42+
if (!mixinConfigFile.exists()) {
43+
error("JSON file not found: ${mixinConfigFile.absolutePath}")
44+
}
45+
46+
val objectMapper = ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT)
47+
try {
48+
val jsonNode = objectMapper.readTree(mixinConfigFile)
49+
if (jsonNode.isObject) {
50+
val objectNode = jsonNode as ObjectNode
51+
objectNode.put("refmap", "automodpack-main.mixins.refmap.json")
52+
objectMapper.writeValue(mixinConfigFile, objectNode)
53+
println("Added refmap (automodpack-main.mixins.refmap.json) to ${mixinConfigFile.name}")
54+
} else {
55+
error("JSON file ${mixinConfigFile.name} is not a JSON object, couldn't add refmap.")
56+
}
57+
} catch (e: Exception) {
58+
println("Error processing JSON file ${mixinConfigFile.absolutePath}: ${e.message}")
59+
e.printStackTrace()
60+
}
4461
}
4562
}
4663

@@ -55,7 +72,7 @@ tasks {
5572

5673
processResources {
5774
exclude("**/fabric.mod.json", "**/automodpack.accesswidener")
58-
if (stonecutter.eval(stonecutter.current.version, ">=1.21.9")) {
75+
if (sc.current.parsed >= "1.21.9") {
5976
exclude("**/pack.mcmeta")
6077
rename("new-pack.mcmeta", "pack.mcmeta")
6178
} else {
@@ -69,7 +86,7 @@ tasks {
6986
}
7087

7188
java {
72-
if (stonecutter.eval(stonecutter.current.version, ">=1.20.5")) {
89+
if (sc.current.parsed >= "1.20.5") {
7390
sourceCompatibility = JavaVersion.VERSION_21
7491
targetCompatibility = JavaVersion.VERSION_21
7592
toolchain.languageVersion.set(JavaLanguageVersion.of(21))
@@ -80,25 +97,3 @@ java {
8097
}
8198
withSourcesJar()
8299
}
83-
84-
fun addRefmapToJsonFile(jsonFile: File, refmap: String) {
85-
if (!jsonFile.exists()) {
86-
error("JSON file not found: ${jsonFile.absolutePath}")
87-
}
88-
89-
val objectMapper = ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT)
90-
try {
91-
val jsonNode = objectMapper.readTree(jsonFile)
92-
if (jsonNode.isObject) {
93-
val objectNode = jsonNode as ObjectNode
94-
objectNode.put("refmap", refmap)
95-
objectMapper.writeValue(jsonFile, objectNode)
96-
println("Added refmap ($refmap) to ${jsonFile.name}")
97-
} else {
98-
error("JSON file ${jsonFile.name} is not a JSON object, couldn't add refmap.")
99-
}
100-
} catch (e: Exception) {
101-
println("Error processing JSON file ${jsonFile.absolutePath}: ${e.message}")
102-
e.printStackTrace()
103-
}
104-
}

build.neoforge.gradle.kts

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,10 @@ group = "${property("mod.group")}"
1010
base.archivesName.set("${property("mod_name")}-mc${property("deps.minecraft")}-neoforge".lowercase())
1111

1212
neoForge {
13-
version = property("deps.neoforge") as String
1413
validateAccessTransformers = true
15-
16-
if (hasProperty("deps.parchment")) parchment {
17-
val (mc, ver) = (property("deps.parchment") as String).split(':')
18-
mappingsVersion = ver
19-
minecraftVersion = mc
14+
enable {
15+
version = property("deps.neoforge") as String
16+
isDisableRecompilation = true
2017
}
2118
}
2219

@@ -34,7 +31,7 @@ dependencies {
3431
tasks {
3532
processResources {
3633
exclude("**/fabric.mod.json", "**/automodpack.accesswidener", "**/forge.mods.toml")
37-
if (stonecutter.eval(stonecutter.current.version, ">=1.21.9")) {
34+
if (sc.current.parsed >= "1.21.9") {
3835
exclude("**/pack.mcmeta")
3936
rename("new-pack.mcmeta", "pack.mcmeta")
4037
} else {
@@ -48,8 +45,14 @@ tasks {
4845
}
4946

5047
java {
51-
withSourcesJar()
52-
sourceCompatibility = JavaVersion.VERSION_21
53-
targetCompatibility = JavaVersion.VERSION_21
54-
toolchain.languageVersion.set(JavaLanguageVersion.of(21))
48+
if (sc.current.parsed >= "26.1") {
49+
sourceCompatibility = JavaVersion.VERSION_25
50+
targetCompatibility = JavaVersion.VERSION_25
51+
toolchain.languageVersion.set(JavaLanguageVersion.of(25))
52+
} else {
53+
withSourcesJar()
54+
sourceCompatibility = JavaVersion.VERSION_21
55+
targetCompatibility = JavaVersion.VERSION_21
56+
toolchain.languageVersion.set(JavaLanguageVersion.of(21))
57+
}
5558
}

buildSrc/build.gradle.kts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
plugins {
22
`kotlin-dsl`
3-
kotlin("jvm") version "2.2.20"
3+
kotlin("jvm") version "2.3.0"
44
}
55

66
repositories {
@@ -9,5 +9,6 @@ repositories {
99
}
1010

1111
dependencies {
12-
implementation("com.fasterxml.jackson.core:jackson-databind:2.20.0") // For JSON parsing e.g. in build.forge.gradle.kts
12+
implementation("com.fasterxml.jackson.core:jackson-databind:2.20.1") // For JSON parsing e.g. in build.forge.gradle.kts
13+
implementation("dev.luna5ama.jar-optimizer:dev.luna5ama.jar-optimizer.gradle.plugin:1.2.2")
1314
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import org.gradle.api.DefaultTask
2+
import org.gradle.api.provider.Property
3+
import org.gradle.api.file.DirectoryProperty
4+
import org.gradle.api.file.RegularFileProperty
5+
import org.gradle.api.tasks.Input
6+
import org.gradle.api.tasks.Internal
7+
import org.gradle.api.tasks.OutputFile
8+
import org.gradle.api.tasks.TaskAction
9+
import java.io.File
10+
import java.io.FileInputStream
11+
import java.io.FileOutputStream
12+
import java.util.zip.ZipEntry
13+
import java.util.zip.ZipInputStream
14+
import java.util.zip.ZipOutputStream
15+
16+
abstract class MergeJarTask : DefaultTask() {
17+
@get:Input
18+
abstract val mergedDirPath: Property<String>
19+
20+
@get:Input
21+
abstract val rootProjectPath: Property<String>
22+
23+
@get:Input
24+
abstract val libsPath: Property<String>
25+
26+
@get:Internal
27+
abstract val buildDirectory: DirectoryProperty
28+
29+
@get:OutputFile
30+
abstract val outputJar: RegularFileProperty
31+
32+
@TaskAction
33+
fun mergeJars() {
34+
val mergedDir = File(mergedDirPath.get())
35+
mergedDir.mkdirs()
36+
37+
val buildDirLibs = buildDirectory.get().dir("libs").asFile
38+
val jarToMerge = buildDirLibs.listFiles()
39+
?.firstOrNull { file -> file.isFile && !file.name.endsWith("-sources.jar") && file.name.endsWith(".jar") }
40+
?: error("No jar found to merge in build/libs directory! ${buildDirLibs.absolutePath}")
41+
42+
val time = System.currentTimeMillis()
43+
println("Found $jarToMerge to merge. Merging...")
44+
45+
val loaderModule = getLoaderModuleName(jarToMerge.name)
46+
47+
val loaderBuildDir = File(rootProjectPath.get(), "loader/${loaderModule.replace("-", "/")}/build/libs")
48+
val loaderFile = loaderBuildDir.listFiles()
49+
?.single { it.isFile && !it.name.endsWith("-sources.jar") && it.name.endsWith(".jar") }
50+
?: error("No loader jar found in ${loaderBuildDir.absolutePath}")
51+
52+
val libsDir = File(libsPath.get())
53+
val zstdFile = libsDir.listFiles()
54+
?.firstOrNull { file -> file.isFile && file.name.startsWith("zstd-jni-") && file.name.endsWith(".jar") }
55+
?: error("No zstd-jni-*.jar found in libs directory! ${libsDir.absolutePath}")
56+
57+
val finalJar = File(mergedDir, jarToMerge.name)
58+
59+
// Merge jars inline to avoid script reference issues
60+
val seen = mutableSetOf<String>()
61+
ZipOutputStream(FileOutputStream(finalJar).buffered()).use { zipStream ->
62+
ZipInputStream(FileInputStream(loaderFile).buffered()).use { baseStream ->
63+
generateSequence { baseStream.nextEntry }
64+
.forEach { entry ->
65+
if (seen.add(entry.name) && !entry.isDirectory) {
66+
zipStream.putNextEntry(ZipEntry(entry.name))
67+
baseStream.copyTo(zipStream)
68+
zipStream.closeEntry()
69+
}
70+
}
71+
}
72+
73+
// Add mod jar
74+
zipStream.putNextEntry(ZipEntry("META-INF/jarjar/automodpack-mod.jar"))
75+
FileInputStream(jarToMerge).buffered().use { it.copyTo(zipStream) }
76+
zipStream.closeEntry()
77+
78+
// Add zstd jar
79+
zipStream.putNextEntry(ZipEntry("META-INF/jarjar/zstd-jni.jar"))
80+
FileInputStream(zstdFile).buffered().use { it.copyTo(zipStream) }
81+
zipStream.closeEntry()
82+
}
83+
84+
outputJar.get().asFile.writeText(finalJar.absolutePath)
85+
println("Merged: ${jarToMerge.name} into: ${finalJar.name} from: ${loaderFile.name} Took: ${System.currentTimeMillis() - time}ms")
86+
}
87+
}

0 commit comments

Comments
 (0)