Skip to content

Commit 4f16668

Browse files
jpenillalynxplay
authored andcommitted
Add plugin remap tool
1 parent 733c216 commit 4f16668

File tree

8 files changed

+1254
-1
lines changed

8 files changed

+1254
-1
lines changed

build.gradle.kts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ import xyz.jpenilla.resourcefactory.bukkit.BukkitPluginYaml
22

33
plugins {
44
`java-library`
5-
id("io.papermc.paperweight.userdev") version "2.0.0-beta.16"
5+
id("io.papermc.paperweight.userdev")
66
id("xyz.jpenilla.run-paper") version "2.3.1" // Adds runServer and runMojangMappedServer tasks for testing
77
id("xyz.jpenilla.resource-factory-bukkit-convention") version "1.2.0" // Generates plugin.yml based on the Gradle config
8+
9+
`remap-plugin-src`
810
}
911

1012
group = "io.papermc.paperweight"

buildSrc/build.gradle.kts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
plugins {
2+
`kotlin-dsl`
3+
}
4+
5+
repositories {
6+
mavenCentral()
7+
gradlePluginPortal()
8+
}
9+
10+
dependencies {
11+
implementation("io.papermc.paperweight:paperweight-userdev:1.7.3")
12+
}

buildSrc/src/main/java/modified/mercury/RemapperVisitor.java

Lines changed: 514 additions & 0 deletions
Large diffs are not rendered by default.

buildSrc/src/main/java/modified/mercury/SimpleRemapperVisitor.java

