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 "org.jetbrains.gradle.plugin.idea-ext" version "0.7"
30 archivesBaseName = rootProject.name
31 version = rootProject.mod_version
33 sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = JavaVersion.VERSION_1_8
36 idea.project.settings {
38 delegateBuildRunToGradle = false
39 testRunner = ActionDelegationConfig.TestRunner.PLATFORM
42 "Fabric: Minecraft Client"(org.jetbrains.gradle.ext.Gradle) {
43 project = rootProject.project(":fabric")
44 taskNames = Collections.singletonList("runClient")
46 "Fabric: Minecraft Server"(org.jetbrains.gradle.ext.Gradle) {
47 project = rootProject.project(":fabric")
48 taskNames = Collections.singletonList("runServer")
50 "Forge: Minecraft Client"(org.jetbrains.gradle.ext.Gradle) {
51 project = rootProject.project(":forge")
52 taskNames = Collections.singletonList("runClient")
54 "Forge: Minecraft Server"(org.jetbrains.gradle.ext.Gradle) {
55 project = rootProject.project(":forge")
56 taskNames = Collections.singletonList("runServer")
63 def folder = file(".gradle/.mergemods")
65 def fabricJar = file("fabric/build/libs/${rootProject.name}-${rootProject.mod_version}.jar")
66 def forgeJar = file("forge/build/libs/${rootProject.name}-${rootProject.mod_version}.jar")
67 def fabricFolder = new File(folder, ".tempFabric")
68 def forgeFolder = new File(folder, ".tempForge")
69 def mergeFolder = new File(folder, ".tempMerge")
70 def policyMap = new HashMap<String, String>()
71 file("merging.policy").eachLine {
72 if (it.isBlank() || it.startsWith("#")) return
73 def env = it.substring(0, it.indexOf(' '))
75 policyMap.put(it.substring(env.length() + 1), "Fabric")
76 else if (env == "FORGE")
77 policyMap.put(it.substring(env.length() + 1), "Forge")
78 else throw new IllegalStateException("Illegal env $env at $it")
80 forgeFolder.deleteDir()
81 fabricFolder.deleteDir()
82 mergeFolder.deleteDir()
83 unzip(fabricJar, fabricFolder)
84 unzip(forgeJar, forgeFolder)
86 Stream.of(forgeFolder, fabricFolder).each { useFolder ->
88 Files.walkFileTree(useFolder.toPath(), new SimpleFileVisitor<Path>() {
90 FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
92 File ogFile = file.toFile()
93 File outFile = new File(mergeFolder, ogFile.getAbsolutePath().replace(useFolder.getAbsolutePath(), ""))
94 outFile.getParentFile().mkdirs()
95 if (outFile.exists()) {
96 def env = useFolder.getName().substring(5)
97 def fileName = outFile.getAbsolutePath().replace(mergeFolder.getAbsolutePath(), "")
98 def policyEnv = policyMap.get(fileName)
99 if (policyEnv == null) {
100 throw new IllegalStateException("Unhandled duplicate file: $fileName")
102 println "Chose env ${policyEnv.toUpperCase(Locale.ROOT)} for duplicate file: $fileName"
103 if (policyEnv != env)
104 return FileVisitResult.CONTINUE
106 if (!ogFile.isDirectory()) {
107 org.apache.commons.io.FileUtils.copyFile(ogFile, outFile)
109 org.apache.commons.io.FileUtils.copyDirectory(ogFile, outFile)
111 } catch (IOException e) {
115 return FileVisitResult.CONTINUE
118 } catch (IOException e) {
123 File finalMerge = file("build/libs/${rootProject.name}-${rootProject.mod_version}.jar")
124 finalMerge.parentFile.mkdirs()
126 compress(mergeFolder.toPath(), finalMerge)
131 rootProject.subprojects.forEach {
132 buildMerged.mustRunAfter it.tasks.getByName("build")
135 static def compress(Path sourceDir, File zipFile) {
137 final ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(zipFile))
138 Files.walkFileTree(sourceDir, new SimpleFileVisitor<Path>() {
140 FileVisitResult visitFile(Path file, BasicFileAttributes attributes) {
142 Path targetFile = sourceDir.relativize(file)
143 outputStream.putNextEntry(new ZipEntry(targetFile.toString()))
144 byte[] bytes = Files.readAllBytes(file)
145 outputStream.write(bytes, 0, bytes.length)
146 outputStream.closeEntry()
147 } catch (IOException e) {
150 return FileVisitResult.CONTINUE
154 } catch (IOException e) {
159 static def unzip(File zipFile, File destDir) {
160 if (!destDir.exists())
163 byte[] buffer = new byte[1024]
165 fis = new FileInputStream(zipFile)
166 ZipInputStream zis = new ZipInputStream(fis)
167 ZipEntry zipEntry = zis.getNextEntry()
168 while (zipEntry != null) {
169 if (!zipEntry.isDirectory()) {
170 File newFile = new File(destDir, zipEntry.getName())
171 new File(newFile.getParent()).mkdirs()
172 FileOutputStream fos = new FileOutputStream(newFile)
174 while ((len = zis.read(buffer)) > 0) {
175 fos.write(buffer, 0, len)
180 zipEntry = zis.getNextEntry()
185 } catch (IOException e) {