blob: 53affbea082cc72b5352658148c5faf53f5ca495 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
import com.github.jengelman.gradle.plugins.shadow.transformers.ResourceTransformer
import com.github.jengelman.gradle.plugins.shadow.transformers.TransformerContext
import com.google.gson.Gson
import com.google.gson.JsonObject
import com.google.gson.JsonPrimitive
import java.io.Serializable
import net.fabricmc.accesswidener.AccessWidenerReader
import net.fabricmc.accesswidener.AccessWidenerWriter
import org.apache.tools.zip.ZipEntry
import org.apache.tools.zip.ZipOutputStream
import org.gradle.api.file.FileTreeElement
import org.gradle.api.provider.Property
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Internal
open class FabricModTransform : ResourceTransformer {
enum class AccessWidenerInclusion : Serializable {
ALL,
NONE,
}
@get:Input
var mergeAccessWideners: AccessWidenerInclusion = AccessWidenerInclusion.ALL
@get:Internal
internal var mergedFmj: JsonObject? = null
@get:Internal
internal val foundAccessWideners = AccessWidenerWriter()
@get:Internal
internal var foundAnyAccessWidener = false
override fun canTransformResource(element: FileTreeElement): Boolean {
if (mergeAccessWideners == AccessWidenerInclusion.ALL && element.name.endsWith(".accesswidener"))
return true
return element.path == "fabric.mod.json"
}
override fun transform(context: TransformerContext) {
if (context.path.endsWith(".accesswidener")) {
foundAnyAccessWidener = true
// TODO: allow filtering for only those mentioned in a fabric.mod.json, potentially
context.inputStream.use { stream ->
AccessWidenerReader(foundAccessWideners).read(stream.bufferedReader())
}
return
}
// TODO: mixins.json relocations
val fmj = context.inputStream.use { stream ->
Gson().fromJson(stream.bufferedReader(), JsonObject::class.java)
}
val mergedFmj = this.mergedFmj
println("${fmj["id"]} is first? ${mergedFmj == null}")
if (mergedFmj == null) {
this.mergedFmj = fmj
} else {
// TODO: merge stuff
}
}
override fun hasTransformedResource(): Boolean {
return mergedFmj != null
}
override fun modifyOutputStream(os: ZipOutputStream, preserveFileTimestamps: Boolean) {
val mergedFmj = mergedFmj!!
if (foundAnyAccessWidener) {
val awFile = mergedFmj["accessWidener"]
require(awFile is JsonPrimitive && awFile.isString)
os.putNextEntry(ZipEntry(awFile.asString))
os.write(foundAccessWideners.write())
os.closeEntry()
}
os.putNextEntry(ZipEntry("fabric.mod.json"))
os.write(mergedFmj.toString().toByteArray())
os.closeEntry()
}
}
|