6 classpath("commons-io:commons-io:2.6")
10 import java.nio.file.FileVisitResult
11 import java.nio.file.Files
12 import java.nio.file.Path
13 import java.nio.file.SimpleFileVisitor
14 import java.nio.file.attribute.BasicFileAttributes
15 import java.util.stream.Stream
16 import java.util.zip.ZipEntry
17 import java.util.zip.ZipInputStream
18 import java.util.zip.ZipOutputStream
21 id "architectury-plugin" version "3.0.76"
22 id "forgified-fabric-loom" version "0.6.67" apply false
26 minecraft = minecraft_version
30 apply plugin: "forgified-fabric-loom"
33 silentMojangMappingsLicense()
39 apply plugin: "architectury-plugin"
42 archivesBaseName = rootProject.name
43 version = rootProject.mod_version
45 tasks.withType(JavaCompile) {
46 options.encoding = "UTF-8"
52 dependsOn it.tasks.getByName("build")
55 def folder = file(".gradle/.mergemods")
57 def fabricJar = file("fabric/build/libs/${rootProject.name}-${rootProject.mod_version}-fabric.jar")
58 def forgeJar = file("forge/build/libs/${rootProject.name}-${rootProject.mod_version}-forge.jar")
59 def fabricFolder = new File(folder, ".tempFabric")
60 def forgeFolder = new File(folder, ".tempForge")
61 def mergeFolder = new File(folder, ".tempMerge")
62 def policyMap = new HashMap<String, String>()
63 file("merging.policy").eachLine {
64 if (it.isBlank() || it.startsWith("#")) return
65 def env = it.substring(0, it.indexOf(' '))
67 policyMap.put(it.substring(env.length() + 1), "Fabric")
68 else if (env == "FORGE")
69 policyMap.put(it.substring(env.length() + 1), "Forge")
70 else throw new IllegalStateException("Illegal env $env at $it")
72 forgeFolder.deleteDir()
73 fabricFolder.deleteDir()
74 mergeFolder.deleteDir()
75 unzip(fabricJar, fabricFolder)
76 unzip(forgeJar, forgeFolder)
78 Stream.of(forgeFolder, fabricFolder).each { useFolder ->
80 Files.walkFileTree(useFolder.toPath(), new SimpleFileVisitor<Path>() {
82 FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
84 File ogFile = file.toFile()
85 File outFile = new File(mergeFolder, ogFile.getAbsolutePath().replace(useFolder.getAbsolutePath(), ""))
86 outFile.getParentFile().mkdirs()
87 if (outFile.exists()) {
88 def env = useFolder.getName().substring(5)
89 def fileName = outFile.getAbsolutePath().replace(mergeFolder.getAbsolutePath(), "")
90 if (!ogFile.isFile() || !outFile.isFile() || !Arrays.equals(ogFile.readBytes(), outFile.readBytes())) {
91 def policyEnv = policyMap.get(fileName)
92 if (policyEnv == null) {
93 throw new IllegalStateException("Unhandled duplicate file: $fileName")
95 println "Chose env ${policyEnv.toUpperCase(Locale.ROOT)} for duplicate file: $fileName"
97 return FileVisitResult.CONTINUE
100 if (!ogFile.isDirectory()) {
101 org.apache.commons.io.FileUtils.copyFile(ogFile, outFile)
103 org.apache.commons.io.FileUtils.copyDirectory(ogFile, outFile)
105 } catch (IOException e) {
109 return FileVisitResult.CONTINUE
112 } catch (IOException e) {
117 File finalMerge = file("build/libs/${rootProject.name}-${rootProject.mod_version}.jar")
118 finalMerge.parentFile.mkdirs()
120 compress(mergeFolder.toPath(), finalMerge)
125 rootProject.subprojects.forEach {
126 buildMerged.mustRunAfter it.tasks.getByName("build")
129 static def compress(Path sourceDir, File zipFile) {
131 final ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(zipFile))
132 Files.walkFileTree(sourceDir, new SimpleFileVisitor<Path>() {
134 FileVisitResult visitFile(Path file, BasicFileAttributes attributes) {
136 Path targetFile = sourceDir.relativize(file)
137 outputStream.putNextEntry(new ZipEntry(targetFile.toString()))
138 byte[] bytes = Files.readAllBytes(file)
139 outputStream.write(bytes, 0, bytes.length)
140 outputStream.closeEntry()
141 } catch (IOException e) {
144 return FileVisitResult.CONTINUE
148 } catch (IOException e) {
153 static def unzip(File zipFile, File destDir) {
154 if (!destDir.exists())
157 byte[] buffer = new byte[1024]
159 fis = new FileInputStream(zipFile)
160 ZipInputStream zis = new ZipInputStream(fis)
161 ZipEntry zipEntry = zis.getNextEntry()
162 while (zipEntry != null) {
163 if (!zipEntry.isDirectory()) {
164 File newFile = new File(destDir, zipEntry.getName())
165 new File(newFile.getParent()).mkdirs()
166 FileOutputStream fos = new FileOutputStream(newFile)
168 while ((len = zis.read(buffer)) > 0) {
169 fos.write(buffer, 0, len)
174 zipEntry = zis.getNextEntry()
179 } catch (IOException e) {