2024-04-17 15:10:16 +02:00
//version: 1656003793falsepattern75
2022-01-10 02:35:24 +01:00
/*
DO NOT CHANGE THIS FILE!
Also, you may replace this file at any time if there is an update available.
2022-04-17 17:22:24 +02:00
Please check https://github.com/FalsePattern/ExampleMod1.7.10/blob/main/build.gradle for updates.
2022-01-10 02:35:24 +01:00
*/
import com.github.jengelman.gradle.plugins.shadow.tasks.ConfigureShadowRelocation
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
2022-08-28 17:58:19 +02:00
import com.matthewprenger.cursegradle.CurseArtifact
import com.matthewprenger.cursegradle.CurseRelation
import com.modrinth.minotaur.dependencies.ModDependency
import com.modrinth.minotaur.dependencies.VersionDependency
2022-07-24 11:39:53 +02:00
import org.gradle.internal.logging.text.StyledTextOutput.Style
import org.gradle.internal.logging.text.StyledTextOutputFactory
2022-01-10 02:35:24 +01:00
2022-07-24 11:39:53 +02:00
import java.nio.file.Files
import java.nio.file.Paths
2022-01-10 02:35:24 +01:00
import java.util.concurrent.TimeUnit
2022-07-24 11:39:53 +02:00
import java.util.zip.ZipEntry
import java.util.zip.ZipInputStream
import java.util.zip.ZipOutputStream
2022-01-10 02:35:24 +01:00
buildscript {
repositories {
2022-07-24 11:39:53 +02:00
mavenLocal ()
2022-01-10 02:35:24 +01:00
maven {
name = "forge"
2022-08-21 10:14:46 +02:00
url = "https://mvn.falsepattern.com/forge"
2022-01-10 02:35:24 +01:00
}
maven {
name = "sonatype"
url = "https://oss.sonatype.org/content/repositories/snapshots/"
}
maven {
name = "Scala CI dependencies"
url = "https://repo1.maven.org/maven2/"
}
maven {
name = "jitpack"
2022-08-20 20:08:26 +02:00
url = "https://mvn.falsepattern.com/jitpack/"
2022-01-10 02:35:24 +01:00
}
2022-06-27 22:55:03 +02:00
maven {
2022-08-21 10:14:46 +02:00
name = "mavenpattern"
2022-08-20 20:08:26 +02:00
url = "https://mvn.falsepattern.com/releases/"
2022-06-27 22:55:03 +02:00
}
2022-12-27 18:54:42 +01:00
maven {
name = "usrv"
url = "https://mvn.falsepattern.com/usrv/"
}
2022-01-10 02:35:24 +01:00
}
dependencies {
2022-12-27 18:54:42 +01:00
classpath 'net.minecraftforge.gradle:ForgeGradle:1.2.11'
2022-06-27 22:55:03 +02:00
classpath 'com.falsepattern:jtweaker:0.2.1'
2022-01-10 02:35:24 +01:00
}
}
plugins {
2022-07-24 11:39:53 +02:00
id 'java-library'
2022-01-10 02:35:24 +01:00
id 'idea'
2022-07-24 11:39:53 +02:00
id 'eclipse'
2022-01-10 02:35:24 +01:00
id 'scala'
2022-07-24 11:39:53 +02:00
id 'maven-publish'
id 'org.jetbrains.kotlin.jvm' version '1.5.30' apply false
id 'org.jetbrains.kotlin.kapt' version '1.5.30' apply false
id 'com.google.devtools.ksp' version '1.5.30-1.0.0' apply false
id 'org.ajoberstar.grgit' version '4.1.1'
id 'com.github.johnrengelman.shadow' version '4.0.4'
id 'com.palantir.git-version' version '0.13.0'
id 'de.undercouch.download' version '5.0.1'
id 'com.github.gmazzo.buildconfig' version '3.0.3' apply false
2022-08-28 17:58:19 +02:00
id 'com.modrinth.minotaur' version '2.+' apply false
id 'com.matthewprenger.cursegradle' version '1.4.0' apply false
2022-01-10 02:35:24 +01:00
}
2022-06-27 22:55:03 +02:00
apply plugin: 'com.falsepattern.jtweaker'
2022-07-24 11:39:53 +02:00
def out = services . get ( StyledTextOutputFactory ). create ( 'an-output' )
2022-01-10 02:35:24 +01:00
apply plugin: 'forge'
def projectJavaVersion = JavaLanguageVersion . of ( 8 )
java {
toolchain {
languageVersion . set ( projectJavaVersion )
}
}
idea {
module {
inheritOutputDirs = true
downloadJavadoc = true
downloadSources = true
}
}
if ( JavaVersion . current () != JavaVersion . VERSION_1_8 ) {
throw new GradleException ( "This project requires Java 8, but it's running on " + JavaVersion . current ())
}
checkPropertyExists ( "modName" )
checkPropertyExists ( "modId" )
checkPropertyExists ( "modGroup" )
checkPropertyExists ( "autoUpdateBuildScript" )
checkPropertyExists ( "minecraftVersion" )
checkPropertyExists ( "forgeVersion" )
checkPropertyExists ( "replaceGradleTokenInFile" )
checkPropertyExists ( "gradleTokenModId" )
checkPropertyExists ( "gradleTokenModName" )
checkPropertyExists ( "gradleTokenVersion" )
checkPropertyExists ( "gradleTokenGroupName" )
checkPropertyExists ( "apiPackage" )
checkPropertyExists ( "accessTransformersFile" )
checkPropertyExists ( "usesMixins" )
checkPropertyExists ( "mixinPlugin" )
checkPropertyExists ( "mixinsPackage" )
checkPropertyExists ( "coreModClass" )
checkPropertyExists ( "containsMixinsAndOrCoreModOnly" )
checkPropertyExists ( "usesShadowedDependencies" )
checkPropertyExists ( "developmentEnvironmentUserName" )
2022-04-17 17:22:24 +02:00
//Properties added in fork
2022-07-24 11:39:53 +02:00
propertyDefaultIfUnset ( "skipBuildScriptUpdateCheck" , false )
propertyDefaultIfUnset ( "repositoryURL" , "" )
propertyDefaultIfUnset ( "repositoryName" , "" )
propertyDefaultIfUnset ( "mavenGroupId" , "" )
propertyDefaultIfUnset ( "mavenArtifactId" , "" )
propertyDefaultIfUnset ( "hasMixinDeps" , false )
2022-09-25 14:25:32 +02:00
propertyDefaultIfUnset ( "mixinConfigs" , "" )
propertyDefaultIfUnset ( "mixinPluginPreInit" , "" )
propertyDefaultIfUnset ( "mixinPluginMinimumVersion" , "0.8.5" )
2022-07-24 11:39:53 +02:00
propertyDefaultIfUnset ( "remapStubs" , false )
2023-11-18 14:45:59 +01:00
propertyDefaultIfUnset ( "apiPackages" , null )
propertyDefaultIfUnset ( "apiPackagesNoRecurse" , null )
2022-07-24 11:39:53 +02:00
2022-08-28 17:58:19 +02:00
propertyDefaultIfUnset ( "modrinthProjectId" , "" )
propertyDefaultIfUnset ( "modrinthDependencies" , "" )
propertyDefaultIfUnset ( "curseForgeProjectId" , "" )
propertyDefaultIfUnset ( "curseForgeRelations" , "" )
2022-12-27 18:54:42 +01:00
propertyDefaultIfUnset ( "changelog" , "" )
2022-08-28 17:58:19 +02:00
2022-07-24 11:39:53 +02:00
propertyDefaultIfUnset ( "remoteMappings" , "https://raw.githubusercontent.com/MinecraftForge/FML/1.7.10/conf/" )
propertyDefaultIfUnset ( "mappingsChannel" , "stable" )
propertyDefaultIfUnset ( "mappingsVersion" , "12" )
2022-01-10 02:35:24 +01:00
String javaSourceDir = "src/main/java/"
String scalaSourceDir = "src/main/scala/"
2022-07-24 11:39:53 +02:00
String kotlinSourceDir = "src/main/kotlin/"
2022-01-10 02:35:24 +01:00
2023-11-18 14:45:59 +01:00
def verifyPackage ( thePackage , propName ) {
String javaSourceDir = "src/main/java/"
String scalaSourceDir = "src/main/scala/"
String kotlinSourceDir = "src/main/kotlin/"
String targetPackageJava = javaSourceDir + modGroup . toString (). replaceAll ( "\\." , "/" ) + "/" + thePackage . toString (). replaceAll ( "\\." , "/" )
String targetPackageScala = scalaSourceDir + modGroup . toString (). replaceAll ( "\\." , "/" ) + "/" + thePackage . toString (). replaceAll ( "\\." , "/" )
String targetPackageKotlin = kotlinSourceDir + modGroup . toString (). replaceAll ( "\\." , "/" ) + "/" + thePackage . toString (). replaceAll ( "\\." , "/" )
if (!( getFile ( targetPackageJava ). exists () || getFile ( targetPackageScala ). exists () || getFile ( targetPackageKotlin ). exists ())) {
throw new GradleException ( "Could not resolve \"${propName}\"! Could not find " + targetPackageJava + " or " + targetPackageScala + " or " + targetPackageKotlin )
}
2022-01-10 02:35:24 +01:00
}
2023-11-18 14:45:59 +01:00
verifyPackage ( "" , "modGroup" )
2022-01-10 02:35:24 +01:00
if ( apiPackage ) {
2023-11-18 14:45:59 +01:00
verifyPackage ( apiPackage , "apiPackage" )
}
if ( apiPackages ) {
apiPackages . tokenize ( ';' ). forEach { it -> verifyPackage ( it , "apiPackages" )}
}
if ( apiPackagesNoRecurse ) {
apiPackagesNoRecurse . tokenize ( ';' ). forEach { it -> verifyPackage ( it , "apiPackagesNoRecurse" )}
2022-01-10 02:35:24 +01:00
}
if ( accessTransformersFile ) {
String targetFile = "src/main/resources/META-INF/" + accessTransformersFile
2022-07-24 11:39:53 +02:00
if (! getFile ( targetFile ). exists ()) {
2022-01-10 02:35:24 +01:00
throw new GradleException ( "Could not resolve \"accessTransformersFile\"! Could not find " + targetFile )
}
}
if ( usesMixins . toBoolean ()) {
2022-09-25 14:25:32 +02:00
if ( mixinsPackage . isEmpty ()) {
throw new GradleException ( "\"usesMixins\" requires \"mixinsPackage\" to be set!" )
2022-01-10 02:35:24 +01:00
}
2023-11-18 14:45:59 +01:00
String targetPackageJava = javaSourceDir + modGroup . toString (). replaceAll ( "\\." , "/" ) + "/" + mixinsPackage . toString (). replaceAll ( "\\." , "/" )
String targetPackageScala = scalaSourceDir + modGroup . toString (). replaceAll ( "\\." , "/" ) + "/" + mixinsPackage . toString (). replaceAll ( "\\." , "/" )
String targetPackageKotlin = kotlinSourceDir + modGroup . toString (). replaceAll ( "\\." , "/" ) + "/" + mixinsPackage . toString (). replaceAll ( "\\." , "/" )
2022-07-24 11:39:53 +02:00
if (!( getFile ( targetPackageJava ). exists () || getFile ( targetPackageScala ). exists () || getFile ( targetPackageKotlin ). exists ())) {
throw new GradleException ( "Could not resolve \"mixinsPackage\"! Could not find " + targetPackageJava + " or " + targetPackageScala + " or " + targetPackageKotlin )
2022-01-10 02:35:24 +01:00
}
2022-09-25 14:25:32 +02:00
if (! mixinPlugin . isEmpty ()) {
String targetFileJava = javaSourceDir + modGroup . toString (). replaceAll ( "\\." , "/" ) + "/" + mixinPlugin . toString (). replaceAll ( "\\." , "/" ) + ".java"
String targetFileScala = scalaSourceDir + modGroup . toString (). replaceAll ( "\\." , "/" ) + "/" + mixinPlugin . toString (). replaceAll ( "\\." , "/" ) + ".scala"
String targetFileScalaJava = scalaSourceDir + modGroup . toString (). replaceAll ( "\\." , "/" ) + "/" + mixinPlugin . toString (). replaceAll ( "\\." , "/" ) + ".java"
String targetFileKotlin = kotlinSourceDir + modGroup . toString (). replaceAll ( "\\." , "/" ) + "/" + mixinPlugin . toString (). replaceAll ( "\\." , "/" ) + ".kt"
if (!( getFile ( targetFileJava ). exists () || getFile ( targetFileScala ). exists () || getFile ( targetFileScalaJava ). exists () || getFile ( targetFileKotlin ). exists ())) {
throw new GradleException ( "Could not resolve \"mixinPlugin\"! Could not find " + targetFileJava + " or " + targetFileScala + " or " + targetFileScalaJava + " or " + targetFileKotlin )
}
2022-01-10 02:35:24 +01:00
}
}
if ( coreModClass ) {
String targetFileJava = javaSourceDir + modGroup . toString (). replaceAll ( "\\." , "/" ) + "/" + coreModClass . toString (). replaceAll ( "\\." , "/" ) + ".java"
String targetFileScala = scalaSourceDir + modGroup . toString (). replaceAll ( "\\." , "/" ) + "/" + coreModClass . toString (). replaceAll ( "\\." , "/" ) + ".scala"
String targetFileScalaJava = scalaSourceDir + modGroup . toString (). replaceAll ( "\\." , "/" ) + "/" + coreModClass . toString (). replaceAll ( "\\." , "/" ) + ".java"
2022-07-24 11:39:53 +02:00
String targetFileKotlin = kotlinSourceDir + modGroup . toString (). replaceAll ( "\\." , "/" ) + "/" + coreModClass . toString (). replaceAll ( "\\." , "/" ) + ".kt"
if (!( getFile ( targetFileJava ). exists () || getFile ( targetFileScala ). exists () || getFile ( targetFileScalaJava ). exists () || getFile ( targetFileKotlin ). exists ())) {
throw new GradleException ( "Could not resolve \"coreModClass\"! Could not find " + targetFileJava + " or " + targetFileScala + " or " + targetFileScalaJava + " or " + targetFileKotlin )
2022-01-10 02:35:24 +01:00
}
}
configurations . all {
resolutionStrategy . cacheChangingModulesFor ( 0 , TimeUnit . SECONDS )
// Make sure GregTech build won't time out
System . setProperty ( "org.gradle.internal.http.connectionTimeout" , 120000 as String )
System . setProperty ( "org.gradle.internal.http.socketTimeout" , 120000 as String )
}
// Fix Jenkins' Git: chmod a file should not be detected as a change and append a '.dirty' to the version
try {
2022-07-24 11:39:53 +02:00
'git config core.fileMode false' . execute ()
2022-01-10 02:35:24 +01:00
}
2022-07-24 11:39:53 +02:00
catch ( Exception ignored ) {
out . style ( Style . Failure ). println ( "git isn't installed at all" )
}
// Pulls version first from the VERSION env and then git tag
String identifiedVersion
String versionOverride = System . getenv ( "VERSION" ) ?: null
try {
identifiedVersion = versionOverride == null ? gitVersion () : versionOverride
}
catch ( Exception ignored ) {
out . style ( Style . Failure ). text (
'This mod must be version controlled by Git AND the repository must provide at least one tag,\n' +
'or the VERSION override must be set! ' ). style ( Style . SuccessHeader ). text ( '(Do NOT download from GitHub using the ZIP option, instead\n' +
'clone the repository, see ' ). style ( Style . Info ). text ( 'https://gtnh.miraheze.org/wiki/Development' ). style ( Style . SuccessHeader ). println ( ' for details.)'
)
versionOverride = 'NO-GIT-TAG-SET'
identifiedVersion = versionOverride
}
version = identifiedVersion
ext {
modVersion = identifiedVersion
}
if ( identifiedVersion == versionOverride ) {
out . style ( Style . Failure ). text ( 'Override version to ' ). style ( Style . Identifier ). text ( modVersion ). style ( Style . Failure ). println ( '!\7' )
2022-01-10 02:35:24 +01:00
}
group = modGroup
if ( project . hasProperty ( "customArchiveBaseName" ) && customArchiveBaseName ) {
archivesBaseName = customArchiveBaseName
}
else {
archivesBaseName = modId
}
2022-04-17 17:22:24 +02:00
archivesBaseName += "-mc" + minecraftVersion
2022-01-10 02:35:24 +01:00
minecraft {
version = minecraftVersion + "-" + forgeVersion + "-" + minecraftVersion
runDir = "run"
if ( replaceGradleTokenInFile ) {
2023-01-04 01:22:36 +01:00
for ( file in replaceGradleTokenInFile . split ( ',' )) {
replaceIn file
}
2022-01-10 02:35:24 +01:00
if ( gradleTokenModId ) {
replace gradleTokenModId , modId
}
if ( gradleTokenModName ) {
replace gradleTokenModName , modName
}
if ( gradleTokenVersion ) {
2022-07-24 11:39:53 +02:00
replace gradleTokenVersion , modVersion
2022-01-10 02:35:24 +01:00
}
if ( gradleTokenGroupName ) {
replace gradleTokenGroupName , modGroup
}
}
}
if ( file ( "addon.gradle" ). exists ()) {
apply from: "addon.gradle"
}
apply from: 'repositories.gradle'
2023-11-18 14:45:59 +01:00
if ( file ( 'repositories_override.gradle' ). exists ()) {
apply from: 'repositories_override.gradle'
}
2022-01-10 02:35:24 +01:00
configurations {
2023-02-11 11:24:05 +01:00
for ( config in [ shadowImplementation , shadowCompile , shadeCompile ]) {
implementation . extendsFrom ( shadeCompile )
compileClasspath . extendsFrom ( config )
runtimeClasspath . extendsFrom ( config )
testCompileClasspath . extendsFrom ( config )
testRuntimeClasspath . extendsFrom ( config )
}
2022-01-10 02:35:24 +01:00
}
repositories {
maven {
name = "Overmind forge repo mirror"
url = "https://gregtech.overminddl1.com/"
}
2022-04-17 17:22:24 +02:00
if ( usesMixins . toBoolean () || hasMixinDeps . toBoolean ()) {
2022-09-01 19:19:53 +02:00
maven {
name = "sponge"
url = "https://mvn.falsepattern.com/releases"
2022-01-10 02:35:24 +01:00
}
maven {
2022-09-01 19:19:53 +02:00
name = "sponge2"
url = "https://mvn.falsepattern.com/sponge"
2022-01-10 02:35:24 +01:00
}
2024-04-17 15:10:16 +02:00
maven {
name = "jitpack"
url = "https://mvn.falsepattern.com/jitpack/"
}
2022-01-10 02:35:24 +01:00
}
}
2024-04-17 15:10:16 +02:00
def unimixinsVersion = "0.1.15"
2023-11-27 10:51:40 +01:00
2022-01-10 02:35:24 +01:00
dependencies {
if ( usesMixins . toBoolean ()) {
2024-04-17 15:10:16 +02:00
annotationProcessor ( "org.ow2.asm:asm-debug-all:5.0.3" )
annotationProcessor ( "com.google.guava:guava:24.1.1-jre" )
annotationProcessor ( "com.google.code.gson:gson:2.8.6" )
2023-11-27 10:51:40 +01:00
annotationProcessor ( "com.github.LegacyModdingMC.UniMixins:unimixins-all-1.7.10:$unimixinsVersion:dev" )
implementation ( "com.github.LegacyModdingMC.UniMixins:unimixins-all-1.7.10:$unimixinsVersion:dev" )
runtimeOnly ( 'org.jetbrains:intellij-fernflower:1.2.1.16' )
2022-09-01 19:19:53 +02:00
} else if ( hasMixinDeps . toBoolean ()) {
2023-11-27 10:51:40 +01:00
runtimeOnly ( "com.github.LegacyModdingMC.UniMixins:unimixins-all-1.7.10:$unimixinsVersion:dev" )
2022-04-17 17:22:24 +02:00
}
2023-01-04 01:22:36 +01:00
// Latest LWJGL
2023-11-27 10:51:40 +01:00
implementation "org.lwjgl.lwjgl:lwjgl:2.9.4-nightly-20150209"
implementation "org.lwjgl.lwjgl:lwjgl_util:2.9.4-nightly-20150209"
2023-01-04 01:22:36 +01:00
minecraftNatives "org.lwjgl.lwjgl:lwjgl-platform:2.9.4-nightly-20150209"
minecraftDeps "org.lwjgl.lwjgl:lwjgl:2.9.4-nightly-20150209"
minecraftDeps "org.lwjgl.lwjgl:lwjgl_util:2.9.4-nightly-20150209"
2022-01-10 02:35:24 +01:00
}
2023-11-27 10:51:40 +01:00
if ( usesMixins . toBoolean ()) {
configurations . implementation . dependencies . each {
if ( it instanceof ExternalModuleDependency ) {
it . exclude module: "SpongeMixins"
it . exclude module: "SpongePoweredMixin"
it . exclude module: "00gasstation-mc1.7.10"
it . exclude module: "gtnhmixins"
}
}
}
2022-01-10 02:35:24 +01:00
apply from: 'dependencies.gradle'
2023-11-18 14:45:59 +01:00
if ( file ( 'dependencies_override.gradle' ). exists ()) {
apply from: 'dependencies_override.gradle'
}
2022-08-24 20:33:02 +02:00
def mixinDir = new File ( project . buildDir , 'mixins' )
if (! mixinDir . exists ()) {
mixinDir . mkdirs ()
}
2022-01-10 02:35:24 +01:00
def mixingConfigRefMap = "mixins." + modId + ".refmap.json"
2022-08-24 20:33:02 +02:00
def srgFile = new File ( project . buildDir , 'srgs/mcp-srg.srg' )
def mixinSrg = new File ( mixinDir , "${mixingConfigRefMap}.srg" )
def mixinRefMap = new File ( mixinDir , mixingConfigRefMap )
2022-01-10 02:35:24 +01:00
task generateAssets {
2022-09-25 14:25:32 +02:00
if ( usesMixins . toBoolean () && ! mixinPlugin . isEmpty ()) {
2022-01-10 02:35:24 +01:00
getFile ( "/src/main/resources/mixins." + modId + ".json" ). text = """{
"required": true,
2022-09-25 14:25:32 +02:00
"minVersion": "${mixinPluginMinimumVersion}",
2022-01-10 02:35:24 +01:00
"package": "${modGroup}.${mixinsPackage}",
"plugin": "${modGroup}.${mixinPlugin}",
"refmap": "${mixingConfigRefMap}",
2022-09-25 14:25:32 +02:00
"target": "@env(${mixinPluginPreInit.toBoolean() ? "PREINIT": "DEFAULT"})",
2022-01-10 02:35:24 +01:00
"compatibilityLevel": "JAVA_8"
}
"""
}
}
task relocateShadowJar ( type: ConfigureShadowRelocation ) {
target = tasks . shadowJar
prefix = modGroup + ".shadow"
}
shadowJar {
2022-06-27 22:55:03 +02:00
if ( remapStubs . toBoolean ()) {
dependsOn ( removeStub )
}
2022-01-10 02:35:24 +01:00
project . configurations . shadeCompile . each { dep ->
from ( project . zipTree ( dep )) {
exclude 'META-INF' , 'META-INF/**'
}
}
manifest {
attributes ( getManifestAttributes ())
}
minimize () // This will only allow shading for actually used classes
configurations = [ project . configurations . shadowImplementation , project . configurations . shadowCompile ]
dependsOn ( relocateShadowJar )
}
jar {
2022-06-27 22:55:03 +02:00
if ( remapStubs . toBoolean ()) {
dependsOn ( removeStub )
}
2022-01-10 02:35:24 +01:00
project . configurations . shadeCompile . each { dep ->
from ( project . zipTree ( dep )) {
exclude 'META-INF' , 'META-INF/**'
}
}
manifest {
attributes ( getManifestAttributes ())
}
if ( usesShadowedDependencies . toBoolean ()) {
dependsOn ( shadowJar )
enabled = false
}
}
reobf {
2022-08-27 22:18:30 +02:00
if ( usesMixins . toBoolean ()) {
2022-01-10 02:35:24 +01:00
addExtraSrgFile mixinSrg
}
}
2022-08-27 22:18:30 +02:00
if ( usesMixins . toBoolean ()) {
tasks . compileJava {
options . compilerArgs += [
'-Xlint:-processing' ,
"-AreobfSrgFile=${srgFile}" ,
"-AoutSrgFile=${mixinSrg}" ,
"-AoutRefMapFile=${mixinRefMap}"
]
2022-01-10 02:35:24 +01:00
}
}
runClient {
def arguments = []
2022-04-17 17:22:24 +02:00
def jvmArguments = []
2022-01-10 02:35:24 +01:00
2022-04-17 17:22:24 +02:00
if ( usesMixins . toBoolean () || hasMixinDeps . toBoolean ()) {
arguments += [
"--tweakClass" , "org.spongepowered.asm.launch.MixinTweaker"
]
jvmArguments += [
"-Dmixin.debug=true" , "-Dmixin.debug.countInjections=true" , "-Dmixin.debug.verbose=true" , "-Dmixin.debug.export=true"
2022-01-10 02:35:24 +01:00
]
}
if ( developmentEnvironmentUserName ) {
arguments += [
"--username" ,
developmentEnvironmentUserName
]
}
args ( arguments )
2022-04-17 17:22:24 +02:00
jvmArgs ( jvmArguments )
2022-01-10 02:35:24 +01:00
}
runServer {
def arguments = []
2022-04-17 17:22:24 +02:00
def jvmArguments = []
2022-01-10 02:35:24 +01:00
2022-04-17 17:22:24 +02:00
if ( usesMixins . toBoolean () || hasMixinDeps . toBoolean ()) {
arguments += [
"--tweakClass" , "org.spongepowered.asm.launch.MixinTweaker"
]
jvmArguments += [
"-Dmixin.debug=true" , "-Dmixin.debug.countInjections=true" , "-Dmixin.debug.verbose=true" , "-Dmixin.debug.export=true"
2022-01-10 02:35:24 +01:00
]
}
args ( arguments )
2022-04-17 17:22:24 +02:00
jvmArgs ( jvmArguments )
2022-01-10 02:35:24 +01:00
}
tasks . withType ( JavaExec ). configureEach {
javaLauncher . set (
javaToolchains . launcherFor {
languageVersion = projectJavaVersion
}
)
}
2022-07-24 11:39:53 +02:00
processResources {
2022-01-10 02:35:24 +01:00
// this will ensure that this task is redone when the versions change.
inputs . property "version" , project . version
inputs . property "mcversion" , project . minecraft . version
// replace stuff in mcmod.info, nothing else
from ( sourceSets . main . resources . srcDirs ) {
include 'mcmod.info'
2022-07-24 11:39:53 +02:00
// replace modVersion and minecraftVersion
2022-01-10 02:35:24 +01:00
expand "minecraftVersion" : project . minecraft . version ,
2022-07-24 11:39:53 +02:00
"modVersion" : modVersion ,
2022-01-10 02:35:24 +01:00
"modId" : modId ,
"modName" : modName
}
if ( usesMixins . toBoolean ()) {
2022-08-24 20:33:02 +02:00
from mixinRefMap
2022-01-10 02:35:24 +01:00
}
2022-07-24 11:39:53 +02:00
// copy everything else that's not the mcmod.info
2022-01-10 02:35:24 +01:00
from ( sourceSets . main . resources . srcDirs ) {
exclude 'mcmod.info'
}
}
def getManifestAttributes () {
def manifestAttributes = [:]
2022-07-24 11:39:53 +02:00
if (! containsMixinsAndOrCoreModOnly . toBoolean () && ( usesMixins . toBoolean () || coreModClass )) {
2022-01-10 02:35:24 +01:00
manifestAttributes += [ "FMLCorePluginContainsFMLMod" : true ]
}
if ( accessTransformersFile ) {
manifestAttributes += [ "FMLAT" : accessTransformersFile . toString ()]
}
if ( coreModClass ) {
manifestAttributes += [ "FMLCorePlugin" : modGroup + "." + coreModClass ]
}
if ( usesMixins . toBoolean ()) {
2022-09-25 14:25:32 +02:00
String [] configs = [];
if (! mixinPlugin . isEmpty ()) {
configs += [ "mixins.${modId}.json" ];
}
if (! mixinConfigs . isEmpty ()) {
configs += [ mixinConfigs ];
}
2022-01-10 02:35:24 +01:00
manifestAttributes += [
"TweakClass" : "org.spongepowered.asm.launch.MixinTweaker" ,
2022-09-25 14:25:32 +02:00
"MixinConfigs" : String . join ( "," , configs ),
2022-07-24 11:39:53 +02:00
"ForceLoadAsMod" : ! containsMixinsAndOrCoreModOnly . toBoolean ()
2022-01-10 02:35:24 +01:00
]
}
return manifestAttributes
}
task sourcesJar ( type: Jar ) {
2022-07-24 11:39:53 +02:00
from ( sourceSets . main . allSource )
2022-01-10 02:35:24 +01:00
from ( file ( "$projectDir/LICENSE" ))
getArchiveClassifier (). set ( 'sources' )
}
task shadowDevJar ( type: ShadowJar ) {
2022-06-27 22:55:03 +02:00
if ( remapStubs . toBoolean ()) {
dependsOn ( removeStub )
}
2022-01-10 02:35:24 +01:00
project . configurations . shadeCompile . each { dep ->
from ( project . zipTree ( dep )) {
exclude 'META-INF' , 'META-INF/**'
}
}
from sourceSets . main . output
getArchiveClassifier (). set ( "dev" )
manifest {
attributes ( getManifestAttributes ())
}
minimize () // This will only allow shading for actually used classes
configurations = [ project . configurations . shadowImplementation , project . configurations . shadowCompile ]
}
task relocateShadowDevJar ( type: ConfigureShadowRelocation ) {
target = tasks . shadowDevJar
prefix = modGroup + ".shadow"
}
task circularResolverJar ( type: Jar ) {
dependsOn ( relocateShadowDevJar )
dependsOn ( shadowDevJar )
enabled = false
}
task devJar ( type: Jar ) {
2022-06-27 22:55:03 +02:00
if ( remapStubs . toBoolean ()) {
dependsOn ( removeStub )
}
2022-01-10 02:35:24 +01:00
project . configurations . shadeCompile . each { dep ->
from ( project . zipTree ( dep )) {
exclude 'META-INF' , 'META-INF/**'
}
}
from sourceSets . main . output
getArchiveClassifier (). set ( "dev" )
manifest {
attributes ( getManifestAttributes ())
}
if ( usesShadowedDependencies . toBoolean ()) {
dependsOn ( circularResolverJar )
enabled = false
}
}
task apiJar ( type: Jar ) {
2022-07-24 11:39:53 +02:00
from ( sourceSets . main . allSource ) {
2023-11-18 14:45:59 +01:00
if ( apiPackage )
include modGroup . toString (). replaceAll ( "\\." , "/" ) + "/" + apiPackage . toString (). replaceAll ( "\\." , "/" ) + '/**'
if ( apiPackages )
apiPackages . tokenize ( ';' ). forEach { pkg ->
include modGroup . toString (). replaceAll ( "\\." , "/" ) + "/" + pkg . toString (). replaceAll ( "\\." , "/" ) + '/**'
}
if ( apiPackagesNoRecurse )
apiPackagesNoRecurse . tokenize ( ';' ). forEach { pkg ->
include modGroup . toString (). replaceAll ( "\\." , "/" ) + "/" + pkg . toString (). replaceAll ( "\\." , "/" ) + '/*'
}
2022-01-10 02:35:24 +01:00
}
from ( sourceSets . main . output ) {
2023-11-18 14:45:59 +01:00
if ( apiPackage )
include modGroup . toString (). replaceAll ( "\\." , "/" ) + "/" + apiPackage . toString (). replaceAll ( "\\." , "/" ) + '/**'
if ( apiPackages )
apiPackages . tokenize ( ';' ). forEach { pkg ->
include modGroup . toString (). replaceAll ( "\\." , "/" ) + "/" + pkg . toString (). replaceAll ( "\\." , "/" ) + '/**'
}
if ( apiPackagesNoRecurse )
apiPackagesNoRecurse . tokenize ( ';' ). forEach { pkg ->
include modGroup . toString (). replaceAll ( "\\." , "/" ) + "/" + pkg . toString (). replaceAll ( "\\." , "/" ) + '/*'
}
2022-01-10 02:35:24 +01:00
}
from ( sourceSets . main . resources . srcDirs ) {
include ( "LICENSE" )
}
getArchiveClassifier (). set ( 'api' )
}
2022-08-24 20:33:02 +02:00
task copySrgs ( type: Copy , dependsOn: 'genSrgs' ) {
from plugins . getPlugin ( 'forge' ). delayedFile ( '{SRG_DIR}' )
include '**/*.srg'
into layout . buildDirectory . file ( 'srgs' )
}
compileJava . dependsOn ( copySrgs )
2022-01-10 02:35:24 +01:00
artifacts {
archives sourcesJar
archives devJar
2023-11-18 14:45:59 +01:00
if ( apiPackage || apiPackages || apiPackagesNoRecurse ) {
2022-01-10 02:35:24 +01:00
archives apiJar
}
}
2022-07-24 11:39:53 +02:00
// The gradle metadata includes all of the additional deps that we disabled from POM generation (including forgeBin with no groupID),
// and isn't strictly needed with the POM so just disable it.
tasks . withType ( GenerateModuleMetadata ) {
enabled = false
}
// workaround variable hiding in pom processing
def projectConfigs = project . configurations
2022-01-10 02:35:24 +01:00
// publishing
2022-04-17 17:22:24 +02:00
2022-01-10 02:35:24 +01:00
def getMavenSettingsCredentials = {
String userHome = System . getProperty ( "user.home" );
File mavenSettings = new File ( userHome , ".m2/settings.xml" )
def xmlSlurper = new XmlSlurper ()
def output = xmlSlurper . parse ( mavenSettings )
return output . "servers" . "server"
}
def getCredentials = {
2022-07-24 11:39:53 +02:00
String username = System . getenv ( "MAVEN_DEPLOY_USER" )
String password = System . getenv ( "MAVEN_DEPLOY_PASSWORD" )
if ( username == null ) {
try {
def entries = getMavenSettingsCredentials ()
for ( entry in entries ) {
if ( entry . "id" . text () == repositoryName ) {
return [ username: entry . username . text (), password: entry . password . text ()]
}
2022-04-17 17:22:24 +02:00
}
2022-07-24 11:39:53 +02:00
} catch ( Exception ignored ){}
return [ username: "none" , password: "none" ]
} else {
return [ username: username , password: password ]
2022-01-10 02:35:24 +01:00
}
}
2022-04-17 17:22:24 +02:00
//Publishing
2023-05-23 14:08:26 +02:00
tasks . publish . dependsOn ( build )
2022-01-10 02:35:24 +01:00
publishing {
publications {
maven ( MavenPublication ) {
2023-02-11 11:24:05 +01:00
from components . java
if ( usesShadowedDependencies . toBoolean ()) {
artifact source: shadowJar , classifier: ""
}
if (! project . hasProperty ( "noPublishedSources" ) || ! noPublishedSources ) {
artifact source: sourcesJar , classifier: "sources"
}
2022-07-24 11:39:53 +02:00
artifact source: usesShadowedDependencies . toBoolean () ? shadowDevJar : devJar , classifier: "dev"
2023-11-18 14:45:59 +01:00
if ( apiPackage || apiPackages || apiPackagesNoRecurse ) {
2022-01-10 02:35:24 +01:00
artifact source: apiJar , classifier: "api"
}
2022-04-17 17:22:24 +02:00
groupId = mavenGroupId
artifactId = mavenArtifactId + "-mc" + minecraftVersion
2022-08-27 22:18:30 +02:00
version = modVersion
2022-07-24 11:39:53 +02:00
// remove extra garbage from minecraft and minecraftDeps configuration
pom . withXml {
def badArtifacts = [:]. withDefault {[] as Set < String >}
for ( configuration in [ projectConfigs . minecraft , projectConfigs . minecraftDeps ]) {
for ( dependency in configuration . allDependencies ) {
badArtifacts [ dependency . group == null ? "" : dependency . group ] += dependency . name
}
}
// example for specifying extra stuff to ignore
// badArtifacts["org.example.group"] += "artifactName"
Node pomNode = asNode ()
pomNode . dependencies . '*' . findAll () {
badArtifacts [ it . groupId . text ()]. contains ( it . artifactId . text ())
}. each () {
it . parent (). remove ( it )
}
}
2022-01-10 02:35:24 +01:00
}
}
2022-04-17 17:22:24 +02:00
2022-01-10 02:35:24 +01:00
repositories {
2022-05-06 12:44:03 +02:00
if ( repositoryURL . trim () != "" ) {
maven {
name = repositoryName
url = repositoryURL
def creds = getCredentials ()
credentials {
2022-07-24 11:39:53 +02:00
username = creds ?. username ?: "none"
password = creds ?. password ?: "none"
2022-05-06 12:44:03 +02:00
}
2022-01-10 02:35:24 +01:00
}
}
}
}
2023-02-11 11:24:05 +01:00
tasks . withType ( PublishToMavenRepository ) { task ->
dependsOn ( "build" )
}
publishToMavenLocal . dependsOn ( "build" )
2022-12-27 18:54:42 +01:00
if ( project . changelog == "" ) {
File changelogFile = new File ( System . getenv ( "CHANGELOG_FILE" ) ?: "CHANGELOG.md" )
if ( changelogFile . exists ()) {
project . changelog = changelogFile . getText ( "UTF-8" )
} else {
project . changelog = "No changelog was provided."
}
}
project . changelog = project . changelog . replace ( "{version}" , modVersion )
2022-08-28 17:58:19 +02:00
2022-12-27 18:54:42 +01:00
if ( curseForgeProjectId != "" && System . getenv ( "CURSEFORGE_TOKEN" ) != null ) {
2022-08-28 17:58:19 +02:00
apply plugin: 'com.matthewprenger.cursegradle'
curseforge {
2022-12-27 18:54:42 +01:00
apiKey = System . getenv ( "CURSEFORGE_TOKEN" )
2022-08-28 17:58:19 +02:00
project {
id = curseForgeProjectId
2022-12-27 18:54:42 +01:00
changelogType = "markdown"
changelog = project . changelog
2022-08-28 17:58:19 +02:00
releaseType = modVersion . contains ( "-a" ) ? "alpha" : modVersion . contains ( "-b" ) ? "beta" : "release"
addGameVersion project . minecraft . version
2022-08-30 20:42:50 +02:00
addGameVersion "Forge"
2022-08-28 17:58:19 +02:00
mainArtifact ( jar ) {
2023-05-23 14:08:26 +02:00
displayName = "$modName $modVersion"
2022-08-28 17:58:19 +02:00
}
}
options {
javaIntegration = false
forgeGradleIntegration = false
}
}
if ( curseForgeRelations . size () != 0 ) {
String [] deps = curseForgeRelations . split ( ";" )
deps . each { dep ->
if ( dep . size () == 0 ) {
return
}
String [] parts = dep . split ( ":" )
String type = parts [ 0 ]
String name = parts [ 1 ]
addCurseForgeRelation ( type , name )
}
}
2022-12-27 18:54:42 +01:00
if ( usesMixins . toBoolean ()) {
2023-11-27 10:51:40 +01:00
addCurseForgeRelation ( "requiredDependency" , "unimixins" )
2022-12-27 18:54:42 +01:00
}
2022-08-28 17:58:19 +02:00
tasks . curseforge . dependsOn ( build )
2022-08-30 20:42:50 +02:00
tasks . publish . dependsOn ( tasks . curseforge )
2022-08-28 17:58:19 +02:00
}
2022-12-27 18:54:42 +01:00
if ( modrinthProjectId != "" && System . getenv ( "MODRINTH_TOKEN" ) != null ) {
2022-08-28 17:58:19 +02:00
apply plugin: 'com.modrinth.minotaur'
modrinth {
token = System . getenv ( "MODRINTH_TOKEN" )
projectId = modrinthProjectId
versionNumber = modVersion
versionType = modVersion . contains ( "-a" ) ? "alpha" : modVersion . contains ( "-b" ) ? "beta" : "release"
2022-12-27 18:54:42 +01:00
changelog = project . changelog
2022-08-28 17:58:19 +02:00
uploadFile = jar
gameVersions = [ project . minecraft . version ]
loaders = [ "forge" ]
}
if ( modrinthDependencies . size () != 0 ) {
String [] deps = modrinthDependencies . split ( ";" )
deps . each { dep ->
if ( dep . size () == 0 ) {
return
}
String [] parts = dep . split ( ":" )
String [] qual = parts [ 0 ]. split ( "-" )
String scope = qual [ 0 ]
String type = qual [ 1 ]
String name = parts [ 1 ]
addModrinthDep ( scope , type , name )
}
}
2022-12-27 18:54:42 +01:00
if ( usesMixins . toBoolean ()) {
2023-11-27 10:51:40 +01:00
addModrinthDep ( "required" , "project" , "ghjoiQAl" )
2022-12-27 18:54:42 +01:00
}
2022-08-28 17:58:19 +02:00
tasks . modrinth . dependsOn ( build )
2022-08-30 20:42:50 +02:00
tasks . publish . dependsOn ( tasks . modrinth )
2022-08-28 17:58:19 +02:00
}
def addModrinthDep ( scope , type , name ) {
com . modrinth . minotaur . dependencies . Dependency dep ;
if (!( scope in [ "required" , "optional" , "incompatible" , "embedded" ])) {
throw new Exception ( "Invalid modrinth dependency scope: " + scope )
}
switch ( type ) {
case "project" :
dep = new ModDependency ( name , scope )
break
case "version" :
dep = new VersionDependency ( name , scope )
break
default :
throw new Exception ( "Invalid modrinth dependency type: " + type )
}
project . modrinth . dependencies . add ( dep )
}
def addCurseForgeRelation ( type , name ) {
if (!( type in [ "requiredDependency" , "embeddedLibrary" , "optionalDependency" , "tool" , "incompatible" ])) {
throw new Exception ( "Invalid CurseForge relation type: " + type )
}
CurseArtifact artifact = project . curseforge . curseProjects [ 0 ]. mainArtifact
CurseRelation rel = ( artifact . curseRelations ?: ( artifact . curseRelations = new CurseRelation ()))
rel . "$type" ( name )
}
2022-01-10 02:35:24 +01:00
// Updating
task updateBuildScript {
doLast {
if ( performBuildScriptUpdate ( projectDir . toString ())) return
print ( "Build script already up-to-date!" )
}
}
2022-08-20 20:08:26 +02:00
if (! project . getGradle (). startParameter . isOffline () && ! skipBuildScriptUpdateCheck . toBoolean () && isNewBuildScriptVersionAvailable ( projectDir . toString ())) {
2022-01-10 02:35:24 +01:00
if ( autoUpdateBuildScript . toBoolean ()) {
performBuildScriptUpdate ( projectDir . toString ())
} else {
2022-07-24 11:39:53 +02:00
out . style ( Style . SuccessHeader ). println ( "Build script update available! Run 'gradle updateBuildScript'" )
2022-01-10 02:35:24 +01:00
}
}
static URL availableBuildScriptUrl () {
2022-04-17 17:22:24 +02:00
new URL ( "https://raw.githubusercontent.com/FalsePattern/ExampleMod1.7.10/main/build.gradle" )
2022-01-10 02:35:24 +01:00
}
boolean performBuildScriptUpdate ( String projectDir ) {
if ( isNewBuildScriptVersionAvailable ( projectDir )) {
def buildscriptFile = getFile ( "build.gradle" )
availableBuildScriptUrl (). withInputStream { i -> buildscriptFile . withOutputStream { it << i } }
2022-07-24 11:39:53 +02:00
out . println ( "Build script updated. Please REIMPORT the project or RESTART your IDE!" )
2022-01-10 02:35:24 +01:00
return true
}
return false
}
boolean isNewBuildScriptVersionAvailable ( String projectDir ) {
Map parameters = [ "connectTimeout" : 2000 , "readTimeout" : 2000 ]
String currentBuildScript = getFile ( "build.gradle" ). getText ()
String currentBuildScriptHash = getVersionHash ( currentBuildScript )
String availableBuildScript = availableBuildScriptUrl (). newInputStream ( parameters ). getText ()
String availableBuildScriptHash = getVersionHash ( availableBuildScript )
boolean isUpToDate = currentBuildScriptHash . empty || availableBuildScriptHash . empty || currentBuildScriptHash == availableBuildScriptHash
return ! isUpToDate
}
static String getVersionHash ( String buildScriptContent ) {
String versionLine = buildScriptContent . find ( "^//version: [a-z0-9]*" )
if ( versionLine != null ) {
return versionLine . split ( ": " ). last ()
}
return ""
}
configure ( updateBuildScript ) {
group = 'forgegradle'
description = 'Updates the build script to the latest version'
}
2022-07-24 11:39:53 +02:00
// Parameter Deobfuscation
task deobfParams {
doLast {
String mcpDir = "$project.gradle.gradleUserHomeDir/caches/minecraft/de/oceanlabs/mcp/mcp_$mappingsChannel/$mappingsVersion"
String mcpZIP = "$mcpDir/mcp_$mappingsChannel-$mappingsVersion-${minecraftVersion}.zip"
String paramsCSV = "$mcpDir/params.csv"
download . run {
src "https://maven.minecraftforge.net/de/oceanlabs/mcp/mcp_$mappingsChannel/$mappingsVersion-$minecraftVersion/mcp_$mappingsChannel-$mappingsVersion-${minecraftVersion}.zip"
dest mcpZIP
overwrite false
}
if (! file ( paramsCSV ). exists ()) {
println ( "Extracting MCP archive ..." )
unzip ( mcpZIP , mcpDir )
}
println ( "Parsing params.csv ..." )
Map < String , String > params = new HashMap <>()
Files . lines ( Paths . get ( paramsCSV )). forEach { line ->
String [] cells = line . split ( "," )
if ( cells . length > 2 && cells [ 0 ]. matches ( "p_i?\\d+_\\d+_" )) {
params . put ( cells [ 0 ], cells [ 1 ])
}
}
out . style ( Style . Success ). println ( "Modified ${replaceParams(file(" $projectDir /src/ main /java"), params)} files!")
out.style(Style.Failure).println("Don't forget to verify that the code still works as before!\n It could be broken due to duplicate variables existing now\n or parameters taking priority over other variables.")
}
}
static int replaceParams(File file, Map<String, String> params) {
int fileCount = 0
if(file.isDirectory()) {
for(File f : file.listFiles()) {
fileCount += replaceParams(f, params)
}
return fileCount
}
println("Visiting ${file.getName()} ...")
try {
String content = new String(Files.readAllBytes(file.toPath()))
int hash = content.hashCode()
params.forEach{key, value ->
content = content.replaceAll(key, value)
}
if(hash != content.hashCode()) {
Files.write(file.toPath(), content.getBytes("UTF-8"))
return 1
}
} catch(Exception e) {
e.printStackTrace()
}
return 0
}
// Credit: bitsnaps (https://gist.github.com/ bitsnaps /00947f2dce66f4bbdabc67d7e7b33681)
static unzip(String zipFileName, String outputDir) {
byte[] buffer = new byte[16384]
ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFileName))
ZipEntry zipEntry = zis.getNextEntry()
while (zipEntry != null) {
File newFile = new File(outputDir + File.separator, zipEntry.name)
if (zipEntry.isDirectory()) {
if (!newFile.isDirectory() && !newFile.mkdirs()) {
throw new IOException("Failed to create directory $newFile")
}
} else {
// fix for Windows-created archives
File parent = newFile.parentFile
if (!parent.isDirectory() && !parent.mkdirs()) {
throw new IOException("Failed to create directory $parent")
}
// write file content
FileOutputStream fos = new FileOutputStream(newFile)
int len = 0
while ((len = zis.read(buffer)) > 0) {
fos.write(buffer, 0, len)
}
fos.close()
}
zipEntry = zis.getNextEntry()
}
zis.closeEntry()
zis.close()
}
configure(deobfParams) {
group = 'forgegradle'
description = 'Rename all obfuscated parameter names inherited from Minecraft classes'
}
2024-04-17 15:10:16 +02:00
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
2022-07-24 11:39:53 +02:00
// Dependency Deobfuscation
def deobfMaven(mavenDep) {
throw new GradleException("deobfMaven(mavenDep) is deprecated. " +
"You must use the new deobfMaven(repoURL, mavenDep) method instead." +
"The old method broke the buildscript when used.")
}
def deobfMaven(String repoURL, String mavenDep) {
if (!repoURL.endsWith("/ ")) {
repoURL += " /"
}
String[] parts = mavenDep.split(":")
parts[0] = parts[0].replace('.', '/ ')
def jarURL = repoURL + parts[0] + "/" + parts[1] + "/" + parts[2] + "/" + parts[1] + "-" + parts[2] + ".jar"
return deobf(jarURL)
}
def deobf(String sourceURL) {
try {
URL url = new URL(sourceURL)
String fileName = url.getFile()
//get rid of directories:
int lastSlash = fileName.lastIndexOf("/")
if(lastSlash > 0) {
fileName = fileName.substring(lastSlash + 1)
}
//get rid of extension:
if(fileName.endsWith(".jar") || fileName.endsWith(".litemod")) {
fileName = fileName.substring(0, fileName.lastIndexOf("."))
}
String hostName = url.getHost()
if(hostName.startsWith("www.")) {
hostName = hostName.substring(4)
}
List parts = Arrays.asList(hostName.split("\\."))
Collections.reverse(parts)
hostName = String.join(".", parts)
return deobf(sourceURL, "$hostName/$fileName")
} catch(Exception e) {
return deobf(sourceURL, "deobf/${sourceURL.hashCode()}")
}
}
// The method above is to be preferred. Use this method if the filename is not at the end of the URL.
def deobf(String sourceURL, String rawFileName) {
String bon2Version = "2.5.1"
String fileName = URLDecoder.decode(rawFileName, "UTF-8")
String cacheDir = "$project.gradle.gradleUserHomeDir/caches"
String bon2Dir = "$cacheDir/forge_gradle/deobf"
String bon2File = "$bon2Dir/BON2-${bon2Version}.jar"
String obfFile = "$cacheDir/modules-2/files-2.1/${fileName}.jar"
String deobfFile = "$cacheDir/modules-2/files-2.1/${fileName}-deobf.jar"
if(file(deobfFile).exists()) {
return files(deobfFile)
}
String mappingsVer
if(remoteMappings) {
String id = "${forgeVersion.split("\\.")[3]}-$minecraftVersion"
String mappingsZIP = "$cacheDir/forge_gradle/maven_downloader/de/oceanlabs/mcp/mcp_snapshot_nodoc/$id/mcp_snapshot_nodoc-${id}.zip"
zipMappings(mappingsZIP, remoteMappings, bon2Dir)
mappingsVer = "snapshot_$id"
} else {
mappingsVer = "${mappingsChannel}_$mappingsVersion"
}
download.run {
2023-05-23 14:08:26 +02:00
src "https://github.com/FalsePattern/ExampleMod1.7.10/raw/main/blobs/BON2-2.5.1.jar"
2022-07-24 11:39:53 +02:00
dest bon2File
quiet true
overwrite false
}
download.run {
src sourceURL
dest obfFile
quiet true
overwrite false
}
exec {
2023-05-23 14:08:26 +02:00
commandLine Paths.get(System.getProperty("java.home"), "bin", "java").toAbsolutePath().toString(), ' - jar ', bon2File, ' -- inputJar ', obfFile, ' -- outputJar ', deobfFile, ' -- mcVer ', minecraftVersion, ' -- mappingsVer ', mappingsVer, ' -- notch '
2022-07-24 11:39:53 +02:00
workingDir bon2Dir
standardOutput = new FileOutputStream ( "${deobfFile}.log" )
}
return files ( deobfFile )
}
def zipMappings ( String zipPath , String url , String bon2Dir ) {
File zipFile = new File ( zipPath )
if ( zipFile . exists ()) {
return
}
String fieldsCache = "$bon2Dir/data/fields.csv"
String methodsCache = "$bon2Dir/data/methods.csv"
download . run {
src "${url}fields.csv"
dest fieldsCache
quiet true
}
download . run {
src "${url}methods.csv"
dest methodsCache
quiet true
}
zipFile . getParentFile (). mkdirs ()
ZipOutputStream zos = new ZipOutputStream ( new FileOutputStream ( zipFile ))
zos . putNextEntry ( new ZipEntry ( "fields.csv" ))
Files . copy ( Paths . get ( fieldsCache ), zos )
zos . closeEntry ()
zos . putNextEntry ( new ZipEntry ( "methods.csv" ))
Files . copy ( Paths . get ( methodsCache ), zos )
zos . closeEntry ()
zos . close ()
}
2022-01-10 02:35:24 +01:00
// Helper methods
def checkPropertyExists ( String propertyName ) {
2022-07-24 11:39:53 +02:00
if (! project . hasProperty ( propertyName )) {
2022-04-17 17:22:24 +02:00
throw new GradleException ( "This project requires a property \"" + propertyName + "\"! Please add it your \"gradle.properties\". You can find all properties and their description here: https://github.com/FalsePattern/ExampleMod1.7.10/blob/main/gradle.properties" )
2022-01-10 02:35:24 +01:00
}
}
2022-07-24 11:39:53 +02:00
def propertyDefaultIfUnset ( String propertyName , defaultValue ) {
2022-09-25 14:25:32 +02:00
if (! project . hasProperty ( propertyName )) {
System . err . println ( "Your gradle.properties is missing the $propertyName entry. It has been automatically set to \"$defaultValue\" as fallback. You can find all properties and their description here: https://github.com/FalsePattern/ExampleMod1.7.10/blob/main/gradle.properties" )
}
2022-08-28 17:58:19 +02:00
if (! project . hasProperty ( propertyName ) || project . property ( propertyName ) == "" ) {
2022-07-24 11:39:53 +02:00
project . ext . setProperty ( propertyName , defaultValue )
}
}
2022-01-10 02:35:24 +01:00
def getFile ( String relativePath ) {
return new File ( projectDir , relativePath )
2022-12-27 18:54:42 +01:00
}
if ( file ( "addon_final.gradle" ). exists ()) {
apply from: "addon_final.gradle"
2022-08-28 17:58:19 +02:00
}