aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlease <4586901+Glease@users.noreply.github.com>2022-09-01 12:01:50 +0800
committerGlease <4586901+Glease@users.noreply.github.com>2022-09-01 12:40:28 +0800
commit1bc9006d7bbe5c503f36364b2c4dce2a29293e3a (patch)
tree5a6cb5230f93739fee59310b41dbe540c951ce63
parentb0698efc456a3dc92a8b7a059b01433d461866e3 (diff)
downloadGT5-Unofficial-1bc9006d7bbe5c503f36364b2c4dce2a29293e3a.tar.gz
GT5-Unofficial-1bc9006d7bbe5c503f36364b2c4dce2a29293e3a.tar.bz2
GT5-Unofficial-1bc9006d7bbe5c503f36364b2c4dce2a29293e3a.zip
add skeleton code
this should be the least common code for all the branches I work on...
-rw-r--r--.gitattributes35
-rw-r--r--.github/scripts/test-no-crash-reports.sh9
-rw-r--r--.github/test-scala-presence.toml2
-rw-r--r--.github/workflows/build-and-test.yml36
-rw-r--r--.github/workflows/release-latest.yml44
-rw-r--r--.github/workflows/release-tags.yml45
-rw-r--r--.github/workflows/test-scala-presence.yml18
-rw-r--r--.github/workflows/toolchain-compatibility.yml43
-rw-r--r--README.md6
-rw-r--r--addon.gradle7
-rw-r--r--build.gradle926
-rw-r--r--dependencies.gradle6
-rw-r--r--gradle.properties14
-rw-r--r--repositories.gradle31
-rw-r--r--settings.gradle10
-rw-r--r--src/main/java/net/glease/ggfab/BlockIcons.java30
-rw-r--r--src/main/java/net/glease/ggfab/GGConstants.java11
-rw-r--r--src/main/java/net/glease/ggfab/GGItemList.java171
-rw-r--r--src/main/java/net/glease/ggfab/GGUtils.java39
-rw-r--r--src/main/java/net/glease/ggfab/GigaGramFab.java3
-rw-r--r--src/main/resources/mcmod.info2
21 files changed, 1203 insertions, 285 deletions
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000000..9917fc4abe
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,35 @@
+* text eol=lf
+
+*.jar binary
+
+*.png binary
+*.jpg binary
+*.jpeg binary
+*.gif binary
+*.tif binary
+*.tiff binary
+*.ico binary
+*.svg text
+*.eps binary
+
+*.kar binary
+*.m4a binary
+*.mid binary
+*.midi binary
+*.mp3 binary
+*.ogg binary
+*.ra binary
+
+*.7z binary
+*.gz binary
+*.tar binary
+*.tgz binary
+*.zip binary
+
+*.patch -text
+
+*.bat text eol=crlf
+*.cmd text eol=crlf
+*.ps1 text eol=crlf
+
+*autogenerated binary \ No newline at end of file
diff --git a/.github/scripts/test-no-crash-reports.sh b/.github/scripts/test-no-crash-reports.sh
deleted file mode 100644
index c67e342c06..0000000000
--- a/.github/scripts/test-no-crash-reports.sh
+++ /dev/null
@@ -1,9 +0,0 @@
-directory="run/crash-reports"
-if [ -d $directory ]; then
- echo "Crash reports detected:"
- cat $directory/*
- exit 1
-else
- echo "No crash reports detected"
- exit 0
-fi
diff --git a/.github/test-scala-presence.toml b/.github/test-scala-presence.toml
new file mode 100644
index 0000000000..ae0e9acd49
--- /dev/null
+++ b/.github/test-scala-presence.toml
@@ -0,0 +1,2 @@
+[exclude]
+"src/main/java/**/*.java" = "import scala." \ No newline at end of file
diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml
index 6c9b3cbc6c..3ee2f686fd 100644
--- a/.github/workflows/build-and-test.yml
+++ b/.github/workflows/build-and-test.yml
@@ -1,5 +1,3 @@
-# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
-# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
name: Build and test
@@ -11,35 +9,5 @@ on:
jobs:
build-and-test:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- with:
- fetch-depth: 0
-
- - name: Set up JDK 8
- uses: actions/setup-java@v2
- with:
- java-version: '8'
- distribution: 'adopt'
- cache: gradle
-
- - name: Grant execute permission for gradlew
- run: chmod +x gradlew
-
- - name: Setup the workspace
- run: ./gradlew setupCIWorkspace
-
- - name: Build the mod
- run: ./gradlew build
-
- - name: Run server for 1 minute
- run: |
- mkdir run
- echo "eula=true" > run/eula.txt
- timeout 10 ./gradlew runServer || true
-
- - name: Test no crashes happend
- run: |
- chmod +x .github/scripts/test-no-crash-reports.sh
- .github/scripts/test-no-crash-reports.sh
+ uses: GTNewHorizons/GTNH-Actions-Workflows/.github/workflows/build-and-test.yml@master
+ secrets: inherit
diff --git a/.github/workflows/release-latest.yml b/.github/workflows/release-latest.yml
deleted file mode 100644
index 5ecccc044f..0000000000
--- a/.github/workflows/release-latest.yml
+++ /dev/null
@@ -1,44 +0,0 @@
-# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
-# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
-
-name: Release latest build
-
-on:
- push:
- branches: [ master, main ]
-
-jobs:
- build-and-release:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- with:
- fetch-depth: 0
-
- - name: Set release version
- run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
-
- - name: Set up JDK 8
- uses: actions/setup-java@v2
- with:
- java-version: '8'
- distribution: 'adopt'
- cache: gradle
-
- - name: Grant execute permission for gradlew
- run: chmod +x gradlew
-
- - name: Setup the workspace
- run: ./gradlew setupCIWorkspace
-
- - name: Build the mod
- run: ./gradlew build
-
- - name: Update latest tag
- uses: "marvinpinto/action-automatic-releases@latest"
- with:
- repo_token: "${{ secrets.GITHUB_TOKEN }}"
- automatic_release_tag: "latest"
- prerelease: false
- title: "Latest build"
- files: build/libs/*.jar
diff --git a/.github/workflows/release-tags.yml b/.github/workflows/release-tags.yml
index 25c354b227..e4c0be6b0d 100644
--- a/.github/workflows/release-tags.yml
+++ b/.github/workflows/release-tags.yml
@@ -1,45 +1,14 @@
-# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
-# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
name: Release tagged build
on:
push:
- tags:
- - '*'
+ tags: [ '*' ]
-jobs:
- build:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- with:
- fetch-depth: 0
-
- - name: Set release version
- run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
-
- - name: Set up JDK 8
- uses: actions/setup-java@v2
- with:
- java-version: '8'
- distribution: 'adopt'
- cache: gradle
-
- - name: Grant execute permission for gradlew
- run: chmod +x gradlew
+permissions:
+ contents: write
- - name: Setup the workspace
- run: ./gradlew setupCIWorkspace
-
- - name: Build the mod
- run: ./gradlew build
-
- - name: Release under current tag
- uses: "marvinpinto/action-automatic-releases@latest"
- with:
- repo_token: "${{ secrets.GITHUB_TOKEN }}"
- automatic_release_tag: "${{ env.RELEASE_VERSION }}"
- prerelease: false
- title: "${{ env.RELEASE_VERSION }}"
- files: build/libs/*.jar
+jobs:
+ release-tags:
+ uses: GTNewHorizons/GTNH-Actions-Workflows/.github/workflows/release-tags.yml@master
+ secrets: inherit
diff --git a/.github/workflows/test-scala-presence.yml b/.github/workflows/test-scala-presence.yml
new file mode 100644
index 0000000000..6b1091e1fd
--- /dev/null
+++ b/.github/workflows/test-scala-presence.yml
@@ -0,0 +1,18 @@
+name: Test Scala Presence
+
+on:
+ pull_request:
+ branches: [ master, main ]
+ push:
+ branches: [ master, main ]
+
+jobs:
+ test-scala-presence:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Check file content
+ uses: mattsb42-meta/not-grep@1.0.0
+ with:
+ config-file: ./.github/test-scala-presence.toml
diff --git a/.github/workflows/toolchain-compatibility.yml b/.github/workflows/toolchain-compatibility.yml
deleted file mode 100644
index a082bf33ab..0000000000
--- a/.github/workflows/toolchain-compatibility.yml
+++ /dev/null
@@ -1,43 +0,0 @@
-# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
-# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
-
-name: Check if toolchain is applied when using differnt java versions
-
-on:
- pull_request:
- branches: [ master, main ]
-
-jobs:
- check-compatibility-with-java-11:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- with:
- fetch-depth: 0
-
- - name: Set up JDK 11
- uses: actions/setup-java@v2
- with:
- java-version: '11'
- distribution: 'adopt'
- cache: gradle
-
- - name: Grant execute permission for gradlew
- run: chmod +x gradlew
-
- - name: Setup the workspace
- run: ./gradlew setupCIWorkspace
-
- - name: Build the mod
- run: ./gradlew build
-
- - name: Run server for 1 minute
- run: |
- mkdir run
- echo "eula=true" > run/eula.txt
- timeout 10 ./gradlew runServer || true
-
- - name: Test no crashes happend
- run: |
- chmod +x .github/scripts/test-no-crash-reports.sh
- .github/scripts/test-no-crash-reports.sh
diff --git a/README.md b/README.md
new file mode 100644
index 0000000000..4e1db508e7
--- /dev/null
+++ b/README.md
@@ -0,0 +1,6 @@
+# GGFab
+
+THIS MOD DOES NOT HAVE AN API. EVERYTHING IS SUBJECT TO CHANGE WITHOUT NOTICE! DO NOT PROGRAM AGAINST ME!
+
+An API is planned, use patience!
+However, IDs and names would probably keep the same. \ No newline at end of file
diff --git a/addon.gradle b/addon.gradle
new file mode 100644
index 0000000000..e879a8b814
--- /dev/null
+++ b/addon.gradle
@@ -0,0 +1,7 @@
+idea {
+ module {
+ inheritOutputDirs = false
+ outputDir = compileJava.destinationDir
+ testOutputDir = compileTestJava.destinationDir
+ }
+}
diff --git a/build.gradle b/build.gradle
index 89bbf22205..997b94dc30 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,34 +1,82 @@
+//version: 1661114848
+/*
+ DO NOT CHANGE THIS FILE!
+ Also, you may replace this file at any time if there is an update available.
+ Please check https://github.com/GTNewHorizons/ExampleMod1.7.10/blob/main/build.gradle for updates.
+ */
+
+
+import com.github.jengelman.gradle.plugins.shadow.tasks.ConfigureShadowRelocation
+import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
+import org.gradle.internal.logging.text.StyledTextOutput.Style
+import org.gradle.internal.logging.text.StyledTextOutputFactory
+
+import java.nio.file.Files
+import java.nio.file.Paths
import java.util.concurrent.TimeUnit
+import java.util.zip.ZipEntry
+import java.util.zip.ZipInputStream
+import java.util.zip.ZipOutputStream
buildscript {
repositories {
+ mavenCentral()
+
maven {
- name = "forge"
- url = "https://maven.minecraftforge.net"
+ name 'forge'
+ url 'https://maven.minecraftforge.net'
}
maven {
- name = "sonatype"
- url = "https://oss.sonatype.org/content/repositories/snapshots/"
+ // GTNH ForgeGradle Fork
+ name = "GTNH Maven"
+ url = "http://jenkins.usrv.eu:8081/nexus/content/groups/public/"
}
maven {
- name = "Scala CI dependencies"
- url = "https://repo1.maven.org/maven2/"
+ name 'sonatype'
+ url 'https://oss.sonatype.org/content/repositories/snapshots/'
}
maven {
- name = "jitpack"
- url = "https://jitpack.io"
+ name 'Scala CI dependencies'
+ url 'https://repo1.maven.org/maven2/'
}
}
dependencies {
- classpath 'com.github.GTNewHorizons:ForgeGradle:1.2.4'
+ classpath 'net.minecraftforge.gradle:ForgeGradle:1.2.9'
}
}
-
plugins {
- id("com.palantir.git-version") version("0.12.3")
- id("se.bjurr.gitchangelog.git-changelog-gradle-plugin") version("1.65")
+ id 'java-library'
+ id 'idea'
+ id 'eclipse'
+ id 'scala'
+ 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' apply false
+ id 'de.undercouch.download' version '5.0.1'
+ id 'com.github.gmazzo.buildconfig' version '3.0.3' apply false
+ id 'com.diffplug.spotless' version '6.7.2' apply false
+}
+boolean settingsupdated = verifySettingsGradle()
+settingsupdated = verifyGitAttributes() || settingsupdated
+if (settingsupdated)
+ throw new GradleException("Settings has been updated, please re-run task.")
+
+dependencies {
+ implementation 'com.diffplug:blowdryer:1.6.0'
}
+apply plugin: 'com.diffplug.blowdryer'
+
+if (project.file('.git/HEAD').isFile()) {
+ apply plugin: 'com.palantir.git-version'
+}
+
+def out = services.get(StyledTextOutputFactory).create('an-output')
+
apply plugin: 'forge'
def projectJavaVersion = JavaLanguageVersion.of(8)
@@ -41,11 +89,104 @@ java {
idea {
module {
- inheritOutputDirs = false
+ inheritOutputDirs = true
downloadJavadoc = true
downloadSources = true
- outputDir = compileJava.destinationDir
- testOutputDir = compileTestJava.destinationDir
+ }
+}
+
+boolean disableSpotless = project.hasProperty("disableSpotless") ? project.disableSpotless.toBoolean() : false
+
+if (!disableSpotless) {
+ apply plugin: 'com.diffplug.spotless'
+ apply from: Blowdryer.file('spotless.gradle')
+}
+
+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")
+
+boolean noPublishedSources = project.hasProperty("noPublishedSources") ? project.noPublishedSources.toBoolean() : false
+boolean usesMixinDebug = project.hasProperty('usesMixinDebug') ?: project.usesMixins.toBoolean()
+boolean forceEnableMixins = project.hasProperty('forceEnableMixins') ? project.forceEnableMixins.toBoolean() : false
+String channel = project.hasProperty('channel') ? project.channel : 'stable'
+String mappingsVersion = project.hasProperty('mappingsVersion') ? project.mappingsVersion : '12'
+String javaSourceDir = "src/main/java/"
+String scalaSourceDir = "src/main/scala/"
+String kotlinSourceDir = "src/main/kotlin/"
+
+String targetPackageJava = javaSourceDir + modGroup.toString().replaceAll("\\.", "/")
+String targetPackageScala = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/")
+String targetPackageKotlin = kotlinSourceDir + modGroup.toString().replaceAll("\\.", "/")
+if (!(getFile(targetPackageJava).exists() || getFile(targetPackageScala).exists() || getFile(targetPackageKotlin).exists())) {
+ throw new GradleException("Could not resolve \"modGroup\"! Could not find " + targetPackageJava + " or " + targetPackageScala + " or " + targetPackageKotlin)
+}
+
+if (apiPackage) {
+ targetPackageJava = javaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/")
+ targetPackageScala = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/")
+ targetPackageKotlin = kotlinSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/")
+ if (!(getFile(targetPackageJava).exists() || getFile(targetPackageScala).exists() || getFile(targetPackageKotlin).exists())) {
+ throw new GradleException("Could not resolve \"apiPackage\"! Could not find " + targetPackageJava + " or " + targetPackageScala + " or " + targetPackageKotlin)
+ }
+}
+
+if (accessTransformersFile) {
+ String targetFile = "src/main/resources/META-INF/" + accessTransformersFile
+ if (!getFile(targetFile).exists()) {
+ throw new GradleException("Could not resolve \"accessTransformersFile\"! Could not find " + targetFile)
+ }
+}
+
+if (usesMixins.toBoolean()) {
+ if (mixinsPackage.isEmpty() || mixinPlugin.isEmpty()) {
+ throw new GradleException("\"mixinPlugin\" requires \"mixinsPackage\" and \"mixinPlugin\" to be set!")
+ }
+
+ targetPackageJava = javaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinsPackage.toString().replaceAll("\\.", "/")
+ targetPackageScala = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinsPackage.toString().replaceAll("\\.", "/")
+ targetPackageKotlin = kotlinSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinsPackage.toString().replaceAll("\\.", "/")
+ 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)
+ }
+
+ 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)
+ }
+}
+
+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"
+ 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)
}
}
@@ -58,84 +199,255 @@ configurations.all {
}
// Fix Jenkins' Git: chmod a file should not be detected as a change and append a '.dirty' to the version
-'git config core.fileMode false'.execute()
-// Pulls version from git tag
-version = minecraftVersion + "-" + gitVersion()
+try {
+ 'git config core.fileMode false'.execute()
+}
+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 = minecraftVersion + '-' + 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')
+}
+
group = modGroup
-archivesBaseName = modId
+if (project.hasProperty("customArchiveBaseName") && customArchiveBaseName) {
+ archivesBaseName = customArchiveBaseName
+} else {
+ archivesBaseName = modId
+}
+
+def arguments = []
+def jvmArguments = []
+
+if (usesMixins.toBoolean() || forceEnableMixins) {
+ arguments += [
+ "--tweakClass org.spongepowered.asm.launch.MixinTweaker"
+ ]
+ if (usesMixinDebug.toBoolean()) {
+ jvmArguments += [
+ "-Dmixin.debug.countInjections=true",
+ "-Dmixin.debug.verbose=true",
+ "-Dmixin.debug.export=true"
+ ]
+ }
+}
minecraft {
- version = minecraftVersion + "-" + forgeVersion + "-" + minecraftVersion
- runDir = "run"
+ version = minecraftVersion + '-' + forgeVersion + '-' + minecraftVersion
+ runDir = 'run'
+
+ if (replaceGradleTokenInFile) {
+ replaceIn replaceGradleTokenInFile
+ if (gradleTokenModId) {
+ replace gradleTokenModId, modId
+ }
+ if (gradleTokenModName) {
+ replace gradleTokenModName, modName
+ }
+ if (gradleTokenVersion) {
+ replace gradleTokenVersion, modVersion
+ }
+ if (gradleTokenGroupName) {
+ replace gradleTokenGroupName, modGroup
+ }
+ }
+
+ clientIntellijRun {
+ args(arguments)
+ jvmArgs(jvmArguments)
+
+ if (developmentEnvironmentUserName) {
+ args("--username", developmentEnvironmentUserName)
+ }
+ }
+
+ serverIntellijRun {
+ args(arguments)
+ jvmArgs(jvmArguments)
+ }
+}
- replaceIn "GigaGramFab.java"
- replace '${version}', versionDetails().lastTag
+if (file('addon.gradle').exists()) {
+ apply from: 'addon.gradle'
}
-if(file("addon.gradle").exists()) {
- apply from: "addon.gradle"
+apply from: 'repositories.gradle'
+
+configurations {
+ implementation.extendsFrom(shadowImplementation) // TODO: remove after all uses are refactored
+ implementation.extendsFrom(shadowCompile)
+ implementation.extendsFrom(shadeCompile)
}
repositories {
maven {
- name = "Overmind forge repo mirror"
- url = "https://gregtech.overminddl1.com/"
+ name 'Overmind forge repo mirror'
+ url 'https://gregtech.overminddl1.com/'
}
- maven {
- name = "jitpack"
- url = "https://jitpack.io"
- content {
- includeGroupByRegex 'com\\.github\\.[^.]*'
+ if (usesMixins.toBoolean() || forceEnableMixins) {
+ maven {
+ name 'sponge'
+ url 'https://repo.spongepowered.org/repository/maven-public'
+ }
+ maven {
+ url 'https://jitpack.io'
}
}
- maven {
- name = "ic2"
- url = "https://maven.ic2.player.to/"
- content {
- includeGroup 'net.industrial-craft'
+}
+
+dependencies {
+ if (usesMixins.toBoolean()) {
+ 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')
+ annotationProcessor('org.spongepowered:mixin:0.8-SNAPSHOT')
+ }
+ if (usesMixins.toBoolean() || forceEnableMixins) {
+ // using 0.8 to workaround a issue in 0.7 which fails mixin application
+ compile('com.github.GTNewHorizons:SpongePoweredMixin:0.7.12-GTNH') {
+ // Mixin includes a lot of dependencies that are too up-to-date
+ exclude module: 'launchwrapper'
+ exclude module: 'guava'
+ exclude module: 'gson'
+ exclude module: 'commons-io'
+ exclude module: 'log4j-core'
}
- metadataSources {
- artifact()
+ compile('com.github.GTNewHorizons:SpongeMixins:1.5.0')
+ }
+}
+
+apply from: 'dependencies.gradle'
+
+def mixingConfigRefMap = 'mixins.' + modId + '.refmap.json'
+def refMap = "${tasks.compileJava.temporaryDir}" + File.separator + mixingConfigRefMap
+def mixinSrg = "${tasks.reobf.temporaryDir}" + File.separator + "mixins.srg"
+
+task generateAssets {
+ if (usesMixins.toBoolean()) {
+ def mixinConfigFile = getFile("/src/main/resources/mixins." + modId + ".json");
+ if (!mixinConfigFile.exists()) {
+ mixinConfigFile.text = """{
+ "required": true,
+ "minVersion": "0.7.11",
+ "package": "${modGroup}.${mixinsPackage}",
+ "plugin": "${modGroup}.${mixinPlugin}",
+ "refmap": "${mixingConfigRefMap}",
+ "target": "@env(DEFAULT)",
+ "compatibilityLevel": "JAVA_8",
+ "mixins": [],
+ "client": [],
+ "server": []
+}
+"""
}
}
}
-dependencies {
- compile "net.industrial-craft:industrialcraft-2:2.2.790-experimental:dev"
- compile "com.github.GTNewHorizons:StructureLib:1.0.11:dev"
- compile("com.github.GTNewHorizons:GT5-Unofficial:experimental-SNAPSHOT") {
- transitive = false
+task relocateShadowJar(type: ConfigureShadowRelocation) {
+ target = tasks.shadowJar
+ prefix = modGroup + ".shadow"
+}
+
+shadowJar {
+ project.configurations.shadeCompile.each { dep ->
+ from(project.zipTree(dep)) {
+ exclude 'META-INF', 'META-INF/**'
+ }
+ }
+
+ manifest {
+ attributes(getManifestAttributes())
}
- runtimeOnly "com.github.GTNewHorizons:CodeChickenLib:1.1.4:dev"
- runtimeOnly "com.github.GTNewHorizons:CodeChickenCore:1.0.9:dev"
- runtimeOnly "com.github.GTNewHorizons:NotEnoughItems:2.1.16-GTNH:dev"
+ minimize() // This will only allow shading for actually used classes
+ configurations = [
+ project.configurations.shadowImplementation,
+ project.configurations.shadowCompile
+ ]
+ dependsOn(relocateShadowJar)
}
jar {
+ project.configurations.shadeCompile.each { dep ->
+ from(project.zipTree(dep)) {
+ exclude 'META-INF', 'META-INF/**'
+ }
+ }
+
manifest {
attributes(getManifestAttributes())
}
+
+ if (usesShadowedDependencies.toBoolean()) {
+ dependsOn(shadowJar)
+ enabled = false
+ }
}
-runClient {
- def arguments = []
+reobf {
+ if (usesMixins.toBoolean()) {
+ addExtraSrgFile mixinSrg
+ }
+}
+
+afterEvaluate {
+ if (usesMixins.toBoolean()) {
+ tasks.compileJava {
+ options.compilerArgs += [
+ "-AreobfSrgFile=${tasks.reobf.srg}",
+ "-AoutSrgFile=${mixinSrg}",
+ "-AoutRefMapFile=${refMap}",
+ // Elan: from what I understand they are just some linter configs so you get some warning on how to properly code
+ "-XDenableSunApiLintControl",
+ "-XDignore.symbol.file"
+ ]
+ }
+ }
+}
- if(developmentEnvironmentUserName) {
+runClient {
+ if (developmentEnvironmentUserName) {
arguments += [
- "--username",
- developmentEnvironmentUserName
+ "--username",
+ developmentEnvironmentUserName
]
}
args(arguments)
+ jvmArgs(jvmArguments)
+}
+
+runServer {
+ args(arguments)
+ jvmArgs(jvmArguments)
}
tasks.withType(JavaExec).configureEach {
javaLauncher.set(
- javaToolchains.launcherFor {
- languageVersion = projectJavaVersion
- }
+ javaToolchains.launcherFor {
+ languageVersion = projectJavaVersion
+ }
)
}
@@ -143,54 +455,122 @@ processResources {
// this will ensure that this task is redone when the versions change.
inputs.property "version", project.version
inputs.property "mcversion", project.minecraft.version
+ exclude("spotless.gradle")
// replace stuff in mcmod.info, nothing else
from(sourceSets.main.resources.srcDirs) {
include 'mcmod.info'
- // replace version and mcversion
+ // replace modVersion and minecraftVersion
expand "minecraftVersion": project.minecraft.version,
- "modVersion": versionDetails().lastTag,
- "modId": modId,
- "modName": modName
+ "modVersion": modVersion,
+ "modId": modId,
+ "modName": modName
+ }
+
+ if (usesMixins.toBoolean()) {
+ from refMap
}
- // copy everything else, thats not the mcmod.info
+ // copy everything else that's not the mcmod.info
from(sourceSets.main.resources.srcDirs) {
exclude 'mcmod.info'
+ exclude 'spotless.gradle'
}
}
-static def getManifestAttributes() {
+def getManifestAttributes() {
def manifestAttributes = [:]
+ if (!containsMixinsAndOrCoreModOnly.toBoolean() && (usesMixins.toBoolean() || coreModClass)) {
+ manifestAttributes += ["FMLCorePluginContainsFMLMod": true]
+ }
+
+ if (accessTransformersFile) {
+ manifestAttributes += ["FMLAT": accessTransformersFile.toString()]
+ }
+
+ if (coreModClass) {
+ manifestAttributes += ["FMLCorePlugin": modGroup + "." + coreModClass]
+ }
+
+ if (usesMixins.toBoolean()) {
+ manifestAttributes += [
+ "TweakClass" : "org.spongepowered.asm.launch.MixinTweaker",
+ "MixinConfigs" : "mixins." + modId + ".json",
+ "ForceLoadAsMod": !containsMixinsAndOrCoreModOnly.toBoolean()
+ ]
+ }
return manifestAttributes
}
task sourcesJar(type: Jar) {
- from (sourceSets.main.allJava)
- from (file("$projectDir/LICENSE"))
+ from(sourceSets.main.allSource)
+ from(file("$projectDir/LICENSE"))
getArchiveClassifier().set('sources')
}
+task shadowDevJar(type: ShadowJar) {
+ 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) {
+ 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) {
- from (sourceSets.main.allJava) {
- include modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString() + '/**'
+ from(sourceSets.main.allSource) {
+ include modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/") + '/**'
}
- from (sourceSets.main.output) {
- include modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString() + '/**'
+ from(sourceSets.main.output) {
+ include modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/") + '/**'
}
- from (sourceSets.main.resources.srcDirs) {
+ from(sourceSets.main.resources.srcDirs) {
include("LICENSE")
}
@@ -198,59 +578,391 @@ task apiJar(type: Jar) {
}
artifacts {
- archives sourcesJar
+ if (!noPublishedSources) {
+ archives sourcesJar
+ }
archives devJar
+ if (apiPackage) {
+ archives apiJar
+ }
}
-task generateGitChangelog(type: se.bjurr.gitchangelog.plugin.gradle.GitChangelogTask) {
- file = new File("CHANGELOG.md")
- toRef = "HEAD"
- templateContent = """<!-- Generated file. DO NOT HAND EDIT!!! -->
-# Change log
-Change log generated from git history.
-{{#tags}}
-## {{name}}
- {{#issues}}
- {{#commits}}
- 1. {{{messageTitle}}} ([@{{{hash}}} by {{{authorName}}}](https://github.com/Glease/TC4Tweaks/commit/{{{hashFull}}}))
- {{/commits}}
- {{/issues}}
-{{/tags}}
-"""
+// 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
}
-task createSignedJarDir() {
- onlyIf { // Skip the task if our secret data isn't available
- project.hasProperty('keyStore')
+// workaround variable hiding in pom processing
+def projectConfigs = project.configurations
+
+publishing {
+ publications {
+ maven(MavenPublication) {
+ from components.java
+ if (usesShadowedDependencies.toBoolean()) {
+ artifact source: shadowJar, classifier: ""
+ }
+ if (!noPublishedSources) {
+ artifact source: sourcesJar, classifier: "sources"
+ }
+ artifact source: usesShadowedDependencies.toBoolean() ? shadowDevJar : devJar, classifier: "dev"
+ if (apiPackage) {
+ artifact source: apiJar, classifier: "api"
+ }
+
+ groupId = System.getenv("ARTIFACT_GROUP_ID") ?: "com.github.GTNewHorizons"
+ artifactId = System.getenv("ARTIFACT_ID") ?: project.name
+ // Using the identified version, not project.version as it has the prepended 1.7.10
+ version = System.getenv("RELEASE_VERSION") ?: identifiedVersion
+
+ // 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)
+ }
+ }
+ }
}
+
+ repositories {
+ maven {
+ url = "http://jenkins.usrv.eu:8081/nexus/content/repositories/releases"
+ credentials {
+ username = System.getenv("MAVEN_USER") ?: "NONE"
+ password = System.getenv("MAVEN_PASSWORD") ?: "NONE"
+ }
+ }
+ }
+}
+
+// Updating
+task updateBuildScript {
doLast {
- mkdir new File(jar.destinationDir, "signed").toString()
+ if (performBuildScriptUpdate(projectDir.toString())) return
+
+ print("Build script already up-to-date!")
}
}
-// sign jars
-task signJar() {
- dependsOn reobf
- dependsOn createSignedJarDir
- onlyIf { // Skip the task if our secret data isn't available
- project.hasProperty('keyStore')
+if (!project.getGradle().startParameter.isOffline() && isNewBuildScriptVersionAvailable(projectDir.toString())) {
+ if (autoUpdateBuildScript.toBoolean()) {
+ performBuildScriptUpdate(projectDir.toString())
+ } else {
+ out.style(Style.SuccessHeader).println("Build script update available! Run 'gradle updateBuildScript'")
}
- inputs.files jar.outputs.files
- jar.outputs.files.forEach {
- outputs.file it
+}
+
+static URL availableBuildScriptUrl() {
+ new URL("https://raw.githubusercontent.com/GTNewHorizons/ExampleMod1.7.10/master/build.gradle")
+}
+
+static URL exampleSettingsGradleUrl() {
+ new URL("https://raw.githubusercontent.com/GTNewHorizons/ExampleMod1.7.10/master/settings.gradle.example")
+}
+
+static URL exampleGitAttributesUrl() {
+ new URL("https://raw.githubusercontent.com/GTNewHorizons/ExampleMod1.7.10/master/.gitattributes")
+}
+
+
+boolean verifyGitAttributes() {
+ def gitattributesFile = getFile(".gitattributes")
+ if (!gitattributesFile.exists()) {
+ println("Downloading default .gitattributes")
+ exampleGitAttributesUrl().withInputStream { i -> gitattributesFile.withOutputStream { it << i } }
+ exec {
+ workingDir '.'
+ commandLine 'git', 'add', '--renormalize', '.'
+ }
+ return true
+ }
+ return false
+}
+
+boolean verifySettingsGradle() {
+ def settingsFile = getFile("settings.gradle")
+ if (!settingsFile.exists()) {
+ println("Downloading default settings.gradle")
+ exampleSettingsGradleUrl().withInputStream { i -> settingsFile.withOutputStream { it << i } }
+ return true
+ }
+ return false
+}
+
+boolean performBuildScriptUpdate(String projectDir) {
+ if (isNewBuildScriptVersionAvailable(projectDir)) {
+ def buildscriptFile = getFile("build.gradle")
+ availableBuildScriptUrl().withInputStream { i -> buildscriptFile.withOutputStream { it << i } }
+ out.style(Style.Success).print("Build script updated. Please REIMPORT the project or RESTART your IDE!")
+ boolean settingsupdated = verifySettingsGradle()
+ settingsupdated = verifyGitAttributes() || settingsupdated
+ if (settingsupdated)
+ throw new GradleException("Settings has been updated, please re-run task.")
+ 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'
+}
+
+// Parameter Deobfuscation
+
+task deobfParams {
doLast {
- jar.outputs.files.forEach {
- ant.signjar destDir: new File(jar.destinationDirectory.asFile.get(), "signed"),
- sigfile: project.hasProperty("signerName") ? project.signerName : project.keyStoreAlias,
- keystore: project.keyStore,
- alias: project.keyStoreAlias,
- storepass: project.keyStorePass,
- keypass: project.keyStoreKeyPass,
- jar: it
+
+ String mcpDir = "$project.gradle.gradleUserHomeDir/caches/minecraft/de/oceanlabs/mcp/mcp_$channel/$mappingsVersion"
+ String mcpZIP = "$mcpDir/mcp_$channel-$mappingsVersion-${minecraftVersion}.zip"
+ String paramsCSV = "$mcpDir/params.csv"
+
+ download.run {
+ src "https://maven.minecraftforge.net/de/oceanlabs/mcp/mcp_$channel/$mappingsVersion-$minecraftVersion/mcp_$channel-$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'
+}
+
+// Dependency Deobfuscation
+
+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
+ String remoteMappings = project.hasProperty('remoteMappings') ? project.remoteMappings : 'https://raw.githubusercontent.com/MinecraftForge/FML/1.7.10/conf/'
+ 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 = "${channel}_$mappingsVersion"
}
+
+ download.run {
+ src "http://jenkins.usrv.eu:8081/nexus/content/repositories/releases/com/github/parker8283/BON2/$bon2Version-CUSTOM/BON2-$bon2Version-CUSTOM-all.jar"
+ dest bon2File
+ quiet true
+ overwrite false
+ }
+
+ download.run {
+ src sourceURL
+ dest obfFile
+ quiet true
+ overwrite false
+ }
+
+ exec {
+ commandLine 'java', '-jar', bon2File, '--inputJar', obfFile, '--outputJar', deobfFile, '--mcVer', minecraftVersion, '--mappingsVer', mappingsVer, '--notch'
+ workingDir bon2Dir
+ standardOutput = new FileOutputStream("${deobfFile}.log")
+ }
+
+ return files(deobfFile)
}
-assemble.dependsOn signJar
-install.dependsOn reobf
+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()
+}
+
+// Helper methods
+
+def checkPropertyExists(String propertyName) {
+ if (!project.hasProperty(propertyName)) {
+ 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/GTNewHorizons/ExampleMod1.7.10/blob/main/gradle.properties")
+ }
+}
+
+def getFile(String relativePath) {
+ return new File(projectDir, relativePath)
+}
diff --git a/dependencies.gradle b/dependencies.gradle
new file mode 100644
index 0000000000..dd5296b772
--- /dev/null
+++ b/dependencies.gradle
@@ -0,0 +1,6 @@
+// Add your dependencies here
+
+dependencies {
+ compile("net.industrial-craft:industrialcraft-2:2.2.828-experimental:dev")
+ compile("com.github.GTNewHorizons:GT5-Unofficial:5.09.41.18:dev")
+}
diff --git a/gradle.properties b/gradle.properties
index f274ecd42e..bb0b51b01c 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -3,7 +3,7 @@ modName = GigaGramFab
# This is a case-sensitive string to identify your mod. Convention is to use lower case.
modId = ggfab
-modGroup = net.glease
+modGroup = net.glease.ggfab
# WHY is there no version field?
# The build script relies on git to provide a version via tags. It is super easy and will enable you to always know the
@@ -19,18 +19,18 @@ forgeVersion = 10.13.4.1614
# restart Minecraft in development. Choose this dependent on your mod:
# Do you need consistent player progressing (for example Thaumcraft)? -> Select a name
# Do you need to test how your custom blocks interacts with a player that is not the owner? -> leave name empty
-developmentEnvironmentUserName = "glease"
+developmentEnvironmentUserName = glease
# Define a source file of your project with:
# public static final String VERSION = "GRADLETOKEN_VERSION";
# The string's content will be replaced with your mods version when compiled. You should use this to specify your mod's
# version in @Mod([...], version = VERSION, [...])
# Leave these properties empty to skip individual token replacements
-replaceGradleTokenInFile = Tags.java
-gradleTokenModId = GRADLETOKEN_MODID
+replaceGradleTokenInFile = GGConstants.java
+gradleTokenModId =
gradleTokenModName = GRADLETOKEN_MODNAME
gradleTokenVersion = GRADLETOKEN_VERSION
-gradleTokenGroupName = GRADLETOKEN_GROUPNAME
+gradleTokenGroupName =
# In case your mod provides an API for other mods to implement you may declare its package here. Otherwise you can
# leave this property empty.
@@ -43,7 +43,7 @@ accessTransformersFile =
# Provides setup for Mixins if enabled. If you don't know what mixins are: Keep it disabled!
usesMixins = false
-# Specify the location of your implementation of IMixinConfigPlugin. Leave it empty otherwise.
+# Specify the location of your implementation of IMixinPlugin. Leave it empty otherwise.
mixinPlugin =
# Specify the package that contains all of your Mixins. You may only place Mixins in this package or the build will fail!
mixinsPackage =
@@ -53,7 +53,7 @@ mixinsPackage =
coreModClass =
# If your project is only a consolidation of mixins or a core mod and does NOT contain a 'normal' mod ( = some class
# that is annotated with @Mod) you want this to be true. When in doubt: leave it on false!
-containsMixinsAndOrCoreModOnly = false
+containsMixinsAndOrCoreModOnly = true
# If enabled, you may use 'shadowImplementation' for dependencies. They will be integrated in your jar. It is your
# responsibility check the licence and request permission for distribution, if required.
diff --git a/repositories.gradle b/repositories.gradle
new file mode 100644
index 0000000000..21017d1455
--- /dev/null
+++ b/repositories.gradle
@@ -0,0 +1,31 @@
+// Add any additional repositories for your dependencies here
+
+repositories {
+ maven {
+ name = "GTNH"
+ url = "http://jenkins.usrv.eu:8081/nexus/content/groups/public/"
+ }
+ maven {
+ name = "ic2"
+ url = "https://maven.ic2.player.to/"
+ metadataSources {
+ mavenPom()
+ artifact()
+ }
+ }
+ maven {
+ name = "ic2"
+ url = "https://maven2.ic2.player.to/"
+ metadataSources {
+ mavenPom()
+ artifact()
+ }
+ }
+ maven {
+ url "https://cursemaven.com"
+ }
+ maven {
+ name = "jitpack.io"
+ url = "https://jitpack.io"
+ }
+}
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000000..93c852a12c
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,10 @@
+plugins {
+ id 'com.diffplug.blowdryerSetup' version '1.6.0'
+}
+
+apply plugin: 'com.diffplug.blowdryerSetup'
+
+blowdryerSetup {
+ github('GTNewHorizons/ExampleMod1.7.10', 'tag', '0.1.5')
+ //devLocal '.' // Use this when testing config updates locally
+}
diff --git a/src/main/java/net/glease/ggfab/BlockIcons.java b/src/main/java/net/glease/ggfab/BlockIcons.java
new file mode 100644
index 0000000000..6db4b72a60
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/BlockIcons.java
@@ -0,0 +1,30 @@
+package net.glease.ggfab;
+
+import gregtech.api.enums.Textures.BlockIcons.CustomIcon;
+import gregtech.api.interfaces.IIconContainer;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.ResourceLocation;
+
+public enum BlockIcons implements IIconContainer {
+ ;
+ private final CustomIcon backing;
+
+ BlockIcons() {
+ backing = new CustomIcon("iconsets/" + name());
+ }
+
+ @Override
+ public IIcon getIcon() {
+ return backing.getIcon();
+ }
+
+ @Override
+ public IIcon getOverlayIcon() {
+ return backing.getOverlayIcon();
+ }
+
+ @Override
+ public ResourceLocation getTextureFile() {
+ return backing.getTextureFile();
+ }
+}
diff --git a/src/main/java/net/glease/ggfab/GGConstants.java b/src/main/java/net/glease/ggfab/GGConstants.java
new file mode 100644
index 0000000000..888ca67913
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/GGConstants.java
@@ -0,0 +1,11 @@
+package net.glease.ggfab;
+
+import net.minecraft.util.EnumChatFormatting;
+
+public class GGConstants {
+ public static final String MODID = "ggfab";
+ public static final String MODNAME = "GRADLETOKEN_MODNAME";
+ public static final String VERSION = "GRADLETOKEN_VERSION";
+
+ public static final String GGMARK = EnumChatFormatting.GOLD + "GigaGram" + EnumChatFormatting.RESET + "Fab";
+}
diff --git a/src/main/java/net/glease/ggfab/GGItemList.java b/src/main/java/net/glease/ggfab/GGItemList.java
new file mode 100644
index 0000000000..d126419ec1
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/GGItemList.java
@@ -0,0 +1,171 @@
+package net.glease.ggfab;
+
+import gregtech.api.interfaces.IItemContainer;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import static gregtech.api.enums.GT_Values.W;
+
+public enum GGItemList implements IItemContainer{
+ ;
+
+ private ItemStack mStack;
+ private boolean mHasNotBeenSet = true;
+
+ @Override
+ public IItemContainer set(Item aItem) {
+ mHasNotBeenSet = false;
+ if (aItem == null) {
+ return this;
+ }
+ ItemStack aStack = new ItemStack(aItem, 1, 0);
+ mStack = GT_Utility.copyAmount(1, aStack);
+ return this;
+ }
+
+ @Override
+ public IItemContainer set(ItemStack aStack) {
+ mHasNotBeenSet = false;
+ mStack = GT_Utility.copyAmount(1, aStack);
+ return this;
+ }
+
+ @Override
+ public Item getItem() {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(mStack)) {
+ return null;
+ }
+ return mStack.getItem();
+ }
+
+ @Override
+ public Block getBlock() {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ return GT_Utility.getBlockFromStack(new ItemStack(getItem()));
+ }
+
+ @Override
+ public final boolean hasBeenSet() {
+ return !mHasNotBeenSet;
+ }
+
+ @Override
+ public boolean isStackEqual(Object aStack) {
+ return isStackEqual(aStack, false, false);
+ }
+
+ @Override
+ public boolean isStackEqual(Object aStack, boolean aWildcard, boolean aIgnoreNBT) {
+ if (GT_Utility.isStackInvalid(aStack)) {
+ return false;
+ }
+ return GT_Utility.areUnificationsEqual((ItemStack) aStack, aWildcard ? getWildcard(1) : get(1), aIgnoreNBT);
+ }
+
+ @Override
+ public ItemStack get(long aAmount, Object... aReplacements) {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(mStack)) {
+ return GT_Utility.copyAmount(aAmount, aReplacements);
+ }
+ return GT_Utility.copyAmount(aAmount, GT_OreDictUnificator.get(mStack));
+ }
+
+ @Override
+ public ItemStack getWildcard(long aAmount, Object... aReplacements) {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(mStack)) {
+ return GT_Utility.copyAmount(aAmount, aReplacements);
+ }
+ return GT_Utility.copyAmountAndMetaData(aAmount, W, GT_OreDictUnificator.get(mStack));
+ }
+
+ @Override
+ public ItemStack getUndamaged(long aAmount, Object... aReplacements) {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(mStack)) {
+ return GT_Utility.copyAmount(aAmount, aReplacements);
+ }
+ return GT_Utility.copyAmountAndMetaData(aAmount, 0, GT_OreDictUnificator.get(mStack));
+ }
+
+ @Override
+ public ItemStack getAlmostBroken(long aAmount, Object... aReplacements) {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(mStack)) {
+ return GT_Utility.copyAmount(aAmount, aReplacements);
+ }
+ return GT_Utility.copyAmountAndMetaData(aAmount, mStack.getMaxDamage() - 1, GT_OreDictUnificator.get(mStack));
+ }
+
+ @Override
+ public ItemStack getWithName(long aAmount, String aDisplayName, Object... aReplacements) {
+ ItemStack rStack = get(1, aReplacements);
+ if (GT_Utility.isStackInvalid(rStack)) {
+ return null;
+ }
+ rStack.setStackDisplayName(aDisplayName);
+ return GT_Utility.copyAmount(aAmount, rStack);
+ }
+
+ @Override
+ public ItemStack getWithCharge(long aAmount, int aEnergy, Object... aReplacements) {
+ ItemStack rStack = get(1, aReplacements);
+ if (GT_Utility.isStackInvalid(rStack)) {
+ return null;
+ }
+ GT_ModHandler.chargeElectricItem(rStack, aEnergy, Integer.MAX_VALUE, true, false);
+ return GT_Utility.copyAmount(aAmount, rStack);
+ }
+
+ @Override
+ public ItemStack getWithDamage(long aAmount, long aMetaValue, Object... aReplacements) {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(mStack)) {
+ return GT_Utility.copyAmount(aAmount, aReplacements);
+ }
+ return GT_Utility.copyAmountAndMetaData(aAmount, aMetaValue, GT_OreDictUnificator.get(mStack));
+ }
+
+ @Override
+ public IItemContainer registerOre(Object... aOreNames) {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ for (Object tOreName : aOreNames) {
+ GT_OreDictUnificator.registerOre(tOreName, get(1));
+ }
+ return this;
+ }
+
+ @Override
+ public IItemContainer registerWildcardAsOre(Object... aOreNames) {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ for (Object tOreName : aOreNames) {
+ GT_OreDictUnificator.registerOre(tOreName, getWildcard(1));
+ }
+ return this;
+ }
+
+}
diff --git a/src/main/java/net/glease/ggfab/GGUtils.java b/src/main/java/net/glease/ggfab/GGUtils.java
new file mode 100644
index 0000000000..ea34952971
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/GGUtils.java
@@ -0,0 +1,39 @@
+package net.glease.ggfab;
+
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import java.util.StringJoiner;
+
+public class GGUtils {
+ public static boolean isValidTile(IGregTechTileEntity tile) {
+ return tile != null && !tile.isDead() && tile.getMetaTileEntity() != null && tile.getMetaTileEntity().getBaseMetaTileEntity() == tile;
+ }
+ public static boolean isValidTile(IMetaTileEntity mte) {
+ return mte != null && mte.getBaseMetaTileEntity() != null && mte.getBaseMetaTileEntity().getMetaTileEntity() == mte && !mte.getBaseMetaTileEntity().isDead();
+ }
+ public static ChunkCoordinates translate(ChunkCoordinates origin, ForgeDirection direction) {
+ return new ChunkCoordinates(origin.posX + direction.offsetX, origin.posY + direction.offsetY, origin.posZ + direction.offsetZ);
+ }
+
+ public static String formatTileInfo(String prefix, IMetaTileEntity mte, String delimiter, String suffix) {
+ if (!isValidTile(mte)) return prefix + "N/A" + suffix;
+ StringJoiner sj = new StringJoiner(delimiter, prefix, suffix);
+ IGregTechTileEntity til = mte.getBaseMetaTileEntity();
+ sj.add(String.valueOf(til.getXCoord()));
+ sj.add(String.valueOf(til.getYCoord()));
+ sj.add(String.valueOf(til.getZCoord()));
+ return sj.toString();
+ }
+
+ public static String formatTileInfo(String prefix, IGregTechTileEntity tile, String delimiter, String suffix) {
+ if (!isValidTile(tile)) return prefix + "N/A" + suffix;
+ StringJoiner sj = new StringJoiner(delimiter, prefix, suffix);
+ sj.add(String.valueOf(tile.getXCoord()));
+ sj.add(String.valueOf(tile.getYCoord()));
+ sj.add(String.valueOf(tile.getZCoord()));
+ return sj.toString();
+ }
+}
diff --git a/src/main/java/net/glease/ggfab/GigaGramFab.java b/src/main/java/net/glease/ggfab/GigaGramFab.java
index f5100fa177..580a967504 100644
--- a/src/main/java/net/glease/ggfab/GigaGramFab.java
+++ b/src/main/java/net/glease/ggfab/GigaGramFab.java
@@ -3,9 +3,8 @@ package net.glease.ggfab;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.event.*;
-@Mod(modid = GigaGramFab.MODID, version = "${version}", name = "GigaGramFab", acceptedMinecraftVersions = "[1.7.10]", dependencies = "required-after:IC2;")
+@Mod(modid = GGConstants.MODID, version = GGConstants.VERSION, name = GGConstants.MODNAME, acceptedMinecraftVersions = "[1.7.10]", dependencies = "required-after:IC2;required-after:gregtech")
public class GigaGramFab {
- public static final String MODID = "ggfab";
@Mod.EventHandler
public void preInit(FMLPreInitializationEvent event) {
diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info
index 22523887dc..85a730d971 100644
--- a/src/main/resources/mcmod.info
+++ b/src/main/resources/mcmod.info
@@ -1,6 +1,6 @@
[
{
- "modid": "ggfab",
+ "modid": "${modId}",
"name": "${modName}",
"description": "Production at scale",
"version": "${modVersion}",