For one, the forge handshake takes place *after* login phase (but before the JoinGame packet), so we must ensure that the SquashFilter does not reorder those. Secondly, we were ignoring the initial packet (timestamp = 0) in marker processor when it should have been passed to the SquashFilter. This was not an issue before cause the SquashFilter did not rely on it. Now however the SquashFilter needs to be able to see a login phase packet, so it knows that the following packets till the JoinGame packet are part of the forge handshake. In ReplayStudio: 20b5183 Fix forge handshake being reordered to after the JoinGame packet
597 lines
21 KiB
Groovy
597 lines
21 KiB
Groovy
import com.replaymod.gradle.preprocess.PreprocessTask
|
|
|
|
buildscript {
|
|
def mcVersion
|
|
def (major, minor, patch) = project.name.tokenize('-')[0].tokenize('.')
|
|
mcVersion = "${major}${minor.padLeft(2, '0')}${(patch ?: '').padLeft(2, '0')}" as int
|
|
def fabric = mcVersion >= 11400 && !project.name.endsWith("-forge")
|
|
project.ext.mcVersion = mcVersion
|
|
project.ext.fabric = fabric
|
|
|
|
repositories {
|
|
mavenLocal()
|
|
jcenter()
|
|
mavenCentral()
|
|
maven {
|
|
name = "fabric"
|
|
url = "https://maven.fabricmc.net/"
|
|
}
|
|
if (!fabric) {
|
|
maven {
|
|
name = "forge"
|
|
url = "https://files.minecraftforge.net/maven"
|
|
}
|
|
}
|
|
maven {
|
|
name = "sonatype"
|
|
url = "https://oss.sonatype.org/content/repositories/snapshots/"
|
|
}
|
|
maven { url 'https://jitpack.io' }
|
|
}
|
|
|
|
dependencies {
|
|
classpath 'com.github.jengelman.gradle.plugins:shadow:4.0.2'
|
|
if (fabric) {
|
|
classpath 'fabric-loom:fabric-loom.gradle.plugin:0.4-SNAPSHOT'
|
|
} else if (mcVersion >= 11400) {
|
|
classpath('net.minecraftforge.gradle:ForgeGradle:3.+'){
|
|
exclude group: 'trove', module: 'trove' // preprocessor/idea requires more recent one
|
|
}
|
|
} else if (mcVersion >= 10800) {
|
|
classpath('com.github.ReplayMod:ForgeGradle:' + (
|
|
mcVersion >= 11200 ? 'b64de9c' : // FG 2.3
|
|
mcVersion >= 10904 ? '5bb7a53' : // FG 2.2
|
|
'fc1eabc' // FG 2.1
|
|
) + ':all')
|
|
} else {
|
|
classpath 'com.github.ReplayMod:ForgeGradle:5fca6853:all' // FG 1.2
|
|
}
|
|
}
|
|
}
|
|
|
|
def FG3 = !fabric && mcVersion >= 11400
|
|
def FABRIC = fabric
|
|
|
|
def jGuiVersion = project.name
|
|
if (['1.10.2', '1.11', '1.11.2'].contains(jGuiVersion)) jGuiVersion = '1.9.4'
|
|
if (['1.12.1', '1.12.2'].contains(jGuiVersion)) jGuiVersion = '1.12'
|
|
def jGui = project.evaluationDependsOn(":jGui:$jGuiVersion")
|
|
|
|
apply plugin: 'com.github.johnrengelman.shadow'
|
|
|
|
if (mcVersion >= 10800) {
|
|
if (FABRIC) {
|
|
apply plugin: 'fabric-loom'
|
|
} else if (FG3) {
|
|
apply plugin: 'net.minecraftforge.gradle'
|
|
} else {
|
|
apply plugin: 'net.minecraftforge.gradle.forge'
|
|
}
|
|
} else {
|
|
apply plugin: 'forge'
|
|
}
|
|
|
|
if (!FABRIC) {
|
|
ext {
|
|
mixinSrg = new File(project.buildDir, 'tmp/mixins/mixins.srg')
|
|
mixinRefMap = new File(project.buildDir, 'tmp/mixins/mixins.replaymod.refmap.json')
|
|
}
|
|
|
|
compileJava {
|
|
options.compilerArgs += [
|
|
"-AoutSrgFile=${project.mixinSrg.canonicalPath}",
|
|
"-AoutRefMapFile=${project.mixinRefMap.canonicalPath}",
|
|
"-AreobfSrgFile=${project.file('build/mcp-srg.srg').canonicalPath}"
|
|
]
|
|
}
|
|
}
|
|
|
|
apply plugin: 'com.replaymod.preprocess'
|
|
|
|
preprocess {
|
|
vars.put("MC", project.mcVersion)
|
|
vars.put("FABRIC", project.fabric ? 1 : 0)
|
|
|
|
keywords.set([
|
|
".java": PreprocessTask.DEFAULT_KEYWORDS,
|
|
".json": PreprocessTask.DEFAULT_KEYWORDS,
|
|
".mcmeta": PreprocessTask.DEFAULT_KEYWORDS,
|
|
".cfg": PreprocessTask.CFG_KEYWORDS,
|
|
".vert": PreprocessTask.DEFAULT_KEYWORDS,
|
|
".frag": PreprocessTask.DEFAULT_KEYWORDS,
|
|
])
|
|
}
|
|
|
|
def mcVersionStr = "${(int)(mcVersion/10000)}.${(int)(mcVersion/100)%100}" + (mcVersion%100==0 ? '' : ".${mcVersion%100}")
|
|
|
|
sourceCompatibility = 1.8
|
|
targetCompatibility = 1.8
|
|
|
|
if (mcVersion >= 11400) {
|
|
sourceSets {
|
|
api
|
|
}
|
|
}
|
|
|
|
version = project.name + '-' + rootProject.version
|
|
group= "com.replaymod"
|
|
archivesBaseName = "replaymod"
|
|
|
|
if (FABRIC) {
|
|
minecraft {
|
|
refmapName = 'mixins.replaymod.refmap.json'
|
|
autoGenIDERuns = true
|
|
}
|
|
} else {
|
|
minecraft {
|
|
if (FG3) {
|
|
runs {
|
|
client {
|
|
workingDirectory rootProject.file('run')
|
|
property 'forge.logging.console.level', 'info'
|
|
mods {
|
|
replaymod {
|
|
source sourceSets.main
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
if (mcVersion >= 10800) {
|
|
coreMod = 'com.replaymod.core.LoadingPlugin'
|
|
}
|
|
runDir = "../../run"
|
|
}
|
|
|
|
if (!FG3) {
|
|
version = [
|
|
11202: '1.12.2-14.23.0.2486',
|
|
11201: '1.12.1-14.22.0.2444',
|
|
11200: '1.12-14.21.1.2387',
|
|
11102: '1.11.2-13.20.0.2216',
|
|
11100: '1.11-13.19.1.2188',
|
|
11002: '1.10.2-12.18.2.2099',
|
|
10904: '1.9.4-12.17.0.1976',
|
|
10809: '1.8.9-11.15.1.1722',
|
|
10800: '1.8-11.14.4.1563',
|
|
10710: '1.7.10-10.13.4.1558-1.7.10',
|
|
][mcVersion]
|
|
}
|
|
mappings = [
|
|
11404: "snapshot_20190719-1.14.3",
|
|
11202: "snapshot_20170615",
|
|
11201: "snapshot_20170615",
|
|
11200: "snapshot_20170615",
|
|
11102: "snapshot_20161220",
|
|
11100: "snapshot_20161111",
|
|
11002: "snapshot_20160518",
|
|
10904: "snapshot_20160518",
|
|
10809: "stable_22",
|
|
10800: "snapshot_nodoc_20141130",
|
|
10710: "stable_12",
|
|
][mcVersion]
|
|
}
|
|
}
|
|
|
|
afterEvaluate {
|
|
if (mcVersion >= 11400) {
|
|
// No longer required in 1.13+ because all version info is in the toml file
|
|
} else {
|
|
// Note cannot use minecraft.replace because that has already been forwarded to the task by FG by now
|
|
tasks.sourceMainJava.replace '@MOD_VERSION@', project.version
|
|
// Includes intentional whitespace to stop Forge from declaring the mod to be compatible with
|
|
// a newer srg-compatible MC version (that may be using a different protocol version)
|
|
tasks.sourceMainJava.replace '@MC_VERSION@', "[ $mcVersionStr ]"
|
|
}
|
|
}
|
|
|
|
repositories {
|
|
mavenLocal()
|
|
maven {
|
|
name = "SpongePowered Repo"
|
|
url = "http://repo.spongepowered.org/maven/"
|
|
}
|
|
maven {
|
|
name = "fabric"
|
|
url = "https://maven.fabricmc.net/"
|
|
}
|
|
maven {
|
|
url 'https://jitpack.io'
|
|
content {
|
|
includeGroupByRegex 'com\\.github\\..*'
|
|
}
|
|
}
|
|
}
|
|
|
|
configurations {
|
|
// Include dep in fat jar without relocation and, when forge supports it, without exploding (TODO)
|
|
shade
|
|
compile.extendsFrom shade
|
|
// Include dep in fat jar with relocation and minimization
|
|
shadow
|
|
compile.extendsFrom shadow
|
|
}
|
|
|
|
def shadeExclusions = {
|
|
// Cannot just add these to the shade configuration because they'd be inherited by the compile configuration then
|
|
exclude group: 'com.google.guava', module: 'guava-jdk5'
|
|
exclude group: 'com.google.guava', module: 'guava' // provided by MC
|
|
exclude group: 'com.google.code.gson', module: 'gson' // provided by MC
|
|
exclude group: 'org.projectlombok', module: 'lombok' // runtime only for @SneakyThrows which isn't used
|
|
}
|
|
|
|
dependencies {
|
|
if (FABRIC) {
|
|
minecraft 'com.mojang:minecraft:' + [
|
|
11404: '1.14.4',
|
|
11502: '1.15.2',
|
|
11601: '1.16.1',
|
|
][mcVersion]
|
|
mappings 'net.fabricmc:yarn:' + [
|
|
11404: '1.14.4+build.16',
|
|
11502: '1.15.2+build.14',
|
|
11601: '1.16.1+build.17:v2',
|
|
][mcVersion]
|
|
modCompile 'net.fabricmc:fabric-loader:' + [
|
|
11404: '0.7.8+build.189',
|
|
11502: '0.7.8+build.189',
|
|
11601: '0.8.8+build.202',
|
|
][mcVersion]
|
|
def fabricApiVersion = [
|
|
11404: '0.4.3+build.247-1.14',
|
|
11502: '0.5.1+build.294-1.15',
|
|
11601: '0.14.0+build.371-1.16',
|
|
][mcVersion]
|
|
def fabricApiModules = [
|
|
"api-base",
|
|
"networking-v0",
|
|
"keybindings-v0",
|
|
"resource-loader-v0",
|
|
]
|
|
if (mcVersion >= 11600) {
|
|
fabricApiModules.add("key-binding-api-v1")
|
|
}
|
|
fabricApiModules.each { module ->
|
|
modCompile fabricApi.module("fabric-$module", fabricApiVersion)
|
|
include fabricApi.module("fabric-$module", fabricApiVersion)
|
|
}
|
|
}
|
|
|
|
if (FG3) {
|
|
minecraft 'net.minecraftforge:forge:' + [
|
|
11404: '1.14.4-28.1.113',
|
|
][mcVersion]
|
|
}
|
|
|
|
if (!FABRIC) {
|
|
// Mixin 0.8 is no longer compatible with MC 1.11.2 or older
|
|
def mixinVersion = mcVersion >= 11200 ? '0.8' : '0.7.10-SNAPSHOT'
|
|
annotationProcessor "org.spongepowered:mixin:$mixinVersion"
|
|
compileOnly "org.spongepowered:mixin:$mixinVersion"
|
|
shade("org.spongepowered:mixin:$mixinVersion") {
|
|
transitive = false // deps should all be bundled with MC
|
|
}
|
|
|
|
// Mixin needs these (and depends on them but for some reason that's not enough. FG, did you do that?)
|
|
annotationProcessor 'com.google.code.gson:gson:2.2.4'
|
|
annotationProcessor 'com.google.guava:guava:21.0'
|
|
annotationProcessor 'org.ow2.asm:asm-tree:6.2'
|
|
}
|
|
shadow 'com.googlecode.mp4parser:isoparser:1.1.7'
|
|
shadow 'org.apache.commons:commons-exec:1.3'
|
|
shadow 'com.google.apis:google-api-services-youtube:v3-rev178-1.22.0', shadeExclusions
|
|
shadow 'com.google.api-client:google-api-client-gson:1.20.0', shadeExclusions
|
|
shadow 'com.google.api-client:google-api-client-java6:1.20.0', shadeExclusions
|
|
shadow 'com.google.oauth-client:google-oauth-client-jetty:1.20.0'
|
|
|
|
if (FABRIC) {
|
|
shadow 'org.apache.maven:maven-artifact:3.6.1'
|
|
}
|
|
|
|
shadow 'org.aspectj:aspectjrt:1.8.2'
|
|
|
|
shadow 'com.github.ReplayMod.JavaBlend:2.79.0:a0696f8'
|
|
|
|
shadow "com.github.ReplayMod:ReplayStudio:20b5183", shadeExclusions
|
|
|
|
implementation(jGui){
|
|
transitive = false // FG 1.2 puts all MC deps into the compile configuration and we don't want to shade those
|
|
exclude group: 'org.projectlombok', module: 'lombok' // runtime only for @SneakyThrows which isn't used
|
|
}
|
|
shadow 'com.github.ReplayMod:lwjgl-utils:27dcd66'
|
|
|
|
if (FABRIC) {
|
|
if (mcVersion >= 11600) {
|
|
modCompile 'io.github.prospector:modmenu:1.14.0+build.24'
|
|
} else {
|
|
modCompile 'io.github.prospector.modmenu:ModMenu:1.6.2-92'
|
|
}
|
|
}
|
|
|
|
annotationProcessor 'org.projectlombok:lombok:1.18.12'
|
|
compile 'org.projectlombok:lombok:1.18.12' // runtime only for @SneakyThrows which isn't used
|
|
|
|
testCompile 'junit:junit:4.11'
|
|
}
|
|
|
|
if (mcVersion <= 10710) {
|
|
// FG 1.2 adds all MC deps to the compile configuration which we don't want
|
|
afterEvaluate {
|
|
// Remove them from the compile and runtime configurations
|
|
configurations.compile.extendsFrom -= [configurations.minecraft, configurations.minecraftDeps]
|
|
configurations.runtime.extendsFrom -= [configurations.forgeGradleStartClass]
|
|
// And add them to the source sets instead
|
|
sourceSets.main.with {
|
|
compileClasspath += configurations.minecraft + configurations.minecraftDeps
|
|
runtimeClasspath += configurations.minecraft + configurations.minecraftDeps + configurations.forgeGradleStartClass
|
|
}
|
|
// Also need to reconfigure the reobf task, so it can properly re-obfuscates inherited members
|
|
tasks.reobf.obfOutput.all { artifact ->
|
|
artifact.getFile() // force resolve
|
|
artifact.classpath += configurations.minecraft + configurations.minecraftDeps
|
|
}
|
|
}
|
|
|
|
// Test sources aren't preprocessed and I can't be bothered to fix that
|
|
tasks.compileTestJava.onlyIf { false }
|
|
}
|
|
|
|
if (FABRIC) {
|
|
tasks.remapJar {
|
|
addNestedDependencies.set(true)
|
|
afterEvaluate { // FIXME why does loom overwrite this if we set it immediately?
|
|
archiveClassifier.set('obf')
|
|
}
|
|
}
|
|
}
|
|
|
|
File configureRelocationOutput = new File(project.buildDir, 'configureRelocation')
|
|
task configureRelocation() {
|
|
dependsOn tasks.jar
|
|
dependsOn configurations.shadow
|
|
outputs.file(configureRelocationOutput)
|
|
doLast {
|
|
def pkgs = files(configurations.shadow).filter { it.exists() }.collect {
|
|
def tree = it.isDirectory() ? fileTree(it) : zipTree(it)
|
|
def pkgs = [].toSet()
|
|
tree.visit { file ->
|
|
if (!file.directory && file.name.endsWith('.class') && file.path.contains('/')) {
|
|
def pkg = file.path.substring(0, file.path.lastIndexOf('/')) + '/'
|
|
if (pkg.startsWith('com/')) {
|
|
if (pkg.startsWith('com/google/')) {
|
|
if (!pkg.startsWith('com/google/common')) {
|
|
pkgs << pkg.substring(0, pkg.indexOf('/', 'com/google/'.length()))
|
|
}
|
|
} else if (!pkg.startsWith('com/replaymod')) {
|
|
pkgs << pkg.substring(0, pkg.indexOf('/', 4))
|
|
}
|
|
} else if (pkg.startsWith('net/')) {
|
|
if (!pkg.startsWith('net/minecraft')
|
|
&& !pkg.startsWith('net/fabric')) {
|
|
pkgs << pkg.substring(0, pkg.indexOf('/', 'net/'.length()))
|
|
}
|
|
} else if (pkg.startsWith('org/')) {
|
|
if (pkg.startsWith('org/apache/')) {
|
|
if (pkg.startsWith('org/apache/commons/')) {
|
|
if (!pkg.startsWith('org/apache/commons/io')) {
|
|
pkgs << pkg.substring(0, pkg.indexOf('/', 'org/apache/commons/'.length()))
|
|
}
|
|
} else if (!pkg.startsWith('org/apache/logging')) {
|
|
pkgs << pkg.substring(0, pkg.indexOf('/', 'org/apache/'.length()))
|
|
}
|
|
} else if (!pkg.startsWith('org/spongepowered')) {
|
|
pkgs << pkg.substring(0, pkg.indexOf('/', 4))
|
|
}
|
|
} else if (pkg.startsWith('it/unimi/dsi/fastutil') && mcVersion >= 11400) {
|
|
return // MC uses this as well
|
|
} else if (!pkg.startsWith('javax/')) {
|
|
// Note: we cannot just use top level packages as those will be too generic and we'll run
|
|
// into this long standing bug: https://github.com/johnrengelman/shadow/issues/232
|
|
def i = pkg.indexOf('/')
|
|
def i2 = pkg.indexOf('/', i + 1)
|
|
if (i2 > 0) {
|
|
pkgs << pkg.substring(0, i2)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
pkgs
|
|
}.flatten().unique()
|
|
configureRelocationOutput.write(pkgs.join('\n'))
|
|
}
|
|
}
|
|
|
|
tasks.removeByName('shadowJar') // we want to base our shadowed jar on the reobfJar output, not the sourceSet output
|
|
task shadowJar(type: com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar) {
|
|
from { (FABRIC ? tasks.remapJar : tasks.jar).archiveFile.get() }
|
|
dependsOn { FABRIC ? tasks.remapJar : (mcVersion >= 10800 ? tasks.reobfJar : tasks.reobf) }
|
|
|
|
from({ zipTree((FABRIC ? jGui.tasks.remapJar : jGui.tasks.jar).archiveFile.get()) }) {
|
|
filesMatching('mixins.jgui.json') {
|
|
filter { it.replace('de.johni0702', 'com.replaymod.lib.de.johni0702') }
|
|
}
|
|
filesMatching('mixins.jgui.refmap.json') {
|
|
filter { it.replace('de/johni0702', 'com/replaymod/lib/de/johni0702') }
|
|
}
|
|
}
|
|
dependsOn { FABRIC ? jGui.tasks.remapJar : (mcVersion >= 10800 ? jGui.tasks.reobfJar : jGui.tasks.reobf) }
|
|
relocate 'de.johni0702', 'com.replaymod.lib.de.johni0702'
|
|
|
|
manifest.inheritFrom tasks.jar.manifest
|
|
|
|
from project.configurations.shade
|
|
configurations = [project.configurations.shadow]
|
|
exclude 'META-INF/INDEX.LIST', 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'module-info.class'
|
|
|
|
dependsOn tasks.configureRelocation
|
|
inputs.file(configureRelocationOutput)
|
|
doFirst {
|
|
configureRelocationOutput.readLines().each { pkg ->
|
|
def pkgName = pkg.replace('/', '.')
|
|
relocate pkgName, 'com.replaymod.lib.' + pkgName
|
|
}
|
|
}
|
|
|
|
// No need to shadow netty, MC provides it
|
|
// (actually, pre-1.12 ships a netty which is too old, so we need to shade it there anyway)
|
|
if (mcVersion >= 11200) {
|
|
relocate 'com.github.steveice10.netty', 'io.netty'
|
|
exclude 'com/github/steveice10/netty/**'
|
|
}
|
|
|
|
if (mcVersion >= 11400) {
|
|
// MC ships this
|
|
exclude 'it/unimi/dsi/fastutil/**'
|
|
}
|
|
|
|
minimize {
|
|
exclude(dependency('.*spongepowered:mixin:.*'))
|
|
}
|
|
}
|
|
tasks.assemble.dependsOn tasks.shadowJar
|
|
|
|
jar {
|
|
classifier = 'raw'
|
|
|
|
if (!FABRIC) {
|
|
from files(project.mixinRefMap.canonicalPath)
|
|
manifest {
|
|
attributes 'TweakClass': 'com.replaymod.core.tweaker.ReplayModTweaker',
|
|
'TweakOrder': '0',
|
|
'FMLCorePluginContainsFMLMod': 'true',
|
|
'FMLCorePlugin': 'com.replaymod.core.LoadingPlugin',
|
|
'FMLAT': 'replaymod_at.cfg'
|
|
}
|
|
}
|
|
}
|
|
|
|
processResources {
|
|
// this will ensure that this task is redone when the versions change.
|
|
inputs.property 'version', { project.version }
|
|
inputs.property 'mcversion', { mcVersionStr }
|
|
|
|
// replace stuff in mcmod.info (forge) and fabric.mod.json, nothing else
|
|
filesMatching(['mcmod.info', 'fabric.mod.json']) {
|
|
// replace version and mcversion
|
|
expand 'version': project.version, 'mcversion': mcVersionStr
|
|
}
|
|
|
|
// strip comments from (strict) JSON files
|
|
filesMatching('pack.mcmeta') {
|
|
filter { line -> line.trim().startsWith('//') ? '' : line}
|
|
}
|
|
|
|
// exclude mod meta for non-applicable loader
|
|
if (FABRIC) {
|
|
exclude 'mcmod.info'
|
|
} else {
|
|
exclude 'fabric.mod.json'
|
|
}
|
|
}
|
|
|
|
sourceSets {
|
|
integrationTest {
|
|
compileClasspath += main.runtimeClasspath + main.output
|
|
java {
|
|
srcDir file('src/integration-test/java')
|
|
}
|
|
resources.srcDir file('src/integration-test/resources')
|
|
}
|
|
}
|
|
|
|
if (FABRIC) {
|
|
// not required, fabric manages those by itself just fine
|
|
} else if (FG3) {
|
|
task copySrg(dependsOn: 'createMcpToSrg') {
|
|
doLast {
|
|
def tsrg = file(project.tasks.createMcpToSrg.output).readLines()
|
|
def srg = []
|
|
def cls = ''
|
|
for (def line : tsrg) {
|
|
if (line[0] != '\t') {
|
|
srg.add('CL: ' + line)
|
|
cls = line.split(' ')[0]
|
|
} else {
|
|
def parts = line.substring(1).split(' ')
|
|
if (line.contains('(')) {
|
|
srg.add('MD: ' + cls + '/' + parts[0] + ' ' + parts[1] + ' ' + cls + '/' + parts[2] + ' ' + parts[1])
|
|
} else {
|
|
srg.add('FD: ' + cls + '/' + parts[0] + ' ' + cls + '/' + parts[1])
|
|
}
|
|
}
|
|
}
|
|
new File(project.buildDir, 'mcp-srg.srg').write(srg.join('\n'))
|
|
}
|
|
}
|
|
compileJava.dependsOn copySrg
|
|
} else {
|
|
task copySrg(type: Copy, dependsOn: 'genSrgs') {
|
|
from {project.tasks.genSrgs.mcpToSrg}
|
|
into 'build'
|
|
}
|
|
compileJava.dependsOn copySrg
|
|
}
|
|
|
|
if (!FABRIC && !FG3) {
|
|
if (mcVersion <= 10710) {
|
|
reobf.addExtraSrgFile project.mixinSrg
|
|
} else {
|
|
reobfJar.addSecondarySrgFile project.mixinSrg
|
|
}
|
|
}
|
|
|
|
/* FIXME
|
|
// Mixin uses multiple HashMaps to generate the refmap.
|
|
// HashMaps are unordered collections and as such do not produce deterministic output.
|
|
// To fix that, we simply sort the refmap json file.
|
|
import groovy.json.JsonSlurper
|
|
import groovy.json.JsonOutput
|
|
compileJava.doLast {
|
|
File refmapFile = mcVersion >= 10800 ? compileJava.ext.refMapFile : project.mixinRefMap
|
|
if (refmapFile.exists()) {
|
|
def ordered
|
|
ordered = {
|
|
if (it instanceof Map) {
|
|
def sorted = new TreeMap(it)
|
|
sorted.replaceAll { k, v -> ordered(v) }
|
|
sorted
|
|
} else if (it instanceof List) {
|
|
it.replaceAll { v -> ordered(v) }
|
|
} else {
|
|
it
|
|
}
|
|
}
|
|
def json = JsonOutput.toJson(ordered(new JsonSlurper().parse(refmapFile)))
|
|
refmapFile.withWriter { it.write json }
|
|
}
|
|
}
|
|
*/
|
|
|
|
if (!FG3 && !FABRIC) { // FIXME
|
|
task runIntegrationTest(type: JavaExec, dependsOn: ["makeStart", "jar"]) {
|
|
main = 'GradleStart'
|
|
standardOutput = System.out
|
|
errorOutput = System.err
|
|
workingDir file(minecraft.runDir)
|
|
|
|
def testDir = new File(minecraft.runDir, "integration-test")
|
|
doFirst {
|
|
testDir.deleteDir()
|
|
testDir.mkdirs()
|
|
}
|
|
|
|
doLast {
|
|
testDir.deleteDir()
|
|
}
|
|
|
|
afterEvaluate {
|
|
def runClient = tasks.getByName("runClient")
|
|
runIntegrationTest.jvmArgs = runClient.jvmArgs + "-Dfml.noGrab=true"
|
|
runIntegrationTest.args = runClient.args + "--gameDir" + testDir.canonicalPath
|
|
runIntegrationTest.classpath runClient.classpath + sourceSets.integrationTest.output
|
|
}
|
|
}
|
|
}
|
|
|
|
defaultTasks 'build'
|