6 classpath("commons-io:commons-io:2.6")
10 import org.jetbrains.gradle.ext.ActionDelegationConfig
12 import java.nio.file.FileVisitResult
13 import java.nio.file.Files
14 import java.nio.file.Path
15 import java.nio.file.SimpleFileVisitor
16 import java.nio.file.attribute.BasicFileAttributes
17 import java.util.stream.Stream
18 import java.util.zip.ZipEntry
19 import java.util.zip.ZipInputStream
20 import java.util.zip.ZipOutputStream
23 id "me.shedaniel.plugin.architect"
24 id "org.jetbrains.gradle.plugin.idea-ext" version "0.7"
28 minecraft = minecraft_version
33 apply plugin: "me.shedaniel.plugin.architect"
36 archivesBaseName = rootProject.name
37 version = rootProject.mod_version
40 idea.project.settings {
42 delegateBuildRunToGradle = false
43 testRunner = ActionDelegationConfig.TestRunner.PLATFORM
46 "Fabric: Minecraft Client"(org.jetbrains.gradle.ext.Gradle) {
47 project = rootProject.project(":fabric")
48 taskNames = Collections.singletonList("runClient")
50 "Fabric: Minecraft Server"(org.jetbrains.gradle.ext.Gradle) {
51 project = rootProject.project(":fabric")
52 taskNames = Collections.singletonList("runServer")
54 "Forge: Minecraft Client"(org.jetbrains.gradle.ext.Gradle) {
55 project = rootProject.project(":forge")
56 taskNames = Collections.singletonList("runClient")
58 "Forge: Minecraft Server"(org.jetbrains.gradle.ext.Gradle) {
59 project = rootProject.project(":forge")
60 taskNames = Collections.singletonList("runServer")
67 def folder = file(".gradle/.mergemods")
69 def fabricJar = file("fabric/build/libs/${rootProject.name}-${rootProject.mod_version}.jar")
70 def forgeJar = file("forge/build/libs/${rootProject.name}-${rootProject.mod_version}.jar")
71 def fabricFolder = new File(folder, ".tempFabric")
72 def forgeFolder = new File(folder, ".tempForge")
73 def mergeFolder = new File(folder, ".tempMerge")
74 def policyMap = new HashMap<String, String>()
75 file("merging.policy").eachLine {
76 if (it.isBlank() || it.startsWith("#")) return
77 def env = it.substring(0, it.indexOf(' '))
79 policyMap.put(it.substring(env.length() + 1), "Fabric")
80 else if (env == "FORGE")
81 policyMap.put(it.substring(env.length() + 1), "Forge")
82 else throw new IllegalStateException("Illegal env $env at $it")
84 forgeFolder.deleteDir()
85 fabricFolder.deleteDir()
86 mergeFolder.deleteDir()
87 unzip(fabricJar, fabricFolder)
88 unzip(forgeJar, forgeFolder)
90 Stream.of(forgeFolder, fabricFolder).each { useFolder ->
92 Files.walkFileTree(useFolder.toPath(), new SimpleFileVisitor<Path>() {
94 FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
96 File ogFile = file.toFile()
97 File outFile = new File(mergeFolder, ogFile.getAbsolutePath().replace(useFolder.getAbsolutePath(), ""))
98 outFile.getParentFile().mkdirs()
99 if (outFile.exists()) {
100 def env = useFolder.getName().substring(5)
101 def fileName = outFile.getAbsolutePath().replace(mergeFolder.getAbsolutePath(), "")
102 def policyEnv = policyMap.get(fileName)
103 if (policyEnv == null) {
104 throw new IllegalStateException("Unhandled duplicate file: $fileName")
106 println "Chose env ${policyEnv.toUpperCase(Locale.ROOT)} for duplicate file: $fileName"
107 if (policyEnv != env)
108 return FileVisitResult.CONTINUE
110 if (!ogFile.isDirectory()) {
111 org.apache.commons.io.FileUtils.copyFile(ogFile, outFile)
113 org.apache.commons.io.FileUtils.copyDirectory(ogFile, outFile)
115 } catch (IOException e) {
119 return FileVisitResult.CONTINUE
122 } catch (IOException e) {
127 File finalMerge = file("build/libs/${rootProject.name}-${rootProject.mod_version}.jar")
128 finalMerge.parentFile.mkdirs()
130 compress(mergeFolder.toPath(), finalMerge)
135 rootProject.subprojects.forEach {
136 buildMerged.mustRunAfter it.tasks.getByName("build")
139 static def compress(Path sourceDir, File zipFile) {
141 final ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(zipFile))
142 Files.walkFileTree(sourceDir, new SimpleFileVisitor<Path>() {
144 FileVisitResult visitFile(Path file, BasicFileAttributes attributes) {
146 Path targetFile = sourceDir.relativize(file)
147 outputStream.putNextEntry(new ZipEntry(targetFile.toString()))
148 byte[] bytes = Files.readAllBytes(file)
149 outputStream.write(bytes, 0, bytes.length)
150 outputStream.closeEntry()
151 } catch (IOException e) {
154 return FileVisitResult.CONTINUE
158 } catch (IOException e) {
163 static def unzip(File zipFile, File destDir) {
164 if (!destDir.exists())
167 byte[] buffer = new byte[1024]
169 fis = new FileInputStream(zipFile)
170 ZipInputStream zis = new ZipInputStream(fis)
171 ZipEntry zipEntry = zis.getNextEntry()
172 while (zipEntry != null) {
173 if (!zipEntry.isDirectory()) {
174 File newFile = new File(destDir, zipEntry.getName())
175 new File(newFile.getParent()).mkdirs()
176 FileOutputStream fos = new FileOutputStream(newFile)
178 while ((len = zis.read(buffer)) > 0) {
179 fos.write(buffer, 0, len)
184 zipEntry = zis.getNextEntry()
189 } catch (IOException e) {