Skip to content

Commit 1b4cc4e

Browse files
committed
Include yarn unpick data remapped to mojang
1 parent cdf2473 commit 1b4cc4e

File tree

6 files changed

+186
-6
lines changed

6 files changed

+186
-6
lines changed

build.gradle.kts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,9 @@ plugins {
1414
`kotlin-dsl`
1515
`maven-publish`
1616
id("org.parchmentmc.compass")
17+
id("blackstone")
1718
}
1819

19-
// Generates metadata for sanitize tasks
20-
apply<org.parchmentmc.BlackstonePlugin>()
21-
2220
val mcVersion = providers.gradleProperty("mcVersion")
2321
compass {
2422
version = mcVersion
@@ -60,6 +58,9 @@ dependencies {
6058
// MCPConfig for the SRG intermediate
6159
mcpconfig("de.oceanlabs.mcp:mcp_config:1.19.3-20221207.122022")
6260

61+
unpickDefinitions("net.fabricmc:yarn:25w43a+build.7:mergedv2")
62+
unpickDefinitionsIntermediary("net.fabricmc:intermediary:25w43a:v2")
63+
6364
// ART for remapping the client JAR
6465
remapper("net.neoforged:AutoRenamingTool:2.0.15")
6566

@@ -166,25 +167,28 @@ val officialExportZip by tasks.registering(Zip::class) {
166167
group = LifecycleBasePlugin.BUILD_GROUP
167168
description = "Creates a ZIP archive containing the export produced by the \"official\" intermediate provider and production data"
168169
from(tasks.named<GenerateExport>("generateOfficialExport").flatMap { it.output })
170+
unpick.includeDefinitions(this)
169171
archiveBaseName = "officialExport"
170172
}
171173

172174
val officialSanitizedExportZip by tasks.registering(Zip::class) {
173175
group = LifecycleBasePlugin.BUILD_GROUP
174176
description = "Creates a ZIP archive containing the sanitized export produced by the \"official\" intermediate provider and production data"
175177
from(generateSanitizedExport.flatMap { it.output })
178+
unpick.includeDefinitions(this)
176179
archiveBaseName = "officialSanitizedExport"
177180
}
178181

179182
val officialStagingExportZip by tasks.registering(Zip::class) {
180183
group = LifecycleBasePlugin.BUILD_GROUP
181184
description = "Creates a ZIP archive containing the export produced by the \"official\" intermediate provider and staging data"
182185
from(tasks.named<GenerateExport>("generateOfficialStagingExport").flatMap { it.output })
186+
unpick.includeDefinitions(this)
183187
archiveBaseName = "officialStagingExport"
184188
}
185189

186190
tasks.withType<Zip>().named { name -> name.startsWith("official") }.configureEach {
187-
rename { "parchment.json" }
191+
rename(".*\\.json", "parchment.json")
188192
destinationDirectory = project.layout.buildDirectory.dir("exportZips")
189193
}
190194

buildSrc/build.gradle.kts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,8 @@ dependencies {
3939
implementation("cuchaz:enigma:4.0.2")
4040
implementation("org.cadixdev:lorenz:0.5.8")
4141
implementation("org.cadixdev:lorenz-io-enigma:0.5.8")
42+
43+
implementation("net.fabricmc.unpick:unpick:3.0.0-beta.11")
44+
implementation("net.fabricmc.unpick:unpick-format-utils:3.0.0-beta.11")
45+
implementation("net.fabricmc:mapping-io:0.7.1")
4246
}

buildSrc/src/main/kotlin/org/parchmentmc/BlackstonePlugin.kt

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,20 @@ import org.parchmentmc.compass.tasks.SanitizeData
1212
import org.parchmentmc.compass.tasks.ValidateData
1313
import org.parchmentmc.lodestone.LodestoneExtension
1414
import org.parchmentmc.lodestone.tasks.*
15-
16-
const val PLUGIN_TASK_GROUP = "blackstone"
15+
import org.parchmentmc.tasks.RemapUnpickDefinitions
1716

1817
class BlackstonePlugin : Plugin<Project> {
18+
companion object {
19+
const val PLUGIN_TASK_GROUP = "blackstone"
20+
}
1921

2022
override fun apply(target: Project) {
2123
target.apply(plugin = "org.parchmentmc.lodestone")
2224
target.apply(plugin = "maven-publish")
2325

2426
val mcVersion = target.providers.gradleProperty("mcVersion")
2527
val createDistribution = registerTasks(target, mcVersion.get())
28+
applyUnpick(target)
2629

2730
val blackstoneConfig = target.configurations.named("blackstone") {
2831
val cfc = target.files(createDistribution.flatMap { it.archiveFile })
@@ -56,6 +59,23 @@ class BlackstonePlugin : Plugin<Project> {
5659
}
5760
}
5861

62+
private fun applyUnpick(target: Project) {
63+
val defs = target.configurations.register("unpickDefinitions")
64+
val intermediary = target.configurations.register("unpickDefinitionsIntermediary")
65+
val ext = target.extensions.create<UnpickExtension>("unpick")
66+
67+
target.tasks.register<RemapUnpickDefinitions>("remapUnpickDefinitions") {
68+
inputDefinitionsJar.setFrom(defs)
69+
outputDefinitionsFile.set(target.layout.buildDirectory.file("definitions.unpick"))
70+
intermediaryJar.setFrom(intermediary)
71+
mojangMappings.set(
72+
target.tasks.named("downloadVersion", DownloadVersion::class).flatMap {
73+
it.output.file("client.txt")
74+
}
75+
)
76+
}
77+
}
78+
5979
private fun registerTasks(target: Project, mcVersion: String): TaskProvider<Zip> {
6080
val downloadLauncherMeta by target.tasks.registering(DownloadLauncherMetadata::class) {
6181
group = PLUGIN_TASK_GROUP
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.parchmentmc
2+
3+
import org.gradle.api.provider.Property
4+
import org.gradle.api.tasks.bundling.AbstractArchiveTask
5+
import org.gradle.kotlin.dsl.named
6+
import org.parchmentmc.tasks.RemapUnpickDefinitions
7+
8+
abstract class UnpickExtension {
9+
abstract val remapIntermediaryDefinitions: Property<Boolean>
10+
11+
init {
12+
init()
13+
}
14+
15+
fun init() {
16+
remapIntermediaryDefinitions.convention(true)
17+
}
18+
19+
fun includeDefinitions(task: AbstractArchiveTask) {
20+
if (remapIntermediaryDefinitions.get()) {
21+
task.from(task.project.tasks.named<RemapUnpickDefinitions>("remapUnpickDefinitions")) {
22+
into("extras")
23+
}
24+
} else {
25+
task.from(task.project.configurations.named("unpickDefinitions")) {
26+
into("extras")
27+
rename(".*", "definitions.unpick")
28+
}
29+
}
30+
}
31+
}
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
package org.parchmentmc.tasks
2+
3+
import daomephsta.unpick.constantmappers.datadriven.parser.v3.UnpickV3Reader
4+
import daomephsta.unpick.constantmappers.datadriven.parser.v3.UnpickV3Remapper
5+
import daomephsta.unpick.constantmappers.datadriven.parser.v3.UnpickV3Writer
6+
import daomephsta.unpick.constantmappers.datadriven.tree.UnpickV3Visitor
7+
import net.fabricmc.mappingio.adapter.MappingSourceNsSwitch
8+
import net.fabricmc.mappingio.format.proguard.ProGuardFileReader
9+
import net.fabricmc.mappingio.format.tiny.Tiny2FileReader
10+
import net.fabricmc.mappingio.tree.MemoryMappingTree
11+
import org.gradle.api.DefaultTask
12+
import org.gradle.api.file.ConfigurableFileCollection
13+
import org.gradle.api.file.RegularFileProperty
14+
import org.gradle.api.tasks.CacheableTask
15+
import org.gradle.api.tasks.InputFile
16+
import org.gradle.api.tasks.InputFiles
17+
import org.gradle.api.tasks.OutputFile
18+
import org.gradle.api.tasks.PathSensitive
19+
import org.gradle.api.tasks.PathSensitivity
20+
import org.gradle.api.tasks.TaskAction
21+
import org.parchmentmc.util.openZip
22+
import org.parchmentmc.util.path
23+
import kotlin.io.path.bufferedReader
24+
import kotlin.io.path.createParentDirectories
25+
import kotlin.io.path.writeText
26+
27+
@CacheableTask
28+
abstract class RemapUnpickDefinitions : DefaultTask() {
29+
@get:InputFiles
30+
@get:PathSensitive(PathSensitivity.NONE)
31+
abstract val inputDefinitionsJar: ConfigurableFileCollection
32+
33+
@get:OutputFile
34+
abstract val outputDefinitionsFile: RegularFileProperty
35+
36+
@get:InputFiles
37+
@get:PathSensitive(PathSensitivity.NONE)
38+
abstract val intermediaryJar: ConfigurableFileCollection
39+
40+
@get:InputFile
41+
@get:PathSensitive(PathSensitivity.NONE)
42+
abstract val mojangMappings: RegularFileProperty
43+
44+
@TaskAction
45+
fun remap() {
46+
val fromOfficial = MemoryMappingTree()
47+
intermediaryJar.files.single().toPath().openZip().use { fs ->
48+
fs.getPath("mappings/mappings.tiny").bufferedReader().use { reader ->
49+
Tiny2FileReader.read(reader, fromOfficial)
50+
}
51+
}
52+
mojangMappings.path.bufferedReader().use {
53+
ProGuardFileReader.read(
54+
it,
55+
"mojang",
56+
"official",
57+
MappingSourceNsSwitch(fromOfficial, "official")
58+
)
59+
}
60+
val fromIntermediary = MemoryMappingTree()
61+
fromIntermediary.srcNamespace = "intermediary"
62+
fromOfficial.accept(MappingSourceNsSwitch(fromIntermediary, "intermediary"))
63+
64+
inputDefinitionsJar.files.single().toPath().openZip().use { fs ->
65+
fs.getPath("extras/definitions.unpick").bufferedReader().use { reader ->
66+
val reader = UnpickV3Reader(reader)
67+
val writer = UnpickV3Writer()
68+
val remapper = makeRemapper(writer, fromIntermediary)
69+
reader.accept(remapper)
70+
outputDefinitionsFile.path.createParentDirectories()
71+
outputDefinitionsFile.path.writeText(writer.output)
72+
}
73+
}
74+
}
75+
76+
fun makeRemapper(downstream: UnpickV3Visitor, tree: MemoryMappingTree): UnpickV3Remapper {
77+
return object : UnpickV3Remapper(downstream) {
78+
override fun mapClassName(className: String): String {
79+
return tree.getClass(className.replace(".", "/"))
80+
?.getName("mojang")?.replace("/", ".")
81+
?: className
82+
}
83+
84+
override fun mapFieldName(
85+
className: String,
86+
fieldName: String,
87+
fieldDesc: String
88+
): String {
89+
val classMapping = tree.getClass(className.replace(".", "/")) ?: return fieldName
90+
val fieldMapping = classMapping.getField(fieldName, fieldDesc) ?: return fieldName
91+
return fieldMapping.getName("mojang") ?: fieldName
92+
}
93+
94+
override fun mapMethodName(
95+
className: String,
96+
methodName: String,
97+
methodDesc: String
98+
): String {
99+
val classMapping = tree.getClass(className.replace(".", "/")) ?: return methodName
100+
val methodMapping = classMapping.getMethod(methodName, methodDesc) ?: return methodName
101+
return methodMapping.getName("mojang") ?: methodName
102+
}
103+
104+
override fun getClassesInPackage(pkg: String): List<String> {
105+
return tree.classes
106+
.filter {
107+
val pkgSlash = pkg.replace(".", "/") + "/"
108+
it.srcName.startsWith(pkgSlash) && !it.srcName.substringAfter(pkgSlash).contains('/')
109+
}
110+
.map { it.srcName.replace("/", ".") }
111+
}
112+
113+
override fun getFieldDesc(className: String, fieldName: String): String {
114+
val classMapping = tree.getClass(className.replace(".", "/")) ?: return ""
115+
val fieldMapping = classMapping.getField(fieldName, null) ?: return ""
116+
return fieldMapping.srcDesc ?: ""
117+
}
118+
}
119+
}
120+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
implementation-class=org.parchmentmc.BlackstonePlugin

0 commit comments

Comments
 (0)