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 buildMerged.mustRunAfter project(":fabric").tasks.getByName("build")
132 buildMerged.mustRunAfter project(":forge").tasks.getByName("build")
134 static def compress(Path sourceDir, File zipFile) {
136 final ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(zipFile))
137 Files.walkFileTree(sourceDir, new SimpleFileVisitor<Path>() {
139 FileVisitResult visitFile(Path file, BasicFileAttributes attributes) {
141 Path targetFile = sourceDir.relativize(file)
142 outputStream.putNextEntry(new ZipEntry(targetFile.toString()))
143 byte[] bytes = Files.readAllBytes(file)
144 outputStream.write(bytes, 0, bytes.length)
145 outputStream.closeEntry()
146 } catch (IOException e) {
149 return FileVisitResult.CONTINUE
153 } catch (IOException e) {
158 static def unzip(File zipFile, File destDir) {
159 if (!destDir.exists())
162 byte[] buffer = new byte[1024]
164 fis = new FileInputStream(zipFile)
165 ZipInputStream zis = new ZipInputStream(fis)
166 ZipEntry zipEntry = zis.getNextEntry()
167 while (zipEntry != null) {
168 if (!zipEntry.isDirectory()) {
169 File newFile = new File(destDir, zipEntry.getName())
170 new File(newFile.getParent()).mkdirs()
171 FileOutputStream fos = new FileOutputStream(newFile)
173 while ((len = zis.read(buffer)) > 0) {
174 fos.write(buffer, 0, len)
179 zipEntry = zis.getNextEntry()
184 } catch (IOException e) {