plugins { id("fabric-loom") version("0.5-SNAPSHOT") apply false id("maven-publish") id("java") id("java-library") id("net.minecrell.licenser") version("0.4.1") id("com.matthewprenger.cursegradle") version("1.4.0") id("net.corda.plugins.jar-filter") version("5.0.8") apply false } import net.fabricmc.loom.LoomGradleExtension import net.fabricmc.loom.task.RemapJarTask import net.fabricmc.loom.util.DownloadUtil import net.fabricmc.loom.util.MinecraftVersionInfo import net.fabricmc.lorenztiny.TinyMappingsReader import net.fabricmc.mapping.tree.TinyMappingFactory import org.cadixdev.lorenz.MappingSet import org.cadixdev.lorenz.io.TextMappingsWriter import org.cadixdev.lorenz.io.proguard.ProGuardReader import org.cadixdev.lorenz.model.* import org.zeroturnaround.zip.ByteSource import org.zeroturnaround.zip.ZipEntrySource import org.zeroturnaround.zip.ZipUtil import java.nio.charset.StandardCharsets import java.nio.file.Files import java.nio.file.Path import java.text.SimpleDateFormat import java.util.function.Consumer archivesBaseName = "RoughlyEnoughItems" version = project.mod_version group = "me.shedaniel" allprojects { apply plugin: 'maven-publish' apply plugin: 'maven' apply plugin: 'fabric-loom' apply plugin: 'net.minecrell.licenser' apply plugin: 'net.corda.plugins.jar-filter' sourceCompatibility = targetCompatibility = 1.8 loom { shareCaches = true } repositories { maven { url "https://dl.bintray.com/shedaniel/shedaniel-mods" } mavenLocal() } afterEvaluate { processResources { filesMatching('fabric.mod.json') { expand 'version': project.version } inputs.property "version", project.version } license { header rootProject.file('HEADER') include '**/*.java' } jar { from rootProject.file("LICENSE") } } dependencies { minecraft("com.mojang:minecraft:${project.minecraft_version}") mappings(new MojangMappingsDependency(project, loom)) modApi("net.fabricmc:fabric-loader:${project.fabricloader_version}") modApi(fabricApi.module("fabric-api-base", project.fabric_api)) modApi(fabricApi.module("fabric-resource-loader-v0", project.fabric_api)) modApi(fabricApi.module("fabric-networking-v0", project.fabric_api)) modApi(fabricApi.module("fabric-lifecycle-events-v1", project.fabric_api)) modApi(fabricApi.module("fabric-rendering-fluids-v1", project.fabric_api)) modApi("me.shedaniel.cloth.api:cloth-client-events-v0:${cloth_client_events_v0_version}") { transitive(false) } modApi("me.shedaniel.cloth:config-2:${cloth_config_version}") { exclude(module: "fabric-api") } modApi("me.sargunvohra.mcmods:autoconfig1u:${project.autoconfig1u}") { exclude(module: "fabric-api") } modApi("org.jetbrains:annotations:19.0.0") modCompileOnly("io.github.prospector:modmenu:${modmenu_version}") { transitive(false) } modRuntime("io.github.prospector:modmenu:${modmenu_version}") { transitive(false) } modRuntime("me.shedaniel:SmoothScrollingEverywhere:3.0.3-unstable") { transitive(false) } } tasks.withType(JavaCompile) { options.encoding = "UTF-8" } task sourcesJar(type: Jar, dependsOn: classes) { classifier("sources") from sourceSets.main.allSource } } subprojects { group = rootProject.group version = rootProject.version task remapMavenJar(type: Copy, dependsOn: remapJar) { afterEvaluate { from("${project.buildDir}/libs/$archivesBaseName-${version}.jar") into("${project.buildDir}/libs/") rename { String fn -> "$archivesBaseName-${version}-maven.jar" } } } configurations { dev remapped } jar { classifier("dev") } remapJar { input.set(file("${project.buildDir}/filtered-libs/$archivesBaseName-${version}-dev-filtered.jar")) classifier(null) } artifacts { dev file: file("${project.buildDir}/libs/$archivesBaseName-${version}-dev.jar"), type: "jar", builtBy: jar remapped file: file("${project.buildDir}/libs/$archivesBaseName-${version}.jar"), type: "jar", builtBy: remapJar } task jarFilter(type: net.corda.gradle.jarfilter.JarFilterTask) { jars jar annotations { forRemove = [ "org.jetbrains.annotations.NotNull", "org.jetbrains.annotations.Nullable", "org.jetbrains.annotations.ApiStatus\$Experimental", "org.jetbrains.annotations.ApiStatus\$Internal", "org.jetbrains.annotations.ApiStatus\$ScheduledForRemoval", "org.jetbrains.annotations.ApiStatus\$AvailableSince", "org.jetbrains.annotations.ApiStatus\$NonExtendable", "org.jetbrains.annotations.ApiStatus\$OverrideOnly" ] } } remapJar.dependsOn("jarFilter") publishing { publications { create("${archivesBaseName}_mavenJava", MavenPublication) { afterEvaluate { artifact(file("${project.buildDir}/libs/$archivesBaseName-${version}-maven.jar")) { builtBy remapMavenJar } artifact(sourcesJar) { builtBy remapSourcesJar } } } } repositories { if (project.hasProperty('danielshe_pass')) { maven { url = "http://deploy.modmuss50.me/" credentials { username = "danielshe" password = project.getProperty('danielshe_pass') } } } } } } task licenseFormatAll subprojects { licenseFormatAll.dependsOn("${path}:licenseFormat") } subprojects { rootProject.remapJar.dependsOn("${path}:remapJar") } task remapMavenJar(type: RemapJarTask, dependsOn: jar) { afterEvaluate { input.set(file("${project.buildDir}/libs/${archivesBaseName}-${version}-dev.jar")) archiveName = "${archivesBaseName}-${version}-maven.jar" addNestedDependencies.set(false) } } dependencies { afterEvaluate { subprojects.each { compile project(path: ":${it.name}", configuration: "dev") include project(path: ":${it.name}", configuration: "remapped") } def listAdded = new ArrayList(Arrays.asList((api_exculde as String).split(','))) def eachDep = { dep -> for (apiIncludeDepStr in (api_include as String).split(',')) { if (apiIncludeDepStr.isEmpty()) continue def apiIncludeGroup = apiIncludeDepStr.split(':')[0] def apiIncludeDep = apiIncludeDepStr.split(':')[1] if (dep.module.id.group == apiIncludeGroup && dep.module.id.name.startsWith(apiIncludeDep)) { def version = dep.module.id.version.indexOf('@') >= 0 ? dep.module.id.version.substring(0, dep.module.id.version.indexOf('@')) : dep.module.id.version def mavenDep = "${dep.module.id.group}:${dep.module.id.name}:$version" if (!(mavenDep in listAdded)) { include(mavenDep) { transitive = false } listAdded.add(mavenDep) } break } } } rootProject.configurations.compile.resolvedConfiguration.firstLevelModuleDependencies.each eachDep rootProject.configurations.runtimeClasspath.resolvedConfiguration.firstLevelModuleDependencies.each eachDep } } def releaseChangelog = "No changelog" /* Thank you modmenu & fablabs */ task releaseOnCf { def df = new SimpleDateFormat("yyyy-MM-dd HH:mm") df.setTimeZone(TimeZone.getTimeZone("UTC")) def branch if (System.env.BRANCH_NAME) { branch = System.env.BRANCH_NAME branch = branch.substring(branch.lastIndexOf("/") + 1) } else { branch = "git rev-parse --abbrev-ref HEAD".execute().in.text.trim() } if (branch == "HEAD") { branch = "git rev-parse --short HEAD".execute().in.text.trim() } def time = df.format(new Date()) def changes = new StringBuilder() changes << "

REI v$project.version for $project.supported_version

Updated at $time.
Click here for changelog" def proc = "git log --max-count=200 --pretty=format:%s".execute() proc.in.eachLine { line -> def processedLine = line.toString() if (!processedLine.contains("New translations") && !processedLine.contains("Merge") && !processedLine.contains("branch")) { changes << "
- ${processedLine.capitalize()}" } } proc.waitFor() releaseChangelog = changes.toString() dependsOn tasks.getByName("curseforge") } curseforge { if (project.hasProperty('danielshe_curse_api_key') || System.getenv('danielshe_curse_api_key') != null) { apiKey = project.hasProperty('danielshe_curse_api_key') ? project.property('danielshe_curse_api_key') : System.getenv('danielshe_curse_api_key') project { id = "310111" releaseType = "release" changelogType = "html" changelog = releaseChangelog addGameVersion "1.16-Snapshot" addGameVersion "1.16.2" addGameVersion "1.16.3" addGameVersion "1.16.4" addGameVersion "Java 8" addGameVersion "Fabric" relations { requiredDependency "fabric-api" embeddedLibrary "cloth-api" embeddedLibrary "cloth-config" embeddedLibrary "auto-config-updated-api" } mainArtifact(file("${project.buildDir}/libs/${project.archivesBaseName}-${project.version}.jar")) { displayName = "[Fabric $project.supported_version] v$project.version" } addArtifact(file("${project.buildDir}/libs/${project.archivesBaseName}-${project.version}-sources.jar")) { displayName = "[Fabric $project.supported_version] v$project.version Sources" } afterEvaluate { uploadTask.dependsOn("build") } } } options { forgeGradleIntegration = false javaVersionAutoDetect = false } } publishing { publications { mavenJava(MavenPublication) { artifact(file("${project.buildDir}/libs/$archivesBaseName-${version}-maven.jar")) { builtBy remapMavenJar } artifact(sourcesJar) { builtBy remapSourcesJar } pom.withXml { def depsNode = asNode().appendNode("dependencies") subprojects.each { def depNode = depsNode.appendNode("dependency") depNode.appendNode("groupId", it.group) depNode.appendNode("artifactId", it.name) depNode.appendNode("version", it.version) depNode.appendNode("scope", "compile") } } } } repositories { if (project.hasProperty('danielshe_pass')) { maven { url = "http://deploy.modmuss50.me/" credentials { username = "danielshe" password = project.getProperty('danielshe_pass') } } } } } /* The following code is licensed under MIT License. Copyright (c) 2016 FabricMC Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ class MojangMappingsDependency implements SelfResolvingDependency { private final Project project private final LoomGradleExtension extension MojangMappingsDependency(Project project, LoomGradleExtension extension) { this.project = project this.extension = extension } @Override Set resolve() { Path mappingsDir = extension.getMappingsProvider().getMappingsDir() Path mappingsFile = mappingsDir.resolve(String.format("net.mojang.minecraft-mappings-%s.tiny", getVersion())) Path clientMappings = mappingsDir.resolve(String.format("net.mojang.minecraft.mappings-%s-client.map", getVersion())) Path serverMappings = mappingsDir.resolve(String.format("net.mojang.minecraft.mappings-%s-server.map", getVersion())) if (!Files.exists(mappingsFile) || project.getGradle().getStartParameter().isRefreshDependencies()) { MappingSet mappingSet try { mappingSet = getMappingsSet(clientMappings, serverMappings) Writer writer = new StringWriter() new TinyWriter(writer, "intermediary", "named").write(mappingSet) Files.deleteIfExists(mappingsFile) ZipUtil.pack([ new ByteSource("mappings/mappings.tiny", writer.toString().getBytes(StandardCharsets.UTF_8)) ] as ZipEntrySource[], mappingsFile.toFile()) writer.close() } catch (IOException e) { throw new RuntimeException("Failed to resolve Mojang mappings", e) } } return Collections.singleton(mappingsFile.toFile()) } private MappingSet getMappingsSet(Path clientMappings, Path serverMappings) throws IOException { MinecraftVersionInfo versionInfo = extension.getMinecraftProvider().getVersionInfo() if (versionInfo.downloads.get("client_mappings") == null) { throw new RuntimeException("Failed to find official mojang mappings for " + getVersion()) } String clientMappingsUrl = versionInfo.downloads.get("client_mappings").url String serverMappingsUrl = versionInfo.downloads.get("server_mappings").url DownloadUtil.downloadIfChanged(new URL(clientMappingsUrl), clientMappings.toFile(), project.getLogger()) DownloadUtil.downloadIfChanged(new URL(serverMappingsUrl), serverMappings.toFile(), project.getLogger()) MappingSet mappings = MappingSet.create() BufferedReader clientBufferedReader = Files.newBufferedReader(clientMappings, StandardCharsets.UTF_8) BufferedReader serverBufferedReader = Files.newBufferedReader(serverMappings, StandardCharsets.UTF_8) ProGuardReader proGuardReaderClient = new ProGuardReader(clientBufferedReader) ProGuardReader proGuardReaderServer = new ProGuardReader(serverBufferedReader) proGuardReaderClient.read(mappings) proGuardReaderServer.read(mappings) clientBufferedReader.close() serverBufferedReader.close() proGuardReaderClient.close() proGuardReaderServer.close() MappingSet officialToNamed = mappings.reverse() MappingSet intermediaryToOfficial BufferedReader reader = Files.newBufferedReader(extension.getMappingsProvider().getIntermediaryTiny(), StandardCharsets.UTF_8) intermediaryToOfficial = new TinyMappingsReader(TinyMappingFactory.loadWithDetection(reader), "intermediary", "official").read() reader.close() MappingSet intermediaryToMojang = MappingSet.create() // Merging. Don't use MappingSet#merge iterateClasses(intermediaryToOfficial, { inputMappings -> officialToNamed.getClassMapping(inputMappings.getFullDeobfuscatedName()) .ifPresent({ namedClass -> ClassMapping mojangClassMapping = intermediaryToMojang.getOrCreateClassMapping(inputMappings.getFullObfuscatedName()) .setDeobfuscatedName(namedClass.getFullDeobfuscatedName()) for (FieldMapping fieldMapping : inputMappings.getFieldMappings()) { namedClass.getFieldMapping(fieldMapping.getDeobfuscatedName()) .ifPresent({ namedField -> mojangClassMapping.getOrCreateFieldMapping(fieldMapping.getSignature()) .setDeobfuscatedName(namedField.getDeobfuscatedName()) }) } for (MethodMapping methodMapping : inputMappings.getMethodMappings()) { namedClass.getMethodMapping(methodMapping.getDeobfuscatedSignature()) .ifPresent({ namedMethod -> mojangClassMapping.getOrCreateMethodMapping(methodMapping.getSignature()) .setDeobfuscatedName(namedMethod.getDeobfuscatedName()) }) } }) }) return intermediaryToMojang } @Override Set resolve(boolean transitive) { return resolve() } @Override TaskDependency getBuildDependencies() { return { Collections.emptySet() } } @Override String getGroup() { return "net.mojang.minecraft" } @Override String getName() { return "mappings" } @Override String getVersion() { return extension.getMinecraftProvider().getMinecraftVersion() } @Override boolean contentEquals(Dependency dependency) { if (dependency instanceof MojangMappingsDependency) { return ((MojangMappingsDependency) dependency).extension.getMinecraftProvider().getMinecraftVersion() == getVersion() } return false } @Override Dependency copy() { return new MojangMappingsDependency(project, extension) } @Override String getReason() { return null } @Override void because(String s) { } private static void iterateClasses(MappingSet mappings, Closure consumer) { for (TopLevelClassMapping classMapping : mappings.getTopLevelClassMappings()) { iterateClass(classMapping, consumer) } } private static void iterateClass(ClassMapping classMapping, Consumer consumer) { consumer.accept(classMapping) for (InnerClassMapping innerClassMapping : classMapping.getInnerClassMappings()) { iterateClass(innerClassMapping, consumer) } } private static class TinyWriter extends TextMappingsWriter { private final String namespaceFrom private final String namespaceTo protected TinyWriter(Writer writer, String namespaceFrom, String namespaceTo) { super(writer) this.namespaceFrom = namespaceFrom this.namespaceTo = namespaceTo } @Override void write(MappingSet mappings) { writer.println("tiny\t2\t0\t" + namespaceFrom + "\t" + namespaceTo) iterateClasses(mappings, { classMapping -> writer.println("c\t" + classMapping.getFullObfuscatedName() + "\t" + classMapping.getFullDeobfuscatedName()) for (FieldMapping fieldMapping : classMapping.getFieldMappings()) { fieldMapping.getType().ifPresent({ fieldType -> writer.println("\tf\t" + fieldType + "\t" + fieldMapping.getObfuscatedName() + "\t" + fieldMapping.getDeobfuscatedName()) }) } for (MethodMapping methodMapping : classMapping.getMethodMappings()) { writer.println("\tm\t" + methodMapping.getSignature().getDescriptor() + "\t" + methodMapping.getObfuscatedName() + "\t" + methodMapping.getDeobfuscatedName()) } }) } } }