Lines changed: 496 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import modified.mercury.RemapperVisitor
2+
import modified.mercury.SimpleRemapperVisitor
3+
import paper.libs.org.cadixdev.lorenz.MappingSet
4+
import paper.libs.org.cadixdev.mercury.RewriteContext
5+
import paper.libs.org.cadixdev.mercury.SourceRewriter
6+
import java.util.Objects
7+
8+
class MercuryRemapper private constructor(mappings: MappingSet, simple: Boolean, javadoc: Boolean) : SourceRewriter {
9+
private val mappings: MappingSet
10+
private val simple: Boolean
11+
private val javadoc: Boolean
12+
13+
init {
14+
this.mappings = Objects.requireNonNull(mappings, "mappings")
15+
this.simple = simple
16+
this.javadoc = javadoc
17+
}
18+
19+
override fun getFlags(): Int = SourceRewriter.FLAG_RESOLVE_BINDINGS
20+
21+
override fun rewrite(context: RewriteContext) {
22+
context.compilationUnit.accept(if (simple) SimpleRemapperVisitor(context, mappings, this.javadoc) else RemapperVisitor(context, mappings, this.javadoc))
23+
}
24+
25+
companion object {
26+
fun create(mappings: MappingSet): SourceRewriter {
27+
return MercuryRemapper(mappings, false, true)
28+
}
29+
30+
fun create(mappings: MappingSet, javadoc: Boolean): SourceRewriter {
31+
return MercuryRemapper(mappings, false, javadoc)
32+
}
33+
34+
fun createSimple(mappings: MappingSet): SourceRewriter {
35+
return MercuryRemapper(mappings, true, true)
36+
}
37+
38+
fun createSimple(mappings: MappingSet, javadoc: Boolean): SourceRewriter {
39+
return MercuryRemapper(mappings, true, javadoc)
40+
}
41+
}
42+
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
import io.papermc.paperweight.tasks.JavaLauncherTask
2+
import io.papermc.paperweight.tasks.RemapSources
3+
import io.papermc.paperweight.util.MappingFormats
4+
import io.papermc.paperweight.util.constants.DEOBF_NAMESPACE
5+
import io.papermc.paperweight.util.constants.SPIGOT_NAMESPACE
6+
import io.papermc.paperweight.util.deleteRecursive
7+
import io.papermc.paperweight.util.path
8+
import org.gradle.api.file.ConfigurableFileCollection
9+
import org.gradle.api.file.DirectoryProperty
10+
import org.gradle.api.file.RegularFileProperty
11+
import org.gradle.api.provider.Property
12+
import org.gradle.api.tasks.CompileClasspath
13+
import org.gradle.api.tasks.Input
14+
import org.gradle.api.tasks.InputDirectory
15+
import org.gradle.api.tasks.InputFile
16+
import org.gradle.api.tasks.OutputDirectory
17+
import org.gradle.api.tasks.TaskAction
18+
import org.gradle.kotlin.dsl.submit
19+
import org.gradle.workers.WorkAction
20+
import org.gradle.workers.WorkParameters
21+
import org.gradle.workers.WorkerExecutor
22+
import paper.libs.org.cadixdev.mercury.Mercury
23+
import paper.libs.org.eclipse.jdt.core.JavaCore
24+
import java.nio.file.Files
25+
import javax.inject.Inject
26+
27+
abstract class RemapPluginSources : JavaLauncherTask() {
28+
@get:CompileClasspath
29+
abstract val remapClasspath: ConfigurableFileCollection
30+
31+
@get:InputDirectory
32+
abstract val inputSources: DirectoryProperty
33+
34+
@get:OutputDirectory
35+
abstract val outputDir: DirectoryProperty
36+
37+
@get:InputFile
38+
abstract val mappingsFile: RegularFileProperty
39+
40+
@get:Input
41+
abstract val addExplicitThis: Property<Boolean>
42+
43+
@get:Inject
44+
abstract val workerExecutor: WorkerExecutor
45+
46+
override fun init() {
47+
super.init()
48+
addExplicitThis.convention(false)
49+
}
50+
51+
@TaskAction
52+
fun run() {
53+
val queue = workerExecutor.processIsolation {
54+
forkOptions.jvmArgs("-Xmx2G")
55+
forkOptions.executable(launcher.get().executablePath.path.toAbsolutePath().toString())
56+
}
57+
58+
queue.submit(RemapPluginSourcesAction::class) {
59+
remapClasspath.setFrom(this@RemapPluginSources.remapClasspath)
60+
inputSources.set(this@RemapPluginSources.inputSources)
61+
outputDir.set(this@RemapPluginSources.outputDir)
62+
mappingsFile.set(this@RemapPluginSources.mappingsFile)
63+
addExplicitThis.set(this@RemapPluginSources.addExplicitThis)
64+
}
65+
}
66+
67+
abstract class RemapPluginSourcesAction : WorkAction<RemapPluginSourcesAction.Params> {
68+
interface Params : WorkParameters {
69+
val remapClasspath: ConfigurableFileCollection
70+
val inputSources: DirectoryProperty
71+
val outputDir: DirectoryProperty
72+
val mappingsFile: RegularFileProperty
73+
val addExplicitThis: Property<Boolean>
74+
}
75+
76+
override fun execute() {
77+
val mappingSet = MappingFormats.TINY.read(
78+
parameters.mappingsFile.path,
79+
SPIGOT_NAMESPACE,
80+
DEOBF_NAMESPACE
81+
)
82+
83+
val merc = Mercury()
84+
merc.isGracefulClasspathChecks = true
85+
merc.sourceCompatibility = JavaCore.VERSION_17
86+
merc.classPath.addAll(parameters.remapClasspath.map { it.toPath() })
87+
if (parameters.addExplicitThis.get()) {
88+
merc.processors.add(RemapSources.ExplicitThisAdder)
89+
}
90+
merc.processors.add(MercuryRemapper.create(mappingSet, false))
91+
92+
parameters.outputDir.path.deleteRecursive()
93+
Files.createDirectories(parameters.outputDir.path)
94+
95+
merc.rewrite(parameters.inputSources.path, parameters.outputDir.path)
96+
}
97+
}
98+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import io.papermc.paperweight.util.MappingFormats
2+
import io.papermc.paperweight.util.constants.DEOBF_NAMESPACE
3+
import io.papermc.paperweight.util.constants.SPIGOT_NAMESPACE
4+
import io.papermc.paperweight.util.path
5+
import org.gradle.api.file.RegularFileProperty
6+
import org.gradle.api.provider.Property
7+
import org.gradle.api.tasks.Input
8+
import org.gradle.api.tasks.InputFile
9+
import org.gradle.api.tasks.OutputFile
10+
import org.gradle.api.tasks.TaskAction
11+
import java.nio.file.Files
12+
13+
abstract class ReverseMappings : io.papermc.paperweight.tasks.BaseTask() {
14+
@get:InputFile
15+
abstract val inputMappings: RegularFileProperty
16+
17+
@get:OutputFile
18+
abstract val outputMappings: RegularFileProperty
19+
20+
@get:Input
21+
abstract val fromNs: Property<String>
22+
23+
@get:Input
24+
abstract val toNs: Property<String>
25+
26+
@TaskAction
27+
fun run() {
28+
val mappingSet = MappingFormats.TINY.read(
29+
inputMappings.path,
30+
fromNs.get(),
31+
toNs.get()
32+
).reverse()
33+
34+
Files.deleteIfExists(outputMappings.path)
35+
Files.createDirectories(outputMappings.path.parent)
36+
MappingFormats.TINY.write(
37+
mappingSet,
38+
outputMappings.path,
39+
toNs.get(),
40+
fromNs.get()
41+
)
42+
}
43+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import io.papermc.paperweight.tasks.RemapJar
2+
import io.papermc.paperweight.util.constants.DEOBF_NAMESPACE
3+
import io.papermc.paperweight.util.constants.SPIGOT_NAMESPACE
4+
import io.papermc.paperweight.util.registering
5+
6+
plugins {
7+
java
8+
id("io.papermc.paperweight.userdev")
9+
}
10+
11+
tasks {
12+
val reverseMappings by registering<ReverseMappings> {
13+
inputMappings.set(layout.projectDirectory.file(".gradle/caches/paperweight/setupCache/extractDevBundle.dir/data/mojang+yarn-spigot-reobf.tiny"))
14+
outputMappings.set(layout.buildDirectory.file("reversed-reobf-mappings.tiny"))
15+
16+
fromNs.set(DEOBF_NAMESPACE)
17+
toNs.set(SPIGOT_NAMESPACE)
18+
}
19+
20+
val reobfPaperJar by tasks.registering<RemapJar> {
21+
// won't be runnable as we don't fixjarforreobf
22+
// pretty hacky but should work
23+
inputJar.set(layout.file(configurations.mojangMappedServerRuntime.flatMap {
24+
it.elements.map { elements ->
25+
elements.filter { element ->
26+
val p = element.asFile.absolutePath
27+
p.contains("ivyRepository") && p.contains("paper-server-userdev")
28+
}.single().asFile
29+
}
30+
}))
31+
outputJar.set(layout.buildDirectory.file("reobfPaper.jar"))
32+
fromNamespace.set(DEOBF_NAMESPACE)
33+
toNamespace.set(SPIGOT_NAMESPACE)
34+
mappingsFile.set(reverseMappings.flatMap { it.outputMappings })
35+
remapper.from(configurations.remapper)
36+
}
37+
38+
@Suppress("unused_variable")
39+
val remapPluginSources by registering<RemapPluginSources> {
40+
remapClasspath.from(reobfPaperJar.flatMap { it.outputJar })
41+
remapClasspath.from(configurations.compileClasspath)
42+
inputSources.set(layout.projectDirectory.dir("src/main/java"))
43+
outputDir.set(layout.projectDirectory.dir("src/main/mojangMappedJava"))
44+
mappingsFile.set(reverseMappings.flatMap { it.outputMappings })
45+
}
46+
}

0 commit comments

Comments
 (0)