buildscript {
  repositories {
    maven { url = 'https://maven.minecraftforge.net' }
    mavenCentral()
    jcenter()
  }
}

plugins {
  id 'com.matthewprenger.cursegradle' version '1.4.0'
  id 'eclipse'
  id 'maven-publish'
  id 'net.minecraftforge.gradle' version '5.1.+'
  id 'nu.studer.credentials' version '1.0.7'
}

version = "${version_major}.${version_minor}.${version_patch}"
group = "${group}" // http://maven.apache.org/guides/mini/guide-naming-conventions.html
archivesBaseName = "${mod_id}_${mc_version}"

// Mojang ships Java 17 to end users in 1.18+, so your mod should target Java 17.
java.toolchain.languageVersion = JavaLanguageVersion.of(17)

println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + '(' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch'))
minecraft {
  // The mappings can be changed at any time and must be in the following format.
  // Channel:   Version:
  // official   MCVersion             Official field/method names from Mojang mapping files
  // parchment  YYYY.MM.DD-MCVersion  Open community-sourced parameter names and javadocs layered on top of official
  //
  // You must be aware of the Mojang license when using the 'official' or 'parchment' mappings.
  // See more information here: https://github.com/MinecraftForge/MCPConfig/blob/master/Mojang.md
  //
  // Parchment is an unofficial project maintained by ParchmentMC, separate from MinecraftForge
  // Additional setup is needed to use their mappings: https://github.com/ParchmentMC/Parchment/wiki/Getting-Started
  //
  // Use non-default mappings at your own risk. They may not always work.
  // Simply re-run your setup task after changing the mappings to update your workspace.
  mappings channel: 'official', version: "${mc_version}"

  // makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable.

  // accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg')

  // Default run configurations.
  // These can be tweaked, removed, or duplicated as needed.
  runs {
    client {
      workingDirectory project.file('run')

      // Recommended logging data for a userdev environment
      // The markers can be changed as needed.
      // "SCAN": For mods scan.
      // "REGISTRIES": For firing of registry events.
      // "REGISTRYDUMP": For getting the contents of all registries.
      property 'forge.logging.markers', 'REGISTRIES'

      // Recommended logging level for the console
      property 'forge.logging.console.level', 'debug'

      // Comma-separated list of namespaces to load gametests from. Empty = all namespaces.
      property 'forge.enabledGameTestNamespaces', "${mod_id}"

      mods {
        [[ --ModId-- ]] {
            source sourceSets.main
        }
      }

      // Mixin Support for itself or for testing other mods.
      property 'mixin.env.remapRefMap', 'true'
      property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg"
    }

    server {
      workingDirectory project.file('run')

      property 'forge.logging.markers', 'REGISTRIES'

      property 'forge.logging.console.level', 'debug'

      property 'forge.enabledGameTestNamespaces', "${mod_id}"

      mods {
        [[ --ModId-- ]] {
            source sourceSets.main
        }
      }

      // Mixin Support for itself or for testing other mods.
      property 'mixin.env.remapRefMap', 'true'
      property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg"
    }

    // This run config launches GameTestServer and runs all registered gametests, then exits.
    // By default, the server will crash when no gametests are provided.
    // The gametest system is also enabled by default for other run configs under the /test command.
    gameTestServer {
      workingDirectory project.file('run')

      property 'forge.logging.markers', 'REGISTRIES'

      property 'forge.logging.console.level', 'debug'

      property 'forge.enabledGameTestNamespaces', "${mod_id}"

      mods {
        [[ --ModId-- ]] {
          source sourceSets.main
        }
      }
    }

    data {
      workingDirectory project.file('run')

      property 'forge.logging.markers', 'REGISTRIES'

      property 'forge.logging.console.level', 'debug'

      // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources.
      args '--mod', '[[ --ModId-- ]]', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/')

      mods {
        [[ --ModId-- ]] {
            source sourceSets.main
        }
      }
    }
  }
}

// Include resources generated by data generators.
sourceSets.main.resources { srcDir 'src/generated/resources' }

repositories {
  // Put repositories for dependencies here
  // ForgeGradle automatically adds the Forge maven and Maven Central for you

  maven {
    url "https://www.cursemaven.com"
    content {
      includeGroup "curse.maven"
    }
  }
  maven {
    name = "Maven (local)"
    url = "file:///${project.projectDir}/.mcmodsrepo"
  }
}

dependencies {
  // Specify the version of Minecraft to use, If this is any group other then 'net.minecraft' it is assumed
  // that the dep is a ForgeGradle 'patcher' dependency. And it's patches will be applied.
  // The userdev artifact is a special name and will get all sorts of transformations applied to it.
  minecraft "net.minecraftforge:forge:${mc_version}-${forge_version}"

  // You may put jars on which you depend on in ./libs or you may define them like so..
  // compile "some.group:artifact:version:classifier"
  // compile "some.group:artifact:version"

  // Real mod deobf dependency examples - these get remapped to your current mappings
  // compileOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}:api") // Adds JEI API as a compile dependency
  // runtimeOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}") // Adds the full JEI mod as a runtime dependency
  // implementation fg.deobf("com.tterrag.registrate:Registrate:MC${mc_version}-${registrate_version}") // Adds registrate as a dependency

  // Examples using mod jars from ./libs
  // implementation fg.deobf("blank:coolmod-${mc_version}:${coolmod_version}")

  // For more info...
  // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html
  // http://www.gradle.org/docs/current/userguide/dependency_management.html
}

// Example for how to get properties into the manifest for reading by the runtime..
jar {
  manifest {
    attributes([
      "Specification-Title": "${mod_name}",
      "Specification-Vendor": "${vendor_name}",
      "Specification-Version": "1", // We are version 1 of ourselves
      "Implementation-Title": project.name,
      "Implementation-Version": "${version}",
      "Implementation-Vendor" :"${mod_id}",
      "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")
    ])
  }
}

// Example configuration to allow publishing using the maven-publish task
// This is the preferred method to reobfuscate your jar file
jar.finalizedBy('reobfJar')
// However if you are in a multi-project build, dev time needs unobfed jar files, so you can delay the obfuscation until publishing by doing
// publish.dependsOn('reobfJar')

publishing {
  publications {
    mavenJava(MavenPublication) {
      artifact jar
    }
  }
  repositories {
    maven {
      url "file:///${project.projectDir}/.mcmodsrepo"
    }
  }
}

curseforge {
  apiKey = "${credentials.curseforge_api_token}"
  project {
    id = "${curseforge_project_id}"
    changelog = '[[ --Change Log-- ]]'
    releaseType = "${curseforge_release_type}"
    addGameVersion("1.18.2")
    addGameVersion("Forge")
  }
}

tasks.withType(JavaCompile).configureEach {
  options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation
}
