From 8ed9c75ba1c31b698c806b59edf96c5bfcba8b06 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Mon, 5 Mar 2018 12:12:07 +0100 Subject: [PATCH 01/30] Release 2.1.1 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 7ec1d6db..3e3c2f1e 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.1.0 +2.1.1 From fbbca76099f5feb0d197c5ace5acee09c5c8caab Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Mon, 5 Mar 2018 20:46:56 +0100 Subject: [PATCH 02/30] Remove :versions prefix from gradle projects and remove duplicated build code --- .drone.yml | 2 +- .drone.yml.sig | 2 +- README.md | 8 ++-- build.gradle | 19 +------- jGui | 2 +- settings.gradle | 18 +++++--- versions/1.10.2/.gitkeep | 0 versions/1.10.2/build.gradle | 12 ----- versions/1.11.2/.gitkeep | 0 versions/1.11.2/build.gradle | 12 ----- versions/1.11/.gitkeep | 0 versions/1.11/build.gradle | 12 ----- versions/1.12.1/.gitkeep | 0 versions/1.12.1/build.gradle | 12 ----- versions/1.12.2/.gitkeep | 0 versions/1.12.2/build.gradle | 12 ----- versions/1.12/.gitkeep | 0 versions/1.12/build.gradle | 12 ----- versions/1.8.9/.gitkeep | 0 versions/1.8.9/build.gradle | 12 ----- versions/1.8/.gitkeep | 0 versions/1.8/build.gradle | 12 ----- versions/1.9.4/.gitkeep | 0 versions/1.9.4/build.gradle | 12 ----- versions/common.gradle | 87 ++++++++++++++++++++++++++---------- versions/core/.gitignore | 1 + versions/core/.gitkeep | 0 versions/core/build.gradle | 69 ---------------------------- 28 files changed, 85 insertions(+), 231 deletions(-) create mode 100644 versions/1.10.2/.gitkeep delete mode 100644 versions/1.10.2/build.gradle create mode 100644 versions/1.11.2/.gitkeep delete mode 100644 versions/1.11.2/build.gradle create mode 100644 versions/1.11/.gitkeep delete mode 100644 versions/1.11/build.gradle create mode 100644 versions/1.12.1/.gitkeep delete mode 100644 versions/1.12.1/build.gradle create mode 100644 versions/1.12.2/.gitkeep delete mode 100644 versions/1.12.2/build.gradle create mode 100644 versions/1.12/.gitkeep delete mode 100644 versions/1.12/build.gradle create mode 100644 versions/1.8.9/.gitkeep delete mode 100644 versions/1.8.9/build.gradle create mode 100644 versions/1.8/.gitkeep delete mode 100644 versions/1.8/build.gradle create mode 100644 versions/1.9.4/.gitkeep delete mode 100644 versions/1.9.4/build.gradle create mode 100644 versions/core/.gitignore create mode 100644 versions/core/.gitkeep delete mode 100644 versions/core/build.gradle diff --git a/.drone.yml b/.drone.yml index 924509f8..f64fb0a0 100644 --- a/.drone.yml +++ b/.drone.yml @@ -8,7 +8,7 @@ pipeline: commands: - curl --fail --create-dirs -o $HOME/.gradle/init.d/mirror.gradle https://maven.johni0702.de/config/gradle - git config --global user.email "replaymod@drone" && git config --global user.name "Drone" - - SIGNED_JAR=$(! git describe --exact 2>&1 > /dev/null; echo $?) REPRODUCIBLE_BUILD=1 ./gradlew $(bash -c "echo :versions:{1.8,1.8.9,1.9.4,1.10.2,1.11,1.11.2,1.12,1.12.1,1.12.2}:reobfJar") --parallel + - SIGNED_JAR=$(! git describe --exact 2>&1 > /dev/null; echo $?) REPRODUCIBLE_BUILD=1 ./gradlew $(bash -c "echo :{1.8,1.8.9,1.9.4,1.10.2,1.11,1.11.2,1.12,1.12.1,1.12.2}:reobfJar") --parallel - mkdir -p build/libs && mv versions/*/build/libs/* build/libs/ archive: image: plugins/s3 diff --git a/.drone.yml.sig b/.drone.yml.sig index fd87f838..c90fd551 100644 --- a/.drone.yml.sig +++ b/.drone.yml.sig @@ -1 +1 @@ -eyJhbGciOiJIUzI1NiJ9.cGlwZWxpbmU6CiAgY2xvbmU6CiAgICBpbWFnZTogcGx1Z2lucy9naXQKICAgIHRhZ3M6IHRydWUKICAgIHJlY3Vyc2l2ZTogdHJ1ZQogIGJ1aWxkOgogICAgaW1hZ2U6IG1hdmVuOjMuMy45LWpkay04CiAgICBjb21tYW5kczoKICAgICAgLSBjdXJsIC0tZmFpbCAtLWNyZWF0ZS1kaXJzIC1vICRIT01FLy5ncmFkbGUvaW5pdC5kL21pcnJvci5ncmFkbGUgaHR0cHM6Ly9tYXZlbi5qb2huaTA3MDIuZGUvY29uZmlnL2dyYWRsZQogICAgICAtIGdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5lbWFpbCAicmVwbGF5bW9kQGRyb25lIiAmJiBnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIubmFtZSAiRHJvbmUiCiAgICAgIC0gU0lHTkVEX0pBUj0kKCEgZ2l0IGRlc2NyaWJlIC0tZXhhY3QgMj4mMSA-IC9kZXYvbnVsbDsgZWNobyAkPykgUkVQUk9EVUNJQkxFX0JVSUxEPTEgLi9ncmFkbGV3ICQoYmFzaCAtYyAiZWNobyA6dmVyc2lvbnM6ezEuOCwxLjguOSwxLjkuNCwxLjEwLjIsMS4xMSwxLjExLjIsMS4xMiwxLjEyLjEsMS4xMi4yfTpyZW9iZkphciIpIC0tcGFyYWxsZWwKICAgICAgLSBta2RpciAtcCBidWlsZC9saWJzICYmIG12IHZlcnNpb25zLyovYnVpbGQvbGlicy8qIGJ1aWxkL2xpYnMvCiAgYXJjaGl2ZToKICAgIGltYWdlOiBwbHVnaW5zL3MzCiAgICBhY2w6IHB1YmxpYy1yZWFkCiAgICByZWdpb246ICJ1cy1lYXN0LTEiCiAgICBidWNrZXQ6ICJyZXBsYXltb2QiCiAgICBwYXRoX3N0eWxlOiB0cnVlCiAgICBzb3VyY2U6IGJ1aWxkL2xpYnMvKgogICAgc3RyaXBfcHJlZml4OiBidWlsZC9saWJzLwogICAgdGFyZ2V0OiAvCg.GrAnS7L_wYnMV2eTmPJGweU_8ITxbbqZK9ptC6llIDg \ No newline at end of file +eyJhbGciOiJIUzI1NiJ9.cGlwZWxpbmU6CiAgY2xvbmU6CiAgICBpbWFnZTogcGx1Z2lucy9naXQKICAgIHRhZ3M6IHRydWUKICAgIHJlY3Vyc2l2ZTogdHJ1ZQogIGJ1aWxkOgogICAgaW1hZ2U6IG1hdmVuOjMuMy45LWpkay04CiAgICBjb21tYW5kczoKICAgICAgLSBjdXJsIC0tZmFpbCAtLWNyZWF0ZS1kaXJzIC1vICRIT01FLy5ncmFkbGUvaW5pdC5kL21pcnJvci5ncmFkbGUgaHR0cHM6Ly9tYXZlbi5qb2huaTA3MDIuZGUvY29uZmlnL2dyYWRsZQogICAgICAtIGdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5lbWFpbCAicmVwbGF5bW9kQGRyb25lIiAmJiBnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIubmFtZSAiRHJvbmUiCiAgICAgIC0gU0lHTkVEX0pBUj0kKCEgZ2l0IGRlc2NyaWJlIC0tZXhhY3QgMj4mMSA-IC9kZXYvbnVsbDsgZWNobyAkPykgUkVQUk9EVUNJQkxFX0JVSUxEPTEgLi9ncmFkbGV3ICQoYmFzaCAtYyAiZWNobyA6ezEuOCwxLjguOSwxLjkuNCwxLjEwLjIsMS4xMSwxLjExLjIsMS4xMiwxLjEyLjEsMS4xMi4yfTpyZW9iZkphciIpIC0tcGFyYWxsZWwKICAgICAgLSBta2RpciAtcCBidWlsZC9saWJzICYmIG12IHZlcnNpb25zLyovYnVpbGQvbGlicy8qIGJ1aWxkL2xpYnMvCiAgYXJjaGl2ZToKICAgIGltYWdlOiBwbHVnaW5zL3MzCiAgICBhY2w6IHB1YmxpYy1yZWFkCiAgICByZWdpb246ICJ1cy1lYXN0LTEiCiAgICBidWNrZXQ6ICJyZXBsYXltb2QiCiAgICBwYXRoX3N0eWxlOiB0cnVlCiAgICBzb3VyY2U6IGJ1aWxkL2xpYnMvKgogICAgc3RyaXBfcHJlZml4OiBidWlsZC9saWJzLwogICAgdGFyZ2V0OiAvCg.fT6kOBDI6aBi4mOm999DOflJ7ZCkclgr6Vz69rlOpQ0 \ No newline at end of file diff --git a/README.md b/README.md index 9694bdc3..e69e18e4 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ to access private fields is a good indication that this has happened). ### No IDE You can build the mod by running `./gradlew build`. You can then find the final jar files in `versions/$MCVERSION/build/libs/`. -You can also build single versions by running `./gradlew :versions:1.8:build` (builds the MC 1.8 version). +You can also build single versions by running `./gradlew :1.8:build` (builds the MC 1.8 version). ### IntelliJ For the initial setup run `./gradlew idea genIntellijRuns`. @@ -74,15 +74,15 @@ Code for the more recent MC version shall be placed in the first branch of the i Version-dependent import statements shall be placed separately from and after all other imports but before the `static` and `java.*` imports. Common version dependent code (including the fml and forge event bus) are available as static methods/fields in the `MCVer` class. -The source code resides in `src/main` (gradle project `:versions:core`) and is automatically passed through the -preprocessor when any of the concrete versions are built (gradle projects `:versions:1.8`, `:versions:1.8.9`, etc.). +The source code resides in `src/main` (gradle project `:core`) and is automatically passed through the +preprocessor when any of the concrete versions are built (gradle projects `:1.8`, `:1.8.9`, etc.). Do **NOT** edit any of the code in `versions/$MCVERSION/build/` as it is automatically generated and will be overwritten without warning. You can pass the original source code through the preprocessor if you wish to develop/debug with another version of Minecraft: ```bash ./gradle -PmcVersion=10904 :setCoreVersion # switches all sources in src/main to 1.9.4 ``` -If you do so, you'll also have to run `./gradlew :versions:core:copySrg :versions:core:setupDecompWorkspace :jGui:versions:core:setupDecompWorkspace`, +If you do so, you'll also have to run `./gradlew :core:copySrg :core:setupDecompWorkspace :jGui:core:setupDecompWorkspace`, followed by a refresh of the project in your IDE. Make sure to switch back to the most recent branch before committing! diff --git a/build.gradle b/build.gradle index 28554dd8..e4e25ae6 100755 --- a/build.gradle +++ b/build.gradle @@ -21,25 +21,8 @@ group= "com.replaymod" subprojects { buildscript { repositories { - mavenLocal() - mavenCentral() - maven { - name = "forge" - url = "http://files.minecraftforge.net/maven" - } - maven { - name = "sonatype" - url = "https://oss.sonatype.org/content/repositories/snapshots/" - } maven { url 'https://jitpack.io' } } - dependencies { - classpath('com.github.SpongePowered:MixinGradle:dcfaf61'){ // 0.6 - // Because forgegradle requires 6.0 (not -debug-all) while mixingradle depends on 5.0 - // and putting mixin right here will place it before forge in the class loader - exclude group: 'org.ow2.asm', module: 'asm-debug-all' - } - } configurations.classpath.resolutionStrategy.eachDependency { dep -> if (System.getenv('REPRODUCIBLE_BUILD') == '1') return def req = dep.target @@ -80,7 +63,7 @@ task setCoreVersion() { def vars = [MC: project.mcVersion as int, DEV_ENV: 1] project.convertTree(vars, 'src/main/java') project.convertTree(vars, 'src/main/resources') - project.convertTree(vars, 'versions/core/build.gradle') + project.file('versions/core/mcVersion').write(vars.MC.toString()) } } diff --git a/jGui b/jGui index 88cf6782..09903370 160000 --- a/jGui +++ b/jGui @@ -1 +1 @@ -Subproject commit 88cf67823672bf78302775784a6bbd129d75d433 +Subproject commit 09903370897bf50f7994baa79ae38b9d73e5ce3e diff --git a/settings.gradle b/settings.gradle index 27d78551..51d3540f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,12 +1,16 @@ include ':jGui' -([ +[ 'core', '1.8', '1.8.9', '1.9.4', '1.12' -].collect {":jGui:versions:$it"} as String[]).each { - include it +].each { version -> + include ":jGui:$version" + project(":jGui:$version").with { + projectDir = file("jGui/versions/$version") + buildFileName = '../common.gradle' + } } def versions = [ @@ -21,6 +25,10 @@ def versions = [ '1.12.1', '1.12.2' ] -versions.collect {":versions:$it"}.each { - include it +versions.each { version -> + include ":$version" + project(":$version").with { + projectDir = file("versions/$version") + buildFileName = '../common.gradle' + } } diff --git a/versions/1.10.2/.gitkeep b/versions/1.10.2/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/versions/1.10.2/build.gradle b/versions/1.10.2/build.gradle deleted file mode 100644 index d87d515f..00000000 --- a/versions/1.10.2/build.gradle +++ /dev/null @@ -1,12 +0,0 @@ -buildscript { - dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT' - } -} - -apply from: '../common.gradle' - -minecraft { - version = '1.10.2-12.18.2.2099' - mappings = "snapshot_20160518" -} diff --git a/versions/1.11.2/.gitkeep b/versions/1.11.2/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/versions/1.11.2/build.gradle b/versions/1.11.2/build.gradle deleted file mode 100644 index 466a0017..00000000 --- a/versions/1.11.2/build.gradle +++ /dev/null @@ -1,12 +0,0 @@ -buildscript { - dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT' - } -} - -apply from: '../common.gradle' - -minecraft { - version = '1.11.2-13.20.0.2216' - mappings = "snapshot_20161220" -} diff --git a/versions/1.11/.gitkeep b/versions/1.11/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/versions/1.11/build.gradle b/versions/1.11/build.gradle deleted file mode 100644 index a42c0b4a..00000000 --- a/versions/1.11/build.gradle +++ /dev/null @@ -1,12 +0,0 @@ -buildscript { - dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT' - } -} - -apply from: '../common.gradle' - -minecraft { - version = '1.11-13.19.1.2188' - mappings = "snapshot_20161111" -} diff --git a/versions/1.12.1/.gitkeep b/versions/1.12.1/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/versions/1.12.1/build.gradle b/versions/1.12.1/build.gradle deleted file mode 100644 index 726daf3a..00000000 --- a/versions/1.12.1/build.gradle +++ /dev/null @@ -1,12 +0,0 @@ -buildscript { - dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT' - } -} - -apply from: '../common.gradle' - -minecraft { - version = '1.12.1-14.22.0.2444' - mappings = "snapshot_20170615" -} diff --git a/versions/1.12.2/.gitkeep b/versions/1.12.2/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/versions/1.12.2/build.gradle b/versions/1.12.2/build.gradle deleted file mode 100644 index c504ee1c..00000000 --- a/versions/1.12.2/build.gradle +++ /dev/null @@ -1,12 +0,0 @@ -buildscript { - dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT' - } -} - -apply from: '../common.gradle' - -minecraft { - version = '1.12.2-14.23.0.2486' - mappings = "snapshot_20170615" -} diff --git a/versions/1.12/.gitkeep b/versions/1.12/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/versions/1.12/build.gradle b/versions/1.12/build.gradle deleted file mode 100644 index cff536ee..00000000 --- a/versions/1.12/build.gradle +++ /dev/null @@ -1,12 +0,0 @@ -buildscript { - dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT' - } -} - -apply from: '../common.gradle' - -minecraft { - version = '1.12-14.21.1.2387' - mappings = "snapshot_20170615" -} diff --git a/versions/1.8.9/.gitkeep b/versions/1.8.9/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/versions/1.8.9/build.gradle b/versions/1.8.9/build.gradle deleted file mode 100644 index 71cc44c3..00000000 --- a/versions/1.8.9/build.gradle +++ /dev/null @@ -1,12 +0,0 @@ -buildscript { - dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:2.1-SNAPSHOT' - } -} - -apply from: '../common.gradle' - -minecraft { - version = '1.8.9-11.15.1.1722' - mappings = "stable_22" -} diff --git a/versions/1.8/.gitkeep b/versions/1.8/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/versions/1.8/build.gradle b/versions/1.8/build.gradle deleted file mode 100644 index 9e640b17..00000000 --- a/versions/1.8/build.gradle +++ /dev/null @@ -1,12 +0,0 @@ -buildscript { - dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:2.0-SNAPSHOT' - } -} - -apply from: '../common.gradle' - -minecraft { - version = '1.8-11.14.4.1563' - mappings = "snapshot_nodoc_20141130" -} diff --git a/versions/1.9.4/.gitkeep b/versions/1.9.4/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/versions/1.9.4/build.gradle b/versions/1.9.4/build.gradle deleted file mode 100644 index ebf35bf3..00000000 --- a/versions/1.9.4/build.gradle +++ /dev/null @@ -1,12 +0,0 @@ -buildscript { - dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT' - } -} - -apply from: '../common.gradle' - -minecraft { - version = '1.9.4-12.17.0.1976' - mappings = "snapshot_20160518" -} diff --git a/versions/common.gradle b/versions/common.gradle index 81d78a7f..36151cee 100644 --- a/versions/common.gradle +++ b/versions/common.gradle @@ -1,20 +1,42 @@ buildscript { - repositories { - mavenCentral() - } - dependencies { - classpath 'org.ow2.asm:asm:6.0' + def mcVersion + if (project.name != 'core') { + def (major, minor, patch) = project.name.tokenize('.') + mcVersion = "${major}${minor.padLeft(2, '0')}${(patch ?: '').padLeft(2, '0')}" as int + } else { + def f = file('mcVersion') + mcVersion = f.exists() ? f.readLines().first() as int : 11202 } + project.ext.mcVersion = mcVersion - // This and calls to it should really also be handled by the gradle/reprod/init.gradle script - // but apparently there's no sane way to do that for external scripts in gradle :( - def convertRepoToHttp = { repo -> - if (repo instanceof MavenArtifactRepository && repo.url.toString().startsWith('https://')) { - URL url = repo.url.toURL() - repo.url = new URL("http", url.getHost(), url.getPort(), url.getFile()).toURI() + repositories { + jcenter() + mavenCentral() + maven { + name = "forge" + url = "https://files.minecraftforge.net/maven" + } + maven { + name = "sonatype" + url = "https://oss.sonatype.org/content/repositories/snapshots/" } } - if (System.getenv('REPRODUCIBLE_BUILD') == '1') repositories.all convertRepoToHttp + + dependencies { + classpath 'org.ow2.asm:asm:6.0' + classpath('com.github.SpongePowered:MixinGradle:dcfaf61'){ // 0.6 + // Because forgegradle requires 6.0 (not -debug-all) while mixingradle depends on 5.0 + // and putting mixin right here will place it before forge in the class loader + exclude group: 'org.ow2.asm', module: 'asm-debug-all' + } + classpath 'net.minecraftforge.gradle:ForgeGradle:' + ( + mcVersion >= 11200 ? '2.3-SNAPSHOT' : + mcVersion >= 10904 ? '2.2-SNAPSHOT' : + mcVersion >= 10809 ? '2.1-SNAPSHOT' : + mcVersion >= 10800 ? '2.0-SNAPSHOT' : + 'invalid' + ) + } } apply plugin: 'net.minecraftforge.gradle.forge' @@ -32,6 +54,29 @@ archivesBaseName = "replaymod" minecraft { coreMod = 'com.replaymod.core.LoadingPlugin' runDir = "../../eclipse" + + 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', + ][mcVersion] + mappings = [ + 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", + ][mcVersion] } afterEvaluate { // Note cannot use minecraft.replace because that has already been forwarded to the task by FG by now @@ -49,15 +94,6 @@ repositories { maven { url 'https://jitpack.io' } } -// And because gradle does *something*, this definition even needs to be duplicated instead of shared -def convertRepoToHttp = { repo -> - if (repo instanceof MavenArtifactRepository && repo.url.toString().startsWith('https://')) { - URL url = repo.url.toURL() - repo.url = new URL("http", url.getHost(), url.getPort(), url.getFile()).toURI() - } -} -if (System.getenv('REPRODUCIBLE_BUILD') == '1') repositories.all convertRepoToHttp - configurations { shade compile.extendsFrom shade @@ -87,7 +123,7 @@ dependencies { 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' - shade(project(":jGui:versions:$jGuiVersion")){ + shade(project(":jGui:$jGuiVersion")){ exclude group: 'org.projectlombok', module: 'lombok' // runtime only for @SneakyThrows which isn't used } @@ -103,8 +139,6 @@ if (project.name != 'core') { def preprocessedRes = 'build/preprocessed/res' def originalSrc = '../../src/main/java' def originalRes = '../../src/main/resources' - def (major, minor, patch) = project.name.tokenize('.') - def mcVersion = "${major}${minor.padLeft(2, '0')}${(patch ?: '').padLeft(2, '0')}" def vars = [MC: mcVersion as int] sourceSets { @@ -135,6 +169,11 @@ if (project.name != 'core') { } minecraft.accessTransformer preprocessedRes + '/META-INF/replaymod_at.cfg' +} else { + sourceSets { + main.java.srcDirs = ['../../src/main/java'] + main.resources.srcDirs = ['../../src/main/resources'] + } } diff --git a/versions/core/.gitignore b/versions/core/.gitignore new file mode 100644 index 00000000..0e0fabf7 --- /dev/null +++ b/versions/core/.gitignore @@ -0,0 +1 @@ +mcVersion \ No newline at end of file diff --git a/versions/core/.gitkeep b/versions/core/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/versions/core/build.gradle b/versions/core/build.gradle deleted file mode 100644 index 1176443a..00000000 --- a/versions/core/build.gradle +++ /dev/null @@ -1,69 +0,0 @@ -buildscript { - dependencies { - //#if MC>=10904 - //#if MC>=11200 - classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT' - //#else - //$$ classpath 'net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT' - //#endif - //#else - //#if MC>=10809 - //$$ classpath 'net.minecraftforge.gradle:ForgeGradle:2.1-SNAPSHOT' - //#else - //$$ classpath 'net.minecraftforge.gradle:ForgeGradle:2.0-SNAPSHOT' - //#endif - //#endif - } -} - -apply from: '../common.gradle' - -sourceSets { - main.java.srcDirs = ['../../src/main/java'] - main.resources.srcDirs = ['../../src/main/resources'] -} - -minecraft { - //#if MC>=11202 - version = '1.12.2-14.23.0.2486' - mappings = "snapshot_20170615" - //#else - //#if MC>=11201 - //$$ version = '1.12.1-14.22.0.2444' - //$$ mappings = "snapshot_20170615" - //#else - //#if MC>=11200 - //$$ version = '1.12-14.21.1.2387' - //$$ mappings = "snapshot_20170615" - //#else - //#if MC>=11102 - //$$ version = '1.11.2-13.20.0.2216' - //$$ mappings = "snapshot_20161220" - //#else - //#if MC>=11100 - //$$ version = '1.11-13.19.1.2188' - //$$ mappings = "snapshot_20161111" - //#else - //#if MC>=11002 - //$$ version = '1.10.2-12.18.2.2099' - //$$ mappings = "snapshot_20160518" - //#else - //#if MC>=10904 - //$$ version = '1.9.4-12.17.0.1976' - //$$ mappings = "snapshot_20160518" - //#else - //#if MC>=10809 - //$$ version = '1.8.9-11.15.1.1722' - //$$ mappings = "stable_22" - //#else - //$$ version = '1.8-11.14.4.1563' - //$$ mappings = "snapshot_nodoc_20141130" - //#endif - //#endif - //#endif - //#endif - //#endif - //#endif - //#endif - //#endif -} From 34172cd737448c9bff5d29eb84b7930abf581d6c Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Sun, 11 Mar 2018 12:17:18 +0100 Subject: [PATCH 03/30] Fix race condition due to ReplaySender in async mode during setup() The ReplaySender used to be started in async mode even before the call to setup(). If the ReplaySender restarts the replay before the setup() call finishes, that call may instead produce a NPE in clientToServerHandshake(). To fix this race condition, the ReplaySender is always started in sync mode and only switched to async after the setup() call. --- src/main/java/com/replaymod/replay/ReplayHandler.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/replaymod/replay/ReplayHandler.java b/src/main/java/com/replaymod/replay/ReplayHandler.java index 84f70867..32ed21c3 100755 --- a/src/main/java/com/replaymod/replay/ReplayHandler.java +++ b/src/main/java/com/replaymod/replay/ReplayHandler.java @@ -82,7 +82,7 @@ public class ReplayHandler { markers = new ArrayList<>(replayFile.getMarkers().or(Collections.emptySet())); - replaySender = new ReplaySender(this, replayFile, asyncMode); + replaySender = new ReplaySender(this, replayFile, false); setup(); @@ -90,6 +90,8 @@ public class ReplayHandler { overlay.setVisible(true); FML_BUS.post(new ReplayOpenEvent.Post(this)); + + replaySender.setAsyncMode(asyncMode); } void restartedReplay() { From 13d5586583c4f805b1df3f5cebaec1b0dd8b30fb Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Sun, 11 Mar 2018 12:19:23 +0100 Subject: [PATCH 04/30] Fix trimming of replays not actually removing any packets (fixes #113) The init method of the Squash filter has never been called therefore it had never registered its packets and was never able to properly function. --- .../java/com/replaymod/editor/gui/GuiReplayEditor.java | 9 +++++++-- src/main/java/com/replaymod/editor/gui/GuiTrimPanel.java | 8 ++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/replaymod/editor/gui/GuiReplayEditor.java b/src/main/java/com/replaymod/editor/gui/GuiReplayEditor.java index 05322765..359c3164 100644 --- a/src/main/java/com/replaymod/editor/gui/GuiReplayEditor.java +++ b/src/main/java/com/replaymod/editor/gui/GuiReplayEditor.java @@ -36,6 +36,7 @@ import de.johni0702.minecraft.gui.popup.GuiYesNoPopup; import de.johni0702.minecraft.gui.utils.Colors; import net.minecraft.crash.CrashReport; import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.util.ReadableDimension; import javax.annotation.Nullable; @@ -123,7 +124,8 @@ public class GuiReplayEditor extends GuiScreen { return button; } - public void save(File inputFile, PacketStream.FilterInfo...filters) { + @SafeVarargs + public final void save(File inputFile, Pair... filters) { save(Utils.fileNameToReplayName(inputFile.getName()), (outputFile) -> { Studio studio = new ReplayStudio(); File tmpDir = null; @@ -146,7 +148,10 @@ public class GuiReplayEditor extends GuiScreen { PacketStream stream = studio.createReplayStream(in, true); stream.addFilter(new ProgressFilter(metaData.getDuration())); - for (PacketStream.FilterInfo info : filters) { + for (Pair pair : filters) { + PacketStream.FilterInfo info = pair.getLeft(); + JsonObject config = pair.getRight(); + info.getFilter().init(studio, config); stream.addFilter(info.getFilter(), info.getFrom(), info.getTo()); LOGGER.debug("Added filter {}", info); } diff --git a/src/main/java/com/replaymod/editor/gui/GuiTrimPanel.java b/src/main/java/com/replaymod/editor/gui/GuiTrimPanel.java index 3bff46f8..3947214d 100644 --- a/src/main/java/com/replaymod/editor/gui/GuiTrimPanel.java +++ b/src/main/java/com/replaymod/editor/gui/GuiTrimPanel.java @@ -22,6 +22,7 @@ import net.minecraft.client.resources.I18n; import net.minecraft.crash.CrashReport; import org.apache.commons.io.IOCase; import org.apache.commons.io.filefilter.SuffixFileFilter; +import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.util.Dimension; import java.io.File; @@ -133,12 +134,11 @@ public class GuiTrimPanel extends GuiPanel { ChangeTimestampFilter ctf = new ChangeTimestampFilter(); JsonObject config = new JsonObject(); config.addProperty("offset", -start); - ctf.init(null, config); // Pass filters to save dialog gui.save(inputReplays.getSelectedValue(), - new PacketStream.FilterInfo(new SquashFilter(), -1, start), - new PacketStream.FilterInfo(ctf, start, end), - new PacketStream.FilterInfo(new RemoveFilter(), end, -1) + Pair.of(new PacketStream.FilterInfo(new SquashFilter(), -1, start), new JsonObject()), + Pair.of(new PacketStream.FilterInfo(ctf, start, end), config), + Pair.of(new PacketStream.FilterInfo(new RemoveFilter(), end, -1), new JsonObject()) ); }); } From 76be6c1d2e566f929e305fcee0a7824558a7ace2 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Sun, 11 Mar 2018 13:42:28 +0100 Subject: [PATCH 05/30] Fix dead lock when jumping backwards in time during rendering A jump backwards in time entails unloading the current world and with it the ChunkRenderDispatcher that the ChunkLoadingRenderGlobal has locked. --- .../hooks/ChunkLoadingRenderGlobal.java | 23 +++++++++++++++---- .../render/mixin/MixinRenderGlobal.java | 15 ++++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/replaymod/render/hooks/ChunkLoadingRenderGlobal.java b/src/main/java/com/replaymod/render/hooks/ChunkLoadingRenderGlobal.java index d2a9844d..0b8bf90a 100644 --- a/src/main/java/com/replaymod/render/hooks/ChunkLoadingRenderGlobal.java +++ b/src/main/java/com/replaymod/render/hooks/ChunkLoadingRenderGlobal.java @@ -22,15 +22,30 @@ import static com.replaymod.core.versions.MCVer.*; public class ChunkLoadingRenderGlobal { private final RenderGlobal hooked; - private final ChunkRenderDispatcher renderDispatcher; - private final JailingQueue workerJailingQueue; - private final CustomChunkRenderWorker renderWorker; + private ChunkRenderDispatcher renderDispatcher; + private JailingQueue workerJailingQueue; + private CustomChunkRenderWorker renderWorker; private int frame; @SuppressWarnings("unchecked") public ChunkLoadingRenderGlobal(RenderGlobal renderGlobal) { this.hooked = renderGlobal; - this.renderDispatcher = renderGlobal.renderDispatcher; + + setup(renderGlobal.renderDispatcher); + } + + public void updateRenderDispatcher(ChunkRenderDispatcher renderDispatcher) { + if (this.renderDispatcher != null) { + workerJailingQueue.freeAll(); + this.renderDispatcher = null; + } + if (renderDispatcher != null) { + setup(renderDispatcher); + } + } + + private void setup(ChunkRenderDispatcher renderDispatcher) { + this.renderDispatcher = renderDispatcher; this.renderWorker = new CustomChunkRenderWorker(renderDispatcher, new RegionRenderCacheBuilder()); int workerThreads = renderDispatcher.listThreadedWorkers.size(); diff --git a/src/main/java/com/replaymod/render/mixin/MixinRenderGlobal.java b/src/main/java/com/replaymod/render/mixin/MixinRenderGlobal.java index a5cd2885..1eb1d3cb 100644 --- a/src/main/java/com/replaymod/render/mixin/MixinRenderGlobal.java +++ b/src/main/java/com/replaymod/render/mixin/MixinRenderGlobal.java @@ -9,6 +9,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; //#if MC<10904 @@ -66,4 +67,18 @@ public abstract class MixinRenderGlobal { ci.cancel(); } } + + @Inject(method = "setWorldAndLoadRenderers", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/chunk/ChunkRenderDispatcher;stopWorkerThreads()V")) + private void stopWorkerThreadsAndChunkLoadingRenderGlobal(CallbackInfo ci) { + if (replayModRender_hook != null) { + replayModRender_hook.updateRenderDispatcher(null); + } + } + + @Inject(method = "loadRenderers", at = @At(value = "RETURN")) + private void setupChunkLoadingRenderGlobal(CallbackInfo ci) { + if (replayModRender_hook != null) { + replayModRender_hook.updateRenderDispatcher(renderDispatcher); + } + } } From 48b39fe551615f3ef1b381f273b614c559f438a3 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Sun, 11 Mar 2018 20:51:56 +0100 Subject: [PATCH 06/30] Update MCProtocolLib (via ReplayStudio) Primarily because of 1728e10 Default to no team color when receiving unknown values. 63e06fa Remove hard bitsPerEntry limit, enforce minimum of 4. 6de0593 Add CustomStatistic as fallback for custom or unimplemented statistic IDs. --- gradle/reprod/checksums.txt | 32 ++++++++++++++++---------------- versions/common.gradle | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/gradle/reprod/checksums.txt b/gradle/reprod/checksums.txt index 3761b918..1deeb35c 100644 --- a/gradle/reprod/checksums.txt +++ b/gradle/reprod/checksums.txt @@ -26,22 +26,22 @@ f539e2ca00d43e3d2261b7334eb05137f0eb1d3d5e3cc2c2716b0071e27783ed /com/github/Min fe525f413965d4f5f65b70f08b90b3d3f944714f665e2c5636a6e8fec08d3c74 /com/github/MinecraftForge/Srg2Source/ea4ea62/Srg2Source-ea4ea62.pom ecf57aab63509ec0ce3937c2215bc3a2e3cb6357cd11095978db18bd3251731a /com/github/ModCoderPack/MCInjector/7258466/MCInjector-7258466.jar dc7ed1f4f0ddd8f5ce3b449db944907a5eb2855dbbbc59b08dad1247ebafba33 /com/github/ModCoderPack/MCInjector/7258466/MCInjector-7258466.pom -eec4d746869133803b0b3c8a8036a6fb1ec95c52951a0c83cd712f8414eb2155 /com/github/ReplayMod/ReplayStudio/1.10.2/9fd96a7/1.10.2-9fd96a7.jar -4ab7d385c3bb8ff5f644d7581ba01e8f53bf901391bc3db4a42671d691fe10a3 /com/github/ReplayMod/ReplayStudio/1.10.2/9fd96a7/1.10.2-9fd96a7.pom -2b1cc3bb7e47f0e211d9a4f6460094cac923d6225570c3f7050d7ca400797ca3 /com/github/ReplayMod/ReplayStudio/1.11.2/9fd96a7/1.11.2-9fd96a7.jar -5c7a1016aec5d110283b7da5d2275624c9620f4b7e280243d36a3d91fdc9a634 /com/github/ReplayMod/ReplayStudio/1.11.2/9fd96a7/1.11.2-9fd96a7.pom -0b5b847e3632c9af689d6962784055199b32480776d6677c3af7a5222a5d7aa8 /com/github/ReplayMod/ReplayStudio/1.11/9fd96a7/1.11-9fd96a7.jar -264e3bc6f5e46a779e69693a8923b7ec0ab293c0b44aebdef8ae1384e60ca9cd /com/github/ReplayMod/ReplayStudio/1.11/9fd96a7/1.11-9fd96a7.pom -a57a2413914bcd3d28303fd8f15311ea75c71190a709301016e8d4a2a5b8594d /com/github/ReplayMod/ReplayStudio/1.12.1/9fd96a7/1.12.1-9fd96a7.jar -d5de52fb3678b934f9ff79010cf5f9b5808d4dbecea12176a68ba48770058292 /com/github/ReplayMod/ReplayStudio/1.12.1/9fd96a7/1.12.1-9fd96a7.pom -8e394540ae4f7e482418bac8fc62b960e7d6684d0c775de4cbe31a5b6e8265ba /com/github/ReplayMod/ReplayStudio/1.12.2/9fd96a7/1.12.2-9fd96a7.jar -52fffb013931c1665fec82a4b8fa689746ced42ba3aa9bf9ec0e31cb5795dd45 /com/github/ReplayMod/ReplayStudio/1.12.2/9fd96a7/1.12.2-9fd96a7.pom -4a63fcc6f9028eb3861ffa2bfa530946a3bfb08740a63b079438cd63483e25d6 /com/github/ReplayMod/ReplayStudio/1.12/9fd96a7/1.12-9fd96a7.jar -84dc441594bfc55066bc47e220bec2c29b13078f43bf4825ea2efb627ac77e48 /com/github/ReplayMod/ReplayStudio/1.12/9fd96a7/1.12-9fd96a7.pom -05815d75c608c7a595e0b05e253dd061f0399192d5ff801bd4638f91e2977ea9 /com/github/ReplayMod/ReplayStudio/1.8/9fd96a7/1.8-9fd96a7.jar -c8f68dd69574d0a60fd4da65dd719015f15dc39689c11ec82d996d73abafb1df /com/github/ReplayMod/ReplayStudio/1.8/9fd96a7/1.8-9fd96a7.pom -a0860a4846512e77944e4fd3e22e27e239606748aba10b4e3c0f8965439b6208 /com/github/ReplayMod/ReplayStudio/1.9.4/9fd96a7/1.9.4-9fd96a7.jar -8b4d5ad45fc62539a5add40e944e6fb22ad2b4d3954ed5b16f3f2a3b688da010 /com/github/ReplayMod/ReplayStudio/1.9.4/9fd96a7/1.9.4-9fd96a7.pom +70429d88b6f4705ce385491500afa126e936447f992c7d4221d0751e8f0f7c50 /com/github/ReplayMod/ReplayStudio/1.10.2/e6f898d/1.10.2-e6f898d.pom +4d7e34aa0ca77482fb2d4c6617ac556e1c0dfcb1be1e651578200d7198ee3cfc /com/github/ReplayMod/ReplayStudio/1.10.2/e6f898d/1.10.2-e6f898d.jar +c449a20fa5c6365d7c16c3fc3b81fa5f260becc962075d1c02c5a998e4c1c36f /com/github/ReplayMod/ReplayStudio/1.11.2/e6f898d/1.11.2-e6f898d.pom +3feaeb7ddfc841318f842dbd850aff858222ad4abca31ddfffa8c5c2f8c0ae67 /com/github/ReplayMod/ReplayStudio/1.11.2/e6f898d/1.11.2-e6f898d.jar +d55fffd172e435aff8cb31338a7dea43cc7b19eb0af074de0faefad4864f5493 /com/github/ReplayMod/ReplayStudio/1.11/e6f898d/1.11-e6f898d.pom +7fb4e0b0e8e4c0cada73c7091064d50131dfaadf257619f10f391fb8ed341f3c /com/github/ReplayMod/ReplayStudio/1.11/e6f898d/1.11-e6f898d.jar +b758ff30bfc9297a9c13d5ca607fc9096a43682a46951d9ad1cefa5400e4d5fe /com/github/ReplayMod/ReplayStudio/1.12.1/e6f898d/1.12.1-e6f898d.pom +08690338d01adc76e1bbee5077e7f9ab8efa68c78c28b03fafd453ced2528bfe /com/github/ReplayMod/ReplayStudio/1.12.1/e6f898d/1.12.1-e6f898d.jar +561716bffe975418b7bf2067621d931dbd685e9f961d5ce40d1f8841d84570a3 /com/github/ReplayMod/ReplayStudio/1.12.2/e6f898d/1.12.2-e6f898d.pom +0c4e0f20a09925b529795aef86192d90dc94360eefd6b49e7f38d74930e2b7f6 /com/github/ReplayMod/ReplayStudio/1.12.2/e6f898d/1.12.2-e6f898d.jar +b5ccd97d108791fc24627e056116ca05f9e47bfa8a9f1ba4e9d0d730a91460aa /com/github/ReplayMod/ReplayStudio/1.12/e6f898d/1.12-e6f898d.pom +b2126228c5e49c8ed1d7c9da5a59280bfd63c24b0507ee34097c64ee31837ee1 /com/github/ReplayMod/ReplayStudio/1.12/e6f898d/1.12-e6f898d.jar +21cd9c0581ddedd4e7bb2dda9db82b56c2ff5b2b9e71859803fa892fec459fcb /com/github/ReplayMod/ReplayStudio/1.8/e6f898d/1.8-e6f898d.pom +44046515c61f1d2ae73cf37949b460b2e48dfdb70bfcef0c0a09e3a5ad0e8ab9 /com/github/ReplayMod/ReplayStudio/1.8/e6f898d/1.8-e6f898d.jar +481c532b43ddfcb7c9025abf37d2e502935e2343a08c496b029e12826d682de8 /com/github/ReplayMod/ReplayStudio/1.9.4/e6f898d/1.9.4-e6f898d.pom +f2090b2bd7acdff598ef53f1a997572d774752dc6115f176bbe925026d5ac0ab /com/github/ReplayMod/ReplayStudio/1.9.4/e6f898d/1.9.4-e6f898d.jar bfdcda4cbf23f28392384818a1417c2d6df687e15ce77530ef96381393102f8a /com/github/SpongePowered/MixinGradle/dcfaf61/MixinGradle-dcfaf61.jar 3552e0c04817d91d1b6671a051d0e1d952c8b6a8eec57b54e829de9fa3ddf002 /com/github/SpongePowered/MixinGradle/dcfaf61/MixinGradle-dcfaf61.pom c6ebd74cd6108b8c372c95b842725ee5bd6d3303ba26cb00f18bc92f80b47956 /com/github/tony19/named-regexp/0.2.3/named-regexp-0.2.3.jar diff --git a/versions/common.gradle b/versions/common.gradle index 81d78a7f..8b008d84 100644 --- a/versions/common.gradle +++ b/versions/common.gradle @@ -79,7 +79,7 @@ dependencies { def studioVersion = project.name if (studioVersion == '1.8.9') studioVersion = '1.8' - shade("com.github.ReplayMod.ReplayStudio:$studioVersion:9fd96a7"){ + shade("com.github.ReplayMod.ReplayStudio:$studioVersion:e6f898d"){ exclude group: 'com.google.guava', module: 'guava' // provided by MC exclude group: 'org.projectlombok', module: 'lombok' // runtime only for @SneakyThrows which isn't used } From 221991bf2c1f19534f3a6481c02f9149412ffd56 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Thu, 15 Mar 2018 21:56:46 +0100 Subject: [PATCH 07/30] Do not shade gson lib (fixes #115) The gson lib is provided by MC anyway. Additionally, by shading it, we relocate the lib via the FG reobfJar task which doesn't properly handle annotations causing the Mixin lib's MixinConfig to no longer parse properly. --- gradle/reprod/checksums.txt | 32 ++++++++++++++++---------------- versions/common.gradle | 4 +++- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/gradle/reprod/checksums.txt b/gradle/reprod/checksums.txt index 1deeb35c..8cc26694 100644 --- a/gradle/reprod/checksums.txt +++ b/gradle/reprod/checksums.txt @@ -26,22 +26,22 @@ f539e2ca00d43e3d2261b7334eb05137f0eb1d3d5e3cc2c2716b0071e27783ed /com/github/Min fe525f413965d4f5f65b70f08b90b3d3f944714f665e2c5636a6e8fec08d3c74 /com/github/MinecraftForge/Srg2Source/ea4ea62/Srg2Source-ea4ea62.pom ecf57aab63509ec0ce3937c2215bc3a2e3cb6357cd11095978db18bd3251731a /com/github/ModCoderPack/MCInjector/7258466/MCInjector-7258466.jar dc7ed1f4f0ddd8f5ce3b449db944907a5eb2855dbbbc59b08dad1247ebafba33 /com/github/ModCoderPack/MCInjector/7258466/MCInjector-7258466.pom -70429d88b6f4705ce385491500afa126e936447f992c7d4221d0751e8f0f7c50 /com/github/ReplayMod/ReplayStudio/1.10.2/e6f898d/1.10.2-e6f898d.pom -4d7e34aa0ca77482fb2d4c6617ac556e1c0dfcb1be1e651578200d7198ee3cfc /com/github/ReplayMod/ReplayStudio/1.10.2/e6f898d/1.10.2-e6f898d.jar -c449a20fa5c6365d7c16c3fc3b81fa5f260becc962075d1c02c5a998e4c1c36f /com/github/ReplayMod/ReplayStudio/1.11.2/e6f898d/1.11.2-e6f898d.pom -3feaeb7ddfc841318f842dbd850aff858222ad4abca31ddfffa8c5c2f8c0ae67 /com/github/ReplayMod/ReplayStudio/1.11.2/e6f898d/1.11.2-e6f898d.jar -d55fffd172e435aff8cb31338a7dea43cc7b19eb0af074de0faefad4864f5493 /com/github/ReplayMod/ReplayStudio/1.11/e6f898d/1.11-e6f898d.pom -7fb4e0b0e8e4c0cada73c7091064d50131dfaadf257619f10f391fb8ed341f3c /com/github/ReplayMod/ReplayStudio/1.11/e6f898d/1.11-e6f898d.jar -b758ff30bfc9297a9c13d5ca607fc9096a43682a46951d9ad1cefa5400e4d5fe /com/github/ReplayMod/ReplayStudio/1.12.1/e6f898d/1.12.1-e6f898d.pom -08690338d01adc76e1bbee5077e7f9ab8efa68c78c28b03fafd453ced2528bfe /com/github/ReplayMod/ReplayStudio/1.12.1/e6f898d/1.12.1-e6f898d.jar -561716bffe975418b7bf2067621d931dbd685e9f961d5ce40d1f8841d84570a3 /com/github/ReplayMod/ReplayStudio/1.12.2/e6f898d/1.12.2-e6f898d.pom -0c4e0f20a09925b529795aef86192d90dc94360eefd6b49e7f38d74930e2b7f6 /com/github/ReplayMod/ReplayStudio/1.12.2/e6f898d/1.12.2-e6f898d.jar -b5ccd97d108791fc24627e056116ca05f9e47bfa8a9f1ba4e9d0d730a91460aa /com/github/ReplayMod/ReplayStudio/1.12/e6f898d/1.12-e6f898d.pom -b2126228c5e49c8ed1d7c9da5a59280bfd63c24b0507ee34097c64ee31837ee1 /com/github/ReplayMod/ReplayStudio/1.12/e6f898d/1.12-e6f898d.jar -21cd9c0581ddedd4e7bb2dda9db82b56c2ff5b2b9e71859803fa892fec459fcb /com/github/ReplayMod/ReplayStudio/1.8/e6f898d/1.8-e6f898d.pom -44046515c61f1d2ae73cf37949b460b2e48dfdb70bfcef0c0a09e3a5ad0e8ab9 /com/github/ReplayMod/ReplayStudio/1.8/e6f898d/1.8-e6f898d.jar -481c532b43ddfcb7c9025abf37d2e502935e2343a08c496b029e12826d682de8 /com/github/ReplayMod/ReplayStudio/1.9.4/e6f898d/1.9.4-e6f898d.pom -f2090b2bd7acdff598ef53f1a997572d774752dc6115f176bbe925026d5ac0ab /com/github/ReplayMod/ReplayStudio/1.9.4/e6f898d/1.9.4-e6f898d.jar +5a3ec92e5507df0c39475a7162104bdaebf9846b3ff057bc8beb62b0e600a58b /com/github/ReplayMod/ReplayStudio/1.10.2/6cfc69b/1.10.2-6cfc69b.pom +1e464084d1471e7b11994a62f5b837e8e2d0d2786481c6c63b26c1d91820dd0d /com/github/ReplayMod/ReplayStudio/1.10.2/6cfc69b/1.10.2-6cfc69b.jar +cdae4a16367dd0f6c921e45364fd8a4bc6b8b864a690d30acd97ec5138c4259c /com/github/ReplayMod/ReplayStudio/1.11.2/6cfc69b/1.11.2-6cfc69b.pom +a155ed9db00891c34c4c5032b90f1b959cc3b9beeea1dcbb54c5125ee29cf0a8 /com/github/ReplayMod/ReplayStudio/1.11.2/6cfc69b/1.11.2-6cfc69b.jar +a9d2c26ec4a56ab6714d7887504fffb71b728af91809a2c20b31be0d08e94dc5 /com/github/ReplayMod/ReplayStudio/1.11/6cfc69b/1.11-6cfc69b.pom +49b230872bf25d3568f90bab46a786f58d8c8f9044255f37c53e65b19a321ca0 /com/github/ReplayMod/ReplayStudio/1.11/6cfc69b/1.11-6cfc69b.jar +6acdb31e12dbe3df1e339ca2622484f67f7cd7d7ae55210612f17d028aa4114f /com/github/ReplayMod/ReplayStudio/1.12.2/6cfc69b/1.12.2-6cfc69b.pom +2beee4b8946d787f228ad3a9c2c6fdd9243f0972406d3bbb182b7929c6291170 /com/github/ReplayMod/ReplayStudio/1.12.2/6cfc69b/1.12.2-6cfc69b.jar +2abd042a4465d3efeb636181c66ab58fa8b4165818d80f59f322e06efc69e386 /com/github/ReplayMod/ReplayStudio/1.12.1/6cfc69b/1.12.1-6cfc69b.pom +add89b61bbfd24a2eccffadfa6b5293d8fbb9dd0bde2bc332553208b57faf461 /com/github/ReplayMod/ReplayStudio/1.12.1/6cfc69b/1.12.1-6cfc69b.jar +0dd0ea826dd559d151ffa6d78f90c88fd0b69062f9f34610283144d8bef75f6d /com/github/ReplayMod/ReplayStudio/1.12/6cfc69b/1.12-6cfc69b.pom +d5761025f4ff975753f4f5ae044fb0bba3a0d2e85ac4698c123f3bd80d88bbc5 /com/github/ReplayMod/ReplayStudio/1.12/6cfc69b/1.12-6cfc69b.jar +479a762a47c1bcdaf44586594793b2d6a8f4d12b784826373ab80f52f01b3a24 /com/github/ReplayMod/ReplayStudio/1.8/6cfc69b/1.8-6cfc69b.pom +cd5b202b4f9857147d4a1c5ead57242dccc10daee7895aeeead4155046f307f9 /com/github/ReplayMod/ReplayStudio/1.8/6cfc69b/1.8-6cfc69b.jar +c1e24a8d5dbf77c5f1d0e3d1604a752951ef7036979e4023bbfc7eb08e6e877b /com/github/ReplayMod/ReplayStudio/1.9.4/6cfc69b/1.9.4-6cfc69b.pom +6f734a6825344b818c2d0774410e27e57904c29974a2f8919c4e98e1bdcb82a0 /com/github/ReplayMod/ReplayStudio/1.9.4/6cfc69b/1.9.4-6cfc69b.jar bfdcda4cbf23f28392384818a1417c2d6df687e15ce77530ef96381393102f8a /com/github/SpongePowered/MixinGradle/dcfaf61/MixinGradle-dcfaf61.jar 3552e0c04817d91d1b6671a051d0e1d952c8b6a8eec57b54e829de9fa3ddf002 /com/github/SpongePowered/MixinGradle/dcfaf61/MixinGradle-dcfaf61.pom c6ebd74cd6108b8c372c95b842725ee5bd6d3303ba26cb00f18bc92f80b47956 /com/github/tony19/named-regexp/0.2.3/named-regexp-0.2.3.jar diff --git a/versions/common.gradle b/versions/common.gradle index 8b008d84..bfd388e6 100644 --- a/versions/common.gradle +++ b/versions/common.gradle @@ -61,6 +61,8 @@ if (System.getenv('REPRODUCIBLE_BUILD') == '1') repositories.all convertRepoToHt configurations { shade compile.extendsFrom shade + + shade.exclude group: 'com.google.code.gson', module: 'gson' // provided by MC } dependencies { @@ -79,7 +81,7 @@ dependencies { def studioVersion = project.name if (studioVersion == '1.8.9') studioVersion = '1.8' - shade("com.github.ReplayMod.ReplayStudio:$studioVersion:e6f898d"){ + shade("com.github.ReplayMod.ReplayStudio:$studioVersion:6cfc69b"){ exclude group: 'com.google.guava', module: 'guava' // provided by MC exclude group: 'org.projectlombok', module: 'lombok' // runtime only for @SneakyThrows which isn't used } From 31a9e4eaf6d82cb14f65854c63e448dc6bc314d0 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Thu, 15 Mar 2018 22:17:51 +0100 Subject: [PATCH 08/30] Fix preprocessor not processing ifdef --- versions/preprocessor.gradle | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/versions/preprocessor.gradle b/versions/preprocessor.gradle index 40310f94..5d47dee0 100644 --- a/versions/preprocessor.gradle +++ b/versions/preprocessor.gradle @@ -65,7 +65,10 @@ static def convertSource(Map kws, Map vars, Lis } } } else if (trimmed.startsWith(kws.ifdef)) { - ifStack.push(null) + def result = vars.containsKey(trimmed.substring(kws.ifdef.length())) + ifStack.push(result) + indentStack.push(getIndent(line)) + active &= result } else if (trimmed.startsWith(kws.endif)) { if (ifStack.isEmpty()) { throw new ParserException("Unexpected endif in line $n of $fileName") From 9cdd1bbca848e0adb576854529137caf039fb9e6 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Thu, 15 Mar 2018 22:56:40 +0100 Subject: [PATCH 09/30] Sign jars based on current commit instead of tag --- gradle/reprod/setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/reprod/setup.sh b/gradle/reprod/setup.sh index 1ec58939..791a1b66 100755 --- a/gradle/reprod/setup.sh +++ b/gradle/reprod/setup.sh @@ -44,7 +44,7 @@ popd # Back to root ./gradlew -Preprod $PROXY_SETTINGS -I gradle/reprod/init.gradle "$@" -if [ "$SIGNED_JAR" == "1" ]; then +if [ "$(git blame -p version.txt | head -n1 | cut -d' ' -f1)" == "$(git rev-parse HEAD)" ]; then echo "Trying to fetch signature for resulting jar files.." pushd versions for ver in */; do From 0a26f59c9c5ac6ec72b8bdb758ef126f2d10e28d Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Thu, 15 Mar 2018 23:12:53 +0100 Subject: [PATCH 10/30] Release 2.1.2 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 3e3c2f1e..eca07e4c 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.1.1 +2.1.2 From eb04eb47dc2697f8c8192d385ed9383497c1e518 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Wed, 7 Mar 2018 22:00:30 +0100 Subject: [PATCH 11/30] Add 1.7.10 version --- README.md | 2 - jGui | 2 +- settings.gradle | 2 + .../com/replaymod/compat/ReplayModCompat.java | 14 +- .../DisableBetterSprinting.java | 53 +++++- .../mapwriter/mixin/MixinMinecraft.java | 7 +- .../compat/optifine/DisableFastRender.java | 6 + .../HideInvisibleEntities.java | 7 + .../compat/shaders/ShaderBeginRender.java | 2 + .../compat/shaders/ShaderReflection.java | 2 + .../mixin/MixinShaderEntityRenderer.java | 2 + .../shaders/mixin/MixinShaderRenderChunk.java | 2 + .../mixin/MixinShaderRenderGlobal.java | 2 + .../compat/shaders/mixin/MixinShaders.java | 52 ++++++ .../replaymod/core/GLErrorTransformer.java | 96 ++++++++++ .../core/GLStateTrackerTransformer.java | 107 +++++++++++ .../replaymod/core/KeyBindingRegistry.java | 14 +- .../com/replaymod/core/LoadingPlugin.java | 25 ++- .../java/com/replaymod/core/ReplayMod.java | 123 +++++++++--- .../core/events/SettingsChangedEvent.java | 5 + .../com/replaymod/core/gui/GuiFactory.java | 5 + .../core/handler/MainMenuHandler.java | 11 +- .../com/replaymod/core/utils/ModCompat.java | 27 ++- .../replaymod/core/utils/Restrictions.java | 8 + .../java/com/replaymod/core/utils/Utils.java | 22 ++- .../com/replaymod/core/versions/MCVer.java | 175 +++++++++++++++++- .../com/replaymod/editor/ReplayModEditor.java | 11 +- .../replaymod/editor/handler/GuiHandler.java | 6 +- .../com/replaymod/extras/FullBrightness.java | 8 +- .../com/replaymod/extras/HotkeyButtons.java | 7 +- .../com/replaymod/extras/OpenEyeExtra.java | 7 +- .../com/replaymod/extras/ReplayModExtras.java | 11 +- .../AdvancedScreenshots.java | 7 +- .../ScreenshotRenderer.java | 17 +- .../extras/playeroverview/PlayerOverview.java | 32 +++- .../playeroverview/PlayerOverviewGui.java | 29 ++- .../playeroverview/mixin/MixinRender.java | 23 ++- .../extras/youtube/YoutubeUpload.java | 5 + .../com/replaymod/online/ReplayModOnline.java | 13 +- .../replaymod/online/handler/GuiHandler.java | 6 +- .../player/AbstractTimelinePlayer.java | 6 +- .../player/RealtimeTimelinePlayer.java | 7 + .../replaymod/pathing/player/ReplayTimer.java | 5 + .../pathing/properties/SpectatorProperty.java | 7 + .../recording/ReplayModRecording.java | 15 +- .../recording/gui/GuiRecordingOverlay.java | 10 +- .../handler/ConnectionEventHandler.java | 14 +- .../recording/handler/FMLHandshakeFilter.java | 9 + .../recording/handler/GuiHandler.java | 5 + .../handler/RecordingEventHandler.java | 56 ++++-- .../recording/mixin/MixinGuiScreen.java | 45 +++++ .../mixin/MixinNetHandlerLoginClient.java | 16 +- .../mixin/MixinNetHandlerPlayClient.java | 17 +- .../mixin/MixinNetworkDispatcher.java | 13 +- .../recording/mixin/MixinRenderGlobal.java | 22 ++- .../recording/packet/PacketListener.java | 52 +++++- .../packet/ResourcePackRecorder.java | 103 ++++++++++- .../com/replaymod/render/ReplayModRender.java | 13 +- .../com/replaymod/render/VideoWriter.java | 7 +- .../render/capturer/ODSFrameCapturer.java | 33 ++-- .../render/capturer/OpenGlFrameCapturer.java | 5 + .../replaymod/render/capturer/RenderInfo.java | 2 + .../render/events/ReplayRenderEvent.java | 5 + .../hooks/ChunkLoadingRenderGlobal.java | 2 + .../render/hooks/EntityRendererHandler.java | 17 +- .../render/hooks/GLStateTracker.java | 70 +++++++ .../render/mixin/MixinEffectRenderer.java | 54 +++++- .../render/mixin/MixinEntityRenderer.java | 61 +++++- .../replaymod/render/mixin/MixinFrustum.java | 11 +- .../render/mixin/MixinOpenGlHelper.java | 18 ++ .../render/mixin/MixinRenderGlobal.java | 2 + .../replaymod/render/rendering/Pipelines.java | 18 +- .../render/rendering/VideoRenderer.java | 27 ++- .../replaymod/replay/InputReplayTimer.java | 43 ++++- .../com/replaymod/replay/NoGuiScreenshot.java | 7 +- .../com/replaymod/replay/ReplayHandler.java | 69 +++++-- .../com/replaymod/replay/ReplayModReplay.java | 14 +- .../com/replaymod/replay/ReplaySender.java | 72 ++++++- .../replaymod/replay/camera/CameraEntity.java | 109 ++++++++--- .../camera/ClassicCameraController.java | 2 +- .../camera/SpectatorCameraController.java | 6 +- .../camera/VanillaCameraController.java | 4 +- .../replay/events/ReplayChatMessageEvent.java | 6 + .../replay/events/ReplayCloseEvent.java | 5 + .../events/ReplayDispatchKeypressesEvent.java | 5 + .../replay/events/ReplayOpenEvent.java | 5 + .../replay/gui/overlay/GuiReplayOverlay.java | 10 +- .../replay/gui/screen/GuiOpeningReplay.java | 19 ++ .../replaymod/replay/handler/GuiHandler.java | 6 +- .../replay/mixin/MixinGuiSpectator.java | 2 + .../replay/mixin/MixinPlayerControllerMP.java | 31 +++- .../replay/mixin/MixinRenderArrow.java | 2 + .../replay/mixin/MixinRenderManager.java | 2 + .../MixinTileEntityEndPortalRenderer.java | 15 +- .../replay/mixin/MixinViewFrustum.java | 2 + .../restrictions/ReplayModRestrictions.java | 24 ++- .../simplepathing/ReplayModSimplePathing.java | 13 +- .../simplepathing/gui/GuiPathing.java | 10 +- .../simplepathing/preview/PathPreview.java | 7 +- .../preview/PathPreviewRenderer.java | 29 ++- src/main/resources/META-INF/replaymod_at.cfg | 5 + .../mixins.compat.shaders.replaymod.json | 4 + .../resources/mixins.recording.replaymod.json | 3 + .../resources/mixins.render.replaymod.json | 4 + .../resources/mixins.replay.replaymod.json | 8 +- versions/common.gradle | 89 +++++++-- 106 files changed, 2083 insertions(+), 251 deletions(-) create mode 100644 src/main/java/com/replaymod/compat/shaders/mixin/MixinShaders.java create mode 100644 src/main/java/com/replaymod/core/GLErrorTransformer.java create mode 100644 src/main/java/com/replaymod/core/GLStateTrackerTransformer.java create mode 100644 src/main/java/com/replaymod/recording/mixin/MixinGuiScreen.java create mode 100644 src/main/java/com/replaymod/render/hooks/GLStateTracker.java create mode 100644 src/main/java/com/replaymod/render/mixin/MixinOpenGlHelper.java create mode 100644 src/main/java/com/replaymod/replay/gui/screen/GuiOpeningReplay.java diff --git a/README.md b/README.md index e69e18e4..cc6f2ed1 100644 --- a/README.md +++ b/README.md @@ -37,8 +37,6 @@ The `stable` branch contains the most recent release. The `master` branch is solely to be used for the `version.json` file that contains a list of all versions used by the clients to check for updates of this mod. -The MC 1.7.10 version is currently completely separate on `1.7.10` and `1.7.10-dev` due to its huge differences with any current versions. - ### The Preprocessor To support multiple Minecraft versions with the ReplayMod, a [JCP](https://github.com/raydac/java-comment-preprocessor)-inspired preprocessor is used: ```java diff --git a/jGui b/jGui index 09903370..09713104 160000 --- a/jGui +++ b/jGui @@ -1 +1 @@ -Subproject commit 09903370897bf50f7994baa79ae38b9d73e5ce3e +Subproject commit 097131041b4293245820b6f9b46271b5d5f4a830 diff --git a/settings.gradle b/settings.gradle index 51d3540f..f67c539b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,6 +1,7 @@ include ':jGui' [ 'core', + '1.7.10', '1.8', '1.8.9', '1.9.4', @@ -15,6 +16,7 @@ include ':jGui' def versions = [ 'core', + '1.7.10', '1.8', '1.8.9', '1.9.4', diff --git a/src/main/java/com/replaymod/compat/ReplayModCompat.java b/src/main/java/com/replaymod/compat/ReplayModCompat.java index 04ecc728..725f6c19 100644 --- a/src/main/java/com/replaymod/compat/ReplayModCompat.java +++ b/src/main/java/com/replaymod/compat/ReplayModCompat.java @@ -3,12 +3,20 @@ package com.replaymod.compat; import com.replaymod.compat.bettersprinting.DisableBetterSprinting; import com.replaymod.compat.optifine.DisableFastRender; import com.replaymod.compat.oranges17animations.HideInvisibleEntities; +import org.apache.logging.log4j.Logger; + +//#if MC>=10800 import com.replaymod.compat.shaders.ShaderBeginRender; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.eventhandler.EventBus; -import org.apache.logging.log4j.Logger; +//#else +//$$ import cpw.mods.fml.common.Mod; +//$$ import cpw.mods.fml.common.event.FMLInitializationEvent; +//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent; +//$$ import cpw.mods.fml.common.eventhandler.EventBus; +//#endif import static com.replaymod.core.versions.MCVer.*; @@ -16,7 +24,9 @@ import static com.replaymod.core.versions.MCVer.*; version = "@MOD_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@", acceptableRemoteVersions = "*", + //#if MC>=10800 clientSideOnly = true, + //#endif useMetadata = true) public class ReplayModCompat { public static final String MOD_ID = "replaymod-compat"; @@ -31,7 +41,9 @@ public class ReplayModCompat { @Mod.EventHandler public void init(FMLInitializationEvent event) { EventBus bus = FML_BUS; + //#if MC>=10800 bus.register(new ShaderBeginRender()); + //#endif bus.register(new DisableFastRender()); bus.register(new HideInvisibleEntities()); DisableBetterSprinting.register(); diff --git a/src/main/java/com/replaymod/compat/bettersprinting/DisableBetterSprinting.java b/src/main/java/com/replaymod/compat/bettersprinting/DisableBetterSprinting.java index 7c185658..b7c4f227 100644 --- a/src/main/java/com/replaymod/compat/bettersprinting/DisableBetterSprinting.java +++ b/src/main/java/com/replaymod/compat/bettersprinting/DisableBetterSprinting.java @@ -8,13 +8,6 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.client.event.GuiOpenEvent; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.common.ModContainer; -import net.minecraftforge.fml.common.eventhandler.EventPriority; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.versioning.DefaultArtifactVersion; -import net.minecraftforge.fml.common.versioning.Restriction; -import net.minecraftforge.fml.common.versioning.VersionRange; //#if MC>=10904 import net.minecraft.block.state.IBlockState; @@ -26,10 +19,30 @@ import net.minecraft.world.World; import javax.annotation.Nullable; //#else +//#if MC>= 10800 //$$ import net.minecraft.util.BlockPos; +//#endif //$$ import net.minecraft.world.IWorldAccess; //#endif +//#if MC>=10800 +import net.minecraftforge.fml.common.Loader; +import net.minecraftforge.fml.common.ModContainer; +import net.minecraftforge.fml.common.eventhandler.EventPriority; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.versioning.DefaultArtifactVersion; +import net.minecraftforge.fml.common.versioning.Restriction; +import net.minecraftforge.fml.common.versioning.VersionRange; +//#else +//$$ import cpw.mods.fml.common.Loader; +//$$ import cpw.mods.fml.common.ModContainer; +//$$ import cpw.mods.fml.common.eventhandler.EventPriority; +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//$$ import cpw.mods.fml.common.versioning.DefaultArtifactVersion; +//$$ import cpw.mods.fml.common.versioning.Restriction; +//$$ import cpw.mods.fml.common.versioning.VersionRange; +//#endif + import java.util.Collections; import static com.replaymod.compat.ReplayModCompat.LOGGER; @@ -106,7 +119,11 @@ public class DisableBetterSprinting { //#endif { @Override + //#if MC>=10800 public void onEntityRemoved(Entity entityIn) { + //#else + //$$ public void onEntityDestroy(Entity entityIn) { + //#endif if (mc.playerController != null && mc.playerController.getClass().getName().equals(CONTROLLER_OVERRIDE_CLASS_NAME)) { // Someone has secretly swapped out the player controller and is about to substitute their own player entity. // This is the right time to destroy their plan. @@ -115,12 +132,21 @@ public class DisableBetterSprinting { } } - @Override public void notifyLightSet(BlockPos pos) {} @Override public void markBlockRangeForRenderUpdate(int x1, int y1, int z1, int x2, int y2, int z2) {} + //#if MC>=10800 + @Override public void notifyLightSet(BlockPos pos) {} @Override public void spawnParticle(int p_180442_1_, boolean p_180442_2_, double p_180442_3_, double p_180442_5_, double p_180442_7_, double p_180442_9_, double p_180442_11_, double p_180442_13_, int... p_180442_15_) {} @Override public void onEntityAdded(Entity entityIn) {} @Override public void broadcastSound(int p_180440_1_, BlockPos p_180440_2_, int p_180440_3_) {} @Override public void sendBlockBreakProgress(int breakerId, BlockPos pos, int progress) {} + //#else + //$$ @Override public void markBlockForRenderUpdate(int x, int y, int z) {} + //$$ @Override public void spawnParticle(String p_72708_1_, double p_72708_2_, double p_72708_4_, double p_72708_6_, double p_72708_8_, double p_72708_10_, double p_72708_12_) {} + //$$ @Override public void onEntityCreate(Entity entityIn) {} + //$$ @Override public void broadcastSound(int p_180440_1_, int x, int y, int z, int p_180440_3_) {} + //$$ @Override public void destroyBlockPartially(int breakerId, int x, int y, int z, int progress) {} + //$$ @Override public void onStaticEntitiesChanged() {} + //#endif //#if MC>=10904 @Override public void notifyBlockUpdate(World worldIn, BlockPos pos, IBlockState oldState, IBlockState newState, int flags) {} @Override public void playSoundToAllNearExcept(@Nullable EntityPlayer player, SoundEvent soundIn, SoundCategory category, double x, double y, double z, float volume, float pitch) {} @@ -134,14 +160,23 @@ public class DisableBetterSprinting { //#endif //#endif //#else + //#if MC>=10800 //$$ @Override public void markBlockForUpdate(BlockPos pos) {} + //$$ @Override public void playRecord(String recordName, BlockPos blockPosIn) {} + //#else + //$$ @Override public void markBlockForUpdate(int x, int y, int z) {} + //$$ @Override public void playRecord(String recordName, int x, int y, int z) {} + //#endif //$$ @Override public void playSound(String soundName, double x, double y, double z, float volume, float pitch) {} //$$ @Override public void playSoundToNearExcept(EntityPlayer except, String soundName, double x, double y, double z, float volume, float pitch) {} - //$$ @Override public void playRecord(String recordName, BlockPos blockPosIn) {} //#if MC>=10809 //$$ @Override public void playAuxSFX(EntityPlayer p_180439_1_, int p_180439_2_, BlockPos blockPosIn, int p_180439_4_) {} //#else + //#if MC>=10800 //$$ @Override public void playAusSFX(EntityPlayer p_180439_1_, int p_180439_2_, BlockPos blockPosIn, int p_180439_4_) {} + //#else + //$$ @Override public void playAuxSFX(EntityPlayer p_72706_1_, int p_72706_2_, int p_72706_3_, int p_72706_4_, int p_72706_5_, int p_72706_6_) {} + //#endif //#endif //#endif } diff --git a/src/main/java/com/replaymod/compat/mapwriter/mixin/MixinMinecraft.java b/src/main/java/com/replaymod/compat/mapwriter/mixin/MixinMinecraft.java index 3c2d7554..7a4a792c 100644 --- a/src/main/java/com/replaymod/compat/mapwriter/mixin/MixinMinecraft.java +++ b/src/main/java/com/replaymod/compat/mapwriter/mixin/MixinMinecraft.java @@ -3,13 +3,18 @@ package com.replaymod.compat.mapwriter.mixin; import com.replaymod.replay.ReplayModReplay; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ServerData; -import net.minecraftforge.fml.common.Loader; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +//#if MC>=10800 +import net.minecraftforge.fml.common.Loader; +//#else +//$$ import cpw.mods.fml.common.Loader; +//#endif + /** * Approximately this for <1.12: https://github.com/Vectron/mapwriter/commit/68234520c7a3a0ae8201a085d7e66369900586ac */ diff --git a/src/main/java/com/replaymod/compat/optifine/DisableFastRender.java b/src/main/java/com/replaymod/compat/optifine/DisableFastRender.java index 5dec6a94..180626ae 100644 --- a/src/main/java/com/replaymod/compat/optifine/DisableFastRender.java +++ b/src/main/java/com/replaymod/compat/optifine/DisableFastRender.java @@ -2,8 +2,14 @@ package com.replaymod.compat.optifine; import com.replaymod.render.events.ReplayRenderEvent; import net.minecraft.client.Minecraft; + +//#if MC>=10800 import net.minecraftforge.fml.client.FMLClientHandler; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.client.FMLClientHandler; +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif public class DisableFastRender { diff --git a/src/main/java/com/replaymod/compat/oranges17animations/HideInvisibleEntities.java b/src/main/java/com/replaymod/compat/oranges17animations/HideInvisibleEntities.java index 3544f413..63fa36f5 100644 --- a/src/main/java/com/replaymod/compat/oranges17animations/HideInvisibleEntities.java +++ b/src/main/java/com/replaymod/compat/oranges17animations/HideInvisibleEntities.java @@ -3,9 +3,16 @@ package com.replaymod.compat.oranges17animations; import com.replaymod.replay.camera.CameraEntity; import net.minecraft.client.Minecraft; import net.minecraftforge.client.event.RenderLivingEvent; + +//#if MC>=10800 import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.common.Loader; +//$$ import cpw.mods.fml.common.eventhandler.EventPriority; +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif import static com.replaymod.core.versions.MCVer.*; diff --git a/src/main/java/com/replaymod/compat/shaders/ShaderBeginRender.java b/src/main/java/com/replaymod/compat/shaders/ShaderBeginRender.java index d74d570c..7079b1bc 100644 --- a/src/main/java/com/replaymod/compat/shaders/ShaderBeginRender.java +++ b/src/main/java/com/replaymod/compat/shaders/ShaderBeginRender.java @@ -1,3 +1,4 @@ +//#if MC>=10800 package com.replaymod.compat.shaders; import com.replaymod.render.hooks.EntityRendererHandler; @@ -37,3 +38,4 @@ public class ShaderBeginRender { } } +//#endif diff --git a/src/main/java/com/replaymod/compat/shaders/ShaderReflection.java b/src/main/java/com/replaymod/compat/shaders/ShaderReflection.java index 63b07ebf..387874fd 100644 --- a/src/main/java/com/replaymod/compat/shaders/ShaderReflection.java +++ b/src/main/java/com/replaymod/compat/shaders/ShaderReflection.java @@ -1,3 +1,4 @@ +//#if MC>=10800 package com.replaymod.compat.shaders; import net.minecraft.client.Minecraft; @@ -51,3 +52,4 @@ public class ShaderReflection { } } } +//#endif diff --git a/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaderEntityRenderer.java b/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaderEntityRenderer.java index 358ff118..2f2dad10 100644 --- a/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaderEntityRenderer.java +++ b/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaderEntityRenderer.java @@ -1,3 +1,4 @@ +//#if MC>=10800 package com.replaymod.compat.shaders.mixin; import com.replaymod.compat.shaders.ShaderReflection; @@ -26,3 +27,4 @@ public abstract class MixinShaderEntityRenderer { } } } +//#endif diff --git a/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaderRenderChunk.java b/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaderRenderChunk.java index 986e8025..34395dd7 100644 --- a/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaderRenderChunk.java +++ b/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaderRenderChunk.java @@ -1,3 +1,4 @@ +//#if MC>=10800 package com.replaymod.compat.shaders.mixin; import com.replaymod.render.hooks.EntityRendererHandler; @@ -27,3 +28,4 @@ public abstract class MixinShaderRenderChunk { } +//#endif diff --git a/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaderRenderGlobal.java b/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaderRenderGlobal.java index be69cf00..15cafb72 100644 --- a/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaderRenderGlobal.java +++ b/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaderRenderGlobal.java @@ -1,3 +1,4 @@ +//#if MC>=10800 package com.replaymod.compat.shaders.mixin; import com.replaymod.compat.shaders.ShaderReflection; @@ -38,3 +39,4 @@ public abstract class MixinShaderRenderGlobal { } } +//#endif diff --git a/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaders.java b/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaders.java new file mode 100644 index 00000000..d14764d2 --- /dev/null +++ b/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaders.java @@ -0,0 +1,52 @@ +//#if MC<=10710 +//$$ package com.replaymod.compat.shaders.mixin; +//$$ +//$$ import com.replaymod.render.hooks.EntityRendererHandler; +//$$ import com.replaymod.replay.ReplayHandler; +//$$ import com.replaymod.replay.ReplayModReplay; +//$$ import net.minecraft.client.Minecraft; +//$$ import org.spongepowered.asm.mixin.Mixin; +//$$ import org.spongepowered.asm.mixin.Pseudo; +//$$ import org.spongepowered.asm.mixin.Shadow; +//$$ import org.spongepowered.asm.mixin.injection.At; +//$$ import org.spongepowered.asm.mixin.injection.Redirect; +//$$ +//$$ @Pseudo +//$$ @Mixin(targets = "shadersmod/client/Shaders", remap = false) +//$$ public abstract class MixinShaders { +//$$ +//$$ @Shadow static Minecraft mc; +//$$ @Shadow static long systemTime; +//$$ @Shadow static long lastSystemTime; +//$$ @Shadow static long diffSystemTime; +//$$ @Shadow static int frameCounter; +//$$ @Shadow static float frameTime; +//$$ @Shadow static float frameTimeCounter; +//$$ +//$$ @Redirect(method = "beginRender", at = @At(value = "INVOKE", target = "Ljava/lang/System;currentTimeMillis()J")) +//$$ private static long replayModCompat_currentTimeMillis() { +//$$ ReplayHandler replayHandler = ReplayModReplay.instance.getReplayHandler(); +//$$ if (replayHandler != null) { +//$$ systemTime = replayHandler.getReplaySender().currentTimeStamp(); +//$$ +//$$ // We need to manipulate all the other previous-frame-time-based variables too +//$$ +//$$ lastSystemTime = 0; // Draw all frames as if they were the first ones +//$$ // diffSystemTime will be set to 0 by Shaders +//$$ // frameTime will be set to 0 by Shaders +//$$ frameTimeCounter = systemTime / 1000f; // will be %= 3600f by Shaders +//$$ +//$$ // Set frameCounter only if rendering is in progress +//$$ EntityRendererHandler entityRendererHandler = +//$$ ((EntityRendererHandler.IEntityRenderer) mc.entityRenderer).replayModRender_getHandler(); +//$$ if (entityRendererHandler != null) { +//$$ frameCounter = entityRendererHandler.getRenderInfo().getFramesDone(); +//$$ } +//$$ +//$$ return systemTime; +//$$ } +//$$ return System.currentTimeMillis(); +//$$ } +//$$ +//$$ } +//#endif diff --git a/src/main/java/com/replaymod/core/GLErrorTransformer.java b/src/main/java/com/replaymod/core/GLErrorTransformer.java new file mode 100644 index 00000000..91dc3c46 --- /dev/null +++ b/src/main/java/com/replaymod/core/GLErrorTransformer.java @@ -0,0 +1,96 @@ +//#if MC<=10710 +//$$ package com.replaymod.core; +//$$ +//$$ import net.minecraft.launchwrapper.IClassTransformer; +//$$ import org.lwjgl.opengl.GL11; +//$$ import org.lwjgl.util.glu.GLU; +//$$ import org.objectweb.asm.ClassReader; +//$$ import org.objectweb.asm.ClassVisitor; +//$$ import org.objectweb.asm.ClassWriter; +//$$ import org.objectweb.asm.MethodVisitor; +//$$ import org.objectweb.asm.Opcodes; +//$$ +//$$ /** +//$$ * Insert glGetError checks after all calls to any method in any GL*, ARB* and EXT* classes +//$$ */ +//$$ public class GLErrorTransformer implements IClassTransformer { +//$$ private static final String GL_CLASS = "org.lwjgl.opengl.GL"; +//$$ private static final String GL = GL_CLASS.replace('.', '/'); +//$$ private static final String ARB_CLASS = "org.lwjgl.opengl.ARB"; +//$$ private static final String ARB = ARB_CLASS.replace('.', '/'); +//$$ private static final String EXT_CLASS = "org.lwjgl.opengl.EXT"; +//$$ private static final String EXT = EXT_CLASS.replace('.', '/'); +//$$ private static final String GLErrorTransformer_CLASS = GLErrorTransformer.class.getName(); +//$$ private static final String GLErrorTransformer = GLErrorTransformer_CLASS.replace('.', '/'); +//$$ +//$$ @Override +//$$ public byte[] transform(String name, String transformedName, byte[] basicClass) { +//$$ // Ignore (anonymous) inner classes of this transformer +//$$ if (name.startsWith(GLErrorTransformer_CLASS)) return basicClass; +//$$ +//$$ ClassReader reader = new ClassReader(basicClass); +//$$ ClassWriter writer = new ClassWriter(reader, 0); +//$$ reader.accept(new ClassVisitor(Opcodes.ASM5, writer) { +//$$ @Override +//$$ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { +//$$ MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); +//$$ return new MethodVisitor(Opcodes.ASM5, mv) { +//$$ @Override +//$$ public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { +//$$ super.visitMethodInsn(opcode, owner, name, desc, itf); +//$$ if (owner.startsWith(GL) || owner.startsWith(ARB) || owner.startsWith(EXT)) { +//$$ visitLdcInsn(owner.replace('/', '.')); +//$$ visitLdcInsn(name); +//$$ super.visitMethodInsn(Opcodes.INVOKESTATIC, GLErrorTransformer, "glErrorCheck", "(Ljava/lang/String;Ljava/lang/String;)V", false); +//$$ } +//$$ } +//$$ +//$$ @Override +//$$ public void visitMaxs(int maxStack, int maxLocals) { +//$$ super.visitMaxs(maxStack + 2, maxLocals); +//$$ } +//$$ }; +//$$ } +//$$ }, 0); +//$$ return writer.toByteArray(); +//$$ } +//$$ +//$$ private static boolean inGlBegin; +//$$ +//$$ @SuppressWarnings("unused") // Called via ASM +//$$ public static void glErrorCheck(String cls, String method) { +//$$ if (method.equals("glBegin") && cls.equals(GL_CLASS + "11")) { +//$$ if (inGlBegin) { +//$$ // glBegin within glBegin +//$$ throw new GLError(GL11.GL_INVALID_OPERATION, cls, method); +//$$ } +//$$ inGlBegin = true; +//$$ return; +//$$ } +//$$ if (inGlBegin && method.equals("glEnd") && cls.equals(GL_CLASS + "11")) { +//$$ inGlBegin = false; +//$$ } +//$$ if (inGlBegin) { +//$$ return; // Cannot call glGetError in between of glBegin and glEnd +//$$ } +//$$ int err = GL11.glGetError(); +//$$ if (err != 0) { +//$$ GLError e = new GLError(err, cls, method); +//$$ if ("true".equals(System.getProperty("replaymod.glerrors.throw", "true"))) { +//$$ throw e; +//$$ } else { +//$$ e.printStackTrace(); +//$$ } +//$$ } +//$$ } +//$$ +//$$ public static class GLError extends RuntimeException { +//$$ private GLError(int err, String cls, String method) { +//$$ super(GLU.gluErrorString(err) + " (" + err + ")"); +//$$ StackTraceElement[] stack = getStackTrace(); +//$$ stack[0] = new StackTraceElement(cls, method, stack[0].getFileName(), stack[0].getLineNumber()); +//$$ setStackTrace(stack); +//$$ } +//$$ } +//$$ } +//#endif diff --git a/src/main/java/com/replaymod/core/GLStateTrackerTransformer.java b/src/main/java/com/replaymod/core/GLStateTrackerTransformer.java new file mode 100644 index 00000000..47910f13 --- /dev/null +++ b/src/main/java/com/replaymod/core/GLStateTrackerTransformer.java @@ -0,0 +1,107 @@ +//#if MC<=10710 +//$$ package com.replaymod.core; +//$$ +//$$ import net.minecraft.launchwrapper.IClassTransformer; +//$$ import org.objectweb.asm.ClassReader; +//$$ import org.objectweb.asm.ClassVisitor; +//$$ import org.objectweb.asm.ClassWriter; +//$$ import org.objectweb.asm.MethodVisitor; +//$$ import org.objectweb.asm.Opcodes; +//$$ +//$$ import java.util.HashSet; +//$$ import java.util.Set; +//$$ +//$$ /** +//$$ * Redirect all calls to GL11.glEnable and GL11.glDisable to the GLStateTracker (excluding that class itself). +//$$ */ +//$$ public class GLStateTrackerTransformer implements IClassTransformer { +//$$ private static final String GL11_CLASS = "org.lwjgl.opengl.GL11"; +//$$ private static final String GL11 = GL11_CLASS.replace('.', '/'); +//$$ private static final String glEnable = "glEnable"; +//$$ private static final String glDisable = "glDisable"; +//$$ private static final String GLStateTracker_CLASS = "com.replaymod.render.hooks.GLStateTracker"; +//$$ private static final String GLStateTracker = GLStateTracker_CLASS.replace('.', '/'); +//$$ private static final String hook_glEnable = "hook_glEnable"; +//$$ private static final String hook_glDisable = "hook_glDisable"; +//$$ +//$$ @Override +//$$ public byte[] transform(String name, String transformedName, byte[] basicClass) { +//$$ // Ignore (anonymous) inner classes of this transformer +//$$ if (name.startsWith(GLStateTrackerTransformer.class.getName())) return basicClass; +//$$ // Ignore the state tracker itself +//$$ if (name.equals(GLStateTracker_CLASS)) return basicClass; +//$$ +//$$ ClassReader reader = new ClassReader(basicClass); +//$$ Set eligibleMethods = findEligibleMethods(reader); +//$$ if (eligibleMethods.isEmpty()) { +//$$ return basicClass; +//$$ } +//$$ +//$$ ClassWriter writer = new ClassWriter(reader, 0); +//$$ reader.accept(new ClassVisitor(Opcodes.ASM5, writer) { +//$$ @Override +//$$ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { +//$$ MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); +//$$ if (!eligibleMethods.contains(new Method(name, desc))) { +//$$ return mv; +//$$ } +//$$ return new MethodVisitor(Opcodes.ASM5, mv) { +//$$ @Override +//$$ public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { +//$$ if (owner.equals(GL11)) { +//$$ if (name.equals(glEnable)) { +//$$ owner = GLStateTracker; +//$$ name = hook_glEnable; +//$$ } else if (name.equals(glDisable)) { +//$$ owner = GLStateTracker; +//$$ name = hook_glDisable; +//$$ } +//$$ } +//$$ super.visitMethodInsn(opcode, owner, name, desc, itf); +//$$ } +//$$ }; +//$$ } +//$$ }, 0); +//$$ return writer.toByteArray(); +//$$ } +//$$ +//$$ private Set findEligibleMethods(ClassReader reader) { +//$$ Set eligibleMethods = new HashSet<>(); +//$$ reader.accept(new ClassVisitor(Opcodes.ASM5) { +//$$ @Override +//$$ public MethodVisitor visitMethod(int access, String methodName, String methodDesc, String signature, String[] exceptions) { +//$$ return new MethodVisitor(Opcodes.ASM5) { +//$$ @Override +//$$ public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { +//$$ if (owner.equals(GL11) && (name.equals(glEnable) || name.equals(glDisable))) { +//$$ eligibleMethods.add(new Method(methodName, methodDesc)); +//$$ } +//$$ } +//$$ }; +//$$ } +//$$ }, ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES); +//$$ return eligibleMethods; +//$$ } +//$$ +//$$ private static class Method { +//$$ private final String name, desc; +//$$ +//$$ private Method(String name, String desc) { +//$$ this.name = name; +//$$ this.desc = desc; +//$$ } +//$$ +//$$ @Override +//$$ public boolean equals(Object o) { +//$$ if (o == null || getClass() != o.getClass()) return false; +//$$ Method method = (Method) o; +//$$ return name.equals(method.name) && desc.equals(method.desc); +//$$ } +//$$ +//$$ @Override +//$$ public int hashCode() { +//$$ return name.hashCode() ^ desc.hashCode(); +//$$ } +//$$ } +//$$ } +//#endif diff --git a/src/main/java/com/replaymod/core/KeyBindingRegistry.java b/src/main/java/com/replaymod/core/KeyBindingRegistry.java index c09c0418..1f02e0c3 100644 --- a/src/main/java/com/replaymod/core/KeyBindingRegistry.java +++ b/src/main/java/com/replaymod/core/KeyBindingRegistry.java @@ -7,17 +7,27 @@ import net.minecraft.client.settings.KeyBinding; import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReportCategory; import net.minecraft.util.ReportedException; +import org.lwjgl.input.Keyboard; + +//#if MC>=10800 import net.minecraftforge.fml.client.registry.ClientRegistry; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.InputEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; -import org.lwjgl.input.Keyboard; +//#else +//$$ import cpw.mods.fml.client.registry.ClientRegistry; +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//$$ import cpw.mods.fml.common.gameevent.InputEvent; +//$$ import cpw.mods.fml.common.gameevent.TickEvent; +//#endif import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import static com.replaymod.core.versions.MCVer.*; + public class KeyBindingRegistry { private Map keyBindings = new HashMap(); private Multimap keyBindingHandlers = ArrayListMultimap.create(); @@ -64,7 +74,7 @@ public class KeyBindingRegistry { public void handleRepeatedKeyBindings() { for (Map.Entry> entry : repeatedKeyBindingHandlers.asMap().entrySet()) { - if (entry.getKey().isKeyDown()) { + if (isKeyDown(entry.getKey())) { invokeKeyBindingHandlers(entry.getKey(), entry.getValue()); } } diff --git a/src/main/java/com/replaymod/core/LoadingPlugin.java b/src/main/java/com/replaymod/core/LoadingPlugin.java index a633a6bf..a15b9c96 100755 --- a/src/main/java/com/replaymod/core/LoadingPlugin.java +++ b/src/main/java/com/replaymod/core/LoadingPlugin.java @@ -1,11 +1,20 @@ package com.replaymod.core; -import net.minecraftforge.fml.relauncher.CoreModManager; -import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin; import org.apache.logging.log4j.LogManager; import org.spongepowered.asm.launch.MixinBootstrap; import org.spongepowered.asm.mixin.Mixins; +//#if MC>=10800 +import net.minecraftforge.fml.relauncher.CoreModManager; +import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin; +//#else +//$$ import cpw.mods.fml.relauncher.CoreModManager; +//$$ import cpw.mods.fml.relauncher.IFMLLoadingPlugin; +//$$ +//$$ import java.util.ArrayList; +//$$ import java.util.List; +//#endif + import java.io.File; import java.net.URISyntaxException; import java.net.URL; @@ -35,6 +44,9 @@ public class LoadingPlugin implements IFMLLoadingPlugin { CoreModManager.getIgnoredMods().remove(file.getName()); //#else //$$ CoreModManager.getLoadedCoremods().remove(file.getName()); + //#if MC<=10710 + //$$ CoreModManager.getReparseableCoremods().add(file.getName()); + //#endif //#endif } } catch (URISyntaxException e) { @@ -48,8 +60,17 @@ public class LoadingPlugin implements IFMLLoadingPlugin { @Override public String[] getASMTransformerClass() { + //#if MC>=10800 return new String[]{ }; + //#else + //$$ List transformers = new ArrayList<>(); + //$$ if ("true".equals(System.getProperty("replaymod.glerrors", "false"))) { + //$$ transformers.add(GLErrorTransformer.class.getName()); + //$$ } + //$$ transformers.add(GLStateTrackerTransformer.class.getName()); + //$$ return transformers.stream().toArray(String[]::new); + //#endif } @Override diff --git a/src/main/java/com/replaymod/core/ReplayMod.java b/src/main/java/com/replaymod/core/ReplayMod.java index 23b4cba3..86c43a4b 100755 --- a/src/main/java/com/replaymod/core/ReplayMod.java +++ b/src/main/java/com/replaymod/core/ReplayMod.java @@ -12,11 +12,23 @@ import lombok.Getter; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.FolderResourcePack; import net.minecraft.client.resources.IResourcePack; -import net.minecraft.client.settings.GameSettings; -import net.minecraft.crash.CrashReport; -import net.minecraft.crash.CrashReportCategory; import net.minecraft.util.ResourceLocation; import net.minecraftforge.common.config.Configuration; +import org.apache.commons.io.Charsets; +import org.apache.commons.io.FileUtils; + +//#if MC>=10904 +import net.minecraft.util.text.*; +//#else +//$$ import net.minecraft.util.ChatComponentText; +//$$ import net.minecraft.util.ChatComponentTranslation; +//$$ import net.minecraft.util.ChatStyle; +//$$ import net.minecraft.util.EnumChatFormatting; +//$$ import net.minecraft.util.IChatComponent; +//#endif + +//#if MC>=10800 +import net.minecraft.client.settings.GameSettings; import net.minecraftforge.fml.client.FMLClientHandler; import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.Mod; @@ -29,17 +41,21 @@ import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.eventhandler.EventBus; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; -import org.apache.commons.io.Charsets; -import org.apache.commons.io.FileUtils; - -//#if MC>=10904 -import net.minecraft.util.text.*; //#else -//$$ import net.minecraft.util.ChatComponentText; -//$$ import net.minecraft.util.ChatComponentTranslation; -//$$ import net.minecraft.util.ChatStyle; -//$$ import net.minecraft.util.EnumChatFormatting; -//$$ import net.minecraft.util.IChatComponent; +//$$ import cpw.mods.fml.common.Loader; +//$$ import cpw.mods.fml.common.Mod; +//$$ import cpw.mods.fml.common.Mod.EventHandler; +//$$ import cpw.mods.fml.common.Mod.Instance; +//$$ import cpw.mods.fml.common.ModContainer; +//$$ import cpw.mods.fml.common.event.FMLInitializationEvent; +//$$ import cpw.mods.fml.common.event.FMLPostInitializationEvent; +//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent; +//$$ import cpw.mods.fml.common.eventhandler.EventBus; +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//$$ import cpw.mods.fml.common.gameevent.TickEvent; +//$$ import com.replaymod.replay.InputReplayTimer; +//$$ +//$$ import java.util.ArrayDeque; //#endif import java.io.ByteArrayInputStream; @@ -57,8 +73,10 @@ import static com.replaymod.core.versions.MCVer.*; version = "@MOD_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@", acceptableRemoteVersions = "*", + //#if MC>=10800 clientSideOnly = true, updateJSON = "https://raw.githubusercontent.com/ReplayMod/ReplayMod/master/versions.json", + //#endif guiFactory = "com.replaymod.core.gui.GuiFactory") public class ReplayMod { @@ -67,18 +85,7 @@ public class ReplayMod { } @Getter(lazy = true) - private static final String minecraftVersion = parseMinecraftVersion(); - private static String parseMinecraftVersion() { - CrashReport crashReport = new CrashReport("", new Throwable()); - @SuppressWarnings("unchecked") - List list = crashReport.getCategory().children; - for (CrashReportCategory.Entry entry : list) { - if ("Minecraft Version".equals(entry.getKey())) { - return entry.getValue(); - } - } - return "Unknown"; - } + private static final String minecraftVersion = Loader.MC_VERSION; public static final String MOD_ID = "replaymod"; @@ -127,6 +134,8 @@ public class ReplayMod { //#ifdef DEV_ENV static { // Note: even preInit is too late and we'd have to issue another resource reload + @SuppressWarnings("unchecked") + List defaultResourcePacks = mc.defaultResourcePacks; FolderResourcePack jGuiResourcePack = new FolderResourcePack(new File("../jGui/src/main/resources")) { @Override protected InputStream getInputStreamByName(String resourceName) throws IOException { @@ -140,9 +149,23 @@ public class ReplayMod { } } }; - @SuppressWarnings("unchecked") - List defaultResourcePacks = mc.defaultResourcePacks; defaultResourcePacks.add(jGuiResourcePack); + //#if MC<=10710 + //$$ FolderResourcePack mainResourcePack = new FolderResourcePack(new File("../src/main/resources")) { + //$$ @Override + //$$ protected InputStream getInputStreamByName(String resourceName) throws IOException { + //$$ try { + //$$ return super.getInputStreamByName(resourceName); + //$$ } catch (IOException e) { + //$$ if ("pack.mcmeta".equals(resourceName)) { + //$$ return new ByteArrayInputStream(("{\"pack\": {\"description\": \"dummy pack for mod resources in dev-env\", \"pack_format\": 1}}").getBytes(Charsets.UTF_8)); + //$$ } + //$$ throw e; + //$$ } + //$$ } + //$$ }; + //$$ defaultResourcePacks.add(mainResourcePack); + //#endif } //#endif @@ -152,6 +175,9 @@ public class ReplayMod { new MainMenuHandler().register(); + //#if MC<=10710 + //$$ FML_BUS.register(this); // For runLater(Runnable) + //#endif FML_BUS.register(keyBindingRegistry); getKeyBindingRegistry().registerKeyBinding("replaymod.input.settings", 0, () -> { @@ -163,8 +189,11 @@ public class ReplayMod { public void postInit(FMLPostInitializationEvent event) throws IOException { settingsRegistry.save(); // Save default values to disk + // 1.7.10 crashes when render distance > 16 + //#if MC>=10800 if(!FMLClientHandler.instance().hasOptifine()) GameSettings.Options.RENDER_DISTANCE.setValueMax(64f); + //#endif testIfMoeshAndExitMinecraft(); @@ -212,6 +241,7 @@ public class ReplayMod { public void runLater(Runnable runnable) { if (mc.isCallingFromMinecraftThread() && inRunLater) { EventBus bus = FORGE_BUS; + //#if MC>=10800 bus.register(new Object() { @SubscribeEvent public void onRenderTick(TickEvent.RenderTickEvent event) { @@ -221,13 +251,21 @@ public class ReplayMod { } } }); + //#else + //$$ bus.register(new RunLaterHelper(runnable)); + //#endif return; } + //#if MC>=10800 //#if MC<10904 //$$ @SuppressWarnings("unchecked") //#endif Queue> tasks = mc.scheduledTasks; synchronized (mc.scheduledTasks) { + //#else + //$$ Queue> tasks = scheduledTasks; + //$$ synchronized (scheduledTasks) { + //#endif tasks.add(ListenableFutureTask.create(() -> { inRunLater = true; try { @@ -239,6 +277,37 @@ public class ReplayMod { } } + //#if MC<=10710 + //$$ // 1.7.10: Cannot use MC's because it is processed only during ticks (so not at all when replay is paused) + //$$ private final Queue> scheduledTasks = new ArrayDeque<>(); + //$$ + //$$ // in 1.7.10 apparently events can't be delivered to anonymous classes + //$$ public class RunLaterHelper { + //$$ private final Runnable runnable; + //$$ + //$$ private RunLaterHelper(Runnable runnable) { + //$$ this.runnable = runnable; + //$$ } + //$$ + //$$ @SubscribeEvent + //$$ public void onRenderTick(TickEvent.RenderTickEvent event) { + //$$ if (event.phase == TickEvent.Phase.START) { + //$$ runLater(runnable); + //$$ FML_BUS.unregister(this); + //$$ } + //$$ } + //$$ } + //$$ + //$$ @SubscribeEvent + //$$ public void runScheduledTasks(InputReplayTimer.RunScheduledTasks event) { + //$$ synchronized (scheduledTasks) { + //$$ while (!scheduledTasks.isEmpty()) { + //$$ scheduledTasks.poll().run(); + //$$ } + //$$ } + //$$ } + //#endif + public String getVersion() { return getContainer().getVersion(); } diff --git a/src/main/java/com/replaymod/core/events/SettingsChangedEvent.java b/src/main/java/com/replaymod/core/events/SettingsChangedEvent.java index 6bc8d2f7..47105893 100644 --- a/src/main/java/com/replaymod/core/events/SettingsChangedEvent.java +++ b/src/main/java/com/replaymod/core/events/SettingsChangedEvent.java @@ -3,7 +3,12 @@ package com.replaymod.core.events; import com.replaymod.core.SettingsRegistry; import lombok.Getter; import lombok.RequiredArgsConstructor; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.Event; +//#else +//$$ import cpw.mods.fml.common.eventhandler.Event; +//#endif @RequiredArgsConstructor public class SettingsChangedEvent extends Event { diff --git a/src/main/java/com/replaymod/core/gui/GuiFactory.java b/src/main/java/com/replaymod/core/gui/GuiFactory.java index 2f1def4a..e2ac1ed4 100644 --- a/src/main/java/com/replaymod/core/gui/GuiFactory.java +++ b/src/main/java/com/replaymod/core/gui/GuiFactory.java @@ -3,7 +3,12 @@ package com.replaymod.core.gui; import com.replaymod.core.ReplayMod; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; + +//#if MC>=10800 import net.minecraftforge.fml.client.IModGuiFactory; +//#else +//$$ import cpw.mods.fml.client.IModGuiFactory; +//#endif import java.util.Set; diff --git a/src/main/java/com/replaymod/core/handler/MainMenuHandler.java b/src/main/java/com/replaymod/core/handler/MainMenuHandler.java index 79dcc281..9a46cfc2 100644 --- a/src/main/java/com/replaymod/core/handler/MainMenuHandler.java +++ b/src/main/java/com/replaymod/core/handler/MainMenuHandler.java @@ -6,9 +6,14 @@ import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.GuiScreenRealmsProxy; import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import org.lwjgl.opengl.GL11; +//#if MC>=10800 +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif + import java.io.IOException; import static com.replaymod.core.versions.MCVer.*; @@ -50,6 +55,7 @@ public class MainMenuHandler { } } + //#if MC>=11202 private static class RealmsNotificationProxy extends GuiScreen { private final GuiScreenRealmsProxy proxy; private final int offset; @@ -59,12 +65,10 @@ public class MainMenuHandler { this.offset = offset; } - //#if MC>=11202 @Override public void setGuiSize(int w, int h) { proxy.setGuiSize(w, h); } - //#endif @Override public void initGui() { @@ -93,4 +97,5 @@ public class MainMenuHandler { proxy.onGuiClosed(); } } + //#endif } diff --git a/src/main/java/com/replaymod/core/utils/ModCompat.java b/src/main/java/com/replaymod/core/utils/ModCompat.java index 2330406a..26dcba5b 100644 --- a/src/main/java/com/replaymod/core/utils/ModCompat.java +++ b/src/main/java/com/replaymod/core/utils/ModCompat.java @@ -2,13 +2,23 @@ package com.replaymod.core.utils; import com.replaymod.replaystudio.data.ModInfo; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.common.ModContainer; //#if MC>=11200 import net.minecraftforge.registries.ForgeRegistry; import net.minecraftforge.registries.RegistryManager; //#else +//#if MC>=10800 //$$ import net.minecraftforge.fml.common.registry.GameData; +//#else +//$$ import cpw.mods.fml.common.registry.GameData; +//#endif +//#endif + +//#if MC>=10800 +import net.minecraftforge.fml.common.Loader; +import net.minecraftforge.fml.common.ModContainer; +//#else +//$$ import cpw.mods.fml.common.Loader; +//$$ import cpw.mods.fml.common.ModContainer; //#endif import java.util.*; @@ -30,6 +40,7 @@ public class ModCompat { .map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion())) .collect(Collectors.toList()); //#else + //#if MC>=10800 //$$ return Stream.concat( //$$ ((Set) GameData.getBlockRegistry().getKeys()).stream(), //$$ ((Set) GameData.getItemRegistry().getKeys()).stream() @@ -37,6 +48,18 @@ public class ModCompat { //$$ .map(String::toLowerCase).map(ignoreCaseMap::get).filter(mod -> mod != null) //$$ .map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion())) //$$ .collect(Collectors.toList()); + //#else + //$$ return Stream.concat( + //$$ ((Set) GameData.getBlockRegistry().getKeys()).stream(), + //$$ ((Set) GameData.getItemRegistry().getKeys()).stream() + //$$ ).map(name -> { + //$$ if (!name.contains(":")) return null; // Still using old names without namespace, can't do anything, ignore + //$$ return name.split(":", 2)[0]; + //$$ }).filter(s -> !s.equals("minecraft")).distinct() + //$$ .map(String::toLowerCase).map(ignoreCaseMap::get).filter(mod -> mod != null) + //$$ .map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion())) + //$$ .collect(Collectors.toList()); + //#endif //#endif } diff --git a/src/main/java/com/replaymod/core/utils/Restrictions.java b/src/main/java/com/replaymod/core/utils/Restrictions.java index 81479d2c..c198baf6 100644 --- a/src/main/java/com/replaymod/core/utils/Restrictions.java +++ b/src/main/java/com/replaymod/core/utils/Restrictions.java @@ -7,6 +7,10 @@ import net.minecraft.network.play.server.SPacketCustomPayload; //$$ import net.minecraft.network.play.server.S3FPacketCustomPayload; //#endif +//#if MC<=10710 +//$$ import io.netty.buffer.Unpooled; +//#endif + import static com.replaymod.core.versions.MCVer.readString; /** @@ -25,7 +29,11 @@ public class Restrictions { //#else //$$ public String handle(S3FPacketCustomPayload packet) { //#endif + //#if MC>=10800 PacketBuffer buffer = packet.getBufferData(); + //#else + //$$ PacketBuffer buffer = new PacketBuffer(Unpooled.wrappedBuffer(packet.func_149168_d())); + //#endif while (buffer.isReadable()) { String name = readString(buffer, 64); boolean active = buffer.readBoolean(); diff --git a/src/main/java/com/replaymod/core/utils/Utils.java b/src/main/java/com/replaymod/core/utils/Utils.java index b1ecc414..d173d1c8 100644 --- a/src/main/java/com/replaymod/core/utils/Utils.java +++ b/src/main/java/com/replaymod/core/utils/Utils.java @@ -19,8 +19,6 @@ import de.johni0702.minecraft.gui.layout.VerticalLayout; import de.johni0702.minecraft.gui.popup.GuiInfoPopup; import de.johni0702.minecraft.gui.utils.Colors; import net.minecraft.client.gui.GuiScreen; -import net.minecraft.client.network.NetworkPlayerInfo; -import net.minecraft.client.resources.DefaultPlayerSkin; import net.minecraft.crash.CrashReport; import net.minecraft.util.ResourceLocation; import org.apache.commons.io.Charsets; @@ -30,6 +28,17 @@ import org.lwjgl.input.Keyboard; import org.lwjgl.util.Dimension; import org.lwjgl.util.ReadableDimension; +//#if MC>=10800 +import net.minecraft.client.network.NetworkPlayerInfo; +import net.minecraft.client.resources.DefaultPlayerSkin; + +import static com.replaymod.core.versions.MCVer.getConnection; +//#else +//$$ import net.minecraft.client.Minecraft; +//$$ import net.minecraft.client.entity.AbstractClientPlayer; +//$$ import net.minecraft.entity.player.EntityPlayer; +//#endif + import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.imageio.ImageIO; @@ -55,7 +64,6 @@ import java.util.Date; import java.util.UUID; import java.util.function.Consumer; -import static com.replaymod.core.versions.MCVer.getConnection; import static net.minecraft.client.Minecraft.getMinecraft; public class Utils { @@ -162,6 +170,7 @@ public class Utils { } public static ResourceLocation getResourceLocationForPlayerUUID(UUID uuid) { + //#if MC>=10800 NetworkPlayerInfo info = getConnection(getMinecraft()).getPlayerInfo(uuid); ResourceLocation skinLocation; if (info != null && info.hasLocationSkin()) { @@ -170,6 +179,13 @@ public class Utils { skinLocation = DefaultPlayerSkin.getDefaultSkin(uuid); } return skinLocation; + //#else + //$$ EntityPlayer player = Minecraft.getMinecraft().theWorld.getPlayerEntityByUUID(uuid); + //$$ if (player != null || !(player instanceof AbstractClientPlayer)) { + //$$ return AbstractClientPlayer.locationStevePng; + //$$ } + //$$ return ((AbstractClientPlayer) player).getLocationSkin(); + //#endif } public static boolean isCtrlDown() { diff --git a/src/main/java/com/replaymod/core/versions/MCVer.java b/src/main/java/com/replaymod/core/versions/MCVer.java index 3c3f3a9b..ddd3a51d 100644 --- a/src/main/java/com/replaymod/core/versions/MCVer.java +++ b/src/main/java/com/replaymod/core/versions/MCVer.java @@ -11,9 +11,10 @@ import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.multiplayer.ServerList; import net.minecraft.client.multiplayer.WorldClient; import net.minecraft.client.network.NetHandlerPlayClient; -import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.resources.ResourcePackRepository; +import net.minecraft.client.settings.KeyBinding; import net.minecraft.crash.CrashReportCategory; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -21,13 +22,11 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.network.Packet; import net.minecraft.network.PacketBuffer; import net.minecraft.world.World; -import net.minecraft.world.WorldType; import net.minecraft.world.chunk.Chunk; import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderLivingEvent; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.eventhandler.EventBus; //#if MC>=10904 //#if MC>=11200 @@ -37,16 +36,39 @@ import net.minecraft.client.renderer.BufferBuilder; //#endif import net.minecraft.util.math.MathHelper; //#else +//#if MC>=10800 //$$ import net.minecraft.client.renderer.WorldRenderer; +//#endif //$$ import net.minecraft.util.MathHelper; //#endif //#if MC>=10809 import net.minecraft.client.renderer.vertex.DefaultVertexFormats; //#else +//#if MC>=10800 //$$ import net.minecraftforge.fml.common.FMLCommonHandler; +//#else +//$$ import cpw.mods.fml.common.FMLCommonHandler; +//#endif +//#endif + +//#if MC>=10800 +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.GlStateManager.BooleanState; +import net.minecraft.world.WorldType; +import net.minecraftforge.fml.common.eventhandler.EventBus; +//#else +//$$ import com.google.common.util.concurrent.Futures; +//$$ import com.replaymod.render.hooks.GLStateTracker; +//$$ import com.replaymod.render.hooks.GLStateTracker.BooleanState; +//$$ import cpw.mods.fml.common.eventhandler.EventBus; +//$$ import io.netty.handler.codec.DecoderException; +//$$ import net.minecraft.client.resources.FileResourcePack; +//$$ +//$$ import static org.lwjgl.opengl.GL11.*; //#endif import java.io.File; +import java.io.IOException; import java.util.Collection; import java.util.List; import java.util.concurrent.Callable; @@ -143,7 +165,15 @@ public class MCVer { //#if MC>=11102 return buffer.readString(max); //#else + //#if MC>=10800 //$$ return buffer.readStringFromBuffer(max); + //#else + //$$ try { + //$$ return buffer.readStringFromBuffer(max); + //$$ } catch (IOException e) { + //$$ throw new DecoderException(e); + //$$ } + //#endif //#endif } @@ -179,12 +209,34 @@ public class MCVer { //#endif } + //#if MC>=10800 public static WorldType WorldType_DEBUG_ALL_BLOCK_STATES //#if MC>=11200 = WorldType.DEBUG_ALL_BLOCK_STATES; //#else //$$ = WorldType.DEBUG_WORLD; //#endif + //#endif + + //#if MC>=10800 + public static Entity getRenderViewEntity(Minecraft mc) { + return mc.getRenderViewEntity(); + } + //#else + //$$ public static EntityLivingBase getRenderViewEntity(Minecraft mc) { + //$$ return mc.renderViewEntity; + //$$ } + //#endif + + //#if MC>=10800 + public static void setRenderViewEntity(Minecraft mc, Entity entity) { + mc.setRenderViewEntity(entity); + } + //#else + //$$ public static void setRenderViewEntity(Minecraft mc, EntityLivingBase entity) { + //$$ mc.renderViewEntity = entity; + //$$ } + //#endif public static EntityPlayerSP player(Minecraft mc) { //#if MC>=11102 @@ -233,7 +285,11 @@ public class MCVer { @SuppressWarnings("unchecked") public static Collection[] getEntityLists(Chunk chunk) { + //#if MC>=10800 return chunk.getEntityLists(); + //#else + //$$ return chunk.entityLists; + //#endif } @SuppressWarnings("unchecked") @@ -241,19 +297,43 @@ public class MCVer { return world.playerEntities; } - public static GlStateManager.BooleanState fog(GlStateManager.FogState fogState) { + public static BooleanState fog() { //#if MC>=10809 - return fogState.fog; + return GlStateManager.fogState.fog; //#else - //$$ return fogState.field_179049_a; + //#if MC>=10800 + //$$ return GlStateManager.fogState.field_179049_a; + //#else + //$$ return GLStateTracker.getInstance().fog; + //#endif //#endif } - public static void fog(GlStateManager.FogState fogState, GlStateManager.BooleanState fog) { + public static void fog(BooleanState fog) { //#if MC>=10809 - fogState.fog = fog; + GlStateManager.fogState.fog = fog; //#else - //$$ fogState.field_179049_a = fog; + //#if MC>=10800 + //$$ GlStateManager.fogState.field_179049_a = fog; + //#else + //$$ GLStateTracker.getInstance().fog = fog; + //#endif + //#endif + } + + public static BooleanState texture2DState(int index) { + //#if MC>=10800 + return GlStateManager.textureState[index].texture2DState; + //#else + //$$ return GLStateTracker.getInstance().texture[index]; + //#endif + } + + public static void texture2DState(int index, BooleanState texture2DState) { + //#if MC>=10800 + GlStateManager.textureState[index].texture2DState = texture2DState; + //#else + //$$ GLStateTracker.getInstance().texture[index] = texture2DState; //#endif } @@ -289,7 +369,22 @@ public class MCVer { //$$ return repo.setResourcePackInstance(file); //#endif //#else + //#if MC>=10800 //$$ return repo.func_177319_a(file); + //#else + //$$ repo.field_148533_g = false; + //$$ repo.field_148532_f = new FileResourcePack(file); + //$$ Minecraft.getMinecraft().scheduleResourcesRefresh(); + //$$ return Futures.immediateFuture(null); + //#endif + //#endif + } + + public static boolean isKeyDown(KeyBinding keyBinding) { + //#if MC>=10800 + return keyBinding.isKeyDown(); + //#else + //$$ return keyBinding.getIsKeyPressed(); //#endif } @@ -297,7 +392,11 @@ public class MCVer { //#if MC>=10904 Tessellator.getInstance().getBuffer().setTranslation(x, y, z); //#else + //#if MC>=10800 //$$ Tessellator.getInstance().getWorldRenderer().setTranslation(x, y, z); + //#else + //$$ Tessellator.instance.setTranslation(x, y, z); + //#endif //#endif } @@ -308,7 +407,11 @@ public class MCVer { //#if MC>=10809 //$$ Tessellator.getInstance().getWorldRenderer().begin(mode, DefaultVertexFormats.POSITION_COLOR); //#else + //#if MC>=10800 //$$ Tessellator.getInstance().getWorldRenderer().startDrawing(mode); + //#else + //$$ Tessellator.instance.startDrawing(mode); + //#endif //#endif //#endif } @@ -321,7 +424,11 @@ public class MCVer { //$$ VertexBuffer worldRenderer = Tessellator.getInstance().getBuffer(); //#endif //#else + //#if MC>=10800 //$$ WorldRenderer worldRenderer = Tessellator.getInstance().getWorldRenderer(); + //#else + //$$ Tessellator worldRenderer = Tessellator.instance; + //#endif //#endif //#if MC>=10809 worldRenderer.pos(x, y, z).color(r, g, b, a).endVertex(); @@ -338,7 +445,11 @@ public class MCVer { //#if MC>=10809 //$$ Tessellator.getInstance().getWorldRenderer().begin(mode, DefaultVertexFormats.POSITION_TEX); //#else + //#if MC>=10800 //$$ Tessellator.getInstance().getWorldRenderer().startDrawing(mode); + //#else + //$$ Tessellator.instance.startDrawing(mode); + //#endif //#endif //#endif } @@ -351,7 +462,11 @@ public class MCVer { //$$ VertexBuffer worldRenderer = Tessellator.getInstance().getBuffer(); //#endif //#else + //#if MC>=10800 //$$ WorldRenderer worldRenderer = Tessellator.getInstance().getWorldRenderer(); + //#else + //$$ Tessellator worldRenderer = Tessellator.instance; + //#endif //#endif //#if MC>=10809 worldRenderer.pos(x, y, z).tex(u, v).endVertex(); @@ -367,7 +482,11 @@ public class MCVer { //#if MC>=10809 //$$ Tessellator.getInstance().getWorldRenderer().begin(mode, DefaultVertexFormats.POSITION_TEX_COLOR); //#else + //#if MC>=10800 //$$ Tessellator.getInstance().getWorldRenderer().startDrawing(mode); + //#else + //$$ Tessellator.instance.startDrawing(mode); + //#endif //#endif //#endif } @@ -380,7 +499,11 @@ public class MCVer { //$$ VertexBuffer worldRenderer = Tessellator.getInstance().getBuffer(); //#endif //#else + //#if MC>=10800 //$$ WorldRenderer worldRenderer = Tessellator.getInstance().getWorldRenderer(); + //#else + //$$ Tessellator worldRenderer = Tessellator.instance; + //#endif //#endif //#if MC>=10809 worldRenderer.pos(x, y, z).tex(u, v).color(r, g, b, a).endVertex(); @@ -389,6 +512,23 @@ public class MCVer { //$$ worldRenderer.addVertexWithUV(x, y, z, u, v); //#endif } + + public static Tessellator Tessellator_getInstance() { + //#if MC>=10800 + return Tessellator.getInstance(); + //#else + //$$ return Tessellator.instance; + //#endif + } + + public static RenderManager getRenderManager() { + //#if MC>=10800 + return Minecraft.getMinecraft().getRenderManager(); + //#else + //$$ return RenderManager.instance; + //#endif + } + public static int floor(double val) { //#if MC>=11102 return MathHelper.floor(val); @@ -404,4 +544,21 @@ public class MCVer { public static float sin(float val) { return MathHelper.sin(val); } + + //#if MC<=10710 + //$$ public static class GlStateManager { + //$$ public static void resetColor() { /* nop */ } + //$$ public static void clearColor(float r, float g, float b, float a) { glClearColor(r, g, b, a); } + //$$ public static void enableTexture2D() { glEnable(GL_TEXTURE_2D); } + //$$ public static void enableAlpha() { glEnable(GL_ALPHA_TEST); } + //$$ public static void alphaFunc(int func, float ref) { glAlphaFunc(func, ref); } + //$$ public static void enableDepth() { glEnable(GL_DEPTH_TEST); } + //$$ public static void pushMatrix() { glPushMatrix(); } + //$$ public static void popAttrib() { glPopAttrib(); } + //$$ public static void popMatrix() { glPopMatrix(); } + //$$ public static void clear(int mask) { glClear(mask); } + //$$ public static void translate(double x, double y, double z) { glTranslated(x, y, z); } + //$$ public static void rotate(float angle, float x, float y, float z) { glRotatef(angle, x, y, z); } + //$$ } + //#endif } diff --git a/src/main/java/com/replaymod/editor/ReplayModEditor.java b/src/main/java/com/replaymod/editor/ReplayModEditor.java index ddc9b61c..7756dbd6 100644 --- a/src/main/java/com/replaymod/editor/ReplayModEditor.java +++ b/src/main/java/com/replaymod/editor/ReplayModEditor.java @@ -3,16 +3,25 @@ package com.replaymod.editor; import com.replaymod.core.ReplayMod; import com.replaymod.editor.handler.GuiHandler; import com.replaymod.online.Setting; +import org.apache.logging.log4j.Logger; + +//#if MC>=10800 import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; -import org.apache.logging.log4j.Logger; +//#else +//$$ import cpw.mods.fml.common.Mod; +//$$ import cpw.mods.fml.common.event.FMLInitializationEvent; +//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent; +//#endif @Mod(modid = ReplayModEditor.MOD_ID, version = "@MOD_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@", acceptableRemoteVersions = "*", + //#if MC>=10800 clientSideOnly = true, + //#endif useMetadata = true) public class ReplayModEditor { public static final String MOD_ID = "replaymod-editor"; diff --git a/src/main/java/com/replaymod/editor/handler/GuiHandler.java b/src/main/java/com/replaymod/editor/handler/GuiHandler.java index 4cb8aef2..f0fab8f1 100644 --- a/src/main/java/com/replaymod/editor/handler/GuiHandler.java +++ b/src/main/java/com/replaymod/editor/handler/GuiHandler.java @@ -7,8 +7,12 @@ import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiMainMenu; import net.minecraft.client.resources.I18n; import net.minecraftforge.client.event.GuiScreenEvent; -import net.minecraftforge.common.MinecraftForge; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif import static com.replaymod.core.versions.MCVer.*; diff --git a/src/main/java/com/replaymod/extras/FullBrightness.java b/src/main/java/com/replaymod/extras/FullBrightness.java index 67401152..a1610370 100644 --- a/src/main/java/com/replaymod/extras/FullBrightness.java +++ b/src/main/java/com/replaymod/extras/FullBrightness.java @@ -9,9 +9,15 @@ import de.johni0702.minecraft.gui.element.GuiImage; import de.johni0702.minecraft.gui.element.IGuiImage; import de.johni0702.minecraft.gui.layout.HorizontalLayout; import net.minecraft.client.settings.GameSettings; +import org.lwjgl.input.Keyboard; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; -import org.lwjgl.input.Keyboard; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//$$ import cpw.mods.fml.common.gameevent.TickEvent; +//#endif import static com.replaymod.core.versions.MCVer.*; diff --git a/src/main/java/com/replaymod/extras/HotkeyButtons.java b/src/main/java/com/replaymod/extras/HotkeyButtons.java index f4950a99..4f24c558 100644 --- a/src/main/java/com/replaymod/extras/HotkeyButtons.java +++ b/src/main/java/com/replaymod/extras/HotkeyButtons.java @@ -17,11 +17,16 @@ import de.johni0702.minecraft.gui.layout.GridLayout; import de.johni0702.minecraft.gui.layout.HorizontalLayout; import de.johni0702.minecraft.gui.layout.LayoutData; import net.minecraft.client.resources.I18n; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import org.lwjgl.input.Keyboard; import org.lwjgl.util.Dimension; import org.lwjgl.util.ReadableDimension; +//#if MC>=10800 +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif + import java.util.Collection; import java.util.Collections; import java.util.Comparator; diff --git a/src/main/java/com/replaymod/extras/OpenEyeExtra.java b/src/main/java/com/replaymod/extras/OpenEyeExtra.java index bc13e23d..55776d80 100644 --- a/src/main/java/com/replaymod/extras/OpenEyeExtra.java +++ b/src/main/java/com/replaymod/extras/OpenEyeExtra.java @@ -14,9 +14,14 @@ import de.johni0702.minecraft.gui.layout.HorizontalLayout; import de.johni0702.minecraft.gui.layout.VerticalLayout; import de.johni0702.minecraft.gui.popup.AbstractGuiPopup; import de.johni0702.minecraft.gui.utils.Colors; -import net.minecraftforge.fml.common.Loader; import org.apache.commons.io.FileUtils; +//#if MC>=10800 +import net.minecraftforge.fml.common.Loader; +//#else +//$$ import cpw.mods.fml.common.Loader; +//#endif + import javax.net.ssl.HttpsURLConnection; import java.io.File; import java.io.FileOutputStream; diff --git a/src/main/java/com/replaymod/extras/ReplayModExtras.java b/src/main/java/com/replaymod/extras/ReplayModExtras.java index 3dd7a033..768afb44 100644 --- a/src/main/java/com/replaymod/extras/ReplayModExtras.java +++ b/src/main/java/com/replaymod/extras/ReplayModExtras.java @@ -5,10 +5,17 @@ import com.replaymod.extras.advancedscreenshots.AdvancedScreenshots; import com.replaymod.extras.playeroverview.PlayerOverview; import com.replaymod.extras.urischeme.UriSchemeExtra; import com.replaymod.extras.youtube.YoutubeUpload; +import org.apache.logging.log4j.Logger; + +//#if MC>=10800 import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; -import org.apache.logging.log4j.Logger; +//#else +//$$ import cpw.mods.fml.common.Mod; +//$$ import cpw.mods.fml.common.event.FMLInitializationEvent; +//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent; +//#endif import java.util.Arrays; import java.util.HashMap; @@ -20,7 +27,9 @@ import java.util.Optional; version = "@MOD_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@", acceptableRemoteVersions = "*", + //#if MC>=10800 clientSideOnly = true, + //#endif useMetadata = true) public class ReplayModExtras { public static final String MOD_ID = "replaymod-extras"; diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java b/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java index a3e7b36b..b7e4d18a 100644 --- a/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java @@ -6,9 +6,14 @@ import com.replaymod.replay.events.ReplayDispatchKeypressesEvent; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiControls; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import org.lwjgl.input.Keyboard; +//#if MC>=10800 +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif + public class AdvancedScreenshots implements Extra { private ReplayMod mod; diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java index 6fe7af62..56f47ac9 100644 --- a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java @@ -2,7 +2,6 @@ package com.replaymod.extras.advancedscreenshots; import com.replaymod.render.RenderSettings; import com.replaymod.render.capturer.RenderInfo; -import com.replaymod.render.hooks.ChunkLoadingRenderGlobal; import com.replaymod.render.rendering.Pipelines; import lombok.RequiredArgsConstructor; import net.minecraft.client.Minecraft; @@ -10,6 +9,10 @@ import net.minecraft.crash.CrashReport; import org.lwjgl.util.Dimension; import org.lwjgl.util.ReadableDimension; +//#if MC>=10800 +import com.replaymod.render.hooks.ChunkLoadingRenderGlobal; +//#endif + @RequiredArgsConstructor public class ScreenshotRenderer implements RenderInfo { @@ -17,6 +20,8 @@ public class ScreenshotRenderer implements RenderInfo { private final RenderSettings settings; + private int framesDone; + public boolean renderScreenshot() throws Throwable { try { int displayWidthBefore = mc.displayWidth; @@ -25,12 +30,16 @@ public class ScreenshotRenderer implements RenderInfo { boolean hideGUIBefore = mc.gameSettings.hideGUI; mc.gameSettings.hideGUI = true; + //#if MC>=10800 ChunkLoadingRenderGlobal clrg = new ChunkLoadingRenderGlobal(mc.renderGlobal); + //#endif Pipelines.newPipeline(settings.getRenderMethod(),this, new ScreenshotWriter(settings.getOutputFile())).run(); + //#if MC>=10800 clrg.uninstall(); + //#endif mc.gameSettings.hideGUI = hideGUIBefore; mc.resize(displayWidthBefore, displayHeightBefore); @@ -48,6 +57,11 @@ public class ScreenshotRenderer implements RenderInfo { return new Dimension(settings.getVideoWidth(), settings.getVideoHeight()); } + @Override + public int getFramesDone() { + return framesDone; + } + @Override public int getTotalFrames() { // render 2 frames, because only the second contains all frames fully loaded @@ -56,6 +70,7 @@ public class ScreenshotRenderer implements RenderInfo { @Override public float updateForNextFrame() { + framesDone++; return mc.timer.renderPartialTicks; } diff --git a/src/main/java/com/replaymod/extras/playeroverview/PlayerOverview.java b/src/main/java/com/replaymod/extras/playeroverview/PlayerOverview.java index 81748467..29e64631 100644 --- a/src/main/java/com/replaymod/extras/playeroverview/PlayerOverview.java +++ b/src/main/java/com/replaymod/extras/playeroverview/PlayerOverview.java @@ -1,7 +1,6 @@ package com.replaymod.extras.playeroverview; import com.google.common.base.Optional; -import com.google.common.base.Predicate; import com.replaymod.core.ReplayMod; import com.replaymod.core.utils.Utils; import com.replaymod.extras.Extra; @@ -12,12 +11,20 @@ import com.replaymod.replay.events.ReplayOpenEvent; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.client.event.RenderHandEvent; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import org.lwjgl.input.Keyboard; +//#if MC>=10800 +import com.google.common.base.Predicate; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.EventPriority; +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//$$ import net.minecraftforge.client.event.RenderPlayerEvent; +//#endif + import java.io.IOException; import java.util.*; +import java.util.stream.Collectors; import static com.replaymod.core.versions.MCVer.*; @@ -36,12 +43,19 @@ public class PlayerOverview implements Extra { public void run() { if (module.getReplayHandler() != null) { @SuppressWarnings("unchecked") + //#if MC>=10800 List players = world(mod.getMinecraft()).getPlayers(EntityPlayer.class, new Predicate() { @Override public boolean apply(Object input) { return !(input instanceof CameraEntity); // Exclude the camera entity } }); + //#else + //$$ List players = mod.getMinecraft().theWorld.playerEntities; + //$$ players = players.stream() + //$$ .filter(it -> !(it instanceof CameraEntity)) // Exclude the camera entity + //$$ .collect(Collectors.toList()); + //#endif if (!Utils.isCtrlDown()) { // Hide all players that have an UUID v2 (commonly used for NPCs) Iterator iter = players.iterator(); @@ -91,12 +105,22 @@ public class PlayerOverview implements Extra { @SubscribeEvent public void oRenderHand(RenderHandEvent event) { - Entity view = module.getCore().getMinecraft().getRenderViewEntity(); + Entity view = getRenderViewEntity(module.getCore().getMinecraft()); if (view != null && isHidden(view.getUniqueID())) { event.setCanceled(true); } } + // See MixinRender for why this is 1.7.10 only + //#if MC<=10710 + //$$ @SubscribeEvent(priority = EventPriority.HIGHEST) + //$$ public void preRenderPlayer(RenderPlayerEvent.Pre event) { + //$$ if (isHidden(event.entityPlayer.getUniqueID())) { + //$$ event.setCanceled(true); + //$$ } + //$$ } + //#endif + public boolean isSavingEnabled() { return savingEnabled; } diff --git a/src/main/java/com/replaymod/extras/playeroverview/PlayerOverviewGui.java b/src/main/java/com/replaymod/extras/playeroverview/PlayerOverviewGui.java index f186b299..0659410c 100644 --- a/src/main/java/com/replaymod/extras/playeroverview/PlayerOverviewGui.java +++ b/src/main/java/com/replaymod/extras/playeroverview/PlayerOverviewGui.java @@ -20,7 +20,6 @@ import de.johni0702.minecraft.gui.layout.HorizontalLayout; import de.johni0702.minecraft.gui.utils.Colors; import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EnumPlayerModelParts; import net.minecraft.util.ResourceLocation; import org.lwjgl.util.Dimension; import org.lwjgl.util.ReadableDimension; @@ -32,6 +31,10 @@ import net.minecraft.init.SoundEvents; //$$ import net.minecraft.potion.Potion; //#endif +//#if MC>=10800 +import net.minecraft.entity.player.EnumPlayerModelParts; +//#endif + import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -55,7 +58,11 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable { //#if MC>=10904 getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(SoundEvents.UI_BUTTON_CLICK, 1.0F)); //#else + //#if MC>=10800 //$$ getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create(BUTTON_SOUND, 1.0F)); + //#else + //$$ getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.createPositionedSoundRecord(BUTTON_SOUND, 1.0F)); + //#endif //#endif playersScrollable.forEach(IGuiCheckbox.class).setChecked(true); } @@ -66,7 +73,11 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable { //#if MC>=10904 getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(SoundEvents.UI_BUTTON_CLICK, 1.0F)); //#else + //#if MC>=10800 //$$ getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create(BUTTON_SOUND, 1.0F)); + //#else + //$$ getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.createPositionedSoundRecord(BUTTON_SOUND, 1.0F)); + //#endif //#endif playersScrollable.forEach(IGuiCheckbox.class).setChecked(false); } @@ -113,13 +124,23 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable { //#if MC>=10809 if (p.isWearing(EnumPlayerModelParts.HAT)) { //#else + //#if MC>=10800 //$$ if (p.func_175148_a(EnumPlayerModelParts.HAT)) { + //#else + //$$ { + //#endif //#endif renderer.drawTexturedRect(0, 0, 40, 8, size.getWidth(), size.getHeight(), 8, 8, 64, 64); } } }.setSize(16, 16), - new GuiLabel().setText(p.getName()).setColor(isSpectator(p) ? Colors.DKGREY : Colors.WHITE) + new GuiLabel().setText( + //#if MC>=10800 + p.getName() + //#else + //$$ p.getDisplayName() + //#endif + ).setColor(isSpectator(p) ? Colors.DKGREY : Colors.WHITE) ).onClick(new Runnable() { @Override public void run() { @@ -175,7 +196,11 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable { public int compare(EntityPlayer o1, EntityPlayer o2) { if (isSpectator(o1) && !isSpectator(o2)) return 1; if (isSpectator(o2) && !isSpectator(o1)) return -1; + //#if MC>=10800 return o1.getName().compareToIgnoreCase(o2.getName()); + //#else + //$$ return o1.getDisplayName().compareToIgnoreCase(o2.getDisplayName()); + //#endif } } } diff --git a/src/main/java/com/replaymod/extras/playeroverview/mixin/MixinRender.java b/src/main/java/com/replaymod/extras/playeroverview/mixin/MixinRender.java index fd750943..b3c44d36 100644 --- a/src/main/java/com/replaymod/extras/playeroverview/mixin/MixinRender.java +++ b/src/main/java/com/replaymod/extras/playeroverview/mixin/MixinRender.java @@ -2,14 +2,19 @@ package com.replaymod.extras.playeroverview.mixin; import com.replaymod.extras.ReplayModExtras; import com.replaymod.extras.playeroverview.PlayerOverview; -import net.minecraft.client.renderer.culling.ICamera; import net.minecraft.client.renderer.entity.Render; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; + +//#if MC>=10800 +import net.minecraft.client.renderer.culling.ICamera; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +//#else +//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +//#endif /** * This mixin prevents players that are hidden in the PlayerOverview from being rendered. @@ -23,9 +28,12 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; * One example of the previous solution breaking is when used with VanillaEnhancements because it replaces the * RenderManager with a new custom one which in turn will reset our registered RenderPlayer instances because * it does so after we have already registered with the old RenderManager. + * + * For 1.7.10, that method doesn't exist, so we use a combination of the event and inject into */ @Mixin(value = Render.class, priority = 1200) public abstract class MixinRender { + //#if MC>=10800 @Inject(method = "shouldRender", at=@At("HEAD"), cancellable = true) public void replayModExtras_isPlayerHidden(Entity entity, ICamera camera, double camX, double camY, double camZ, CallbackInfoReturnable ci) { ReplayModExtras.instance.get(PlayerOverview.class).ifPresent(playerOverview -> { @@ -37,4 +45,17 @@ public abstract class MixinRender { } }); } + //#else + //$$ @Inject(method = "doRenderShadowAndFire", at=@At("HEAD"), cancellable = true) + //$$ private void replayModExtras_isPlayerHidden(Entity entity, double x, double y, double z, float yaw, float time, CallbackInfo ci) { + //$$ ReplayModExtras.instance.get(PlayerOverview.class).ifPresent(playerOverview -> { + //$$ if (entity instanceof EntityPlayer) { + //$$ EntityPlayer player = (EntityPlayer) entity; + //$$ if (playerOverview.isHidden(player.getUniqueID())) { + //$$ ci.cancel(); + //$$ } + //$$ } + //$$ }); + //$$ } + //#endif } diff --git a/src/main/java/com/replaymod/extras/youtube/YoutubeUpload.java b/src/main/java/com/replaymod/extras/youtube/YoutubeUpload.java index 9aa554f1..9527665b 100644 --- a/src/main/java/com/replaymod/extras/youtube/YoutubeUpload.java +++ b/src/main/java/com/replaymod/extras/youtube/YoutubeUpload.java @@ -7,7 +7,12 @@ import de.johni0702.minecraft.gui.container.GuiScreen; import de.johni0702.minecraft.gui.element.GuiButton; import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.common.MinecraftForge; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif import static com.replaymod.core.versions.MCVer.*; diff --git a/src/main/java/com/replaymod/online/ReplayModOnline.java b/src/main/java/com/replaymod/online/ReplayModOnline.java index 8db3ffb9..badc3a46 100644 --- a/src/main/java/com/replaymod/online/ReplayModOnline.java +++ b/src/main/java/com/replaymod/online/ReplayModOnline.java @@ -13,12 +13,21 @@ import com.replaymod.replaystudio.replay.ZipReplayFile; import com.replaymod.replaystudio.studio.ReplayStudio; import de.johni0702.minecraft.gui.container.GuiScreen; import net.minecraftforge.common.config.Configuration; +import org.apache.logging.log4j.Logger; + +//#if MC>=10800 import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import org.apache.logging.log4j.Logger; +//#else +//$$ import cpw.mods.fml.common.Mod; +//$$ import cpw.mods.fml.common.event.FMLInitializationEvent; +//$$ import cpw.mods.fml.common.event.FMLPostInitializationEvent; +//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent; +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif import java.io.File; import java.io.IOException; @@ -30,7 +39,9 @@ import static net.minecraft.client.Minecraft.getMinecraft; version = "@MOD_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@", acceptableRemoteVersions = "*", + //#if MC>=10800 clientSideOnly = true, + //#endif useMetadata = true) public class ReplayModOnline { public static final String MOD_ID = "replaymod-online"; diff --git a/src/main/java/com/replaymod/online/handler/GuiHandler.java b/src/main/java/com/replaymod/online/handler/GuiHandler.java index ed5eb6d6..34363760 100644 --- a/src/main/java/com/replaymod/online/handler/GuiHandler.java +++ b/src/main/java/com/replaymod/online/handler/GuiHandler.java @@ -13,8 +13,12 @@ import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiMainMenu; import net.minecraft.client.resources.I18n; import net.minecraftforge.client.event.GuiScreenEvent; -import net.minecraftforge.common.MinecraftForge; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif import java.io.File; diff --git a/src/main/java/com/replaymod/pathing/player/AbstractTimelinePlayer.java b/src/main/java/com/replaymod/pathing/player/AbstractTimelinePlayer.java index 498a55fa..4d586132 100644 --- a/src/main/java/com/replaymod/pathing/player/AbstractTimelinePlayer.java +++ b/src/main/java/com/replaymod/pathing/player/AbstractTimelinePlayer.java @@ -12,8 +12,12 @@ import com.replaymod.replaystudio.pathing.path.Keyframe; import com.replaymod.replaystudio.pathing.path.Path; import com.replaymod.replaystudio.pathing.path.Timeline; import net.minecraft.client.Minecraft; -import net.minecraftforge.common.MinecraftForge; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif import javax.annotation.Nullable; import java.util.Iterator; diff --git a/src/main/java/com/replaymod/pathing/player/RealtimeTimelinePlayer.java b/src/main/java/com/replaymod/pathing/player/RealtimeTimelinePlayer.java index 4271ddbf..a4c92d44 100644 --- a/src/main/java/com/replaymod/pathing/player/RealtimeTimelinePlayer.java +++ b/src/main/java/com/replaymod/pathing/player/RealtimeTimelinePlayer.java @@ -4,6 +4,10 @@ import com.google.common.util.concurrent.ListenableFuture; import com.replaymod.replay.ReplayHandler; import com.replaymod.replaystudio.pathing.path.Timeline; +//#if MC<=10710 +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif + /** * Timeline player using the system time. */ @@ -32,6 +36,9 @@ public class RealtimeTimelinePlayer extends AbstractTimelinePlayer { } @Override + //#if MC<=10710 + //$$ @SubscribeEvent + //#endif public void onTick(ReplayTimer.UpdatedEvent event) { if (secondFrame) { secondFrame = false; diff --git a/src/main/java/com/replaymod/pathing/player/ReplayTimer.java b/src/main/java/com/replaymod/pathing/player/ReplayTimer.java index e244a1a5..a2bdc331 100644 --- a/src/main/java/com/replaymod/pathing/player/ReplayTimer.java +++ b/src/main/java/com/replaymod/pathing/player/ReplayTimer.java @@ -2,7 +2,12 @@ package com.replaymod.pathing.player; import com.replaymod.core.utils.WrappedTimer; import net.minecraft.util.Timer; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.Event; +//#else +//$$ import cpw.mods.fml.common.eventhandler.Event; +//#endif import static com.replaymod.core.versions.MCVer.*; diff --git a/src/main/java/com/replaymod/pathing/properties/SpectatorProperty.java b/src/main/java/com/replaymod/pathing/properties/SpectatorProperty.java index 8bd6ee2e..5628b3fd 100644 --- a/src/main/java/com/replaymod/pathing/properties/SpectatorProperty.java +++ b/src/main/java/com/replaymod/pathing/properties/SpectatorProperty.java @@ -8,6 +8,7 @@ import com.replaymod.replaystudio.pathing.property.PropertyPart; import com.replaymod.replaystudio.pathing.property.PropertyParts; import lombok.NonNull; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.world.World; import java.io.IOException; @@ -36,7 +37,13 @@ public class SpectatorProperty extends AbstractProperty { // Lookup entity by id, returns null if an entity with the id does not exists Entity target = world.getEntityByID(value); // Spectate entity, when called with null, returns to camera + //#if MC>=10800 handler.spectateEntity(target); + //#else + //$$ if (target instanceof EntityLivingBase) { + //$$ handler.spectateEntity(((EntityLivingBase) target)); + //$$ } + //#endif } @Override diff --git a/src/main/java/com/replaymod/recording/ReplayModRecording.java b/src/main/java/com/replaymod/recording/ReplayModRecording.java index 7f070af7..fef2207e 100644 --- a/src/main/java/com/replaymod/recording/ReplayModRecording.java +++ b/src/main/java/com/replaymod/recording/ReplayModRecording.java @@ -8,13 +8,22 @@ import com.replaymod.recording.packet.PacketListener; import io.netty.channel.ChannelDuplexHandler; import io.netty.channel.ChannelHandler; import net.minecraft.network.NetworkManager; +import org.apache.logging.log4j.Logger; +import org.lwjgl.input.Keyboard; + +//#if MC>=10800 import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.eventhandler.EventBus; import net.minecraftforge.fml.common.network.NetworkRegistry; -import org.apache.logging.log4j.Logger; -import org.lwjgl.input.Keyboard; +//#else +//$$ import cpw.mods.fml.common.Mod; +//$$ import cpw.mods.fml.common.event.FMLInitializationEvent; +//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent; +//$$ import cpw.mods.fml.common.eventhandler.EventBus; +//$$ import cpw.mods.fml.common.network.NetworkRegistry; +//#endif import static com.replaymod.core.versions.MCVer.*; @@ -22,7 +31,9 @@ import static com.replaymod.core.versions.MCVer.*; version = "@MOD_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@", acceptableRemoteVersions = "*", + //#if MC>=10800 clientSideOnly = true, + //#endif useMetadata = true) public class ReplayModRecording { public static final String MOD_ID = "replaymod-recording"; diff --git a/src/main/java/com/replaymod/recording/gui/GuiRecordingOverlay.java b/src/main/java/com/replaymod/recording/gui/GuiRecordingOverlay.java index c04f4f6d..467abfcc 100644 --- a/src/main/java/com/replaymod/recording/gui/GuiRecordingOverlay.java +++ b/src/main/java/com/replaymod/recording/gui/GuiRecordingOverlay.java @@ -5,16 +5,20 @@ import com.replaymod.recording.Setting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.Gui; -import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.resources.I18n; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.common.MinecraftForge; + +//#if MC>=10800 +import net.minecraft.client.renderer.GlStateManager; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif import static com.replaymod.core.ReplayMod.TEXTURE; import static com.replaymod.core.ReplayMod.TEXTURE_SIZE; -import static com.replaymod.core.versions.MCVer.getFontRenderer; -import static com.replaymod.core.versions.MCVer.getType; +import static com.replaymod.core.versions.MCVer.*; /** * Renders overlay during recording. diff --git a/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java b/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java index 03ab4091..caf966c2 100755 --- a/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java +++ b/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java @@ -12,16 +12,22 @@ import com.replaymod.replaystudio.replay.ZipReplayFile; import com.replaymod.replaystudio.studio.ReplayStudio; import net.minecraft.client.Minecraft; import net.minecraft.network.NetworkManager; +import org.apache.logging.log4j.Logger; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.network.FMLNetworkEvent.ClientDisconnectionFromServerEvent; -import org.apache.logging.log4j.Logger; + +import static com.replaymod.core.versions.MCVer.WorldType_DEBUG_ALL_BLOCK_STATES; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//$$ import cpw.mods.fml.common.network.FMLNetworkEvent.ClientDisconnectionFromServerEvent; +//#endif import java.io.File; import java.text.SimpleDateFormat; import java.util.Calendar; -import static com.replaymod.core.versions.MCVer.WorldType_DEBUG_ALL_BLOCK_STATES; - /** * Handles connection events and initiates recording if enabled. */ @@ -48,10 +54,12 @@ public class ConnectionEventHandler { try { boolean local = networkManager.isLocalChannel(); if (local) { + //#if MC>=10800 if (mc.getIntegratedServer().getEntityWorld().getWorldType() == WorldType_DEBUG_ALL_BLOCK_STATES) { logger.info("Debug World recording is not supported."); return; } + //#endif if(!core.getSettingsRegistry().get(Setting.RECORD_SINGLEPLAYER)) { logger.info("Singleplayer Recording is disabled"); return; diff --git a/src/main/java/com/replaymod/recording/handler/FMLHandshakeFilter.java b/src/main/java/com/replaymod/recording/handler/FMLHandshakeFilter.java index 79553b3b..036be75f 100644 --- a/src/main/java/com/replaymod/recording/handler/FMLHandshakeFilter.java +++ b/src/main/java/com/replaymod/recording/handler/FMLHandshakeFilter.java @@ -2,7 +2,12 @@ package com.replaymod.recording.handler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; + +//#if MC>=10800 import net.minecraftforge.fml.common.network.handshake.FMLHandshakeMessage; +//#else +//$$ import cpw.mods.fml.common.network.handshake.FMLHandshakeMessage; +//#endif /** * Filters out all handshake packets that were sent for recording but must @@ -17,7 +22,11 @@ import net.minecraftforge.fml.common.network.handshake.FMLHandshakeMessage; public class FMLHandshakeFilter extends SimpleChannelInboundHandler { @Override protected void channelRead0(ChannelHandlerContext ctx, FMLHandshakeMessage msg) throws Exception { + //#if MC>=10800 if (!(msg instanceof FMLHandshakeMessage.RegistryData)) { + //#else + //$$ if (!(msg instanceof FMLHandshakeMessage.ModIdData)) { + //#endif // Pass on everything but RegistryData messages ctx.fireChannelRead(msg); } diff --git a/src/main/java/com/replaymod/recording/handler/GuiHandler.java b/src/main/java/com/replaymod/recording/handler/GuiHandler.java index 38b979b2..8a1e7b94 100644 --- a/src/main/java/com/replaymod/recording/handler/GuiHandler.java +++ b/src/main/java/com/replaymod/recording/handler/GuiHandler.java @@ -15,7 +15,12 @@ import net.minecraft.client.gui.GuiWorldSelection; //#endif import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.common.MinecraftForge; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif import static com.replaymod.core.versions.MCVer.getGui; diff --git a/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java b/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java index 183ac912..1a9c0ef0 100755 --- a/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java +++ b/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java @@ -7,13 +7,8 @@ import net.minecraft.item.ItemStack; import net.minecraft.network.Packet; import net.minecraft.network.play.server.*; import net.minecraft.server.integrated.IntegratedServer; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.minecart.MinecartInteractEvent; import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.PlayerEvent.ItemPickupEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent.PlayerTickEvent; //#if MC>=10904 import net.minecraft.entity.EntityLiving; @@ -24,8 +19,22 @@ import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundEvent; import net.minecraft.util.math.BlockPos; //#else +//#if MC>=10800 //$$ import net.minecraft.util.BlockPos; //#endif +//#endif + +//#if MC>=10800 +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.PlayerEvent.ItemPickupEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent.PlayerTickEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//$$ import cpw.mods.fml.common.gameevent.PlayerEvent.ItemPickupEvent; +//$$ import cpw.mods.fml.common.gameevent.TickEvent; +//$$ import cpw.mods.fml.common.gameevent.TickEvent.PlayerTickEvent; +//#endif import java.util.Objects; @@ -115,12 +124,17 @@ public class RecordingEventHandler { public void onPlayerTick(PlayerTickEvent e) { try { if(e.player != player(mc)) return; + //#if MC>=10800 + double playerY = e.player.posY; + //#else + //$$ double playerY = e.player.boundingBox.minY; // TODO do we need this? if so, also in teleport below? + //#endif boolean force = false; if(lastX == null || lastY == null || lastZ == null) { force = true; lastX = e.player.posX; - lastY = e.player.posY; + lastY = playerY; lastZ = e.player.posZ; } @@ -131,11 +145,11 @@ public class RecordingEventHandler { } double dx = e.player.posX - lastX; - double dy = e.player.posY - lastY; + double dy = playerY - lastY; double dz = e.player.posZ - lastZ; lastX = e.player.posX; - lastY = e.player.posY; + lastY = playerY; lastZ = e.player.posZ; Packet packet; @@ -156,7 +170,11 @@ public class RecordingEventHandler { //#else //$$ packet = new S14PacketEntity.S17PacketEntityLookMove(e.player.getEntityId(), //$$ (byte) Math.round(dx * 32), (byte) Math.round(dy * 32), (byte) Math.round(dz * 32), - //$$ newYaw, newPitch, e.player.onGround); + //$$ newYaw, newPitch + //#if MC>=10800 + //$$ , e.player.onGround + //#endif + //$$ ); //#endif } @@ -353,7 +371,13 @@ public class RecordingEventHandler { //$$ return; //$$ } //$$ - //$$ packetListener.save(new S0APacketUseBed(event.entityPlayer, event.pos)); + //$$ packetListener.save(new S0APacketUseBed(event.entityPlayer, + //#if MC>=10800 + //$$ event.pos + //#else + //$$ event.x, event.y, event.z + //#endif + //$$ )); //#endif wasSleeping = true; @@ -388,13 +412,23 @@ public class RecordingEventHandler { } } + //#if MC>=10800 public void onBlockBreakAnim(int breakerId, BlockPos pos, int progress) { + //#else + //$$ public void onBlockBreakAnim(int breakerId, int x, int y, int z, int progress) { + //#endif EntityPlayer thePlayer = player(mc); if (thePlayer != null && breakerId == thePlayer.getEntityId()) { //#if MC>=10904 packetListener.save(new SPacketBlockBreakAnim(breakerId, pos, progress)); //#else - //$$ packetListener.save(new S25PacketBlockBreakAnim(breakerId, pos, progress)); + //$$ packetListener.save(new S25PacketBlockBreakAnim(breakerId, + //#if MC>=10800 + //$$ pos, + //#else + //$$ x, y, z, + //#endif + //$$ progress)); //#endif } } diff --git a/src/main/java/com/replaymod/recording/mixin/MixinGuiScreen.java b/src/main/java/com/replaymod/recording/mixin/MixinGuiScreen.java new file mode 100644 index 00000000..c205f9ac --- /dev/null +++ b/src/main/java/com/replaymod/recording/mixin/MixinGuiScreen.java @@ -0,0 +1,45 @@ +//#if MC<=10710 +//$$ package com.replaymod.recording.mixin; +//$$ +//$$ import de.johni0702.minecraft.gui.container.VanillaGuiScreen; +//$$ import net.minecraft.client.gui.GuiScreen; +//$$ import org.lwjgl.input.Keyboard; +//$$ import org.lwjgl.input.Mouse; +//$$ import org.spongepowered.asm.mixin.Mixin; +//$$ import org.spongepowered.asm.mixin.Shadow; +//$$ import org.spongepowered.asm.mixin.injection.At; +//$$ import org.spongepowered.asm.mixin.injection.Inject; +//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +//$$ +//$$ import static com.replaymod.core.versions.MCVer.*; +//$$ +//$$ @Mixin(GuiScreen.class) +//$$ public abstract class MixinGuiScreen { +//$$ +//$$ @Inject(method = "handleInput", at = @At("HEAD"), cancellable = true) +//$$ private void handleJGuiInput(CallbackInfo ci) { +//$$ ci.cancel(); +//$$ if (Mouse.isCreated()) { +//$$ while (Mouse.next()) { +//$$ if (FORGE_BUS.post(new VanillaGuiScreen.MouseInputEvent())) { +//$$ continue; +//$$ } +//$$ handleMouseInput(); +//$$ } +//$$ } +//$$ +//$$ if (Keyboard.isCreated()) { +//$$ while (Keyboard.next()) { +//$$ if (FORGE_BUS.post(new VanillaGuiScreen.KeyboardInputEvent())) { +//$$ continue; +//$$ } +//$$ handleKeyboardInput(); +//$$ } +//$$ } +//$$ } +//$$ +//$$ @Shadow public abstract void handleMouseInput(); +//$$ +//$$ @Shadow public abstract void handleKeyboardInput(); +//$$ } +//#endif diff --git a/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerLoginClient.java b/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerLoginClient.java index bba6786e..2431c3a0 100644 --- a/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerLoginClient.java +++ b/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerLoginClient.java @@ -9,20 +9,34 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +//#if MC>=10800 +import net.minecraftforge.fml.common.network.FMLNetworkEvent; +//#else +//$$ import cpw.mods.fml.common.network.FMLNetworkEvent; +//#endif + @Mixin(NetHandlerLoginClient.class) public abstract class MixinNetHandlerLoginClient { @Shadow + //#if MC>=10800 private NetworkManager networkManager; + //#else + //$$ private NetworkManager field_147393_d; + //#endif /** * Starts the recording right before switching into PLAY state. - * We cannot use the {@link net.minecraftforge.fml.common.network.FMLNetworkEvent.ClientConnectedToServerEvent} + * We cannot use the {@link FMLNetworkEvent.ClientConnectedToServerEvent} * as it only fires after the forge handshake. */ @Inject(method = "handleLoginSuccess", at=@At("HEAD")) public void replayModRecording_initiateRecording(CallbackInfo cb) { + //#if MC>=10800 ReplayModRecording.instance.initiateRecording(networkManager); + //#else + //$$ ReplayModRecording.instance.initiateRecording(field_147393_d); + //#endif } //#if MC>=11200 diff --git a/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerPlayClient.java b/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerPlayClient.java index cf75a92e..c7642946 100644 --- a/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerPlayClient.java +++ b/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerPlayClient.java @@ -3,7 +3,6 @@ package com.replaymod.recording.mixin; import com.replaymod.recording.handler.RecordingEventHandler; import net.minecraft.client.Minecraft; import net.minecraft.client.network.NetHandlerPlayClient; -import net.minecraft.client.network.NetworkPlayerInfo; import net.minecraft.network.play.server.*; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -11,6 +10,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +//#if MC>=10800 //#if MC>=10904 import net.minecraft.network.play.server.SPacketPlayerListItem.Action; import net.minecraft.network.play.server.SPacketPlayerListItem.AddPlayerData; @@ -18,13 +18,14 @@ import net.minecraft.network.play.server.SPacketPlayerListItem.AddPlayerData; //$$ import net.minecraft.network.play.server.S38PacketPlayerListItem.Action; //$$ import net.minecraft.network.play.server.S38PacketPlayerListItem.AddPlayerData; //#endif - +import net.minecraft.client.network.NetworkPlayerInfo; import java.util.List; import java.util.Map; import java.util.UUID; import static com.replaymod.core.versions.MCVer.*; +//#endif @Mixin(NetHandlerPlayClient.class) public abstract class MixinNetHandlerPlayClient { @@ -32,8 +33,10 @@ public abstract class MixinNetHandlerPlayClient { @Shadow private Minecraft gameController; + //#if MC>=10800 @Shadow private Map playerInfoMap; + //#endif public RecordingEventHandler getRecordingEventHandler() { return ((RecordingEventHandler.RecordingEventSender) gameController.renderGlobal).getRecordingEventHandler(); @@ -46,6 +49,7 @@ public abstract class MixinNetHandlerPlayClient { * @param packet The packet * @param ci Callback info */ + //#if MC>=10800 @Inject(method = "handlePlayerListItem", at=@At("HEAD")) //#if MC>=10809 //#if MC>=10904 @@ -86,6 +90,15 @@ public abstract class MixinNetHandlerPlayClient { //$$ } //$$ } //#endif + //#else + //$$ @Inject(method = "handleJoinGame", at=@At("RETURN")) + //$$ public void recordOwnJoin(S01PacketJoinGame packet, CallbackInfo ci) { + //$$ RecordingEventHandler handler = getRecordingEventHandler(); + //$$ if (handler != null) { + //$$ handler.onPlayerJoin(); + //$$ } + //$$ } + //#endif /** * Record the own player entity respawning. diff --git a/src/main/java/com/replaymod/recording/mixin/MixinNetworkDispatcher.java b/src/main/java/com/replaymod/recording/mixin/MixinNetworkDispatcher.java index a946b260..a0a30a11 100644 --- a/src/main/java/com/replaymod/recording/mixin/MixinNetworkDispatcher.java +++ b/src/main/java/com/replaymod/recording/mixin/MixinNetworkDispatcher.java @@ -3,9 +3,6 @@ package com.replaymod.recording.mixin; import com.replaymod.recording.handler.FMLHandshakeFilter; import io.netty.channel.ChannelPipeline; import io.netty.channel.embedded.EmbeddedChannel; -import net.minecraftforge.fml.common.network.handshake.FMLHandshakeCodec; -import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher; -import net.minecraftforge.fml.relauncher.Side; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -19,6 +16,16 @@ import net.minecraft.network.NetworkManager; import org.spongepowered.asm.mixin.injection.Redirect; //#endif +//#if MC>=10800 +import net.minecraftforge.fml.common.network.handshake.FMLHandshakeCodec; +import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher; +import net.minecraftforge.fml.relauncher.Side; +//#else +//$$ import cpw.mods.fml.common.network.handshake.FMLHandshakeCodec; +//$$ import cpw.mods.fml.common.network.handshake.NetworkDispatcher; +//$$ import cpw.mods.fml.relauncher.Side; +//#endif + @Mixin(value = NetworkDispatcher.class, remap = false) public abstract class MixinNetworkDispatcher { diff --git a/src/main/java/com/replaymod/recording/mixin/MixinRenderGlobal.java b/src/main/java/com/replaymod/recording/mixin/MixinRenderGlobal.java index d57ec24e..ad65c8c7 100644 --- a/src/main/java/com/replaymod/recording/mixin/MixinRenderGlobal.java +++ b/src/main/java/com/replaymod/recording/mixin/MixinRenderGlobal.java @@ -10,8 +10,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; //#if MC>=10904 import net.minecraft.util.math.BlockPos; //#else +//#if MC>=10800 //$$ import net.minecraft.util.BlockPos; //#endif +//#endif @Mixin(RenderGlobal.class) public abstract class MixinRenderGlobal implements RecordingEventHandler.RecordingEventSender { @@ -28,10 +30,26 @@ public abstract class MixinRenderGlobal implements RecordingEventHandler.Recordi return recordingEventHandler; } + //#if MC>=10800 @Inject(method = "sendBlockBreakProgress", at = @At("HEAD")) - public void saveBlockBreakProgressPacket(int breakerId, BlockPos pos, int progress, CallbackInfo info) { + //#else + //$$ @Inject(method = "destroyBlockPartially", at = @At("HEAD")) + //#endif + public void saveBlockBreakProgressPacket(int breakerId, + //#if MC>=10800 + BlockPos pos, + //#else + //$$ int x, int y, int z, + //#endif + int progress, CallbackInfo info) { if (recordingEventHandler != null) { - recordingEventHandler.onBlockBreakAnim(breakerId, pos, progress); + recordingEventHandler.onBlockBreakAnim(breakerId, + //#if MC>=10800 + pos, + //#else + //$$ x, y, z, + //#endif + progress); } } } diff --git a/src/main/java/com/replaymod/recording/packet/PacketListener.java b/src/main/java/com/replaymod/recording/packet/PacketListener.java index ed921900..eddd68f1 100755 --- a/src/main/java/com/replaymod/recording/packet/PacketListener.java +++ b/src/main/java/com/replaymod/recording/packet/PacketListener.java @@ -11,11 +11,9 @@ import io.netty.channel.ChannelInboundHandlerAdapter; import net.minecraft.client.Minecraft; import net.minecraft.entity.Entity; import net.minecraft.network.EnumConnectionState; -import net.minecraft.network.EnumPacketDirection; import net.minecraft.network.Packet; import net.minecraft.network.PacketBuffer; import net.minecraft.network.play.server.*; -import net.minecraftforge.fml.common.network.internal.FMLProxyPacket; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -29,6 +27,13 @@ import net.minecraft.util.text.TextComponentString; //$$ import java.util.List; //#endif +//#if MC>=10800 +import net.minecraft.network.EnumPacketDirection; +import net.minecraftforge.fml.common.network.internal.FMLProxyPacket; +//#else +//$$ import cpw.mods.fml.common.network.internal.FMLProxyPacket; +//#endif + import java.io.DataOutputStream; import java.io.IOException; import java.util.Arrays; @@ -105,7 +110,11 @@ public class PacketListener extends ChannelInboundHandlerAdapter { //#if MC>=10809 //$$ UUID uuid = ((S0CPacketSpawnPlayer) packet).getPlayer(); //#else + //#if MC>=10800 //$$ UUID uuid = ((S0CPacketSpawnPlayer) packet).func_179819_c(); + //#else + //$$ UUID uuid = ((S0CPacketSpawnPlayer) packet).field_148955_b.getId(); + //#endif //#endif //#endif Set uuids = new HashSet<>(Arrays.asList(metaData.getPlayers())); @@ -114,10 +123,12 @@ public class PacketListener extends ChannelInboundHandlerAdapter { saveMetaData(); } //#if MC<10904 + //#if MC>=10800 //$$ if (packet instanceof S46PacketSetCompressionLevel) { //$$ return; // Replay data is never compressed on the packet level //$$ } //#endif + //#endif byte[] bytes = getPacketData(packet); long now = System.currentTimeMillis(); @@ -199,16 +210,32 @@ public class PacketListener extends ChannelInboundHandlerAdapter { //#if MC>=10904 if (packet instanceof SPacketResourcePackSend) { save(resourcePackRecorder.handleResourcePack((SPacketResourcePackSend) packet)); - //#else - //$$ if (packet instanceof S48PacketResourcePackSend) { - //$$ save(resourcePackRecorder.handleResourcePack((S48PacketResourcePackSend) packet)); - //#endif return; } + //#else + //#if MC>=10800 + //$$ if (packet instanceof S48PacketResourcePackSend) { + //$$ save(resourcePackRecorder.handleResourcePack((S48PacketResourcePackSend) packet)); + //$$ return; + //$$ } + //#else + //$$ if (packet instanceof S3FPacketCustomPayload) { + //$$ S3FPacketCustomPayload p = (S3FPacketCustomPayload) packet; + //$$ if ("MC|RPack".equals(p.func_149169_c())) { + //$$ save(resourcePackRecorder.handleResourcePack(p)); + //$$ return; + //$$ } + //$$ } + //#endif + //#endif if (packet instanceof FMLProxyPacket) { // This packet requires special handling + //#if MC>=10800 ((FMLProxyPacket) packet).toS3FPackets().forEach(this::save); + //#else + //$$ save(((FMLProxyPacket) packet).toS3FPacket()); + //#endif super.channelRead(ctx, msg); return; } @@ -223,7 +250,12 @@ public class PacketListener extends ChannelInboundHandlerAdapter { //#else //$$ if (packet instanceof S3FPacketCustomPayload) { //$$ S3FPacketCustomPayload p = (S3FPacketCustomPayload) packet; - //$$ if (Restrictions.PLUGIN_CHANNEL.equals(p.getChannelName())) { + //#if MC>=10800 + //$$ String channelName = p.getChannelName(); + //#else + //$$ String channelName = p.func_149169_c(); + //#endif + //$$ if (Restrictions.PLUGIN_CHANNEL.equals(channelName)) { //$$ packet = new S40PacketDisconnect(new ChatComponentText("Please update to view this replay.")); //#endif save(packet); @@ -304,7 +336,11 @@ public class PacketListener extends ChannelInboundHandlerAdapter { //$$ } //#endif + //#if MC>=10800 Integer packetId = EnumConnectionState.PLAY.getPacketId(EnumPacketDirection.CLIENTBOUND, packet); + //#else + //$$ Integer packetId = (Integer) EnumConnectionState.PLAY.func_150755_b().inverse().get(packet.getClass()); + //#endif if (packetId == null) { throw new IOException("Unknown packet type:" + packet.getClass()); } @@ -322,7 +358,7 @@ public class PacketListener extends ChannelInboundHandlerAdapter { } public void addMarker() { - Entity view = Minecraft.getMinecraft().getRenderViewEntity(); + Entity view = getRenderViewEntity(Minecraft.getMinecraft()); int timestamp = (int) (System.currentTimeMillis() - startTime); Marker marker = new Marker(); diff --git a/src/main/java/com/replaymod/recording/packet/ResourcePackRecorder.java b/src/main/java/com/replaymod/recording/packet/ResourcePackRecorder.java index 941f47fd..c5818c9e 100644 --- a/src/main/java/com/replaymod/recording/packet/ResourcePackRecorder.java +++ b/src/main/java/com/replaymod/recording/packet/ResourcePackRecorder.java @@ -2,21 +2,15 @@ package com.replaymod.recording.packet; import com.google.common.hash.Hashing; import com.google.common.io.Files; -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.ListenableFuture; import com.replaymod.replaystudio.replay.ReplayFile; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreenWorking; import net.minecraft.client.gui.GuiYesNo; import net.minecraft.client.gui.GuiYesNoCallback; import net.minecraft.client.multiplayer.ServerData; -import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.ResourcePackRepository; -import net.minecraft.network.NetworkManager; import net.minecraft.util.HttpUtil; -import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -25,20 +19,39 @@ import net.minecraft.network.play.client.CPacketResourcePackStatus; import net.minecraft.network.play.client.CPacketResourcePackStatus.Action; import net.minecraft.network.play.server.SPacketResourcePackSend; //#else +//#if MC>=10800 //$$ import net.minecraft.network.play.client.C19PacketResourcePackStatus; //$$ import net.minecraft.network.play.client.C19PacketResourcePackStatus.Action; //$$ import net.minecraft.network.play.server.S48PacketResourcePackSend; +//#else +//#endif //#endif +//#if MC>=10800 +import com.google.common.util.concurrent.FutureCallback; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; +import net.minecraft.client.network.NetHandlerPlayClient; +import net.minecraft.network.NetworkManager; +import org.apache.commons.io.FileUtils; + import javax.annotation.Nonnull; + +import static com.replaymod.core.versions.MCVer.*; +//#else +//$$ import net.minecraft.client.multiplayer.ServerData.ServerResourceMode; +//$$ import net.minecraft.client.multiplayer.ServerList; +//$$ import net.minecraft.client.resources.FileResourcePack; +//$$ import net.minecraft.network.play.server.S3FPacketCustomPayload; +//$$ import org.apache.commons.io.Charsets; +//#endif + import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.util.HashMap; import java.util.Map; -import static com.replaymod.core.versions.MCVer.*; - /** * Records resource packs and handles incoming resource pack packets during recording. */ @@ -84,6 +97,7 @@ public class ResourcePackRecorder { } } + //#if MC>=10800 //#if MC>=10904 public CPacketResourcePackStatus makeStatusPacket(String hash, Action action) { //#if MC>=11002 @@ -282,5 +296,78 @@ public class ResourcePackRecorder { //#endif } } + //#else + //$$ public synchronized S3FPacketCustomPayload handleResourcePack(S3FPacketCustomPayload packet) { + //$$ final int requestId = nextRequestId++; + //$$ final String url = new String(packet.func_149168_d(), Charsets.UTF_8); + //$$ + //$$ ServerData serverData = mc.getCurrentServerData(); + //$$ ServerResourceMode resourceMode = serverData == null ? ServerResourceMode.PROMPT : serverData.getResourceMode(); + //$$ if (resourceMode == ServerResourceMode.ENABLED) { + //$$ downloadResourcePack(requestId, url); + //$$ mc.getResourcePackRepository().obtainResourcePack(url); + //$$ } else if (resourceMode == ServerResourceMode.PROMPT) { + //$$ // Lambdas MUST NOT be used with methods that need re-obfuscation in FG prior to 2.2 (will result in AbstractMethodError) + //$$ //noinspection Convert2Lambda + //$$ mc.displayGuiScreen(new GuiYesNo(new GuiYesNoCallback() { + //$$ @Override + //$$ public void confirmClicked(boolean result, int id) { + //$$ if (serverData != null) { + //$$ serverData.setResourceMode(ServerResourceMode.ENABLED); + //$$ ServerList.func_147414_b(serverData); + //$$ } + //$$ + //$$ mc.displayGuiScreen(null); + //$$ + //$$ if (result) { + //$$ downloadResourcePack(requestId, url); + //$$ } + //$$ } + //$$ }, I18n.format("multiplayer.texturePrompt.line1"), I18n.format("multiplayer.texturePrompt.line2"), 0)); + //$$ } + //$$ + //$$ return new S3FPacketCustomPayload(packet.func_149169_c(), ("replay://" + requestId).getBytes(Charsets.UTF_8)); + //$$ } + //$$ + //$$ private void downloadResourcePack(final int requestId, String url) { + //$$ final ResourcePackRepository repo = mc.mcResourcePackRepository; + //$$ + //$$ String fileName = url.substring(url.lastIndexOf("/") + 1); + //$$ + //$$ if (fileName.contains("?")) { + //$$ fileName = fileName.substring(0, fileName.indexOf("?")); + //$$ } + //$$ + //$$ if (!fileName.endsWith(".zip")) { + //$$ return; + //$$ } + //$$ + //$$ fileName = fileName.replaceAll("\\W", ""); + //$$ + //$$ File file = new File(repo.field_148534_e, fileName); + //$$ + //$$ HashMap hashmap = new HashMap<>(); + //$$ hashmap.put("X-Minecraft-Username", mc.getSession().getUsername()); + //$$ hashmap.put("X-Minecraft-UUID", mc.getSession().getPlayerID()); + //$$ hashmap.put("X-Minecraft-Version", "1.7.10"); + //$$ + //$$ GuiScreenWorking guiScreen = new GuiScreenWorking(); + //$$ Minecraft.getMinecraft().displayGuiScreen(guiScreen); + //$$ repo.func_148529_f(); + //$$ repo.field_148533_g = true; + //$$ // Lambdas MUST NOT be used with methods that need re-obfuscation in FG prior to 2.2 (will result in AbstractMethodError) + //$$ //noinspection Convert2Lambda + //$$ HttpUtil.downloadResourcePack(file, url, new HttpUtil.DownloadListener() { + //$$ public void onDownloadComplete(File file) { + //$$ if (repo.field_148533_g) { + //$$ repo.field_148533_g = false; + //$$ repo.field_148532_f = new FileResourcePack(file); + //$$ Minecraft.getMinecraft().scheduleResourcesRefresh(); + //$$ recordResourcePack(file, requestId); + //$$ } + //$$ } + //$$ }, hashmap, 50*1024*1024, guiScreen, Minecraft.getMinecraft().getProxy()); + //$$ } + //#endif } diff --git a/src/main/java/com/replaymod/render/ReplayModRender.java b/src/main/java/com/replaymod/render/ReplayModRender.java index 250134d4..1f9cfcda 100644 --- a/src/main/java/com/replaymod/render/ReplayModRender.java +++ b/src/main/java/com/replaymod/render/ReplayModRender.java @@ -6,11 +6,18 @@ import com.replaymod.replay.events.ReplayCloseEvent; import net.minecraft.crash.CrashReport; import net.minecraft.util.ReportedException; import net.minecraftforge.common.config.Configuration; +import org.apache.commons.io.FileUtils; +import org.apache.logging.log4j.Logger; + +//#if MC>=10800 import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import org.apache.commons.io.FileUtils; -import org.apache.logging.log4j.Logger; +//#else +//$$ import cpw.mods.fml.common.Mod; +//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent; +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif import java.io.File; import java.io.IOException; @@ -23,7 +30,9 @@ import static com.replaymod.core.versions.MCVer.*; version = "@MOD_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@", acceptableRemoteVersions = "*", + //#if MC>=10800 clientSideOnly = true, + //#endif useMetadata = true) public class ReplayModRender { public static final String MOD_ID = "replaymod-render"; diff --git a/src/main/java/com/replaymod/render/VideoWriter.java b/src/main/java/com/replaymod/render/VideoWriter.java index 08ddb9e4..e4c5f280 100755 --- a/src/main/java/com/replaymod/render/VideoWriter.java +++ b/src/main/java/com/replaymod/render/VideoWriter.java @@ -9,7 +9,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReportCategory; import net.minecraft.util.Util; -import net.minecraftforge.fml.common.versioning.ComparableVersion; import org.apache.commons.exec.CommandLine; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; @@ -28,6 +27,12 @@ import java.util.Comparator; import java.util.Optional; import java.util.concurrent.TimeUnit; +//#if MC>=10800 +import net.minecraftforge.fml.common.versioning.ComparableVersion; +//#else +//$$ import cpw.mods.fml.common.versioning.ComparableVersion; +//#endif + import static com.replaymod.render.ReplayModRender.LOGGER; import static org.apache.commons.lang3.Validate.isTrue; diff --git a/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java b/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java index ac612cda..465575e8 100644 --- a/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java +++ b/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java @@ -7,16 +7,22 @@ import com.replaymod.render.frame.OpenGlFrame; import com.replaymod.render.rendering.FrameCapturer; import com.replaymod.render.shader.Program; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GlStateManager; import net.minecraft.crash.CrashReport; import net.minecraft.util.ReportedException; import net.minecraft.util.ResourceLocation; import org.lwjgl.util.ReadableDimension; +//#if MC>=10800 +import net.minecraft.client.renderer.GlStateManager; +import static net.minecraft.client.renderer.GlStateManager.*; +//#else +//$$ import com.replaymod.render.hooks.GLStateTracker.BooleanState; +//$$ import static com.replaymod.core.versions.MCVer.GlStateManager.*; +//#endif + import java.io.IOException; -import static com.replaymod.core.versions.MCVer.fog; -import static net.minecraft.client.renderer.GlStateManager.*; +import static com.replaymod.core.versions.MCVer.*; import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; @@ -43,6 +49,11 @@ public class ODSFrameCapturer implements FrameCapturer { return renderInfo.getFrameSize(); } + @Override + public int getFramesDone() { + return renderInfo.getFramesDone(); + } + @Override public int getTotalFrames() { return renderInfo.getTotalFrames(); @@ -76,9 +87,9 @@ public class ODSFrameCapturer implements FrameCapturer { linkState(1, "lightMapEnabled"); linkState(2, "hurtTextureEnabled"); final Program.Uniform uniform = shaderProgram.getUniformVariable("fogEnabled"); - previousFogState = fog(GlStateManager.fogState); + previousFogState = fog(); uniform.set(previousFogState.currentState); - fog(GlStateManager.fogState, new BooleanState(previousFogState.capability) { + fog(new BooleanState(previousFogState.capability) { @Override public void setState(boolean state) { super.setState(state); @@ -97,15 +108,15 @@ public class ODSFrameCapturer implements FrameCapturer { private void linkState(int id, String var) { final Program.Uniform uniform = shaderProgram.getUniformVariable(var); - previousStates[id] = GlStateManager.textureState[id].texture2DState; + previousStates[id] = texture2DState(id); uniform.set(previousStates[id].currentState); - GlStateManager.textureState[id].texture2DState = new BooleanState(previousStates[id].capability) { + texture2DState(id, new BooleanState(previousStates[id].capability) { @Override public void setState(boolean state) { super.setState(state); uniform.set(state); } - }; + }); } @Override @@ -133,10 +144,10 @@ public class ODSFrameCapturer implements FrameCapturer { left.close(); right.close(); shaderProgram.delete(); - for (int i = 0; i < 3; i++) { - GlStateManager.textureState[i].texture2DState = previousStates[i]; + for (int i = 0; i < previousStates.length; i++) { + texture2DState(i, previousStates[i]); } - fog(GlStateManager.fogState, previousFogState); + fog(previousFogState); } private class CubicStereoFrameCapturer extends CubicPboOpenGlFrameCapturer { diff --git a/src/main/java/com/replaymod/render/capturer/OpenGlFrameCapturer.java b/src/main/java/com/replaymod/render/capturer/OpenGlFrameCapturer.java index d0968582..6654b43f 100644 --- a/src/main/java/com/replaymod/render/capturer/OpenGlFrameCapturer.java +++ b/src/main/java/com/replaymod/render/capturer/OpenGlFrameCapturer.java @@ -15,7 +15,12 @@ import org.lwjgl.util.WritableDimension; import java.io.IOException; import java.nio.ByteBuffer; +//#if MC>=10800 import static net.minecraft.client.renderer.GlStateManager.*; +//#else +//$$ import static com.replaymod.core.versions.MCVer.GlStateManager.*; +//#endif + import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; diff --git a/src/main/java/com/replaymod/render/capturer/RenderInfo.java b/src/main/java/com/replaymod/render/capturer/RenderInfo.java index 896e2419..72f7596e 100644 --- a/src/main/java/com/replaymod/render/capturer/RenderInfo.java +++ b/src/main/java/com/replaymod/render/capturer/RenderInfo.java @@ -6,6 +6,8 @@ import org.lwjgl.util.ReadableDimension; public interface RenderInfo { ReadableDimension getFrameSize(); + int getFramesDone(); + int getTotalFrames(); float updateForNextFrame(); diff --git a/src/main/java/com/replaymod/render/events/ReplayRenderEvent.java b/src/main/java/com/replaymod/render/events/ReplayRenderEvent.java index f52ce0bb..a6ff19b9 100644 --- a/src/main/java/com/replaymod/render/events/ReplayRenderEvent.java +++ b/src/main/java/com/replaymod/render/events/ReplayRenderEvent.java @@ -3,7 +3,12 @@ package com.replaymod.render.events; import com.replaymod.render.rendering.VideoRenderer; import lombok.Getter; import lombok.RequiredArgsConstructor; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.Event; +//#else +//$$ import cpw.mods.fml.common.eventhandler.Event; +//#endif @RequiredArgsConstructor public abstract class ReplayRenderEvent extends Event { diff --git a/src/main/java/com/replaymod/render/hooks/ChunkLoadingRenderGlobal.java b/src/main/java/com/replaymod/render/hooks/ChunkLoadingRenderGlobal.java index d2a9844d..4f2c27b0 100644 --- a/src/main/java/com/replaymod/render/hooks/ChunkLoadingRenderGlobal.java +++ b/src/main/java/com/replaymod/render/hooks/ChunkLoadingRenderGlobal.java @@ -1,3 +1,4 @@ +//#if MC>=10800 package com.replaymod.render.hooks; import com.replaymod.render.utils.JailingQueue; @@ -128,3 +129,4 @@ public class ChunkLoadingRenderGlobal { } } } +//#endif diff --git a/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java b/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java index f27ada50..fa6d2ef3 100644 --- a/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java +++ b/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java @@ -2,11 +2,18 @@ package com.replaymod.render.hooks; import com.replaymod.render.RenderSettings; import com.replaymod.render.capturer.CaptureData; +import com.replaymod.render.capturer.RenderInfo; import com.replaymod.render.capturer.WorldRenderer; import lombok.Getter; import net.minecraft.client.Minecraft; + +//#if MC>=10800 import net.minecraft.client.renderer.GlStateManager; import net.minecraftforge.fml.common.FMLCommonHandler; +//#else +//$$ import com.replaymod.core.versions.MCVer.GlStateManager; +//$$ import cpw.mods.fml.common.FMLCommonHandler; +//#endif import java.io.IOException; @@ -16,12 +23,16 @@ public class EntityRendererHandler implements WorldRenderer { @Getter protected final RenderSettings settings; + @Getter + private final RenderInfo renderInfo; + public CaptureData data; public boolean omnidirectional; - public EntityRendererHandler(RenderSettings settings) { + public EntityRendererHandler(RenderSettings settings, RenderInfo renderInfo) { this.settings = settings; + this.renderInfo = renderInfo; ((IEntityRenderer) mc.entityRenderer).replayModRender_setHandler(this); } @@ -41,7 +52,11 @@ public class EntityRendererHandler implements WorldRenderer { GlStateManager.enableAlpha(); GlStateManager.alphaFunc(516, 0.5F); + //#if MC>=10800 mc.entityRenderer.renderWorldPass(2, partialTicks, finishTimeNano); + //#else + //$$ mc.entityRenderer.renderWorld(partialTicks, finishTimeNano); + //#endif FMLCommonHandler.instance().onRenderTickEnd(partialTicks); } diff --git a/src/main/java/com/replaymod/render/hooks/GLStateTracker.java b/src/main/java/com/replaymod/render/hooks/GLStateTracker.java new file mode 100644 index 00000000..f2abf6dd --- /dev/null +++ b/src/main/java/com/replaymod/render/hooks/GLStateTracker.java @@ -0,0 +1,70 @@ +//#if MC<=10710 +//$$ package com.replaymod.render.hooks; +//$$ +//$$ import org.lwjgl.opengl.GL11; +//$$ import org.lwjgl.opengl.GL13; +//$$ +//$$ /** +//$$ * Tracks OpenGL state for use in the ODS shader. +//$$ * All methods should be called from the GL mixins only. +//$$ */ +//$$ public class GLStateTracker { +//$$ private static ThreadLocal stateTracker = ThreadLocal.withInitial(GLStateTracker::new); +//$$ public static GLStateTracker getInstance() { +//$$ return stateTracker.get(); +//$$ } +//$$ +//$$ public int activeTexture; +//$$ public BooleanState fog = new BooleanState(GL11.GL_FOG); +//$$ public BooleanState[] texture = new BooleanState[32]; +//$$ { +//$$ for (int i = 0; i < texture.length; i++) { +//$$ texture[i] = new BooleanState(GL11.GL_TEXTURE_2D); +//$$ } +//$$ } +//$$ +//$$ public void updateActiveTexture(int magic) { +//$$ this.activeTexture = magic - GL13.GL_TEXTURE0; +//$$ } +//$$ +//$$ public void updateEnabledState(int magic, boolean enabled) { +//$$ switch (magic) { +//$$ case GL11.GL_FOG: fog.setState(enabled); break; +//$$ case GL11.GL_TEXTURE_2D: texture[activeTexture].setState(enabled); break; +//$$ } +//$$ } +//$$ +//$$ public static class BooleanState { +//$$ public int capability; +//$$ public boolean currentState; +//$$ +//$$ public BooleanState(int capability) { +//$$ this.capability = capability; +//$$ } +//$$ +//$$ public void setState(boolean enabled) { +//$$ this.currentState = enabled; +//$$ } +//$$ +//$$ public boolean getState() { +//$$ return currentState; +//$$ } +//$$ } +//$$ +//$$ // Called via ASM (see GLStateTrackerTransformer) +//$$ @Deprecated +//$$ @SuppressWarnings("unused") +//$$ public static void hook_glEnable(int magic) { +//$$ GL11.glEnable(magic); +//$$ getInstance().updateEnabledState(magic, true); +//$$ } +//$$ +//$$ // Called via ASM (see GLStateTrackerTransformer) +//$$ @Deprecated +//$$ @SuppressWarnings("unused") +//$$ public static void hook_glDisable(int magic) { +//$$ GL11.glDisable(magic); +//$$ getInstance().updateEnabledState(magic, false); +//$$ } +//$$ } +//#endif diff --git a/src/main/java/com/replaymod/render/mixin/MixinEffectRenderer.java b/src/main/java/com/replaymod/render/mixin/MixinEffectRenderer.java index f6a483cb..f9d8587c 100644 --- a/src/main/java/com/replaymod/render/mixin/MixinEffectRenderer.java +++ b/src/main/java/com/replaymod/render/mixin/MixinEffectRenderer.java @@ -5,38 +5,68 @@ package com.replaymod.render.mixin; //$$ import net.minecraft.client.Minecraft; //$$ import net.minecraft.client.particle.EffectRenderer; //$$ import net.minecraft.client.particle.EntityFX; -//$$ import net.minecraft.client.renderer.WorldRenderer; //$$ import net.minecraft.entity.Entity; //$$ import org.spongepowered.asm.mixin.Mixin; //$$ import org.spongepowered.asm.mixin.injection.At; //$$ import org.spongepowered.asm.mixin.injection.Redirect; //$$ +//#if MC>=10800 +//$$ import net.minecraft.client.renderer.WorldRenderer; +//#else +//$$ import net.minecraft.client.renderer.Tessellator; +//#endif +//$$ //$$ @Mixin(EffectRenderer.class) //$$ public abstract class MixinEffectRenderer { + //#if MC>=10800 //#if MC>=10809 //$$ @Redirect(method = "renderParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/EntityFX;renderParticle(Lnet/minecraft/client/renderer/WorldRenderer;Lnet/minecraft/entity/Entity;FFFFFF)V")) //#else //$$ @Redirect(method = "renderParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/EntityFX;func_180434_a(Lnet/minecraft/client/renderer/WorldRenderer;Lnet/minecraft/entity/Entity;FFFFFF)V")) //#endif -//$$ private void renderNormalParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks, -//$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { -//$$ renderParticle(fx, worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); -//$$ } + //$$ private void renderNormalParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks, + //$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { + //$$ renderParticle(fx, worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); + //$$ } + //#else + //$$ @Redirect(method = "renderParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/EntityFX;renderParticle(Lnet/minecraft/client/renderer/Tessellator;FFFFFF)V")) + //$$ private void renderNormalParticle(EntityFX fx, Tessellator tesselator, float partialTicks, + //$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { + //$$ renderParticle(fx, tesselator, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); + //$$ } + //#endif //$$ + //#if MC>=10800 //#if MC>=10809 //$$ @Redirect(method = "renderLitParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/EntityFX;renderParticle(Lnet/minecraft/client/renderer/WorldRenderer;Lnet/minecraft/entity/Entity;FFFFFF)V")) //#else //$$ @Redirect(method = "renderLitParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/EntityFX;func_180434_a(Lnet/minecraft/client/renderer/WorldRenderer;Lnet/minecraft/entity/Entity;FFFFFF)V")) //#endif -//$$ private void renderLitParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks, -//$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { -//$$ renderParticle(fx, worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); -//$$ } + //$$ private void renderLitParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks, + //$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { + //$$ renderParticle(fx, worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); + //$$ } + //#else + //$$ @Redirect(method = "renderLitParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/EntityFX;renderParticle(Lnet/minecraft/client/renderer/Tessellator;FFFFFF)V")) + //$$ private void renderLitParticle(EntityFX fx, Tessellator tessellator, float partialTicks, + //$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { + //$$ renderParticle(fx, tessellator, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); + //$$ } + //#endif //$$ -//$$ private void renderParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks, +//$$ private void renderParticle(EntityFX fx, + //#if MC>=10800 + //$$ WorldRenderer worldRenderer, Entity view, + //#else + //$$ Tessellator tessellator, + //#endif +//$$ float partialTicks, //$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { //$$ EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).replayModRender_getHandler(); //$$ if (handler != null && handler.omnidirectional) { + //#if MC<=10710 + //$$ Entity view = Minecraft.getMinecraft().renderViewEntity; + //#endif //$$ // Align all particles towards the camera //$$ double dx = fx.prevPosX + (fx.posX - fx.prevPosX) * partialTicks - view.posX; //$$ double dy = fx.prevPosY + (fx.posY - fx.prevPosY) * partialTicks - view.posY; @@ -54,7 +84,11 @@ package com.replaymod.render.mixin; //#if MC>=10809 //$$ fx.renderParticle(worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); //#else + //#if MC>=10800 //$$ fx.func_180434_a(worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); + //#else + //$$ fx.renderParticle(tessellator, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); + //#endif //#endif //$$ } //$$ } diff --git a/src/main/java/com/replaymod/render/mixin/MixinEntityRenderer.java b/src/main/java/com/replaymod/render/mixin/MixinEntityRenderer.java index 0d833dbf..919a88bc 100644 --- a/src/main/java/com/replaymod/render/mixin/MixinEntityRenderer.java +++ b/src/main/java/com/replaymod/render/mixin/MixinEntityRenderer.java @@ -7,10 +7,10 @@ import com.replaymod.render.hooks.EntityRendererHandler; import com.replaymod.replay.camera.CameraEntity; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.EntityRenderer; -import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.RenderGlobal; import net.minecraft.client.settings.GameSettings; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import org.lwjgl.opengl.GL11; import org.lwjgl.util.ReadableColor; @@ -28,6 +28,14 @@ import net.minecraft.util.math.RayTraceResult; //$$ import net.minecraft.util.MovingObjectPosition; //#endif +//#if MC>=10800 +import net.minecraft.client.renderer.GlStateManager; +//#else +//$$ import com.replaymod.core.versions.MCVer.GlStateManager; +//#endif + +import static com.replaymod.core.versions.MCVer.*; + @Mixin(value = EntityRenderer.class) public abstract class MixinEntityRenderer implements EntityRendererHandler.IEntityRenderer, EntityRendererHandler.GluPerspective { @Shadow @@ -45,6 +53,17 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti return replayModRender_handler; } + //#if MC<=10710 + //$$ @Redirect(method = "renderWorld", at = @At(value = "INVOKE",target = + //$$ "Lnet/minecraft/client/renderer/RenderGlobal;updateRenderers(Lnet/minecraft/entity/EntityLivingBase;Z)Z")) + //$$ private boolean replayModRender_updateAllChunks(RenderGlobal self, EntityLivingBase view, boolean renderAllChunks) { + //$$ if (replayModRender_handler != null) { + //$$ renderAllChunks = true; + //$$ } + //$$ return self.updateRenderers(view, renderAllChunks); + //$$ } + //#endif + @Inject(method = "setupFog", at = @At("HEAD"), cancellable = true) private void replayModRender_onSetupFog(int fogDistanceFlag, float partialTicks, CallbackInfo ci) { if (replayModRender_handler == null) return; @@ -56,7 +75,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti @Inject(method = "orientCamera", at = @At("HEAD")) private void replayModRender_resetRotationIfNeeded(float partialTicks, CallbackInfo ci) { if (replayModRender_handler != null) { - Entity entity = Minecraft.getMinecraft().getRenderViewEntity(); + Entity entity = getRenderViewEntity(Minecraft.getMinecraft()); RenderSettings settings = replayModRender_handler.getSettings(); if (settings.isStabilizeYaw()) { entity.prevRotationYaw = entity.rotationYaw = 0; @@ -79,7 +98,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti @Inject(method = "setupCameraTransform", at = @At("HEAD")) private void replayModRender_beforeSetupCameraTransform(float partialTicks, int renderPass, CallbackInfo ci) { if (replayModRender_handler != null) { - Entity entity = Minecraft.getMinecraft().getRenderViewEntity(); + Entity entity = getRenderViewEntity(Minecraft.getMinecraft()); orgYaw = entity.rotationYaw; orgPitch = entity.rotationPitch; orgPrevYaw = entity.prevRotationYaw; @@ -91,7 +110,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti @Inject(method = "setupCameraTransform", at = @At("RETURN")) private void replayModRender_afterSetupCameraTransform(float partialTicks, int renderPass, CallbackInfo ci) { if (replayModRender_handler != null) { - Entity entity = Minecraft.getMinecraft().getRenderViewEntity(); + Entity entity = getRenderViewEntity(Minecraft.getMinecraft()); entity.rotationYaw = orgYaw; entity.rotationPitch = orgPitch; entity.prevRotationYaw = orgPrevYaw; @@ -109,7 +128,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti ci.cancel(); return; // No spectator hands during 360° view, we wouldn't even know where to put it } - Entity currentEntity = Minecraft.getMinecraft().getRenderViewEntity(); + Entity currentEntity = getRenderViewEntity(Minecraft.getMinecraft()); if (currentEntity instanceof EntityPlayer && !(currentEntity instanceof CameraEntity)) { if (renderPass == 2) { // Need to update render pass renderPass = replayModRender_handler.data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE ? 1 : 0; @@ -127,7 +146,11 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti @Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;drawSelectionBox(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/util/math/RayTraceResult;IF)V")) private void replayModRender_drawSelectionBox(RenderGlobal instance, EntityPlayer player, RayTraceResult rtr, int alwaysZero, float partialTicks) { //#else + //#if MC>=10800 //$$ @Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;drawSelectionBox(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/util/MovingObjectPosition;IF)V")) + //#else + //$$ @Redirect(method = "renderWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;drawSelectionBox(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/util/MovingObjectPosition;IF)V")) + //#endif //$$ private void replayModRender_drawSelectionBox(RenderGlobal instance, EntityPlayer player, MovingObjectPosition rtr, int alwaysZero, float partialTicks) { //#endif if (replayModRender_handler == null) { @@ -137,7 +160,12 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti private int orgRenderDistanceChunks; + //#if MC>=10800 @Inject(method = "renderWorldPass", at = @At(value = "JUMP", ordinal = 0)) + //#else + //$$ @Inject(method = "renderWorld", at = @At(value = "INVOKE", ordinal = 0, shift = At.Shift.AFTER, + //$$ target = "Lnet/minecraft/client/renderer/culling/ClippingHelperImpl;getInstance()Lnet/minecraft/client/renderer/culling/ClippingHelper;")) + //#endif private void replayModRender_beforeRenderSky(CallbackInfo ci) { if (replayModRender_handler != null && replayModRender_handler.getSettings().getChromaKeyingColor() != null) { GameSettings settings = Minecraft.getMinecraft().gameSettings; @@ -146,15 +174,24 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti } } + //#if MC>=10800 @Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;renderSky(FI)V")) private void replayModRender_renderSky(RenderGlobal instance, float partialTicks, int renderPass) { + //#else + //$$ @Redirect(method = "renderWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;renderSky(F)V")) + //$$ private void replayModRender_renderSky(RenderGlobal instance, float partialTicks) { + //#endif if (replayModRender_handler != null && replayModRender_handler.getSettings().getChromaKeyingColor() != null) { Minecraft.getMinecraft().gameSettings.renderDistanceChunks = orgRenderDistanceChunks; ReadableColor color = replayModRender_handler.getSettings().getChromaKeyingColor(); GlStateManager.clearColor(color.getRed() / 255f, color.getGreen() / 255f, color.getBlue() / 255f, 1); GlStateManager.clear(GL11.GL_COLOR_BUFFER_BIT); } else { + //#if MC>=10800 instance.renderSky(partialTicks, renderPass); + //#else + //$$ instance.renderSky(partialTicks); + //#endif } } @@ -162,7 +199,11 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti * Stereoscopic Renderer */ + //#if MC>=10800 @Inject(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/GlStateManager;loadIdentity()V", shift = At.Shift.AFTER, ordinal = 0)) + //#else + //$$ @Inject(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/GL11;glLoadIdentity()V", shift = At.Shift.AFTER, ordinal = 0, remap = false)) + //#endif private void replayModRender_setupStereoscopicProjection(float partialTicks, int renderPass, CallbackInfo ci) { if (replayModRender_getHandler() != null) { if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) { @@ -173,7 +214,11 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti } } + //#if MC>=10800 @Inject(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/GlStateManager;loadIdentity()V", shift = At.Shift.AFTER, ordinal = 1)) + //#else + //$$ @Inject(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/GL11;glLoadIdentity()V", shift = At.Shift.AFTER, ordinal = 1, remap = false)) + //#endif private void replayModRender_setupStereoscopicModelView(float partialTicks, int renderPass, CallbackInfo ci) { if (replayModRender_getHandler() != null) { if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) { @@ -193,15 +238,21 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti replayModRender_gluPerspective(fovY, aspect, zNear, zFar); } + //#if MC>=10800 @Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false)) + //#else + //$$ @Redirect(method = "renderHand", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false)) + //#endif private void replayModRender_gluPerspective$1(float fovY, float aspect, float zNear, float zFar) { replayModRender_gluPerspective(fovY, aspect, zNear, zFar); } + //#if MC>=10800 @Redirect(method = "renderCloudsCheck", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false)) private void replayModRender_gluPerspective$2(float fovY, float aspect, float zNear, float zFar) { replayModRender_gluPerspective(fovY, aspect, zNear, zFar); } + //#endif @Override public void replayModRender_gluPerspective(float fovY, float aspect, float zNear, float zFar) { diff --git a/src/main/java/com/replaymod/render/mixin/MixinFrustum.java b/src/main/java/com/replaymod/render/mixin/MixinFrustum.java index ed22976e..4a6facbe 100644 --- a/src/main/java/com/replaymod/render/mixin/MixinFrustum.java +++ b/src/main/java/com/replaymod/render/mixin/MixinFrustum.java @@ -2,13 +2,22 @@ package com.replaymod.render.mixin; import com.replaymod.render.hooks.EntityRendererHandler; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.culling.Frustum; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +//#if MC>=10800 +import net.minecraft.client.renderer.culling.Frustum; +//#else +//$$ import net.minecraft.client.renderer.culling.Frustrum; +//#endif + +//#if MC>=10800 @Mixin(Frustum.class) +//#else +//$$ @Mixin(Frustrum.class) +//#endif public abstract class MixinFrustum { @Inject(method = "isBoxInFrustum", at = @At("HEAD"), cancellable = true) public void isBoxInFrustum(double minX, double minY, double minZ, double maxX, double maxY, double maxZ, CallbackInfoReturnable ci) { diff --git a/src/main/java/com/replaymod/render/mixin/MixinOpenGlHelper.java b/src/main/java/com/replaymod/render/mixin/MixinOpenGlHelper.java new file mode 100644 index 00000000..7c2380f2 --- /dev/null +++ b/src/main/java/com/replaymod/render/mixin/MixinOpenGlHelper.java @@ -0,0 +1,18 @@ +//#if MC<=10710 +//$$ package com.replaymod.render.mixin; +//$$ +//$$ import com.replaymod.render.hooks.GLStateTracker; +//$$ import net.minecraft.client.renderer.OpenGlHelper; +//$$ import org.spongepowered.asm.mixin.Mixin; +//$$ import org.spongepowered.asm.mixin.injection.At; +//$$ import org.spongepowered.asm.mixin.injection.Inject; +//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +//$$ +//$$ @Mixin(OpenGlHelper.class) +//$$ public abstract class MixinOpenGlHelper { +//$$ @Inject(method = "setActiveTexture", at = @At("RETURN")) +//$$ private static void replayModRender_trackActiveTexture(int magic, CallbackInfo ci) { +//$$ GLStateTracker.getInstance().updateActiveTexture(magic); +//$$ } +//$$ } +//#endif diff --git a/src/main/java/com/replaymod/render/mixin/MixinRenderGlobal.java b/src/main/java/com/replaymod/render/mixin/MixinRenderGlobal.java index a5cd2885..a5364b63 100644 --- a/src/main/java/com/replaymod/render/mixin/MixinRenderGlobal.java +++ b/src/main/java/com/replaymod/render/mixin/MixinRenderGlobal.java @@ -1,3 +1,4 @@ +//#if MC>=10800 package com.replaymod.render.mixin; import com.replaymod.render.hooks.ChunkLoadingRenderGlobal; @@ -67,3 +68,4 @@ public abstract class MixinRenderGlobal { } } } +//#endif diff --git a/src/main/java/com/replaymod/render/rendering/Pipelines.java b/src/main/java/com/replaymod/render/rendering/Pipelines.java index f16ba7df..720c6317 100644 --- a/src/main/java/com/replaymod/render/rendering/Pipelines.java +++ b/src/main/java/com/replaymod/render/rendering/Pipelines.java @@ -30,9 +30,9 @@ public class Pipelines { RenderSettings settings = renderInfo.getRenderSettings(); FrameCapturer capturer; if (PixelBufferObject.SUPPORTED) { - capturer = new SimplePboOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo); + capturer = new SimplePboOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo); } else { - capturer = new SimpleOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo); + capturer = new SimpleOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo); } return new Pipeline<>(capturer, new OpenGlToRGBProcessor(), consumer); } @@ -41,9 +41,9 @@ public class Pipelines { RenderSettings settings = renderInfo.getRenderSettings(); FrameCapturer capturer; if (PixelBufferObject.SUPPORTED) { - capturer = new StereoscopicPboOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo); + capturer = new StereoscopicPboOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo); } else { - capturer = new StereoscopicOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo); + capturer = new StereoscopicOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo); } return new Pipeline<>(capturer, new StereoscopicToRGBProcessor(), consumer); } @@ -52,9 +52,9 @@ public class Pipelines { RenderSettings settings = renderInfo.getRenderSettings(); FrameCapturer capturer; if (PixelBufferObject.SUPPORTED) { - capturer = new CubicPboOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo, settings.getVideoWidth() / 4); + capturer = new CubicPboOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo, settings.getVideoWidth() / 4); } else { - capturer = new CubicOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo, settings.getVideoWidth() / 4); + capturer = new CubicOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo, settings.getVideoWidth() / 4); } return new Pipeline<>(capturer, new CubicToRGBProcessor(), consumer); } @@ -63,9 +63,9 @@ public class Pipelines { RenderSettings settings = renderInfo.getRenderSettings(); FrameCapturer capturer; if (PixelBufferObject.SUPPORTED) { - capturer = new CubicPboOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo, settings.getVideoWidth() / 4); + capturer = new CubicPboOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo, settings.getVideoWidth() / 4); } else { - capturer = new CubicOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo, settings.getVideoWidth() / 4); + capturer = new CubicOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo, settings.getVideoWidth() / 4); } return new Pipeline<>(capturer, new EquirectangularToRGBProcessor(settings.getVideoWidth() / 4), consumer); } @@ -73,7 +73,7 @@ public class Pipelines { public static Pipeline newODSPipeline(RenderInfo renderInfo, FrameConsumer consumer) { RenderSettings settings = renderInfo.getRenderSettings(); FrameCapturer capturer = - new ODSFrameCapturer(new EntityRendererHandler(settings), renderInfo, settings.getVideoWidth() / 4); + new ODSFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo, settings.getVideoWidth() / 4); return new Pipeline<>(capturer, new ODSToRGBProcessor(settings.getVideoWidth() / 4), consumer); } } diff --git a/src/main/java/com/replaymod/render/rendering/VideoRenderer.java b/src/main/java/com/replaymod/render/rendering/VideoRenderer.java index 2854fd9e..4ed6f223 100644 --- a/src/main/java/com/replaymod/render/rendering/VideoRenderer.java +++ b/src/main/java/com/replaymod/render/rendering/VideoRenderer.java @@ -12,7 +12,6 @@ import com.replaymod.render.events.ReplayRenderEvent; import com.replaymod.render.frame.RGBFrame; import com.replaymod.render.gui.GuiRenderingDone; import com.replaymod.render.gui.GuiVideoRenderer; -import com.replaymod.render.hooks.ChunkLoadingRenderGlobal; import com.replaymod.render.metadata.MetadataInjector; import com.replaymod.render.utils.SoundHandler; import com.replaymod.replay.ReplayHandler; @@ -35,6 +34,13 @@ import net.minecraft.util.SoundCategory; //$$ import net.minecraft.client.audio.SoundCategory; //#endif +//#if MC>=10800 +import com.replaymod.render.hooks.ChunkLoadingRenderGlobal; +import static net.minecraft.client.renderer.GlStateManager.*; +//#else +//$$ import static com.replaymod.core.versions.MCVer.GlStateManager.*; +//#endif + import java.io.IOException; import java.util.Collection; import java.util.EnumMap; @@ -46,7 +52,6 @@ import java.util.concurrent.FutureTask; import static com.google.common.collect.Iterables.getLast; import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.render.ReplayModRender.LOGGER; -import static net.minecraft.client.renderer.GlStateManager.*; import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; @@ -69,7 +74,9 @@ public class VideoRenderer implements RenderInfo { private TimelinePlayer timelinePlayer; private Future timelinePlayerFuture; + //#if MC>=10800 private ChunkLoadingRenderGlobal chunkLoadingRenderGlobal; + //#endif private int framesDone; private int totalFrames; @@ -251,7 +258,9 @@ public class VideoRenderer implements RenderInfo { //$$ gui.toMinecraft().setWorldAndResolution(mc, scaled.getScaledWidth(), scaled.getScaledHeight()); //#endif + //#if MC>=10800 chunkLoadingRenderGlobal = new ChunkLoadingRenderGlobal(mc.renderGlobal); + //#endif // Set up our own framebuffer to render the GUI to guiFramebuffer = new Framebuffer(displayWidth, displayHeight, true); @@ -277,9 +286,11 @@ public class VideoRenderer implements RenderInfo { //$$ mc.gameSettings.mapSoundLevels = originalSoundLevels; //#endif mc.displayGuiScreen(null); + //#if MC>=10800 if (chunkLoadingRenderGlobal != null) { chunkLoadingRenderGlobal.uninstall(); } + //#endif new SoundHandler().playRenderSuccessSound(); @@ -303,11 +314,15 @@ public class VideoRenderer implements RenderInfo { } mc.currentScreen = gui.toMinecraft(); + //#if MC>=10800 try { mc.runTick(); } catch (IOException e) { throw new RuntimeException(e); } + //#else + //$$ mc.runTick(); + //#endif } public void drawGui() { @@ -328,6 +343,7 @@ public class VideoRenderer implements RenderInfo { ScaledResolution scaled = newScaledResolution(mc); gui.toMinecraft().setWorldAndResolution(mc, scaled.getScaledWidth(), scaled.getScaledHeight()); + //#if MC>=10800 try { gui.toMinecraft().handleInput(); } catch (IOException e) { @@ -335,6 +351,9 @@ public class VideoRenderer implements RenderInfo { // It isn't actually thrown here, so we'll deal with it the easy way throw new RuntimeException(e); } + //#else + //$$ gui.toMinecraft().handleInput(); + //#endif int mouseX = Mouse.getX() * scaled.getScaledWidth() / mc.displayWidth; int mouseY = scaled.getScaledHeight() - Mouse.getY() * scaled.getScaledHeight() / mc.displayHeight - 1; @@ -352,7 +371,11 @@ public class VideoRenderer implements RenderInfo { if (settings.isHighPerformance()) { Display.update(); } else { + //#if MC>=10800 mc.updateDisplay(); + //#else + //$$ mc.resetSize(); + //#endif } if (Mouse.isGrabbed()) { Mouse.setGrabbed(false); diff --git a/src/main/java/com/replaymod/replay/InputReplayTimer.java b/src/main/java/com/replaymod/replay/InputReplayTimer.java index f8f289a3..4baa0f1c 100644 --- a/src/main/java/com/replaymod/replay/InputReplayTimer.java +++ b/src/main/java/com/replaymod/replay/InputReplayTimer.java @@ -13,11 +13,20 @@ import net.minecraft.util.ReportedException; import net.minecraft.util.Timer; import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.FMLCommonHandler; import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; +//#if MC>=10800 +import net.minecraftforge.fml.common.FMLCommonHandler; + import java.io.IOException; +//#else +//$$ import cpw.mods.fml.common.FMLCommonHandler; +//$$ import cpw.mods.fml.common.eventhandler.Event; +//$$ import net.minecraft.client.renderer.entity.RenderManager; +//$$ +//$$ import static com.replaymod.core.versions.MCVer.FML_BUS; +//#endif public class InputReplayTimer extends WrappedTimer { private final ReplayModReplay mod; @@ -33,6 +42,11 @@ public class InputReplayTimer extends WrappedTimer { public void updateTimer() { super.updateTimer(); + // 1.7.10: We have to run the scheduled executables (ours only) because MC would only run them every tick + //#if MC<=10710 + //$$ FML_BUS.post(new RunScheduledTasks()); + //#endif + // If we are in a replay, we have to manually process key and mouse events as the // tick speed may vary or there may not be any ticks at all (when the replay is paused) if (mod.getReplayHandler() != null) { @@ -45,11 +59,15 @@ public class InputReplayTimer extends WrappedTimer { handleKeyEvent(); } } else { + //#if MC>=10800 try { mc.currentScreen.handleInput(); } catch (IOException e) { // *SIGH* e.printStackTrace(); } + //#else + //$$ mc.currentScreen.handleInput(); + //#endif } } } @@ -91,17 +109,22 @@ public class InputReplayTimer extends WrappedTimer { mc.setIngameFocus(); } } else { + //#if MC>=10800 try { mc.currentScreen.handleMouseInput(); } catch (IOException e) { // WHO IS RESPONSIBLE FOR THIS MESS?!? e.printStackTrace(); } + //#else + //$$ mc.currentScreen.handleMouseInput(); + //#endif } FMLCommonHandler.instance().fireMouseInput(); } protected void handleKeyEvent() { + // TODO 1.7.10: This might be missing some 1.7.10-only key bindings or implement some of them incorrectly int key = Keyboard.getEventKey() == 0 ? Keyboard.getEventCharacter() + 256 : Keyboard.getEventKey(); boolean pressed = Keyboard.getEventKeyState(); @@ -131,15 +154,23 @@ public class InputReplayTimer extends WrappedTimer { if (pressed) { // This might be subject to change as vanilla shaders are still kinda unused in 1.8 if (key == Keyboard.KEY_F4 && mc.entityRenderer != null) { + //#if MC>=10800 mc.entityRenderer.switchUseShader(); + //#else + //$$ mc.entityRenderer.activateNextShader(); + //#endif } if (mc.currentScreen != null) { + //#if MC>=10800 try { mc.currentScreen.handleKeyboardInput(); } catch (IOException e) { // AND WHO THOUGHT THIS WAS A GREAT IDEA? e.printStackTrace(); } + //#else + //$$ mc.currentScreen.handleKeyboardInput(); + //#endif } else { if (key == Keyboard.KEY_ESCAPE) { mc.displayInGameMenu(); @@ -176,7 +207,11 @@ public class InputReplayTimer extends WrappedTimer { } if (key == 48 && Keyboard.isKeyDown(61)) { + //#if MC>=10800 mc.getRenderManager().setDebugBoundingBox(!mc.getRenderManager().isDebugBoundingBox()); + //#else + //$$ RenderManager.debugBoundingBox = !RenderManager.debugBoundingBox; + //#endif } if (key == 25 && Keyboard.isKeyDown(61)) { @@ -196,6 +231,7 @@ public class InputReplayTimer extends WrappedTimer { if (mc.gameSettings.keyBindTogglePerspective.isPressed()) { mc.gameSettings.thirdPersonView = (mc.gameSettings.thirdPersonView + 1) % 3; + //#if MC>=10800 if (mc.entityRenderer != null) { // Extra check, not in vanilla code if (mc.gameSettings.thirdPersonView == 0) { mc.entityRenderer.loadEntityShader(mc.getRenderViewEntity()); @@ -203,6 +239,7 @@ public class InputReplayTimer extends WrappedTimer { mc.entityRenderer.loadEntityShader(null); } } + //#endif } } @@ -222,4 +259,8 @@ public class InputReplayTimer extends WrappedTimer { FMLCommonHandler.instance().fireKeyInput(); } + + //#if MC<=10710 + //$$ public static class RunScheduledTasks extends Event {} + //#endif } diff --git a/src/main/java/com/replaymod/replay/NoGuiScreenshot.java b/src/main/java/com/replaymod/replay/NoGuiScreenshot.java index 0d4c79b8..88a8cc3a 100644 --- a/src/main/java/com/replaymod/replay/NoGuiScreenshot.java +++ b/src/main/java/com/replaymod/replay/NoGuiScreenshot.java @@ -8,10 +8,15 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.RequiredArgsConstructor; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GlStateManager; import net.minecraft.util.ScreenShotHelper; import org.apache.commons.io.FileUtils; +//#if MC>=10800 +import net.minecraft.client.renderer.GlStateManager; +//#else +//$$ import com.replaymod.core.versions.MCVer.GlStateManager; +//#endif + import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; diff --git a/src/main/java/com/replaymod/replay/ReplayHandler.java b/src/main/java/com/replaymod/replay/ReplayHandler.java index 84f70867..a14dde9a 100755 --- a/src/main/java/com/replaymod/replay/ReplayHandler.java +++ b/src/main/java/com/replaymod/replay/ReplayHandler.java @@ -1,7 +1,6 @@ package com.replaymod.replay; import com.google.common.base.Preconditions; -import com.mojang.authlib.GameProfile; import com.replaymod.core.utils.Restrictions; import com.replaymod.core.utils.WrappedTimer; import com.replaymod.replay.camera.CameraEntity; @@ -18,22 +17,36 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityOtherPlayerMP; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.ScaledResolution; -import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.client.resources.I18n; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.network.EnumPacketDirection; import net.minecraft.network.NetworkManager; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.client.FMLClientHandler; -import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher; import org.lwjgl.opengl.Display; import java.io.IOException; import java.util.*; -import static com.replaymod.core.versions.MCVer.*; +//#if MC>=10800 +import com.mojang.authlib.GameProfile; +import net.minecraft.client.network.NetHandlerPlayClient; +import net.minecraft.network.EnumPacketDirection; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.client.FMLClientHandler; +import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher; + import static net.minecraft.client.renderer.GlStateManager.*; +//#else +//$$ import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +//$$ import com.replaymod.replay.gui.screen.GuiOpeningReplay; +//$$ import io.netty.channel.ChannelOutboundHandlerAdapter; +//$$ import net.minecraft.client.network.NetHandlerLoginClient; +//$$ import net.minecraft.entity.EntityLivingBase; +//$$ import net.minecraft.network.EnumConnectionState; +//$$ +//$$ import static com.replaymod.core.versions.MCVer.GlStateManager.*; +//#endif + +import static com.replaymod.core.versions.MCVer.*; import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; @@ -148,6 +161,7 @@ public class ReplayHandler { //$$ mc.ingameGUI.getChatGUI().clearChatMessages(); //#endif + //#if MC>=10800 NetworkManager networkManager = new NetworkManager(EnumPacketDirection.CLIENTBOUND) { @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable t) { @@ -177,6 +191,31 @@ public class ReplayHandler { //$$ channel.pipeline().addAfter("ReplayModReplay_replaySender", "fml:packet_handler", networkDispatcher); //$$ channel.pipeline().fireChannelActive(); //#endif + //#else + //$$ NetworkManager networkManager = new NetworkManager(true) { + //$$ @Override + //$$ public void exceptionCaught(ChannelHandlerContext ctx, Throwable t) { + //$$ t.printStackTrace(); + //$$ } + //$$ }; + //$$ networkManager.setNetHandler(new NetHandlerLoginClient(networkManager, mc, null)); + //$$ + //$$ mc.displayGuiScreen(new GuiOpeningReplay(networkManager)); + //$$ + //$$ ChannelOutboundHandlerAdapter dummyHandler = new ChannelOutboundHandlerAdapter(); + //$$ channel = new EmbeddedChannel(dummyHandler); + //$$ channel.pipeline().remove(dummyHandler); + //$$ channel.pipeline().addFirst("ReplayModReplay_replaySender", replaySender); + //$$ channel.pipeline().addAfter("ReplayModReplay_replaySender", "packet_handler", networkManager); + //$$ channel.pipeline().fireChannelActive(); + //$$ + //$$ // Call twice to force-overwrite the NetworkManager's internal state + //$$ networkManager.setConnectionState(EnumConnectionState.PLAY); + //$$ networkManager.getNetHandler().onConnectionStateTransition(EnumConnectionState.LOGIN, EnumConnectionState.PLAY); + //$$ networkManager.setConnectionState(EnumConnectionState.PLAY); + //$$ + //$$ FMLNetworkHandler.fmlClientHandshake(networkManager); + //#endif } public ReplayFile getReplayFile() { @@ -236,7 +275,11 @@ public class ReplayHandler { * When the entity is {@code null} or the camera entity, the camera becomes the view entity. * @param e The entity to spectate */ + //#if MC>=10800 public void spectateEntity(Entity e) { + //#else + //$$ public void spectateEntity(EntityLivingBase e) { + //#endif CameraEntity cameraEntity = getCameraEntity(); if (cameraEntity == null) { return; // Cannot spectate if we have no camera @@ -254,15 +297,15 @@ public class ReplayHandler { cameraEntity.setCameraController(new SpectatorCameraController(cameraEntity)); } - if (mc.getRenderViewEntity() != e) { - mc.setRenderViewEntity(e); + if (getRenderViewEntity(mc) != e) { + setRenderViewEntity(mc, e); cameraEntity.setCameraPosRot(e); } } /** * Set the camera as the view entity. - * This is equivalent to {@link #spectateEntity(Entity) spectateEntity(null)}. + * This is equivalent to {@code spectateEntity(null)}. */ public void spectateCamera() { spectateEntity(null); @@ -273,7 +316,7 @@ public class ReplayHandler { * @return {@code true} if the camera is the view entity, {@code false} otherwise */ public boolean isCameraView() { - return player(mc) instanceof CameraEntity && player(mc) == mc.getRenderViewEntity(); + return player(mc) instanceof CameraEntity && player(mc) == getRenderViewEntity(mc); } /** @@ -374,11 +417,15 @@ public class ReplayHandler { entity.prevRotationYaw = entity.rotationYaw; entity.prevRotationPitch = entity.rotationPitch; } + //#if MC>=10800 try { mc.runTick(); } catch (IOException e) { e.printStackTrace(); // This should never be thrown but whatever } + //#else + //$$ mc.runTick(); + //#endif //finally, updating the camera's position (which is not done by the sync jumping) moveCameraToTargetPosition(); diff --git a/src/main/java/com/replaymod/replay/ReplayModReplay.java b/src/main/java/com/replaymod/replay/ReplayModReplay.java index a19741ca..48d73d59 100644 --- a/src/main/java/com/replaymod/replay/ReplayModReplay.java +++ b/src/main/java/com/replaymod/replay/ReplayModReplay.java @@ -19,12 +19,20 @@ import com.replaymod.replaystudio.replay.ReplayFile; import com.replaymod.replaystudio.replay.ZipReplayFile; import com.replaymod.replaystudio.studio.ReplayStudio; import net.minecraft.client.Minecraft; +import org.apache.logging.log4j.Logger; +import org.lwjgl.input.Keyboard; + +//#if MC>=10800 import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; -import org.apache.logging.log4j.Logger; -import org.lwjgl.input.Keyboard; +//#else +//$$ import cpw.mods.fml.common.Mod; +//$$ import cpw.mods.fml.common.event.FMLInitializationEvent; +//$$ import cpw.mods.fml.common.event.FMLPostInitializationEvent; +//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent; +//#endif import javax.annotation.Nullable; import java.io.File; @@ -36,7 +44,9 @@ import java.util.Optional; version = "@MOD_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@", acceptableRemoteVersions = "*", + //#if MC>=10800 clientSideOnly = true, + //#endif useMetadata = true) public class ReplayModReplay { public static final String MOD_ID = "replaymod-replay"; diff --git a/src/main/java/com/replaymod/replay/ReplaySender.java b/src/main/java/com/replaymod/replay/ReplaySender.java index dfc18e45..481a61e2 100755 --- a/src/main/java/com/replaymod/replay/ReplaySender.java +++ b/src/main/java/com/replaymod/replay/ReplaySender.java @@ -31,8 +31,6 @@ import net.minecraft.world.WorldType; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.IChunkProvider; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; @@ -50,6 +48,15 @@ import net.minecraft.util.text.ITextComponent; //$$ import net.minecraft.util.IChatComponent; //#endif +//#if MC>=10800 +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//$$ import cpw.mods.fml.common.gameevent.TickEvent; +//$$ import org.apache.commons.io.Charsets; +//#endif + import java.io.*; import java.util.ArrayList; import java.util.Arrays; @@ -89,6 +96,10 @@ public class ReplaySender extends ChannelDuplexHandler { SPacketPlayerAbilities.class, SPacketTitle.class //#else + //#if MC>=10800 + //$$ S43PacketCamera.class, + //$$ S45PacketTitle.class, + //#endif //$$ S06PacketUpdateHealth.class, //$$ S2DPacketOpenWindow.class, //$$ S2EPacketCloseWindow.class, @@ -97,9 +108,7 @@ public class ReplaySender extends ChannelDuplexHandler { //$$ S36PacketSignEditorOpen.class, //$$ S37PacketStatistics.class, //$$ S1FPacketSetExperience.class, - //$$ S43PacketCamera.class, - //$$ S39PacketPlayerAbilities.class, - //$$ S45PacketTitle.class + //$$ S39PacketPlayerAbilities.class //#endif ); @@ -390,7 +399,11 @@ public class ReplaySender extends ChannelDuplexHandler { int i = readVarInt(pb); + //#if MC>=10800 Packet p = EnumConnectionState.PLAY.getPacket(EnumPacketDirection.CLIENTBOUND, i); + //#else + //$$ Packet p = Packet.generatePacket(EnumConnectionState.PLAY.func_150755_b(), i); + //#endif p.readPacketData(pb); return p; @@ -409,7 +422,12 @@ public class ReplaySender extends ChannelDuplexHandler { //$$ if (p instanceof S3FPacketCustomPayload) { //$$ S3FPacketCustomPayload packet = (S3FPacketCustomPayload) p; //#endif - if (Restrictions.PLUGIN_CHANNEL.equals(packet.getChannelName())) { + //#if MC>=10800 + String channelName = packet.getChannelName(); + //#else + //$$ String channelName = packet.func_149169_c(); + //#endif + if (Restrictions.PLUGIN_CHANNEL.equals(channelName)) { final String unknown = replayHandler.getRestrictions().handle(packet); if (unknown == null) { return null; @@ -461,9 +479,15 @@ public class ReplaySender extends ChannelDuplexHandler { //$$ if (p instanceof S3FPacketCustomPayload) { //$$ S3FPacketCustomPayload packet = (S3FPacketCustomPayload) p; //#endif - if ("MC|BOpen".equals(packet.getChannelName())) { + //#if MC>=10800 + String channelName = packet.getChannelName(); + //#else + //$$ String channelName = packet.func_149169_c(); + //#endif + if ("MC|BOpen".equals(channelName)) { return null; } + //#if MC>=10800 } //#if MC>=10904 @@ -476,10 +500,15 @@ public class ReplaySender extends ChannelDuplexHandler { //#if MC>=10809 //$$ String url = packet.getURL(); //#else - //$$ String url = packet.func_179783_a(); + //$$ String url = packet.func_179783_a(); //#endif //#endif if (url.startsWith("replay://")) { + //#else + //$$ String url; + //$$ if ("MC|RPack".equals(channelName) && + //$$ (url = new String(packet.func_149168_d(), Charsets.UTF_8)).startsWith("replay://")) { + //#endif int id = Integer.parseInt(url.substring("replay://".length())); Map index = replayFile.getResourcePackIndex(); if (index != null) { @@ -503,11 +532,16 @@ public class ReplaySender extends ChannelDuplexHandler { //#else //$$ if(p instanceof S01PacketJoinGame) { //$$ S01PacketJoinGame packet = (S01PacketJoinGame) p; - //$$ int entId = packet.getEntityId(); + //#if MC>=10800 + //$$ int entId = packet.getEntityId(); + //#else + //$$ int entId = packet.func_149197_c(); + //#endif //#endif allowMovement = true; actualID = entId; entId = -1789435; // Camera entity id should be negative which is an invalid id and can't be used by servers + //#if MC>=10800 int dimension = packet.getDimension(); EnumDifficulty difficulty = packet.getDifficulty(); int maxPlayers = packet.getMaxPlayers(); @@ -520,6 +554,15 @@ public class ReplaySender extends ChannelDuplexHandler { //$$ p = new S01PacketJoinGame(entId, GameType.SPECTATOR, false, dimension, //$$ difficulty, maxPlayers, worldType, false); //#endif + //#else + //$$ int dimension = packet.func_149194_f(); + //$$ EnumDifficulty difficulty = packet.func_149192_g(); + //$$ int maxPlayers = packet.func_149193_h(); + //$$ WorldType worldType = packet.func_149196_i(); + //$$ + //$$ p = new S01PacketJoinGame(entId, GameType.ADVENTURE, false, dimension, + //$$ difficulty, maxPlayers, worldType); + //#endif } //#if MC>=10904 @@ -535,7 +578,12 @@ public class ReplaySender extends ChannelDuplexHandler { //$$ respawn.getDifficulty(), respawn.getWorldType(), GameType.SPECTATOR); //#else //$$ p = new S07PacketRespawn(respawn.func_149082_c(), - //$$ respawn.func_149081_d(), respawn.func_149080_f(), GameType.SPECTATOR); + //$$ respawn.func_149081_d(), respawn.func_149080_f(), + //#if MC>=10800 + //$$ GameType.SPECTATOR); + //#else + //$$ GameType.ADVENTURE); + //#endif //#endif //#endif @@ -560,6 +608,7 @@ public class ReplaySender extends ChannelDuplexHandler { CameraEntity cent = replayHandler.getCameraEntity(); + //#if MC>=10800 //#if MC>=10904 for (SPacketPlayerPosLook.EnumFlags relative : ppl.getFlags()) { if (relative == SPacketPlayerPosLook.EnumFlags.X @@ -574,6 +623,7 @@ public class ReplaySender extends ChannelDuplexHandler { return null; // At least one of the coordinates is relative, so we don't care } } + //#endif if(cent != null) { //#if MC>=10809 @@ -654,8 +704,10 @@ public class ReplaySender extends ChannelDuplexHandler { //#if MC>=10904 ctx.channel().attr(NetworkManager.PROTOCOL_ATTRIBUTE_KEY).set(EnumConnectionState.PLAY); //#else + //#if MC>=10800 //$$ ctx.attr(NetworkManager.attrKeyConnectionState).set(EnumConnectionState.PLAY); //#endif + //#endif super.channelActive(ctx); } diff --git a/src/main/java/com/replaymod/replay/camera/CameraEntity.java b/src/main/java/com/replaymod/replay/camera/CameraEntity.java index ea363593..fecd2ef0 100755 --- a/src/main/java/com/replaymod/replay/camera/CameraEntity.java +++ b/src/main/java/com/replaymod/replay/camera/CameraEntity.java @@ -12,11 +12,11 @@ import lombok.Setter; import net.minecraft.block.material.Material; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.AbstractClientPlayer; -import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.client.settings.KeyBinding; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItemFrame; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; @@ -25,9 +25,6 @@ import net.minecraftforge.client.event.EntityViewRenderEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderHandEvent; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.eventhandler.EventPriority; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent; //#if MC>=10904 import net.minecraft.inventory.EntityEquipmentSlot; @@ -46,6 +43,19 @@ import net.minecraft.util.text.ITextComponent; //$$ import net.minecraft.util.MovingObjectPosition; //#endif +//#if MC>=10800 +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraftforge.fml.common.eventhandler.EventPriority; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.EventPriority; +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//$$ import cpw.mods.fml.common.gameevent.TickEvent; +//$$ import net.minecraft.client.entity.EntityClientPlayerMP; +//$$ import net.minecraft.util.Session; +//#endif + import java.util.Map; import java.util.UUID; import java.util.function.Function; @@ -57,7 +67,13 @@ import static com.replaymod.core.versions.MCVer.*; * During a replay the player should be an instance of this class. * Camera movement is controlled by a separate {@link CameraController}. */ -public class CameraEntity extends EntityPlayerSP { +public class CameraEntity + //#if MC>=10800 + extends EntityPlayerSP + //#else + //$$ extends EntityClientPlayerMP + //#endif +{ /** * Roll of this camera in degrees. */ @@ -89,8 +105,13 @@ public class CameraEntity extends EntityPlayerSP { //$$ public CameraEntity(Minecraft mcIn, World worldIn, NetHandlerPlayClient netHandlerPlayClient, StatisticsManager statisticsManager) { //$$ super(mcIn, worldIn, netHandlerPlayClient, statisticsManager); //#else + //#if MC>=10800 //$$ public CameraEntity(Minecraft mcIn, World worldIn, NetHandlerPlayClient netHandlerPlayClient, StatFileWriter statFileWriter) { //$$ super(mcIn, worldIn, netHandlerPlayClient, statFileWriter); + //#else + //$$ public CameraEntity(Minecraft mcIn, World worldIn, Session session, NetHandlerPlayClient netHandlerPlayClient, StatFileWriter statFileWriter) { + //$$ super(mcIn, worldIn, session, netHandlerPlayClient, statFileWriter); + //#endif //#endif //#endif FORGE_BUS.register(eventHandler); @@ -151,31 +172,45 @@ public class CameraEntity extends EntityPlayerSP { * @param to The entity whose position to copy */ public void setCameraPosRot(Entity to) { + if (to == this) return; + //#if MC>=10800 + float yOffset = 0; + //#else + //$$ float yOffset = 1.62f; // Magic value (eye height) from EntityRenderer#orientCamera + //#endif prevPosX = to.prevPosX; - prevPosY = to.prevPosY; + prevPosY = to.prevPosY + yOffset; prevPosZ = to.prevPosZ; prevRotationYaw = to.prevRotationYaw; prevRotationPitch = to.prevRotationPitch; posX = to.posX; - posY = to.posY; + posY = to.posY + yOffset; posZ = to.posZ; rotationYaw = to.rotationYaw; rotationPitch = to.rotationPitch; lastTickPosX = to.lastTickPosX; - lastTickPosY = to.lastTickPosY; + lastTickPosY = to.lastTickPosY + yOffset; lastTickPosZ = to.lastTickPosZ; updateBoundingBox(); } private void updateBoundingBox() { + //#if MC>=10800 setEntityBoundingBox(new AxisAlignedBB( + //#else + //$$ this.boundingBox.setBB(AxisAlignedBB.getBoundingBox( + //#endif posX - width / 2, posY, posZ - width / 2, posX + width / 2, posY + height, posZ + width / 2)); } @Override public void onUpdate() { - Entity view = mc.getRenderViewEntity(); + //#if MC>=10800 + Entity view = getRenderViewEntity(mc); + //#else + //$$ EntityLivingBase view = getRenderViewEntity(mc); + //#endif if (view != null) { // Make sure we're always spectating the right entity // This is important if the spectated player respawns as their @@ -191,9 +226,9 @@ public class CameraEntity extends EntityPlayerSP { } view = world(this).getPlayerEntityByUUID(spectating); if (view != null) { - mc.setRenderViewEntity(view); + setRenderViewEntity(mc, view); } else { - mc.setRenderViewEntity(this); + setRenderViewEntity(mc, this); return; } } @@ -216,7 +251,7 @@ public class CameraEntity extends EntityPlayerSP { @Override public void setRotation(float yaw, float pitch) { - if (mc.getRenderViewEntity() == this) { + if (getRenderViewEntity(mc) == this) { // Only update camera rotation when the camera is the view super.setRotation(yaw, pitch); } @@ -232,10 +267,17 @@ public class CameraEntity extends EntityPlayerSP { return falseUnlessSpectating(e -> e.isInsideOfMaterial(materialIn)); // Make sure no overlays are rendered } + //#if MC>=10800 @Override public boolean isInLava() { return falseUnlessSpectating(Entity::isInLava); // Make sure no lava overlay is rendered } + //#else + //$$ @Override + //$$ public boolean handleLavaMovement() { + //$$ return falseUnlessSpectating(Entity::handleLavaMovement); // Make sure no lava overlay is rendered + //$$ } + //#endif @Override public boolean isInWater() { @@ -248,7 +290,7 @@ public class CameraEntity extends EntityPlayerSP { } private boolean falseUnlessSpectating(Function property) { - Entity view = mc.getRenderViewEntity(); + Entity view = getRenderViewEntity(mc); if (view != null && view != this) { return property.apply(view); } @@ -260,20 +302,24 @@ public class CameraEntity extends EntityPlayerSP { return false; // We are in full control of ourselves } + //#if MC>=10800 @Override protected void createRunningParticles() { // We do not produce any particles, we are a camera } + //#endif @Override public boolean canBeCollidedWith() { return false; // We are a camera, we cannot collide } + //#if MC>=10800 @Override public boolean isSpectator() { return ReplayModReplay.instance.getReplayHandler().isCameraView(); // Make sure we're treated as spectator } + //#endif @Override public boolean shouldRenderInPass(int pass) { @@ -285,7 +331,7 @@ public class CameraEntity extends EntityPlayerSP { @Override public boolean isInvisible() { - Entity view = mc.getRenderViewEntity(); + Entity view = getRenderViewEntity(mc); if (view != this) { return view.isInvisible(); } @@ -294,13 +340,14 @@ public class CameraEntity extends EntityPlayerSP { @Override public ResourceLocation getLocationSkin() { - Entity view = mc.getRenderViewEntity(); + Entity view = getRenderViewEntity(mc); if (view != this && view instanceof EntityPlayer) { return Utils.getResourceLocationForPlayerUUID(view.getUniqueID()); } return super.getLocationSkin(); } + //#if MC>=10800 @Override public String getSkinType() { Entity view = mc.getRenderViewEntity(); @@ -309,10 +356,11 @@ public class CameraEntity extends EntityPlayerSP { } return super.getSkinType(); } + //#endif @Override public float getSwingProgress(float renderPartialTicks) { - Entity view = mc.getRenderViewEntity(); + Entity view = getRenderViewEntity(mc); if (view != this && view instanceof EntityPlayer) { return ((EntityPlayer) view).getSwingProgress(renderPartialTicks); } @@ -403,17 +451,21 @@ public class CameraEntity extends EntityPlayerSP { if (mc.gameSettings.keyBindAttack.isPressed() || mc.gameSettings.keyBindUseItem.isPressed()) { if (canSpectate(mc.pointedEntity)) { - ReplayModReplay.instance.getReplayHandler().spectateEntity(mc.pointedEntity); + ReplayModReplay.instance.getReplayHandler().spectateEntity( + //#if MC<=10710 + //$$ (EntityLivingBase) + //#endif + mc.pointedEntity); // Make sure we don't exit right away mc.gameSettings.keyBindSneak.pressTime = 0; } } Map keyBindings = ReplayMod.instance.getKeyBindingRegistry().getKeyBindings(); - if (keyBindings.get("replaymod.input.rollclockwise").isKeyDown()) { + if (isKeyDown(keyBindings.get("replaymod.input.rollclockwise"))) { roll += Utils.isCtrlDown() ? 0.2 : 1; } - if (keyBindings.get("replaymod.input.rollcounterclockwise").isKeyDown()) { + if (isKeyDown(keyBindings.get("replaymod.input.rollcounterclockwise"))) { roll -= Utils.isCtrlDown() ? 0.2 : 1; } } @@ -427,7 +479,11 @@ public class CameraEntity extends EntityPlayerSP { public boolean canSpectate(Entity e) { return e != null && !e.isInvisible() + //#if MC>=10800 && (e instanceof EntityPlayer || e instanceof EntityLiving || e instanceof EntityItemFrame); + //#else + //$$ && e instanceof EntityPlayer; // cannot be more generic since 1.7.10 has no concept of eye height + //#endif } //#if MC>=11102 @@ -448,7 +504,14 @@ public class CameraEntity extends EntityPlayerSP { //$$ } //#endif - private class EventHandler { + //#if MC>=10800 + private + //#else + //$$ public // All event handlers need to be public in 1.7.10 + //#endif + class EventHandler { + private EventHandler() {} + @SubscribeEvent public void onPreClientTick(TickEvent.ClientTickEvent event) { if (event.phase == TickEvent.Phase.START) { @@ -490,14 +553,14 @@ public class CameraEntity extends EntityPlayerSP { @SubscribeEvent public void onRenderHand(RenderHandEvent event) { // Unless we are spectating another player, don't render our hand - if (mc.getRenderViewEntity() == CameraEntity.this || !(mc.getRenderViewEntity() instanceof EntityPlayer)) { + if (getRenderViewEntity(mc) == CameraEntity.this || !(getRenderViewEntity(mc) instanceof EntityPlayer)) { event.setCanceled(true); } } @SubscribeEvent(priority = EventPriority.LOWEST) public void onRenderHandMonitor(RenderHandEvent event) { - Entity view = mc.getRenderViewEntity(); + Entity view = getRenderViewEntity(mc); if (view instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) view; // When the spectated player has changed, force equip their items to prevent the equip animation @@ -525,6 +588,7 @@ public class CameraEntity extends EntityPlayerSP { } } + //#if MC>=10800 @SubscribeEvent public void onEntityViewRenderEvent(EntityViewRenderEvent.CameraSetup event) { if (mc.getRenderViewEntity() == CameraEntity.this) { @@ -535,6 +599,7 @@ public class CameraEntity extends EntityPlayerSP { //#endif } } + //#endif private boolean heldItemTooltipsWasTrue; diff --git a/src/main/java/com/replaymod/replay/camera/ClassicCameraController.java b/src/main/java/com/replaymod/replay/camera/ClassicCameraController.java index 3cfabc87..621d1cbe 100644 --- a/src/main/java/com/replaymod/replay/camera/ClassicCameraController.java +++ b/src/main/java/com/replaymod/replay/camera/ClassicCameraController.java @@ -35,7 +35,7 @@ public class ClassicCameraController implements CameraController { boolean forward = false, backward = false, left = false, right = false, up = false, down = false; speedup = false; for(KeyBinding kb : Minecraft.getMinecraft().gameSettings.keyBindings) { - if(!kb.isKeyDown()) continue; + if(!isKeyDown(kb)) continue; if(kb.getKeyDescription().equals("key.forward")) { forward = true; speedup = true; diff --git a/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java b/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java index 19db9fbd..d66f954e 100644 --- a/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java +++ b/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java @@ -10,6 +10,8 @@ import org.lwjgl.input.Mouse; import java.util.Arrays; +import static com.replaymod.core.versions.MCVer.*; + @RequiredArgsConstructor public class SpectatorCameraController implements CameraController { private final CameraEntity camera; @@ -34,9 +36,9 @@ public class SpectatorCameraController implements CameraController { // Always make sure the camera is in the exact same spot as the spectated entity // This is necessary as some rendering code for the hand doesn't respect the view entity // and always uses mc.thePlayer - Entity view = mc.getRenderViewEntity(); + Entity view = getRenderViewEntity(mc); if (view != null && view != camera) { - camera.setCameraPosRot(mc.getRenderViewEntity()); + camera.setCameraPosRot(getRenderViewEntity(mc)); // If it's a player, also 'steal' its inventory so the rendering code knows what item to render if (view instanceof EntityPlayer) { EntityPlayer viewPlayer = (EntityPlayer) view; diff --git a/src/main/java/com/replaymod/replay/camera/VanillaCameraController.java b/src/main/java/com/replaymod/replay/camera/VanillaCameraController.java index 5a9c3427..7e1085e1 100644 --- a/src/main/java/com/replaymod/replay/camera/VanillaCameraController.java +++ b/src/main/java/com/replaymod/replay/camera/VanillaCameraController.java @@ -5,6 +5,8 @@ import net.minecraft.client.settings.GameSettings; import net.minecraft.client.settings.KeyBinding; import org.lwjgl.util.vector.Vector3f; +import static com.replaymod.core.versions.MCVer.*; + /** * Camera controller performing vanilla creative-like camera movements. */ @@ -39,7 +41,7 @@ public class VanillaCameraController implements CameraController { if (partialTicksPassed == 0) return; Vector3f direction = new Vector3f(0, 0, 0); for (int i = 0; i < 6; i++) { // First, get movement direction depending on keys pressed - if (bindings[i].isKeyDown()) { + if (isKeyDown(bindings[i])) { Vector3f.add(direction, DIRECTIONS[i], direction); } } diff --git a/src/main/java/com/replaymod/replay/events/ReplayChatMessageEvent.java b/src/main/java/com/replaymod/replay/events/ReplayChatMessageEvent.java index c29c594e..9ad07adf 100644 --- a/src/main/java/com/replaymod/replay/events/ReplayChatMessageEvent.java +++ b/src/main/java/com/replaymod/replay/events/ReplayChatMessageEvent.java @@ -3,8 +3,14 @@ package com.replaymod.replay.events; import com.replaymod.replay.camera.CameraEntity; import lombok.Getter; import lombok.RequiredArgsConstructor; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.Cancelable; import net.minecraftforge.fml.common.eventhandler.Event; +//#else +//$$ import cpw.mods.fml.common.eventhandler.Cancelable; +//$$ import cpw.mods.fml.common.eventhandler.Event; +//#endif @Cancelable @RequiredArgsConstructor diff --git a/src/main/java/com/replaymod/replay/events/ReplayCloseEvent.java b/src/main/java/com/replaymod/replay/events/ReplayCloseEvent.java index f01720e6..b228c675 100644 --- a/src/main/java/com/replaymod/replay/events/ReplayCloseEvent.java +++ b/src/main/java/com/replaymod/replay/events/ReplayCloseEvent.java @@ -3,7 +3,12 @@ package com.replaymod.replay.events; import com.replaymod.replay.ReplayHandler; import lombok.Getter; import lombok.RequiredArgsConstructor; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.Event; +//#else +//$$ import cpw.mods.fml.common.eventhandler.Event; +//#endif @RequiredArgsConstructor public abstract class ReplayCloseEvent extends Event { diff --git a/src/main/java/com/replaymod/replay/events/ReplayDispatchKeypressesEvent.java b/src/main/java/com/replaymod/replay/events/ReplayDispatchKeypressesEvent.java index d3547127..5d972056 100644 --- a/src/main/java/com/replaymod/replay/events/ReplayDispatchKeypressesEvent.java +++ b/src/main/java/com/replaymod/replay/events/ReplayDispatchKeypressesEvent.java @@ -1,7 +1,12 @@ package com.replaymod.replay.events; +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.Cancelable; import net.minecraftforge.fml.common.eventhandler.Event; +//#else +//$$ import cpw.mods.fml.common.eventhandler.Cancelable; +//$$ import cpw.mods.fml.common.eventhandler.Event; +//#endif public abstract class ReplayDispatchKeypressesEvent extends Event { diff --git a/src/main/java/com/replaymod/replay/events/ReplayOpenEvent.java b/src/main/java/com/replaymod/replay/events/ReplayOpenEvent.java index ad970a37..0e305532 100644 --- a/src/main/java/com/replaymod/replay/events/ReplayOpenEvent.java +++ b/src/main/java/com/replaymod/replay/events/ReplayOpenEvent.java @@ -3,7 +3,12 @@ package com.replaymod.replay.events; import com.replaymod.replay.ReplayHandler; import lombok.Getter; import lombok.RequiredArgsConstructor; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.Event; +//#else +//$$ import cpw.mods.fml.common.eventhandler.Event; +//#endif @RequiredArgsConstructor public abstract class ReplayOpenEvent extends Event { diff --git a/src/main/java/com/replaymod/replay/gui/overlay/GuiReplayOverlay.java b/src/main/java/com/replaymod/replay/gui/overlay/GuiReplayOverlay.java index e33863ea..d27379a0 100644 --- a/src/main/java/com/replaymod/replay/gui/overlay/GuiReplayOverlay.java +++ b/src/main/java/com/replaymod/replay/gui/overlay/GuiReplayOverlay.java @@ -16,13 +16,19 @@ import de.johni0702.minecraft.gui.layout.CustomLayout; import de.johni0702.minecraft.gui.layout.HorizontalLayout; import net.minecraft.client.resources.I18n; import net.minecraft.client.settings.GameSettings; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.InputEvent; import org.lwjgl.input.Keyboard; import org.lwjgl.util.ReadableDimension; import org.lwjgl.util.ReadablePoint; import org.lwjgl.util.WritablePoint; +//#if MC>=10800 +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.InputEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//$$ import cpw.mods.fml.common.gameevent.InputEvent; +//#endif + import static com.replaymod.core.ReplayMod.TEXTURE_SIZE; import static com.replaymod.core.versions.MCVer.*; diff --git a/src/main/java/com/replaymod/replay/gui/screen/GuiOpeningReplay.java b/src/main/java/com/replaymod/replay/gui/screen/GuiOpeningReplay.java new file mode 100644 index 00000000..d12c5a46 --- /dev/null +++ b/src/main/java/com/replaymod/replay/gui/screen/GuiOpeningReplay.java @@ -0,0 +1,19 @@ +//#if MC<=10710 +//$$ package com.replaymod.replay.gui.screen; +//$$ +//$$ import net.minecraft.client.gui.GuiScreen; +//$$ import net.minecraft.network.NetworkManager; +//$$ +//$$ public class GuiOpeningReplay extends GuiScreen { +//$$ private final NetworkManager networkManager; +//$$ +//$$ public GuiOpeningReplay(NetworkManager networkManager) { +//$$ this.networkManager = networkManager; +//$$ } +//$$ +//$$ @Override +//$$ public void handleInput() { +//$$ networkManager.processReceivedPackets(); +//$$ } +//$$ } +//#endif diff --git a/src/main/java/com/replaymod/replay/handler/GuiHandler.java b/src/main/java/com/replaymod/replay/handler/GuiHandler.java index ffdfbfa6..4a98b72b 100644 --- a/src/main/java/com/replaymod/replay/handler/GuiHandler.java +++ b/src/main/java/com/replaymod/replay/handler/GuiHandler.java @@ -8,8 +8,12 @@ import net.minecraft.client.gui.GuiIngameMenu; import net.minecraft.client.gui.GuiMainMenu; import net.minecraft.client.resources.I18n; import net.minecraftforge.client.event.GuiScreenEvent; -import net.minecraftforge.common.MinecraftForge; + +//#if MC>=10800 import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif import java.io.IOException; import java.util.ArrayList; diff --git a/src/main/java/com/replaymod/replay/mixin/MixinGuiSpectator.java b/src/main/java/com/replaymod/replay/mixin/MixinGuiSpectator.java index f7de3970..e2ce7c2d 100644 --- a/src/main/java/com/replaymod/replay/mixin/MixinGuiSpectator.java +++ b/src/main/java/com/replaymod/replay/mixin/MixinGuiSpectator.java @@ -1,3 +1,4 @@ +//#if MC>=10800 package com.replaymod.replay.mixin; import com.replaymod.replay.camera.CameraEntity; @@ -24,3 +25,4 @@ public abstract class MixinGuiSpectator { } } } +//#endif diff --git a/src/main/java/com/replaymod/replay/mixin/MixinPlayerControllerMP.java b/src/main/java/com/replaymod/replay/mixin/MixinPlayerControllerMP.java index 268ea55d..ded49f19 100644 --- a/src/main/java/com/replaymod/replay/mixin/MixinPlayerControllerMP.java +++ b/src/main/java/com/replaymod/replay/mixin/MixinPlayerControllerMP.java @@ -3,7 +3,6 @@ package com.replaymod.replay.mixin; import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.camera.CameraEntity; import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.multiplayer.PlayerControllerMP; import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.world.World; @@ -22,7 +21,14 @@ import net.minecraft.stats.StatisticsManager; //$$ import net.minecraft.stats.StatFileWriter; //#endif +//#if MC>=10800 +import net.minecraft.client.entity.EntityPlayerSP; + import static com.replaymod.core.versions.MCVer.*; +//#else +//$$ import net.minecraft.client.entity.EntityClientPlayerMP; +//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +//#endif @Mixin(PlayerControllerMP.class) public abstract class MixinPlayerControllerMP { @@ -49,20 +55,43 @@ public abstract class MixinPlayerControllerMP { //$$ if (ReplayModReplay.instance.getReplayHandler() != null) { //$$ ci.setReturnValue(new CameraEntity(mc, worldIn, connection, statisticsManager)); //#else + //#if MC>=10800 //$$ @Inject(method = "func_178892_a", at=@At("HEAD"), cancellable = true) //$$ private void replayModReplay_createReplayCamera(World worldIn, StatFileWriter statFileWriter, CallbackInfoReturnable ci) { //$$ if (ReplayModReplay.instance.getReplayHandler() != null) { //$$ ci.setReturnValue(new CameraEntity(mc, worldIn, netClientHandler, statFileWriter)); + //#else + //$$ @Inject(method = "createPlayer", at=@At("HEAD"), cancellable = true) + //$$ private void replayModReplay_createReplayCamera(World worldIn, StatFileWriter statFileWriter, CallbackInfoReturnable ci) { + //$$ if (ReplayModReplay.instance.getReplayHandler() != null) { + //$$ ci.setReturnValue(new CameraEntity(mc, worldIn, mc.getSession(), netClientHandler, statFileWriter)); + //#endif //#endif //#endif ci.cancel(); } } + //#if MC>=10800 @Inject(method = "isSpectator", at=@At("HEAD"), cancellable = true) private void replayModReplay_isSpectator(CallbackInfoReturnable ci) { if (player(mc) instanceof CameraEntity) { // this check should in theory not be required ci.setReturnValue(player(mc).isSpectator()); } } + //#endif + + //#if MC<=10710 + //$$ // Prevent the disconnect GUI from being opened during the short time when the replay is restarted + //$$ // at which the old network manager is closed but still getting ticked (hence the disconnect GUI opening). + //$$ @Inject(method = "updateController", at = @At("HEAD"), cancellable = true) + //$$ private void replayModReplay_onlyTickNeverDisconnect(CallbackInfo ci) { + //$$ if (ReplayModReplay.instance.getReplayHandler() != null) { + //$$ if (netClientHandler.getNetworkManager().isChannelOpen()) { + //$$ netClientHandler.getNetworkManager().processReceivedPackets(); + //$$ } + //$$ ci.cancel(); + //$$ } + //$$ } + //#endif } diff --git a/src/main/java/com/replaymod/replay/mixin/MixinRenderArrow.java b/src/main/java/com/replaymod/replay/mixin/MixinRenderArrow.java index 301df383..31570815 100644 --- a/src/main/java/com/replaymod/replay/mixin/MixinRenderArrow.java +++ b/src/main/java/com/replaymod/replay/mixin/MixinRenderArrow.java @@ -1,3 +1,4 @@ +//#if MC>=10800 package com.replaymod.replay.mixin; import com.replaymod.replay.ReplayModReplay; @@ -21,3 +22,4 @@ public abstract class MixinRenderArrow extends Render { return ReplayModReplay.instance.getReplayHandler() != null || super.shouldRender(entity, camera, camX, camY, camZ); } } +//#endif diff --git a/src/main/java/com/replaymod/replay/mixin/MixinRenderManager.java b/src/main/java/com/replaymod/replay/mixin/MixinRenderManager.java index 5c738d72..71ab6cfb 100644 --- a/src/main/java/com/replaymod/replay/mixin/MixinRenderManager.java +++ b/src/main/java/com/replaymod/replay/mixin/MixinRenderManager.java @@ -1,3 +1,4 @@ +//#if MC>=10800 package com.replaymod.replay.mixin; import net.minecraft.client.gui.FontRenderer; @@ -25,3 +26,4 @@ public class MixinRenderManager { } } } +//#endif diff --git a/src/main/java/com/replaymod/replay/mixin/MixinTileEntityEndPortalRenderer.java b/src/main/java/com/replaymod/replay/mixin/MixinTileEntityEndPortalRenderer.java index 9bdd32ce..cd1d9493 100644 --- a/src/main/java/com/replaymod/replay/mixin/MixinTileEntityEndPortalRenderer.java +++ b/src/main/java/com/replaymod/replay/mixin/MixinTileEntityEndPortalRenderer.java @@ -3,17 +3,30 @@ package com.replaymod.replay.mixin; import com.replaymod.replay.ReplayHandler; import com.replaymod.replay.ReplayModReplay; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.tileentity.TileEntityEndPortalRenderer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; +//#if MC>=10800 +import net.minecraft.client.renderer.tileentity.TileEntityEndPortalRenderer; +//#else +//$$ import net.minecraft.client.renderer.tileentity.RenderEndPortal; +//#endif + +//#if MC>=10800 @Mixin(TileEntityEndPortalRenderer.class) +//#else +//$$ @Mixin(RenderEndPortal.class) +//#endif public class MixinTileEntityEndPortalRenderer { //#if MC>=10809 @Redirect(method = "renderTileEntityAt", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J")) //#else + //#if MC>=10800 //$$ @Redirect(method = "func_180544_a", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J")) + //#else + //$$ @Redirect(method = "renderTileEntityAt(Lnet/minecraft/tileentity/TileEntityEndPortal;DDDF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J")) + //#endif //#endif private long replayModReplay_getEnchantmentTime() { ReplayHandler replayHandler = ReplayModReplay.instance.getReplayHandler(); diff --git a/src/main/java/com/replaymod/replay/mixin/MixinViewFrustum.java b/src/main/java/com/replaymod/replay/mixin/MixinViewFrustum.java index db69229e..5b83156c 100644 --- a/src/main/java/com/replaymod/replay/mixin/MixinViewFrustum.java +++ b/src/main/java/com/replaymod/replay/mixin/MixinViewFrustum.java @@ -1,3 +1,4 @@ +//#if MC>=10800 package com.replaymod.replay.mixin; import com.replaymod.replay.ReplayModReplay; @@ -91,3 +92,4 @@ public abstract class MixinViewFrustum { //$$ @Shadow abstract int func_178157_a(int p_178157_1_, int p_178157_2_, int p_178157_3_); //#endif } +//#endif diff --git a/src/main/java/com/replaymod/restrictions/ReplayModRestrictions.java b/src/main/java/com/replaymod/restrictions/ReplayModRestrictions.java index 62193d3f..4b4fb54e 100644 --- a/src/main/java/com/replaymod/restrictions/ReplayModRestrictions.java +++ b/src/main/java/com/replaymod/restrictions/ReplayModRestrictions.java @@ -8,6 +8,9 @@ import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandler; import net.minecraft.network.PacketBuffer; import net.minecraftforge.common.config.Configuration; +import org.apache.logging.log4j.Logger; + +//#if MC>=10800 import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; @@ -20,7 +23,21 @@ import net.minecraftforge.fml.common.network.FMLOutboundHandler; import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraftforge.fml.common.network.internal.FMLProxyPacket; import net.minecraftforge.fml.relauncher.Side; -import org.apache.logging.log4j.Logger; +//#else +//$$ import cpw.mods.fml.common.FMLCommonHandler; +//$$ import cpw.mods.fml.common.Mod; +//$$ import cpw.mods.fml.common.event.FMLInitializationEvent; +//$$ import cpw.mods.fml.common.event.FMLPostInitializationEvent; +//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent; +//$$ import cpw.mods.fml.common.eventhandler.EventBus; +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//$$ import cpw.mods.fml.common.gameevent.PlayerEvent; +//$$ import cpw.mods.fml.common.network.FMLEmbeddedChannel; +//$$ import cpw.mods.fml.common.network.FMLOutboundHandler; +//$$ import cpw.mods.fml.common.network.NetworkRegistry; +//$$ import cpw.mods.fml.common.network.internal.FMLProxyPacket; +//$$ import cpw.mods.fml.relauncher.Side; +//#endif import java.io.IOException; import java.util.HashMap; @@ -32,7 +49,9 @@ import static com.replaymod.core.versions.MCVer.*; version = "@MOD_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@", acceptableRemoteVersions = "*", + //#if MC>=10800 serverSideOnly = true, + //#endif useMetadata = true) public class ReplayModRestrictions { public static final String MOD_ID = "replaymod-restrictions"; @@ -55,6 +74,9 @@ public class ReplayModRestrictions { @Mod.EventHandler public void init(FMLInitializationEvent event) { + //#if MC<=10710 + //$$ if (FMLCommonHandler.instance().getSide() == Side.CLIENT) return; + //#endif EventBus bus = FML_BUS; bus.register(this); diff --git a/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java b/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java index 08d304d1..f1cc4e0f 100644 --- a/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java +++ b/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java @@ -11,11 +11,18 @@ import com.replaymod.simplepathing.SPTimeline.SPPath; import com.replaymod.simplepathing.gui.GuiPathing; import com.replaymod.simplepathing.preview.PathPreview; import lombok.Getter; +import org.apache.logging.log4j.Logger; +import org.lwjgl.input.Keyboard; + +//#if MC>=10800 import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import org.apache.logging.log4j.Logger; -import org.lwjgl.input.Keyboard; +//#else +//$$ import cpw.mods.fml.common.Mod; +//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent; +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif import static com.replaymod.core.versions.MCVer.*; @@ -23,7 +30,9 @@ import static com.replaymod.core.versions.MCVer.*; version = "@MOD_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@", acceptableRemoteVersions = "*", + //#if MC>=10800 clientSideOnly = true, + //#endif useMetadata = true) public class ReplayModSimplePathing { public static final String MOD_ID = "replaymod-simplepathing"; diff --git a/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java b/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java index 77854930..f768a0b0 100644 --- a/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java +++ b/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java @@ -46,7 +46,6 @@ import de.johni0702.minecraft.gui.popup.GuiInfoPopup; import de.johni0702.minecraft.gui.popup.GuiYesNoPopup; import de.johni0702.minecraft.gui.utils.Colors; import net.minecraft.crash.CrashReport; -import net.minecraftforge.fml.common.Loader; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.lwjgl.input.Keyboard; @@ -55,6 +54,12 @@ import org.lwjgl.util.ReadableDimension; import org.lwjgl.util.ReadablePoint; import org.lwjgl.util.WritablePoint; +//#if MC>=10800 +import net.minecraftforge.fml.common.Loader; +//#else +//$$ import cpw.mods.fml.common.Loader; +//#endif + import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.IOException; @@ -62,6 +67,7 @@ import java.util.Collections; import java.util.function.Consumer; import static com.replaymod.core.utils.Utils.error; +import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.simplepathing.ReplayModSimplePathing.LOGGER; @@ -618,7 +624,7 @@ public class GuiPathing { CameraEntity camera = replayHandler.getCameraEntity(); int spectatedId = -1; if (!replayHandler.isCameraView()) { - spectatedId = replayHandler.getOverlay().getMinecraft().getRenderViewEntity().getEntityId(); + spectatedId = getRenderViewEntity(replayHandler.getOverlay().getMinecraft()).getEntityId(); } timeline.addPositionKeyframe(time, camera.posX, camera.posY, camera.posZ, camera.rotationYaw, camera.rotationPitch, camera.roll, spectatedId); diff --git a/src/main/java/com/replaymod/simplepathing/preview/PathPreview.java b/src/main/java/com/replaymod/simplepathing/preview/PathPreview.java index 89ecb5de..9608c34b 100644 --- a/src/main/java/com/replaymod/simplepathing/preview/PathPreview.java +++ b/src/main/java/com/replaymod/simplepathing/preview/PathPreview.java @@ -8,9 +8,14 @@ import com.replaymod.replay.events.ReplayCloseEvent; import com.replaymod.replay.events.ReplayOpenEvent; import com.replaymod.simplepathing.ReplayModSimplePathing; import com.replaymod.simplepathing.Setting; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import org.lwjgl.input.Keyboard; +//#if MC>=10800 +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif + import static com.replaymod.core.versions.MCVer.*; public class PathPreview { diff --git a/src/main/java/com/replaymod/simplepathing/preview/PathPreviewRenderer.java b/src/main/java/com/replaymod/simplepathing/preview/PathPreviewRenderer.java index 6b72e696..062d46d6 100644 --- a/src/main/java/com/replaymod/simplepathing/preview/PathPreviewRenderer.java +++ b/src/main/java/com/replaymod/simplepathing/preview/PathPreviewRenderer.java @@ -15,17 +15,23 @@ import com.replaymod.simplepathing.ReplayModSimplePathing; import com.replaymod.simplepathing.SPTimeline; import com.replaymod.simplepathing.gui.GuiPathing; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.Tessellator; import net.minecraft.entity.Entity; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Triple; import org.lwjgl.opengl.GL11; +//#if MC>=10800 +import net.minecraft.client.renderer.GlStateManager; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +//#else +//$$ import com.replaymod.core.versions.MCVer.GlStateManager; +//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; +//#endif + import java.util.Comparator; import java.util.Optional; @@ -60,7 +66,7 @@ public class PathPreviewRenderer { public void renderCameraPath(RenderWorldLastEvent event) { if (!replayHandler.getReplaySender().isAsyncMode() || mc.gameSettings.hideGUI) return; - Entity view = mc.getRenderViewEntity(); + Entity view = getRenderViewEntity(mc); if (view == null) return; GuiPathing guiPathing = mod.getGuiPathing(); @@ -78,8 +84,12 @@ public class PathPreviewRenderer { int renderDistance = mc.gameSettings.renderDistanceChunks * 16; int renderDistanceSquared = renderDistance * renderDistance; + //#if MC>=10800 // Eye height is subtracted to make path appear higher (at eye height) than it actually is (at foot height) Triple viewPos = Triple.of(view.posX, view.posY - view.getEyeHeight(), view.posZ); + //#else + //$$ Triple viewPos = Triple.of(view.posX, view.posY, view.posZ); + //#endif GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); try { @@ -220,7 +230,7 @@ public class PathPreviewRenderer { ); GL11.glLineWidth(3); - Tessellator.getInstance().draw(); + Tessellator_getInstance().draw(); BufferBuilder_setTranslation(0, 0, 0); } @@ -263,10 +273,10 @@ public class PathPreviewRenderer { pos.getRight() - view.getRight() ); GL11.glNormal3f(0, 1, 0); - GL11.glRotatef(-mc.getRenderManager().playerViewY, 0, 1, 0); - GL11.glRotatef(mc.getRenderManager().playerViewX, 1, 0, 0); + GL11.glRotatef(-getRenderManager().playerViewY, 0, 1, 0); + GL11.glRotatef(getRenderManager().playerViewX, 1, 0, 0); - Tessellator.getInstance().draw(); + Tessellator_getInstance().draw(); GL11.glPopMatrix(); } @@ -274,7 +284,6 @@ public class PathPreviewRenderer { private void drawCamera(Triple view, Triple pos, Triple rot) { - Tessellator tessellator = Tessellator.getInstance(); BufferBuilder_setTranslation(0, 0, 0); mc.renderEngine.bindTexture(CAMERA_HEAD); @@ -298,7 +307,7 @@ public class PathPreviewRenderer { BufferBuilder_addPosCol(0, 0, 0, 0, 255, 0, 170); BufferBuilder_addPosCol(0, 0, 2, 0, 255, 0, 170); - tessellator.draw(); + Tessellator_getInstance().draw(); // draw camera cube GL11.glEnable(GL11.GL_TEXTURE_2D); @@ -345,7 +354,7 @@ public class PathPreviewRenderer { BufferBuilder_addPosTexCol(r + cubeSize, r + cubeSize, r + cubeSize, 2*8/64f, 8/64f, 255, 255, 255, 200); BufferBuilder_addPosTexCol(r + cubeSize, r + cubeSize, r, 2 * 8 / 64f, 0, 255, 255, 255, 200); - tessellator.draw(); + Tessellator_getInstance().draw(); GL11.glPopMatrix(); } diff --git a/src/main/resources/META-INF/replaymod_at.cfg b/src/main/resources/META-INF/replaymod_at.cfg index 54ec438e..950bbdee 100644 --- a/src/main/resources/META-INF/replaymod_at.cfg +++ b/src/main/resources/META-INF/replaymod_at.cfg @@ -61,8 +61,13 @@ public net.minecraft.entity.Entity field_70180_af # dataWatcher # ResourcePackRepository public net.minecraft.client.resources.ResourcePackRepository field_148534_e # dirServerResourcepacks +##if MC>=10800 public net.minecraft.client.resources.ResourcePackRepository field_177321_h # lock public net.minecraft.client.resources.ResourcePackRepository field_177322_i # httpRequest +##else +#$$ public net.minecraft.client.resources.ResourcePackRepository field_148532_f # resourcePack +#$$ public net.minecraft.client.resources.ResourcePackRepository field_148533_g # currentlyDownloading +##endif # EntityRenderer public net.minecraft.client.renderer.EntityRenderer * diff --git a/src/main/resources/mixins.compat.shaders.replaymod.json b/src/main/resources/mixins.compat.shaders.replaymod.json index ed6e1a9a..9d1bc2db 100644 --- a/src/main/resources/mixins.compat.shaders.replaymod.json +++ b/src/main/resources/mixins.compat.shaders.replaymod.json @@ -4,9 +4,13 @@ "mixins": [], "server": [], "client": [ + //#if MC>=10800 "MixinShaderEntityRenderer", "MixinShaderRenderChunk", "MixinShaderRenderGlobal", + //#else + //$$ "MixinShaders", + //#endif "MixinShadersRender" ], "compatibilityLevel": "JAVA_8", diff --git a/src/main/resources/mixins.recording.replaymod.json b/src/main/resources/mixins.recording.replaymod.json index 76a425c7..505a8823 100644 --- a/src/main/resources/mixins.recording.replaymod.json +++ b/src/main/resources/mixins.recording.replaymod.json @@ -8,6 +8,9 @@ "MixinPlayerControllerMP", "MixinWorldClient", //#endif + //#if MC<=10710 + //$$ "MixinGuiScreen", + //#endif "MixinNetHandlerLoginClient", "MixinNetHandlerPlayClient", "MixinNetworkDispatcher", diff --git a/src/main/resources/mixins.render.replaymod.json b/src/main/resources/mixins.render.replaymod.json index c2a63ce6..305fa27c 100644 --- a/src/main/resources/mixins.render.replaymod.json +++ b/src/main/resources/mixins.render.replaymod.json @@ -13,7 +13,11 @@ "MixinEntityRenderer", "MixinFrustum", "MixinRender", + //#if MC>=10800 "MixinRenderGlobal", + //#else + //$$ "MixinOpenGlHelper", + //#endif "MixinRenderManager" ], "compatibilityLevel": "JAVA_8", diff --git a/src/main/resources/mixins.replay.replaymod.json b/src/main/resources/mixins.replay.replaymod.json index 9891f696..6fe1e46a 100644 --- a/src/main/resources/mixins.replay.replaymod.json +++ b/src/main/resources/mixins.replay.replaymod.json @@ -7,14 +7,16 @@ //#if MC>=10904 "MixinParticleManager", //#endif + //#if MC>=10800 "MixinGuiSpectator", - "MixinPlayerControllerMP", "MixinRenderArrow", + "MixinRenderManager", + "MixinViewFrustum", + //#endif + "MixinPlayerControllerMP", "MixinRenderItem", "MixinRenderLivingBase", - "MixinRenderManager", "MixinTileEntityEndPortalRenderer", - "MixinViewFrustum", "MixinWorldClient" ], "compatibilityLevel": "JAVA_8", diff --git a/versions/common.gradle b/versions/common.gradle index 36151cee..0545473d 100644 --- a/versions/common.gradle +++ b/versions/common.gradle @@ -34,13 +34,27 @@ buildscript { mcVersion >= 10904 ? '2.2-SNAPSHOT' : mcVersion >= 10809 ? '2.1-SNAPSHOT' : mcVersion >= 10800 ? '2.0-SNAPSHOT' : + mcVersion >= 10710 ? '1.2-SNAPSHOT' : 'invalid' ) } } -apply plugin: 'net.minecraftforge.gradle.forge' -apply plugin: 'org.spongepowered.mixin' +if (mcVersion >= 10800) { + apply plugin: 'net.minecraftforge.gradle.forge' + apply plugin: 'org.spongepowered.mixin' +} else { + apply plugin: 'forge' + + ext { + // FIXME needed? + mixinConfigs = [ + 'compat.shaders', 'extras.playeroverview', 'recording', 'render', 'replay' + ].collect {"mixins.${it}.replaymod.json"} + mixinSrg = new File(project.buildDir, 'tmp/mixins/mixins.srg') + mixinRefMap = new File(project.buildDir, 'tmp/mixins/mixins.replaymod.refmap.json') + } +} sourceCompatibility = 1.8 targetCompatibility = 1.8 @@ -52,7 +66,9 @@ group= "com.replaymod" archivesBaseName = "replaymod" minecraft { - coreMod = 'com.replaymod.core.LoadingPlugin' + if (mcVersion >= 10800) { + coreMod = 'com.replaymod.core.LoadingPlugin' + } runDir = "../../eclipse" version = [ @@ -65,6 +81,7 @@ minecraft { 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 = [ 11202: "snapshot_20170615", @@ -76,6 +93,7 @@ minecraft { 10904: "snapshot_20160518", 10809: "stable_22", 10800: "snapshot_nodoc_20141130", + 10710: "stable_12", ][mcVersion] } afterEvaluate { @@ -113,9 +131,9 @@ dependencies { shade 'org.aspectj:aspectjrt:1.8.2' - def studioVersion = project.name + def studioVersion = "${(int)(mcVersion/10000)}.${(int)(mcVersion/100)%100}" + (mcVersion%100==0 ? '' : ".${mcVersion%100}") if (studioVersion == '1.8.9') studioVersion = '1.8' - shade("com.github.ReplayMod.ReplayStudio:$studioVersion:9fd96a7"){ + shade("com.github.ReplayMod.ReplayStudio:$studioVersion:24a6ad9"){ exclude group: 'com.google.guava', module: 'guava' // provided by MC exclude group: 'org.projectlombok', module: 'lombok' // runtime only for @SneakyThrows which isn't used } @@ -124,6 +142,7 @@ dependencies { 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' shade(project(":jGui:$jGuiVersion")){ + 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 } @@ -132,6 +151,20 @@ dependencies { 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 + } + } +} + if (project.name != 'core') { apply from: '../preprocessor.gradle' @@ -164,7 +197,7 @@ if (project.name != 'core') { compileJava.dependsOn preprocessJava processResources.dependsOn preprocessResources - [deobfMcMCP, deobfMcSRG].each { task -> + (mcVersion >= 10800 ? [deobfMcMCP, deobfMcSRG] : [deobfuscateJar, deobfBinJar]).each { task -> task.dependsOn preprocessResources } @@ -177,16 +210,17 @@ if (project.name != 'core') { } +def reobfTask = mcVersion >= 10800 ? tasks.reobfJar : tasks.reobf task configureRelocation() { dependsOn tasks.jar dependsOn configurations.shade doLast { - def extraSrg = tasks.reobfJar.extraSrgLines + def extraSrg = mcVersion >= 10800 ? reobfTask.extraSrgLines : reobfTask.extraSrg files(configurations.shade).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')) { + if (!file.directory && file.name.endsWith('.class') && file.path.contains('/')) { def pkg = file.path.substring(0, file.path.lastIndexOf('/')) if (!pkg.startsWith('com/replaymod') && !pkg.startsWith('javax/')) { pkgs << pkg @@ -199,7 +233,14 @@ task configureRelocation() { } } } -tasks.reobfJar.dependsOn configureRelocation +reobfTask.dependsOn configureRelocation + +if (mcVersion <= 10710) { + // Dummy task so "./gradlew reobfJar" also builds 1.7.10 + task reobfJar() { + dependsOn reobf + } +} jar { duplicatesStrategy = DuplicatesStrategy.EXCLUDE @@ -207,6 +248,10 @@ jar { dependsOn configurations.compile dependsOn configurations.shade + if (mcVersion <= 10710) { + from project.mixinRefMap + } + def shade = {files( configurations.compile.findAll {it.name.startsWith 'mixin-'} + configurations.shade @@ -237,6 +282,8 @@ jar { attributes 'TweakClass': 'org.spongepowered.asm.launch.MixinTweaker', 'TweakOrder': '0', 'FMLCorePluginContainsFMLMod': 'true', + // FIXME is this needed? 'MixinConfigs': project.mixinConfigs.join(','), + 'FMLCorePlugin': 'com.replaymod.core.LoadingPlugin', 'FMLAT': 'replaymod_at.cfg' } } @@ -285,13 +332,30 @@ setupDecompWorkspace.dependsOn copySrg setupDevWorkspace.dependsOn copySrg project.tasks.idea.dependsOn copySrg +if (mcVersion <= 10710) { + reobf.doFirst { + if (project.mixinSrg.exists()) { + addExtraSrgFile project.mixinSrg + } + } + + compileJava.dependsOn copySrg + compileJava { + options.compilerArgs += [ + "-AoutSrgFile=${project.mixinSrg.canonicalPath}", + "-AoutRefMapFile=${project.mixinRefMap.canonicalPath}", + "-AreobfSrgFile=${project.file('build/mcp-srg.srg').canonicalPath}" + ] + } +} + // 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 = compileJava.ext.refMapFile + File refmapFile = mcVersion >= 10800 ? compileJava.ext.refMapFile : project.mixinRefMap if (refmapFile.exists()) { def ordered ordered = { @@ -324,7 +388,7 @@ import static org.objectweb.asm.Opcodes.ASM5 // As a workaround, to use setupCIWorkspace on Drone, we modify the bin jar in-place and remove all parameter annotations. // WARNING: This piece of code ignores any and all gradle conventions and will probably fail horribly when run outside // of a single-use environment (e.g. Drone). Use setupDecompWorkspace for normal use. -tasks.deobfMcMCP.doLast { +def annotationWorkaround = { println "Applying RuntimeInvisibleParameterAnnotations workaround..." File jar = getOutJar() File tmp = new File((File) getTemporaryDir(), "workaround.jar") @@ -359,6 +423,9 @@ tasks.deobfMcMCP.doLast { jar.delete() tmp.renameTo(jar) } +if (mcVersion >= 10809) { + tasks.deobfMcMCP.doLast annotationWorkaround +} task runIntegrationTest(type: JavaExec, dependsOn: ["makeStart", "jar"]) { main = 'GradleStart' From 3e23826c8d1636bd558d73a490e737e64820077e Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Wed, 7 Mar 2018 22:03:52 +0100 Subject: [PATCH 12/30] [1.7.10] Fix recording of chunk packets in MP (fixes #98) --- .../mixin/MixinS26PacketMapChunkBulk.java | 38 +++++++++++++++++++ .../resources/mixins.recording.replaymod.json | 1 + 2 files changed, 39 insertions(+) create mode 100644 src/main/java/com/replaymod/recording/mixin/MixinS26PacketMapChunkBulk.java diff --git a/src/main/java/com/replaymod/recording/mixin/MixinS26PacketMapChunkBulk.java b/src/main/java/com/replaymod/recording/mixin/MixinS26PacketMapChunkBulk.java new file mode 100644 index 00000000..be5ef086 --- /dev/null +++ b/src/main/java/com/replaymod/recording/mixin/MixinS26PacketMapChunkBulk.java @@ -0,0 +1,38 @@ +//#if MC<=10710 +//$$ package com.replaymod.recording.mixin; +//$$ +//$$ import net.minecraft.network.PacketBuffer; +//$$ import net.minecraft.network.play.server.S21PacketChunkData; +//$$ import net.minecraft.network.play.server.S26PacketMapChunkBulk; +//$$ import org.spongepowered.asm.mixin.Mixin; +//$$ import org.spongepowered.asm.mixin.Shadow; +//$$ import org.spongepowered.asm.mixin.injection.At; +//$$ import org.spongepowered.asm.mixin.injection.Inject; +//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +//$$ +//$$ import java.util.concurrent.Semaphore; +//$$ +//$$ @Mixin({ S21PacketChunkData.class, S26PacketMapChunkBulk.class }) +//$$ public abstract class MixinS26PacketMapChunkBulk { +//$$ +//$$ private byte[] rawData; +//$$ +//$$ @Shadow(remap = false) +//$$ private Semaphore deflateGate; +//$$ +//$$ @Inject(method = "readPacketData", at = @At("HEAD")) +//$$ private void replayModRecording_readRawPacketData(PacketBuffer data, CallbackInfo ci) { +//$$ int readerIndex = data.readerIndex(); +//$$ data.readBytes(rawData = new byte[data.readableBytes()]); +//$$ data.readerIndex(readerIndex); +//$$ } +//$$ +//$$ @Inject(method = "writePacketData", at = @At("HEAD"), cancellable = true) +//$$ private void replayModRecording_writePacketData(PacketBuffer data, CallbackInfo ci) { +//$$ if (rawData != null && deflateGate == null) { +//$$ data.writeBytes(rawData); +//$$ ci.cancel(); +//$$ } +//$$ } +//$$ } +//#endif diff --git a/src/main/resources/mixins.recording.replaymod.json b/src/main/resources/mixins.recording.replaymod.json index 505a8823..a7429f91 100644 --- a/src/main/resources/mixins.recording.replaymod.json +++ b/src/main/resources/mixins.recording.replaymod.json @@ -10,6 +10,7 @@ //#endif //#if MC<=10710 //$$ "MixinGuiScreen", + //$$ "MixinS26PacketMapChunkBulk", //#endif "MixinNetHandlerLoginClient", "MixinNetHandlerPlayClient", From e32dab87496d5744461dc38ff6d52ee5c263f2fd Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Fri, 16 Mar 2018 11:19:05 +0100 Subject: [PATCH 13/30] Add 1.7.10 to reprod / drone build --- .drone.yml | 3 +- .drone.yml.sig | 2 +- .gitmodules | 7 + gradle/reprod/build.gradle | 5 + gradle/reprod/checksums.txt | 74 +++- gradle/reprod/init.gradle | 26 +- ...-Fix-build-for-newer-gradle-versions.patch | 22 ++ .../0002-Fix-compilation-with-ECJ.patch | 22 ++ .../0003-Fix-compilation-for-Gradle-3.patch | 318 ++++++++++++++++++ ...dundant-sourcepath-compiler-argument.patch | 31 ++ gradle/reprod/settings.gradle | 2 + gradle/reprod/upstream/forgegradle-1.2 | 1 + gradle/reprod/upstream/srg2source-3.2 | 1 + 13 files changed, 493 insertions(+), 21 deletions(-) create mode 100644 gradle/reprod/patches/forgegradle-1.2/0001-Fix-build-for-newer-gradle-versions.patch create mode 100644 gradle/reprod/patches/forgegradle-1.2/0002-Fix-compilation-with-ECJ.patch create mode 100644 gradle/reprod/patches/forgegradle-1.2/0003-Fix-compilation-for-Gradle-3.patch create mode 100644 gradle/reprod/patches/forgegradle-1.2/0004-Remove-redundant-sourcepath-compiler-argument.patch create mode 160000 gradle/reprod/upstream/forgegradle-1.2 create mode 160000 gradle/reprod/upstream/srg2source-3.2 diff --git a/.drone.yml b/.drone.yml index f64fb0a0..5b371337 100644 --- a/.drone.yml +++ b/.drone.yml @@ -8,7 +8,8 @@ pipeline: commands: - curl --fail --create-dirs -o $HOME/.gradle/init.d/mirror.gradle https://maven.johni0702.de/config/gradle - git config --global user.email "replaymod@drone" && git config --global user.name "Drone" - - SIGNED_JAR=$(! git describe --exact 2>&1 > /dev/null; echo $?) REPRODUCIBLE_BUILD=1 ./gradlew $(bash -c "echo :{1.8,1.8.9,1.9.4,1.10.2,1.11,1.11.2,1.12,1.12.1,1.12.2}:reobfJar") --parallel + - REPRODUCIBLE_BUILD=1 ./gradlew :1.7.10:setupCIWorkspace :jGui:1.7.10:setupCIWorkspace + - SIGNED_JAR=$(! git describe --exact 2>&1 > /dev/null; echo $?) REPRODUCIBLE_BUILD=1 ./gradlew $(bash -c "echo :{1.7.10,1.8,1.8.9,1.9.4,1.10.2,1.11,1.11.2,1.12,1.12.1,1.12.2}:reobfJar") --parallel - mkdir -p build/libs && mv versions/*/build/libs/* build/libs/ archive: image: plugins/s3 diff --git a/.drone.yml.sig b/.drone.yml.sig index c90fd551..3bd52b21 100644 --- a/.drone.yml.sig +++ b/.drone.yml.sig @@ -1 +1 @@ -eyJhbGciOiJIUzI1NiJ9.cGlwZWxpbmU6CiAgY2xvbmU6CiAgICBpbWFnZTogcGx1Z2lucy9naXQKICAgIHRhZ3M6IHRydWUKICAgIHJlY3Vyc2l2ZTogdHJ1ZQogIGJ1aWxkOgogICAgaW1hZ2U6IG1hdmVuOjMuMy45LWpkay04CiAgICBjb21tYW5kczoKICAgICAgLSBjdXJsIC0tZmFpbCAtLWNyZWF0ZS1kaXJzIC1vICRIT01FLy5ncmFkbGUvaW5pdC5kL21pcnJvci5ncmFkbGUgaHR0cHM6Ly9tYXZlbi5qb2huaTA3MDIuZGUvY29uZmlnL2dyYWRsZQogICAgICAtIGdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5lbWFpbCAicmVwbGF5bW9kQGRyb25lIiAmJiBnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIubmFtZSAiRHJvbmUiCiAgICAgIC0gU0lHTkVEX0pBUj0kKCEgZ2l0IGRlc2NyaWJlIC0tZXhhY3QgMj4mMSA-IC9kZXYvbnVsbDsgZWNobyAkPykgUkVQUk9EVUNJQkxFX0JVSUxEPTEgLi9ncmFkbGV3ICQoYmFzaCAtYyAiZWNobyA6ezEuOCwxLjguOSwxLjkuNCwxLjEwLjIsMS4xMSwxLjExLjIsMS4xMiwxLjEyLjEsMS4xMi4yfTpyZW9iZkphciIpIC0tcGFyYWxsZWwKICAgICAgLSBta2RpciAtcCBidWlsZC9saWJzICYmIG12IHZlcnNpb25zLyovYnVpbGQvbGlicy8qIGJ1aWxkL2xpYnMvCiAgYXJjaGl2ZToKICAgIGltYWdlOiBwbHVnaW5zL3MzCiAgICBhY2w6IHB1YmxpYy1yZWFkCiAgICByZWdpb246ICJ1cy1lYXN0LTEiCiAgICBidWNrZXQ6ICJyZXBsYXltb2QiCiAgICBwYXRoX3N0eWxlOiB0cnVlCiAgICBzb3VyY2U6IGJ1aWxkL2xpYnMvKgogICAgc3RyaXBfcHJlZml4OiBidWlsZC9saWJzLwogICAgdGFyZ2V0OiAvCg.fT6kOBDI6aBi4mOm999DOflJ7ZCkclgr6Vz69rlOpQ0 \ No newline at end of file +eyJhbGciOiJIUzI1NiJ9.cGlwZWxpbmU6CiAgY2xvbmU6CiAgICBpbWFnZTogcGx1Z2lucy9naXQKICAgIHRhZ3M6IHRydWUKICAgIHJlY3Vyc2l2ZTogdHJ1ZQogIGJ1aWxkOgogICAgaW1hZ2U6IG1hdmVuOjMuMy45LWpkay04CiAgICBjb21tYW5kczoKICAgICAgLSBjdXJsIC0tZmFpbCAtLWNyZWF0ZS1kaXJzIC1vICRIT01FLy5ncmFkbGUvaW5pdC5kL21pcnJvci5ncmFkbGUgaHR0cHM6Ly9tYXZlbi5qb2huaTA3MDIuZGUvY29uZmlnL2dyYWRsZQogICAgICAtIGdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5lbWFpbCAicmVwbGF5bW9kQGRyb25lIiAmJiBnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIubmFtZSAiRHJvbmUiCiAgICAgIC0gUkVQUk9EVUNJQkxFX0JVSUxEPTEgLi9ncmFkbGV3IDoxLjcuMTA6c2V0dXBDSVdvcmtzcGFjZSA6akd1aToxLjcuMTA6c2V0dXBDSVdvcmtzcGFjZQogICAgICAtIFNJR05FRF9KQVI9JCghIGdpdCBkZXNjcmliZSAtLWV4YWN0IDI-JjEgPiAvZGV2L251bGw7IGVjaG8gJD8pIFJFUFJPRFVDSUJMRV9CVUlMRD0xIC4vZ3JhZGxldyAkKGJhc2ggLWMgImVjaG8gOnsxLjcuMTAsMS44LDEuOC45LDEuOS40LDEuMTAuMiwxLjExLDEuMTEuMiwxLjEyLDEuMTIuMSwxLjEyLjJ9OnJlb2JmSmFyIikgLS1wYXJhbGxlbAogICAgICAtIG1rZGlyIC1wIGJ1aWxkL2xpYnMgJiYgbXYgdmVyc2lvbnMvKi9idWlsZC9saWJzLyogYnVpbGQvbGlicy8KICBhcmNoaXZlOgogICAgaW1hZ2U6IHBsdWdpbnMvczMKICAgIGFjbDogcHVibGljLXJlYWQKICAgIHJlZ2lvbjogInVzLWVhc3QtMSIKICAgIGJ1Y2tldDogInJlcGxheW1vZCIKICAgIHBhdGhfc3R5bGU6IHRydWUKICAgIHNvdXJjZTogYnVpbGQvbGlicy8qCiAgICBzdHJpcF9wcmVmaXg6IGJ1aWxkL2xpYnMvCiAgICB0YXJnZXQ6IC8K.2bNe9Pd4FUTIP9VTrFR4YuHJkgCmjIbfBCUu-Wrvap8 \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index f49ffdd4..8881f4da 100644 --- a/.gitmodules +++ b/.gitmodules @@ -20,3 +20,10 @@ [submodule "gradle/reprod/upstream/mixin"] path = gradle/reprod/upstream/mixin url = https://github.com/SpongePowered/Mixin.git +[submodule "gradle/reprod/upstream/forgegradle-1.2"] + path = gradle/reprod/upstream/forgegradle-1.2 + url = git@github.com:MinecraftForge/ForgeGradle.git + branch = FG_1.2 +[submodule "gradle/reprod/upstream/srg2source-3.2"] + path = gradle/reprod/upstream/srg2source-3.2 + url = git@github.com:MinecraftForge/Srg2Source.git diff --git a/gradle/reprod/build.gradle b/gradle/reprod/build.gradle index 87e8358d..b837ab92 100644 --- a/gradle/reprod/build.gradle +++ b/gradle/reprod/build.gradle @@ -21,6 +21,9 @@ subprojects { task build(type: Exec) { dependsOn applyPatches + if (project.name == 'forgegradle-1.2') { + dependsOn ':srg2source-3.2:build' + } if (project.name == 'forgegradle-2.3') { dependsOn ':forgeflower:build' } @@ -28,6 +31,8 @@ subprojects { !rootProject.file('deps/repo/' + [ 'mixin': 'org/spongepowered/mixin/0.7.5-SNAPSHOT', 'forgeflower': 'net/minecraftforge/forgeflower/1.0.342-SNAPSHOT', + 'srg2source-3.2': 'net/minecraftforge/srg2source/Srg2Source/3.2-SNAPSHOT', + 'forgegradle-1.2': 'net/minecraftforge/gradle/ForgeGradle/1.2-SNAPSHOT', 'forgegradle-2.1': 'net/minecraftforge/gradle/ForgeGradle/2.1-SNAPSHOT', 'forgegradle-2.2': 'net/minecraftforge/gradle/ForgeGradle/2.2-SNAPSHOT', 'forgegradle-2.3': 'net/minecraftforge/gradle/ForgeGradle/2.3-SNAPSHOT', diff --git a/gradle/reprod/checksums.txt b/gradle/reprod/checksums.txt index 3761b918..4ede2f3c 100644 --- a/gradle/reprod/checksums.txt +++ b/gradle/reprod/checksums.txt @@ -6,6 +6,8 @@ a09a4ac520f9ec5ccd16195272fd8ed4c667285f9e129da5acf633bb21a7d174 /com/cloudbees/ 754184022345800c2d066eceeaf2f7a88a7c2aaeae23eb1c76ef598854aa9157 /com/fasterxml/jackson/core/jackson-core/2.1.3/jackson-core-2.1.3.jar cc3bfcc34a29c041e7cafc05ed6f0c3ebf8a7dcf812489a64f4c37f4f5279adf /com/fasterxml/jackson/core/jackson-core/2.1.3/jackson-core-2.1.3.pom a30a3f89fbbea23deb5290e832eb0d12a8171ae8ba4461af2b936ed0245ee697 /com/fasterxml/oss-parent/4/oss-parent-4.pom +95a925c9cff6c10061b2a7b225b5b470327163f18bae1c3db37375cfba8ae308 /com/github/abrarsyed/jastyle/jAstyle/1.2/jAstyle-1.2.jar +f4d71983e5d2fbc8dda6d86439993a871feb599ad0b8e2904f0b9d179ca8e6a5 /com/github/abrarsyed/jastyle/jAstyle/1.2/jAstyle-1.2.pom 4cad4ee2f1c379fa1f6496912fe026d8a4f2febf0a140ff867206b00a22f988f /com/github/abrarsyed/jastyle/jAstyle/1.3/jAstyle-1.3.jar cd62bdfd946618c26b49451084361edf79cd6ddb3eae1a485ecb05319295896d /com/github/abrarsyed/jastyle/jAstyle/1.3/jAstyle-1.3.pom bd1f6f51d00168a82c25f89204cfe6cbf120f8b92f5929f8b77ed123375d8488 /com/github/fesh0r/fernflower/adbf29f8/fernflower-adbf29f8.jar @@ -24,24 +26,28 @@ fbcba81b21a8bc3c0761e4798fa05285444b43d681c03c9af49f9b2e1ecb0184 /com/github/jpo 485f5625683d9261d32a89c3725df4c361d4b35bfaf866fb68db17833f1fb820 /com/github/MinecraftForge/Srg2Source/dcad1a6/Srg2Source-dcad1a6.pom f539e2ca00d43e3d2261b7334eb05137f0eb1d3d5e3cc2c2716b0071e27783ed /com/github/MinecraftForge/Srg2Source/ea4ea62/Srg2Source-ea4ea62.jar fe525f413965d4f5f65b70f08b90b3d3f944714f665e2c5636a6e8fec08d3c74 /com/github/MinecraftForge/Srg2Source/ea4ea62/Srg2Source-ea4ea62.pom +cddfc1a07301f2fa07a5e1b6897e455d397d6d5c547d45082c267a1ee2c75f70 /com/github/ModCoderPack/MCInjector/05aa80e/MCInjector-05aa80e.jar +7191124b8491d36b9fc1eb1a4e0f8ef710a4b98e27dde92854c24d45457fd9d0 /com/github/ModCoderPack/MCInjector/05aa80e/MCInjector-05aa80e.pom ecf57aab63509ec0ce3937c2215bc3a2e3cb6357cd11095978db18bd3251731a /com/github/ModCoderPack/MCInjector/7258466/MCInjector-7258466.jar dc7ed1f4f0ddd8f5ce3b449db944907a5eb2855dbbbc59b08dad1247ebafba33 /com/github/ModCoderPack/MCInjector/7258466/MCInjector-7258466.pom -eec4d746869133803b0b3c8a8036a6fb1ec95c52951a0c83cd712f8414eb2155 /com/github/ReplayMod/ReplayStudio/1.10.2/9fd96a7/1.10.2-9fd96a7.jar -4ab7d385c3bb8ff5f644d7581ba01e8f53bf901391bc3db4a42671d691fe10a3 /com/github/ReplayMod/ReplayStudio/1.10.2/9fd96a7/1.10.2-9fd96a7.pom -2b1cc3bb7e47f0e211d9a4f6460094cac923d6225570c3f7050d7ca400797ca3 /com/github/ReplayMod/ReplayStudio/1.11.2/9fd96a7/1.11.2-9fd96a7.jar -5c7a1016aec5d110283b7da5d2275624c9620f4b7e280243d36a3d91fdc9a634 /com/github/ReplayMod/ReplayStudio/1.11.2/9fd96a7/1.11.2-9fd96a7.pom -0b5b847e3632c9af689d6962784055199b32480776d6677c3af7a5222a5d7aa8 /com/github/ReplayMod/ReplayStudio/1.11/9fd96a7/1.11-9fd96a7.jar -264e3bc6f5e46a779e69693a8923b7ec0ab293c0b44aebdef8ae1384e60ca9cd /com/github/ReplayMod/ReplayStudio/1.11/9fd96a7/1.11-9fd96a7.pom -a57a2413914bcd3d28303fd8f15311ea75c71190a709301016e8d4a2a5b8594d /com/github/ReplayMod/ReplayStudio/1.12.1/9fd96a7/1.12.1-9fd96a7.jar -d5de52fb3678b934f9ff79010cf5f9b5808d4dbecea12176a68ba48770058292 /com/github/ReplayMod/ReplayStudio/1.12.1/9fd96a7/1.12.1-9fd96a7.pom -8e394540ae4f7e482418bac8fc62b960e7d6684d0c775de4cbe31a5b6e8265ba /com/github/ReplayMod/ReplayStudio/1.12.2/9fd96a7/1.12.2-9fd96a7.jar -52fffb013931c1665fec82a4b8fa689746ced42ba3aa9bf9ec0e31cb5795dd45 /com/github/ReplayMod/ReplayStudio/1.12.2/9fd96a7/1.12.2-9fd96a7.pom -4a63fcc6f9028eb3861ffa2bfa530946a3bfb08740a63b079438cd63483e25d6 /com/github/ReplayMod/ReplayStudio/1.12/9fd96a7/1.12-9fd96a7.jar -84dc441594bfc55066bc47e220bec2c29b13078f43bf4825ea2efb627ac77e48 /com/github/ReplayMod/ReplayStudio/1.12/9fd96a7/1.12-9fd96a7.pom -05815d75c608c7a595e0b05e253dd061f0399192d5ff801bd4638f91e2977ea9 /com/github/ReplayMod/ReplayStudio/1.8/9fd96a7/1.8-9fd96a7.jar -c8f68dd69574d0a60fd4da65dd719015f15dc39689c11ec82d996d73abafb1df /com/github/ReplayMod/ReplayStudio/1.8/9fd96a7/1.8-9fd96a7.pom -a0860a4846512e77944e4fd3e22e27e239606748aba10b4e3c0f8965439b6208 /com/github/ReplayMod/ReplayStudio/1.9.4/9fd96a7/1.9.4-9fd96a7.jar -8b4d5ad45fc62539a5add40e944e6fb22ad2b4d3954ed5b16f3f2a3b688da010 /com/github/ReplayMod/ReplayStudio/1.9.4/9fd96a7/1.9.4-9fd96a7.pom +6ebdbbf19772568d89e9655b5d64c26b1050d9326c8c2e61f64ab33b9650d56f /com/github/ReplayMod/ReplayStudio/1.10.2/24a6ad9/1.10.2-24a6ad9.jar +ab6a1dfa190ddfe8db5258c32363a9fee8e273b43478b948c8b79163d305b523 /com/github/ReplayMod/ReplayStudio/1.10.2/24a6ad9/1.10.2-24a6ad9.pom +01e9dee0e8ce43579f0cd9a360e9059d1443653e964dbe98ba5ac726657f1098 /com/github/ReplayMod/ReplayStudio/1.11.2/24a6ad9/1.11.2-24a6ad9.jar +e688800f492d466b3edf21e1d3a8e7e33f02094bc00af41a938a1901cb954a3d /com/github/ReplayMod/ReplayStudio/1.11.2/24a6ad9/1.11.2-24a6ad9.pom +e9a6a2d1ced27eb8c79c822fff17a2526b80a46565db7d80c291786e72aab2b6 /com/github/ReplayMod/ReplayStudio/1.11/24a6ad9/1.11-24a6ad9.jar +ec2508e54ebf32139af2de851f5ff953c5f9f20f8d0ad2a32d967ca36a3df170 /com/github/ReplayMod/ReplayStudio/1.11/24a6ad9/1.11-24a6ad9.pom +be3a00aeb83309589a5eb5f362c8be4c2a7618254bd83e4ad5e4c68979594134 /com/github/ReplayMod/ReplayStudio/1.12.1/24a6ad9/1.12.1-24a6ad9.jar +5b71b67fcfc0f9b841544fbdfc5341782e0b872137b7e6c580eeb255849b6ddd /com/github/ReplayMod/ReplayStudio/1.12.1/24a6ad9/1.12.1-24a6ad9.pom +a3b7366e9464df440b7d35aa763514d0d4f3561352ff46fd20d4fbd72199d9e4 /com/github/ReplayMod/ReplayStudio/1.12.2/24a6ad9/1.12.2-24a6ad9.jar +648c604e39a264df7fa7ec2a2e23316c6603ef0514f97ed2469e9fa0df8b2f88 /com/github/ReplayMod/ReplayStudio/1.12.2/24a6ad9/1.12.2-24a6ad9.pom +e879a28f1214a31a713a5e913a340c800924af8cef874f4c4b6fe87dfd168a5a /com/github/ReplayMod/ReplayStudio/1.12/24a6ad9/1.12-24a6ad9.jar +f76387ad6cf25314254e09a46fa4d3cf1316e73cc8d7dcc519ff043cedf5e011 /com/github/ReplayMod/ReplayStudio/1.12/24a6ad9/1.12-24a6ad9.pom +7bbfd0a7208a54a6504fcc55ab1923657290eb5f875b8a7a0e90b38c30ac3bf2 /com/github/ReplayMod/ReplayStudio/1.7.10/24a6ad9/1.7.10-24a6ad9.jar +0859e94b2301b922a5b3c708af5cfd3a5258472f0e96c1d5fa03d46ae1904a0d /com/github/ReplayMod/ReplayStudio/1.7.10/24a6ad9/1.7.10-24a6ad9.pom +a8004aa2fe87255b9de92d100347a76eda0c4922a082e1656a402825c21f29d4 /com/github/ReplayMod/ReplayStudio/1.8/24a6ad9/1.8-24a6ad9.jar +826c406986c4ffd5d2abd0b9c0b8184cdf65ac14aa1c8eb885c2ee7b34b9bc2d /com/github/ReplayMod/ReplayStudio/1.8/24a6ad9/1.8-24a6ad9.pom +2d828c6bf155a91c345b21202fe03d8ceaa5c3ad8db0e0c0cc8fde77adc465f6 /com/github/ReplayMod/ReplayStudio/1.9.4/24a6ad9/1.9.4-24a6ad9.jar +c5be0021f31bfd1e9c792b24f2811816430450b91e98452cef33392dda00696e /com/github/ReplayMod/ReplayStudio/1.9.4/24a6ad9/1.9.4-24a6ad9.pom bfdcda4cbf23f28392384818a1417c2d6df687e15ce77530ef96381393102f8a /com/github/SpongePowered/MixinGradle/dcfaf61/MixinGradle-dcfaf61.jar 3552e0c04817d91d1b6671a051d0e1d952c8b6a8eec57b54e829de9fa3ddf002 /com/github/SpongePowered/MixinGradle/dcfaf61/MixinGradle-dcfaf61.pom c6ebd74cd6108b8c372c95b842725ee5bd6d3303ba26cb00f18bc92f80b47956 /com/github/tony19/named-regexp/0.2.3/named-regexp-0.2.3.jar @@ -73,6 +79,8 @@ a5331a0ecb548f9942ab5b93c7ac43c38a21e897763dde1bcdbf0774f416ca6f /com/google/cod 0f1d8369b1e9f1bc4b467c8dcfdd8b59733aad5b5c8419c3a59b2f9abaf04cd2 /com/google/code/gson/gson-parent/2.8.0/gson-parent-2.8.0.pom 4838f4f29a027522363cef1bcda1b48808880b0de4953fab6db4121ee27b649b /com/googlecode/jarjar/jarjar/1.1/jarjar-1.1.jar be4f53c0bc04da4e3d6c65c8f3243d1ea4135e35c7d7dda88af1c582687263d7 /com/googlecode/jarjar/jarjar/1.1/jarjar-1.1.pom +d1296fa8926f71743be61cb4bfdac2ac3deb9ffe1a4948b1f293cb7a1bdb1800 /com/googlecode/javaewah/JavaEWAH/0.5.6/JavaEWAH-0.5.6.jar +fa5c2d7edcd57c6e1b402773dc32a180f82c111af44bfc2d483a2c7be1862e8f /com/googlecode/javaewah/JavaEWAH/0.5.6/JavaEWAH-0.5.6.pom ddbbf392f8e61f770a509a49aed5f32ead19768283b4b512c626e09e1ba5cc46 /com/googlecode/mp4parser/isoparser/1.1.7/isoparser-1.1.7.jar 6890ebacb23d3ab51a5751a830f5269b7e8fdd19d08b7e055bc739f62b4bd174 /com/googlecode/mp4parser/isoparser/1.1.7/isoparser-1.1.7.pom 8c36a80ea613d0b6b8040a17cf837c5bbe3677bc1b06a058a6c174fdb787ebbc /com/google/guava/guava/17.0/guava-17.0.jar @@ -112,6 +120,8 @@ bbc21cab2e0b0c76c9977fdf8b80c311788094d81e6910a2a6e63d80910102c7 /com/gradle/pub 89aa507536b0a93d8c9d3087d738255eefffc002cefa255ebdbd6891b8165447 /com/gradle/publish/plugin-publish-plugin/0.9.1/plugin-publish-plugin-0.9.1.pom 147592c5eb8e11fc8394125954f877acf25918bae13aa210c2825aefc3030ed8 /com/ibm/icu/icu4j-core-mojang/51.2/icu4j-core-mojang-51.2.jar 06b382efe9d60474aa3df7f4851397b3ae0c4f142567f0fc66a8fa2706a665e4 /com/ibm/icu/icu4j-core-mojang/51.2/icu4j-core-mojang-51.2.pom +48cd629c3081dff4d8c35e7da4efb3bcc4ed4b35c8a7e8198d5c30e0312bd912 /com/jcraft/jsch/0.1.46/jsch-0.1.46.jar +eb60cec1e570efad3d750afd9a86b763dba49e47c3c106a599c05e708260efc4 /com/jcraft/jsch/0.1.46/jsch-0.1.46.pom 331746fa62cfbc3368260c5a2e660936ad11be612308c120a044e120361d474e /com/martiansoftware/jsap/2.1/jsap-2.1.jar 9acf56a8579c05bedd819d99232363e2bf327e8f73c67598dbd9885a845a3c69 /com/martiansoftware/jsap/2.1/jsap-2.1.pom 2c149735a093b6c65a27db760896ad5c5b06e29100bb8969937667784fef4ba0 /com/mojang/authlib/1.5.16/authlib-1.5.16.jar @@ -136,6 +146,8 @@ e3ab95d053a4e180693422bf56592f3c62ff273b0deb1d4a3cb5f76d8fb6994a /com/mojang/rea b69780ed88a3df0941e10321685bbdbea80b415c5523ced071301189ea295de5 /com/mojang/realms/1.10.19/realms-1.10.19.pom 9076a115056a4a3ce85b3f8b8c06b8e4ea723d856ab87592d72ac9fd3fa67c9f /com/mojang/realms/1.10.4/realms-1.10.4.jar 0e436798162614ebaa8a04c225ff0100d046848759a3d8a5f5bc3c73dcdaea13 /com/mojang/realms/1.10.4/realms-1.10.4.pom +a8ced4924d0e285ab287d94889e9920f855b9e13ef42e1c7468377b3c13bdb2b /com/mojang/realms/1.3.5/realms-1.3.5.jar +5fede9baa0b3a8064273ad05e3cafb09567de0da51426e925870059e3452ee5c /com/mojang/realms/1.3.5/realms-1.3.5.pom 0ad91190cd480af14954d361d7b9ffc53ab3c5344797e3c9fd90c29bf5d28499 /com/mojang/realms/1.6.1/realms-1.6.1.jar 6c724ad415af96416e035a5ae96b113b1df9247d5833fbf73135c66b23263904 /com/mojang/realms/1.6.1/realms-1.6.1.pom 4a6a90ed956609d6cd3a7f84622fcac87d22e9a5d4858c6d1e965af860d07a63 /com/mojang/realms/1.7.59/realms-1.7.59.jar @@ -211,20 +223,25 @@ ea6fdd37e68569a378fd149b0ab7cfede1de7fa3e794f4ed81f9018366fbdc51 /de/oceanlabs/m 755416d68281e0c6998fc743929f36e14563510467d1c749d4bf66ba5bf82b19 /de/oceanlabs/mcp/mcp_snapshot/20161220-1.11/mcp_snapshot-20161220-1.11.zip 5bbf57acadec0f5ea930b793772bbbf2885098aed8d2ecf6290c170a7cd9f33e /de/oceanlabs/mcp/mcp_snapshot/20170615-1.12/mcp_snapshot-20170615-1.12.zip cf2630841a5ef712b4be22a814f1b83964850b0de4dc78f6131b66280beb3249 /de/oceanlabs/mcp/mcp_snapshot_nodoc/20141130-1.8/mcp_snapshot_nodoc-20141130-1.8.zip +83d303a80071582cd07d41b35aa77c178d609a27c69c8472b794636eb50905b0 /de/oceanlabs/mcp/mcp_stable/12-1.7.10/mcp_stable-12-1.7.10.zip aeed0aaba9d159b7ce60a21e2dcc36adb249fade65ce2f76c730dd0ec7270763 /de/oceanlabs/mcp/mcp_stable/22-1.8.9/mcp_stable-22-1.8.9.zip 22c45060f350fcaa94e503f4a420cf8237c26c0fcdb4ada4aa98389b75c7b231 /de/oceanlabs/mcp/RetroGuard/3.6.6/RetroGuard-3.6.6.jar d6f165bb39aaa20ee14fdcbbdb0b8fffae38067087f333ec6e0acd3f6666b2ad /de/oceanlabs/mcp/RetroGuard/3.6.6/RetroGuard-3.6.6.pom * /de/oceanlabs/mcp/versions.json +7b18843dec340463a7e00c49325d7a6a8621a1de6ae64a4a282d629b0263d0ac /fernflower-fix-1.0.zip 08e0b3db3d116301f16142c88932daf954ac447427d609710c2a5ee8dfcfa1f7 /fr/inria/gforge/spoon/spoon-core/5.1.0/spoon-core-5.1.0.jar 5339568b5996c1b5ddc11cc7a640b11d3b7c65ba0ae7e250dfa12fd906e483bd /fr/inria/gforge/spoon/spoon-core/5.1.0/spoon-core-5.1.0.pom 142667dfce3afeb5cc6e18e893d895604060ecef9dfc0d261f0eb9b9e8c81cb0 /gradle/plugin/net/minecrell/gitpatcher/0.9.0/gitpatcher-0.9.0.jar 37a6757b16b927873baefe8498fa92c5385eba0ded3852982965491da2dd8e3a /gradle/plugin/net/minecrell/gitpatcher/0.9.0/gitpatcher-0.9.0.pom +96eaa32232b5a5b0f9afc121a0e1b2416e3dca50657b31e5431c0a04ae650552 /io/netty/netty-all/4.0.10.Final/netty-all-4.0.10.Final.jar +953a525bdf60c60ce59392849fad264c93276f035eb8345b7add69344352656e /io/netty/netty-all/4.0.10.Final/netty-all-4.0.10.Final.pom 8bc2b71a17ed1b5c6329bcc61fa9a2f7fe071074548fa137ebafec2a23d49d89 /io/netty/netty-all/4.0.15.Final/netty-all-4.0.15.Final.jar 9dfcfbce5531faa07e6afb1a2fc9579f096ffe88707bf95869d83ad81228a157 /io/netty/netty-all/4.0.15.Final/netty-all-4.0.15.Final.pom 50510e9c9874b539b98ef931fe7eeeb002f6b5b1976ea37669b9493426294561 /io/netty/netty-all/4.0.23.Final/netty-all-4.0.23.Final.jar 990a10af14db6b136d3a539eadca5dc7b4d0ceab9a1c90c5268b0ca8ae27b14b /io/netty/netty-all/4.0.23.Final/netty-all-4.0.23.Final.pom fd5ad66cdd0a496d281b26c699f4511da7c3f95083659ebb7bae22dab876581a /io/netty/netty-all/4.1.9.Final/netty-all-4.1.9.Final.jar 8ec38a54fc6ed53201d507c6690805878158bcab25c2f476a74c0ccb1d78870b /io/netty/netty-all/4.1.9.Final/netty-all-4.1.9.Final.pom +6e9fd513e74194c464723421215c52f3c90bcfbacc55fd7a3d9d172011da9bb4 /io/netty/netty-parent/4.0.10.Final/netty-parent-4.0.10.Final.pom 8064a2f9d222704882928e6ff104decc071ab6b7b07dce8efb90100d1e624e30 /io/netty/netty-parent/4.0.15.Final/netty-parent-4.0.15.Final.pom f7f1bd6f1e1df0b300730f1551b7222f13871e40ba5a464978bd3eed94e2212d /io/netty/netty-parent/4.0.23.Final/netty-parent-4.0.23.Final.pom 117ff8d9069d0278585c284ab0817f826f018d9cf4e30f7e1b11f4fbc73013d1 /io/netty/netty-parent/4.1.9.Final/netty-parent-4.1.9.Final.pom @@ -232,6 +249,8 @@ b4533f3b4029e480288d85187fc9ee6789f3d362c6633d8e9b092ec455ad2f28 /it/unimi/dsi/f 2b3db089f1f78a49a628d9015cca6a95e87421fa04262553cd2c4c79d66d04a7 /it/unimi/dsi/fastutil/7.0.12_mojang/fastutil-7.0.12_mojang.pom c266701bd7a4a2c36285862c1e682ccb7b5cb5b380d0de9bb1b34becf9e1c065 /it/unimi/dsi/fastutil/7.1.0/fastutil-7.1.0.jar 2846073506b6ff0361f08d0deafb2f3921797974e9685cae6c103f4a7f29100b /it/unimi/dsi/fastutil/7.1.0/fastutil-7.1.0.pom +dbaa088690a23a954eff669a99d2452a24dd9f10d866725ff5d29ff4740a897e /java3d/vecmath/1.3.1/vecmath-1.3.1.jar +d0da815549fc3f46ccdba82a65fd707b4029e83e1ea335b51dabd6d34a6718b7 /java3d/vecmath/1.3.1/vecmath-1.3.1.pom 09adf7955baa6bddf57a4bdbf9a91cf690261314969b59a18085ece1e05eccf9 /java3d/vecmath/1.5.2/vecmath-1.5.2.jar a4aee4668f1b127c95c9afe1b922f4c5a0b1ad879ba811077cb7d0e048dce231 /java3d/vecmath/1.5.2/vecmath-1.5.2.pom a6d2c9c0ddff7702662073b69c6dc4ec83011d22e4eb2dada28aa2d66ee47f97 /jline/jline/2.13/jline-2.13.jar @@ -270,6 +289,9 @@ ccccd0a92f76fbb24279691daad9b67f85d80471a37e59e0da76d7754982dfe8 /mc/game/1.8/cl * /mc/game/cdcd308b7cbd15bc595850ce6557d4ade48cee7a/1.9.4.json * /mc/game/cf72a57ff499d6d9ade870b2143ee54958bd33ef/1.12.2.json * /mc/game/d74a4b45e8877084e1bcc8121012845f28def238/1.8.json +a4fc2284657544e0f4bcc964f927c2fda3e3a205178ed1d5d58883aaf9780cce /Minecraft.Download/versions/1.7.10/1.7.10.jar +ad98bf393d5380741fc9d1193624a51c3a5a52de88278890380fdf1b702afd32 /Minecraft.Download/versions/1.7.10/1.7.10.json +c70870f00c4024d829e154f7e5f4e885b02dd87991726a3308d81f513972f3fc /Minecraft.Download/versions/1.7.10/minecraft_server.1.7.10.jar 3bff6a1489b8e54cf130344bc5e8744db331045ad2fc736612576e1d80eb1f48 /net/java/dev/jna/jna/3.4.0/jna-3.4.0.jar cf4605822bd56d135dd7031603f122a11a0ec772373f466a4f2aac72dd9a1761 /net/java/dev/jna/jna/3.4.0/jna-3.4.0.pom c4dadeeecaa90c8847902082aee5eb107fcf59c5d0e63a17fcaf273c0e2d2bd1 /net/java/dev/jna/jna/4.4.0/jna-4.4.0.jar @@ -284,6 +306,8 @@ ea89d5090c8303ba4e9a0056e6d8a20429f3e021411e950bfd9eba3b6e6cf15c /net/java/dev/j ba27597365ae85a836c1f51819903668b4a1a7490e39e530633cc8a7b40b5500 /net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5.pom c3334ff39cf0ab3b54925619101054c90098b7c733b1e7834c7b75e4c41e84a5 /net/java/jutils/jutils/1.0.0/jutils-1.0.0.jar af09ead4eb241473e7ec4d152a91a722ea09a717a202e20e4b385eac3217b7d6 /net/java/jutils/jutils/1.0.0/jutils-1.0.0.pom +0358ece24296312b655fe3c78b4fd42653bdb34c27cc9c018069e486aea8de9d /net/md-5/SpecialSource/1.7.3/SpecialSource-1.7.3.jar +bad0f99146d5617d7931761cf424386563e7b25a2ee7cfc235ed314a4776acaf /net/md-5/SpecialSource/1.7.3/SpecialSource-1.7.3.pom b47c5d5810643426a3147ddb2195ef2ab67c80b167e7c2ac64a5d0dee8c030dd /net/md-5/SpecialSource/1.7.4/SpecialSource-1.7.4.jar 5f374f8ae7afff8dbc23aff14e59c5bd585c230afe9a8dcaa7b928e8cb16a27e /net/md-5/SpecialSource/1.7.4/SpecialSource-1.7.4.pom ea608fe91f9c77a7e91061fab2c4d8eb1b865db4d062ea0fcc12a76db06c9dea /net/md-5/SpecialSource/1.8.2/SpecialSource-1.8.2.jar @@ -300,6 +324,7 @@ c8396b067c800425d4f4e97ec6879262f2133b5c53575c6b82c4eb6feb22f2a1 /net/minecraftf ce0229a5c0873e5085bfb67eaea93aeed2e9f95e0534d87eadba5f1864a90778 /net/minecraftforge/forge/1.12-14.21.1.2387/forge-1.12-14.21.1.2387-userdev.jar 0be3944587adda74c34735dc66757afed3223d8599ac6ad1b402d36d452a09f9 /net/minecraftforge/forge/1.12.2-14.23.0.2486/forge-1.12.2-14.23.0.2486.pom 7fdc682b7ae27f08d50873ae68ded2bc3e14756559fae5b9717efcf6814952c8 /net/minecraftforge/forge/1.12.2-14.23.0.2486/forge-1.12.2-14.23.0.2486-userdev.jar +207f089219e0f9ce70b5865519ce879e96f92b13443243b7dc3fd5ed82e3f174 /net/minecraftforge/forge/1.7.10-10.13.4.1558-1.7.10/forge-1.7.10-10.13.4.1558-1.7.10-userdev.jar 5d166a260388526b502b07c167beb8ae5cd18d46f60a10a029c1d6e1206e093a /net/minecraftforge/forge/1.8-11.14.4.1563/forge-1.8-11.14.4.1563.pom 3e33989b813090abe749334b5a9a663bd37cb20e987b91f78fc616cc7fb91ee1 /net/minecraftforge/forge/1.8-11.14.4.1563/forge-1.8-11.14.4.1563-userdev.jar 029ba9ca09212fbb850ea78a6b53b96b1288195b4e191194793cf5cf80d5758a /net/minecraftforge/forge/1.8.9-11.15.1.1722/forge-1.8.9-11.15.1.1722.pom @@ -315,6 +340,8 @@ e74b65b8948446982a506a96176dd8baf4688237ba4903f56ca6f667b6c7ee42 /net/minecraft/ 60f08a3d6fc0e7948fd00fc95fad014fae5a5dc7eb991a631e0efee8bfad0b27 /net/sf/jopt-simple/jopt-simple/4.5/jopt-simple-4.5.pom 3fcfbe3203c2ea521bf7640484fd35d6303186ea2e08e72f032d640ca067ffda /net/sf/jopt-simple/jopt-simple/4.6/jopt-simple-4.6.jar 692744a19473011539ebc1370a264b8af1c056e0ae21f5372aa9dd7d4b4e5a2b /net/sf/jopt-simple/jopt-simple/4.6/jopt-simple-4.6.pom +0ffd6905a1ab99aaa1768b303015c432be9fac56047c1390ccf31bd22df5e64a /net/sf/jopt-simple/jopt-simple/4.7/jopt-simple-4.7.jar +c4330ce0d161b920ab8aba6c286444e6b619d1b6cb686653f89a9e28d476a88d /net/sf/jopt-simple/jopt-simple/4.7/jopt-simple-4.7.pom 26c5856e954b5f864db76f13b86919b59c6eecf9fd930b96baa8884626baf2f5 /net/sf/jopt-simple/jopt-simple/4.9/jopt-simple-4.9.jar 7af7e2d8b24b4798f04c2b7da24c9fbd1b7557b4e017c2054481565916079092 /net/sf/jopt-simple/jopt-simple/4.9/jopt-simple-4.9.pom 9f0c8d50fa4b79b6ff1502dbec8502179d6b9497cacbe17a13074001aed537ec /net/sf/jopt-simple/jopt-simple/5.0.1/jopt-simple-5.0.1.jar @@ -533,9 +560,14 @@ cb7c954965e6b2946c2f7be78c1e089b530e0444b1fefc2d8079a5681362bfa1 /org/eclipse/eq d7cd093fdad45c7cc979f44f7166f259607b41cf44a8afe77561594cef4c39d3 /org/eclipse/equinox/registry/maven-metadata.xml 9cddda75f4a1b4469e73f44e7b61a3e897d0f657df4797f9106ffe88c4eeade0 /org/eclipse/jdt/core/compiler/ecj/4.6.1/ecj-4.6.1.jar 536c45e8804de01321c478cfb994377f81f1e32897636616fa21b877fd137c6f /org/eclipse/jdt/core/compiler/ecj/4.6.1/ecj-4.6.1.pom +5a91ef99dc827e77c8dae1481bd5a92a0ce877304f2b25151ba4e0834e8a917d /org/eclipse/jdt/org.eclipse.jdt.core/3.10.0.v20131029-1755/org.eclipse.jdt.core-3.10.0.v20131029-1755.jar +5591ec1f9826a0506b33cb2a7bceceaf4058f667c0d5e8fd1a348c36540d9dcb /org/eclipse/jdt/org.eclipse.jdt.core/3.10.0.v20131029-1755/org.eclipse.jdt.core-3.10.0.v20131029-1755.pom 2082ffb0bb8f276ca164a6363e394f902163a81b7df44ede13aed33d84fdf27e /org/eclipse/jdt/org.eclipse.jdt.core/3.12.0.v20160315-2126/org.eclipse.jdt.core-3.12.0.v20160315-2126.jar ec467beffac7ffa86b5687a0935b8d3540e8795c9bc0c0d326a1c24cb9be7fe8 /org/eclipse/jdt/org.eclipse.jdt.core/3.12.0.v20160315-2126/org.eclipse.jdt.core-3.12.0.v20160315-2126.pom d6aba7a1569952e082630de6907f460f476c20d97032cb9f7e4f3e14ddb928e7 /org/eclipse/jetty/jetty-parent/14/jetty-parent-14.pom +cf65a484e0626d6b79cc40daa820459d893ba6945cbed119859be4db0a07c1fa /org/eclipse/jgit/org.eclipse.jgit/3.2.0.201312181205-r/org.eclipse.jgit-3.2.0.201312181205-r.jar +bfe5eb76e637e740e7769f6e081c1c2815f0272f76b93b9bad0b6e686f5a9030 /org/eclipse/jgit/org.eclipse.jgit/3.2.0.201312181205-r/org.eclipse.jgit-3.2.0.201312181205-r.pom +0a6f74d2b3a411b785e305ae9678cac377aa2352815a085e4b980d5ba4323f29 /org/eclipse/jgit/org.eclipse.jgit-parent/3.2.0.201312181205-r/org.eclipse.jgit-parent-3.2.0.201312181205-r.pom fa1d59411d4d2667d8f15638af7c0ac44539234c0982c27a2b65ba06c32a0b3e /org/eclipse/osgi/3.10.0-v20140606-1445/osgi-3.10.0-v20140606-1445.jar 1e10819cdb1fe55d44ac94d37f3b1030275199979a73d04b7b53e2d6000d5d2e /org/eclipse/osgi/3.10.0-v20140606-1445/osgi-3.10.0-v20140606-1445.pom bddf4d130cb65fdfc1df7df1febde313fc2ff1ac83c8574ff97befd6c515cc30 /org/eclipse/osgi/3.9.1-v20130814-1242/osgi-3.9.1-v20130814-1242.pom @@ -648,8 +680,11 @@ cd1a673205be12880e73c9c11234d809a901c024a256f4f4c7ae59b0a7aecc75 /org/scala-lang abe89207b0bfcbcf164c820cbba2c962ab5e9f3a0d0f37d81bde4f6c293a874b /org/scala-lang/scala-compiler/2.11.1/scala-compiler-2.11.1.pom 088bcb80f71b6e6a2a31d2fe7288c1fd64f19663ce281b924cdfab3fb105f4f3 /org/scala-lang/scala-library/2.11.1/scala-library-2.11.1.jar 3268a48dc36c664e7f4bd5d88b366bf098a13f7b6e8b87611e3a4413b72860d4 /org/scala-lang/scala-library/2.11.1/scala-library-2.11.1.pom +19495ce701fd9ba3c499c137e3ad5364acee8f87a01ef99e912f995a23fd4cb1 /org/scala-lang/scala-parser-combinators_2.11/1.0.1/scala-parser-combinators_2.11-1.0.1.jar 41938d1e89670979dd783102777a8b879999f4fb00a5b811b51c105b02a9d4f8 /org/scala-lang/scala-reflect/2.11.1/scala-reflect-2.11.1.jar 8b58df7e9e5f2f4f7d2f0dc24353f356abe965337e48504cec36a344e6294757 /org/scala-lang/scala-reflect/2.11.1/scala-reflect-2.11.1.pom +4a7c757d4d87dd37382bd777ad611b5875748aef148277cf25bb39eebb496d07 /org/scala-lang/scala-swing_2.11/1.0.1/scala-swing_2.11-1.0.1.jar +6c3338a4062c13dc2ce61630d9854d361a81656a4050e5080302f500dd4a8832 /org/scala-lang/scala-xml_2.11/1.0.2/scala-xml_2.11-1.0.2.jar 69980c038ca1b131926561591617d9c25fabfc7b29828af91597ca8570cf35fe /org/slf4j/slf4j-api/1.7.7/slf4j-api-1.7.7.jar 353904a7a6c28304d0dcac80fad30c48cd898f6db03b93f05ad6c90dd42d98ad /org/slf4j/slf4j-api/1.7.7/slf4j-api-1.7.7.pom 1dffae3ce768d0547e261c96898cf5d9d194bffd5600f597c9751cc6a73d33d4 /org/slf4j/slf4j-parent/1.7.7/slf4j-parent-1.7.7.pom @@ -668,6 +703,7 @@ c14fb9c32b59cc03251f609416db7c0cff01f811edcccb4f6a865d6e7046bd0b /org/sonatype/f e56188aa8ce51278006aa90bc7e0f304a81e2f1219f462e7d21f262535cd2795 /org/sonatype/forge/forge-parent/5/forge-parent-5.pom 9c5f7cd5226ac8c3798cb1f800c031f7dedc1606dc50dc29567877c8224459a7 /org/sonatype/forge/forge-parent/6/forge-parent-6.pom 1678d4120a585d8a630131aeec4c524d928398583b7eab616ee7d5a87f520d3d /org/sonatype/oss/oss-parent/5/oss-parent-5.pom +b4306d13e8f5392458a1b30866f1cff161b3d2e6999a88d059eea3932c8a8499 /org/sonatype/oss/oss-parent/6/oss-parent-6.pom b51f8867c92b6a722499557fc3a1fdea77bdf9ef574722fe90ce436a29559454 /org/sonatype/oss/oss-parent/7/oss-parent-7.pom fb40265f982548212ff82e362e59732b2187ec6f0d80182885c14ef1f982827a /org/sonatype/oss/oss-parent/9/oss-parent-9.pom 5a15fdba22669e0fdd06e10dcce6320879e1f7398fbc910cd0677b50672a78c4 /org/sonatype/plexus/plexus-cipher/1.4/plexus-cipher-1.4.jar @@ -712,11 +748,17 @@ d1968436fc216c901fb9b82c7e878b50fd1d30091676da95b2edd3a9c0ccf92e /stax/stax-api/ 87b13ae136a2bb9299271a0dfe8c351f76661b654ed8fde035c2cabb198cf259 /stax/stax-api/1.0.1/stax-api-1.0.1.pom ad68a86cfd0255a2bc0525ce11ec49640caea7e34ff91eb89c3193dcccd77f05 /trove/trove/1.0.2/trove-1.0.2.jar 83f2682bd3ded1fe417b7e98e7ac86510cd747378eae7e3a5d1d35c7c7f0d2ea /trove/trove/1.0.2/trove-1.0.2.pom +f921abc9c792f594f7fc6fc06b4a7ea330b646ea5ed3785e3589f90b16b2aad1 /tv/twitch/twitch/5.16/twitch-5.16.jar +53926731bc48ebe3e0624f551aadf8fd7b2b2da22e47271fc7db67fa6679c871 /tv/twitch/twitch/5.16/twitch-5.16.pom 3b90f9f7ad968b9588482e3a09b6e7d0d81c6cf7c214c5cecd8120e3ee509ae9 /tv/twitch/twitch/6.5/twitch-6.5.jar 56820ae80518871ff0af04dbfa54e311f6fa54de922d201f71bd2d3f210e94ba /tv/twitch/twitch/6.5/twitch-6.5.pom 0825d6081eef7e57434cd15525d6c1e7bc5d590e08eaea5b7516820031978af9 /tv/twitch/twitch-external-platform/4.5/twitch-external-platform-4.5-natives-windows-32.jar 6428eb438f53afc563d58c7f2a563ca9fcaae80db3520af744de5e5db1c9df6a /tv/twitch/twitch-external-platform/4.5/twitch-external-platform-4.5-natives-windows-64.jar 5ac03ac36144e4aeeb57b8ccc968b1ed75ae4b9ed4b094f47cb2b7b64c23a67d /tv/twitch/twitch-external-platform/4.5/twitch-external-platform-4.5.pom +8e91fe7ea60f5b584c9d4e3746e89b69c9bbcd868e015813530ecf12b3d25aeb /tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-osx.jar +0e3854b1bfada06203eef47010ee80193054ef34192cd8cd5d705edb8b3b46a1 /tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-windows-32.jar +e4857d9ede9e94a75642cfbd4f9ca45981c76de49842716bea7e4081c2ba3245 /tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-windows-64.jar +90f52e42d4597f78250cad82ca28df2d2443298c97a9e88cf0a88c0b3ac13ff2 /tv/twitch/twitch-platform/5.16/twitch-platform-5.16.pom 4005b7d20bc7e8c37cb0fd94bb7c44b5a6373846f3cb59e7a0095f6ebdf3e4f3 /tv/twitch/twitch-platform/6.5/twitch-platform-6.5-natives-osx.jar 8315b4943f4e1356c34b213d4f309784d5e36cbded1fb37c49efcc7d22c909cb /tv/twitch/twitch-platform/6.5/twitch-platform-6.5-natives-windows-32.jar 75337e7362e489a6f8c9712aeced9e131e82a3ce851cafbd4d03fda284cc7116 /tv/twitch/twitch-platform/6.5/twitch-platform-6.5-natives-windows-64.jar diff --git a/gradle/reprod/init.gradle b/gradle/reprod/init.gradle index a8adf366..96807ace 100644 --- a/gradle/reprod/init.gradle +++ b/gradle/reprod/init.gradle @@ -26,11 +26,23 @@ def setupDependencySubstitution = { Configuration configuration -> // FG 2.1 works for MC 1.8 as well, as long as only CI builds are performed (fails when applying source patches) dep.useTarget 'net.minecraftforge.gradle:ForgeGradle:2.1-SNAPSHOT' } - if (req.group == 'de.oceanlabs.mcp' && req.name == 'mcinjector' && req.version == '3.4-SNAPSHOT') { - dep.useTarget 'com.github.ModCoderPack:MCInjector:7258466' + if (req.group == 'de.oceanlabs.mcp' && req.name == 'mcinjector') { + switch (req.version) { + case '3.2-SNAPSHOT': + dep.useTarget 'com.github.ModCoderPack:MCInjector:05aa80e' + break + case '3.4-SNAPSHOT': + dep.useTarget 'com.github.ModCoderPack:MCInjector:7258466' + break + } } if (req.group == 'net.minecraftforge.srg2source' && req.name == 'Srg2Source') { switch (req.version) { + case '3.2-SNAPSHOT': + /* Fails to build on jitpack because of broken javadocs + dep.useTarget 'com.github.MinecraftForge:Srg2Source:95b5927' + */ + break case '3.3-SNAPSHOT': // Note: 3.3-SNAPSHOT is actually 5f11e29 but that doesn't build due to broken javadoc dep.useTarget 'com.github.MinecraftForge:Srg2Source:dcad1a6' @@ -95,11 +107,19 @@ allprojects { configurations.all setupDependencySubstitution project.tasks.all { task -> - if (task.name == 'reobfJar') { + if (task.name == 'reobfJar' && task.metaClass.respondsTo(task, 'getJar')) { task.doLast { println 'Manually repacking archive after reobfJar task' project.plugins.findPlugin(de.johni0702.gradle.ReproducibleBuildsPlugin.class).stripJar(task.getJar()) } } + if (task.name == 'reobf') { + task.doLast { + println 'Manually repacking archive(s) after reobf task' + task.outputs.files.each { file -> + project.plugins.findPlugin(de.johni0702.gradle.ReproducibleBuildsPlugin.class).stripJar(file) + } + } + } } } diff --git a/gradle/reprod/patches/forgegradle-1.2/0001-Fix-build-for-newer-gradle-versions.patch b/gradle/reprod/patches/forgegradle-1.2/0001-Fix-build-for-newer-gradle-versions.patch new file mode 100644 index 00000000..f52c1962 --- /dev/null +++ b/gradle/reprod/patches/forgegradle-1.2/0001-Fix-build-for-newer-gradle-versions.patch @@ -0,0 +1,22 @@ +From bf77ac2f526b90bd0c04a2aca7e8d9a1bc90d014 Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Thu, 8 Mar 2018 17:17:32 +0100 +Subject: [PATCH] Fix build for newer gradle versions + + +diff --git a/build.gradle b/build.gradle +index 5e61544..737ce9e 100644 +--- a/build.gradle ++++ b/build.gradle +@@ -114,7 +114,7 @@ artifacts { + } + + //These should add a compile time only dependancies to eclipse, ide, and javac, but NOT to the generated POM on maven. +-sourceSets.main.compileClasspath += [ configurations.compileOnly ] ++sourceSets.main.compileClasspath += configurations.compileOnly + idea.module.scopes.PROVIDED.plus += [ configurations.compileOnly ] + eclipse.classpath.plusConfigurations += [ configurations.compileOnly ] + +-- +2.13.6 + diff --git a/gradle/reprod/patches/forgegradle-1.2/0002-Fix-compilation-with-ECJ.patch b/gradle/reprod/patches/forgegradle-1.2/0002-Fix-compilation-with-ECJ.patch new file mode 100644 index 00000000..881ee360 --- /dev/null +++ b/gradle/reprod/patches/forgegradle-1.2/0002-Fix-compilation-with-ECJ.patch @@ -0,0 +1,22 @@ +From f9056380f0e5955817df282c2ac1c8e60c9fedc2 Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Thu, 8 Mar 2018 17:21:53 +0100 +Subject: [PATCH] Fix compilation with ECJ + + +diff --git a/build.gradle b/build.gradle +index 737ce9e..75c2b62 100644 +--- a/build.gradle ++++ b/build.gradle +@@ -90,7 +90,7 @@ dependencies { + + compileJava { + options.deprecation = true +- options.compilerArgs += ["-Werror"] ++ //options.compilerArgs += ["-Werror"] + //options.compilerArgs += ["-Werror", "-Xlint:unchecked"] + } + +-- +2.13.6 + diff --git a/gradle/reprod/patches/forgegradle-1.2/0003-Fix-compilation-for-Gradle-3.patch b/gradle/reprod/patches/forgegradle-1.2/0003-Fix-compilation-for-Gradle-3.patch new file mode 100644 index 00000000..2ac1ca22 --- /dev/null +++ b/gradle/reprod/patches/forgegradle-1.2/0003-Fix-compilation-for-Gradle-3.patch @@ -0,0 +1,318 @@ +From 76ef837020b1d7aa826a01bd2d3a8cdc0704a040 Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Thu, 8 Mar 2018 17:31:19 +0100 +Subject: [PATCH] Fix compilation for Gradle 3 + + +diff --git a/src/main/java/net/minecraftforge/gradle/ZipFileTree.java b/src/main/java/net/minecraftforge/gradle/ZipFileTree.java +deleted file mode 100644 +index c3ab7e3..0000000 +--- a/src/main/java/net/minecraftforge/gradle/ZipFileTree.java ++++ /dev/null +@@ -1,267 +0,0 @@ +-/* +- * Copyright 2010 the original author or authors. +- * +- * Licensed under the Apache License, Version 2.0 (the "License"); +- * you may not use this file except in compliance with the License. +- * You may obtain a copy of the License at +- * +- * http://www.apache.org/licenses/LICENSE-2.0 +- * +- * Unless required by applicable law or agreed to in writing, software +- * distributed under the License is distributed on an "AS IS" BASIS, +- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +- * See the License for the specific language governing permissions and +- * limitations under the License. +- */ +-// Modified by LexManos 10/23/2013 to remove FileSystemMirroringFileTree +-package net.minecraftforge.gradle; +- +-import java.io.File; +-import java.io.FileOutputStream; +-import java.io.IOException; +-import java.io.InputStream; +-import java.io.OutputStream; +-import java.util.Enumeration; +-import java.util.Iterator; +-import java.util.Map; +-import java.util.TreeMap; +-import java.util.concurrent.atomic.AtomicBoolean; +-import java.util.zip.ZipEntry; +-import java.util.zip.ZipFile; +- +-import org.apache.commons.io.IOUtils; +-import org.gradle.api.GradleException; +-import org.gradle.api.InvalidUserDataException; +-import org.gradle.api.UncheckedIOException; +-import org.gradle.api.file.FileVisitDetails; +-import org.gradle.api.file.FileVisitor; +-import org.gradle.api.file.RelativePath; +-import org.gradle.api.internal.file.collections.MinimalFileTree; +-import org.gradle.util.DeprecationLogger; +-import org.gradle.util.GFileUtils; +- +-public class ZipFileTree implements MinimalFileTree +-{ +- private final File zipFile; +- +- public ZipFileTree(File zipFile) +- { +- this.zipFile = zipFile; +- } +- +- public String getDisplayName() +- { +- return String.format("ZIP '%s'", zipFile); +- } +- +- public void visit(FileVisitor visitor) +- { +- if (!zipFile.exists()) +- { +- DeprecationLogger.nagUserOfDeprecatedBehaviour( +- String.format("The specified zip file %s does not exist and will be silently ignored", getDisplayName()) +- ); +- return; +- } +- if (!zipFile.isFile()) +- { +- throw new InvalidUserDataException(String.format("Cannot expand %s as it is not a file.", getDisplayName())); +- } +- +- AtomicBoolean stopFlag = new AtomicBoolean(); +- +- try +- { +- ZipFile zip = new ZipFile(zipFile); +- try +- { +- // The iteration order of zip.getEntries() is based on the hash of the zip entry. This isn't much use +- // to us. So, collect the entries in a map and iterate over them in alphabetical order. +- Map entriesByName = new TreeMap(); +- Enumeration entries = zip.entries(); +- while (entries.hasMoreElements()) +- { +- ZipEntry entry = (ZipEntry) entries.nextElement(); +- entriesByName.put(entry.getName(), entry); +- } +- Iterator sortedEntries = entriesByName.values().iterator(); +- while (!stopFlag.get() && sortedEntries.hasNext()) +- { +- ZipEntry entry = sortedEntries.next(); +- if (entry.isDirectory()) +- { +- visitor.visitDir(new DetailsImpl(entry, zip, stopFlag)); +- } +- else +- { +- visitor.visitFile(new DetailsImpl(entry, zip, stopFlag)); +- } +- } +- } +- finally +- { +- zip.close(); +- } +- } +- catch (Exception e) +- { +- throw new GradleException(String.format("Could not expand %s.", getDisplayName()), e); +- } +- } +- +- private class DetailsImpl implements FileVisitDetails +- { +- private final ZipEntry entry; +- private final ZipFile zip; +- private final AtomicBoolean stopFlag; +- private File file; +- +- public DetailsImpl(ZipEntry entry, ZipFile zip, AtomicBoolean stopFlag) +- { +- this.entry = entry; +- this.zip = zip; +- this.stopFlag = stopFlag; +- } +- +- public String getDisplayName() +- { +- return String.format("zip entry %s!%s", zipFile, entry.getName()); +- } +- +- public void stopVisiting() +- { +- stopFlag.set(true); +- } +- +- /** +- * Changed this to return a broken value! Be warned! Will not be a valid file, do not read it. +- * Standard Jar/Zip tasks don't care about this, even though they call it. +- */ +- public File getFile() +- { +- if (file == null) +- { +- file = new File(entry.getName()); +- //copyTo(file); +- } +- return file; +- } +- +- public long getLastModified() +- { +- return entry.getTime(); +- } +- +- public boolean isDirectory() +- { +- return entry.isDirectory(); +- } +- +- public long getSize() +- { +- return entry.getSize(); +- } +- +- public InputStream open() +- { +- try +- { +- return zip.getInputStream(entry); +- } +- catch (IOException e) +- { +- throw new UncheckedIOException(e); +- } +- } +- +- public RelativePath getRelativePath() +- { +- return new RelativePath(!entry.isDirectory(), entry.getName().split("/")); +- } +- +- // Stuff below this line was -------------------------------------------------- +- // Stolen from Gradle's org.gradle.api.internal.file.AbstractFileTreeElement +- +- public String toString() +- { +- return getDisplayName(); +- } +- +- public String getName() +- { +- return getRelativePath().getLastName(); +- } +- +- public String getPath() +- { +- return getRelativePath().getPathString(); +- } +- +- public void copyTo(OutputStream outstr) +- { +- try +- { +- InputStream inputStream = open(); +- try +- { +- IOUtils.copyLarge(inputStream, outstr); +- } +- finally +- { +- inputStream.close(); +- } +- } +- catch (IOException e) +- { +- throw new UncheckedIOException(e); +- } +- } +- +- public boolean copyTo(File target) +- { +- validateTimeStamps(); +- try +- { +- if (isDirectory()) +- { +- GFileUtils.mkdirs(target); +- } +- else +- { +- GFileUtils.mkdirs(target.getParentFile()); +- copyFile(target); +- } +- return true; +- } +- catch (Exception e) +- { +- throw new GradleException(String.format("Could not copy %s to '%s'.", new Object[] { getDisplayName(), target }), e); +- } +- } +- +- private void validateTimeStamps() +- { +- long lastModified = getLastModified(); +- if (lastModified < 0L) +- throw new GradleException(String.format("Invalid Timestamp %s for '%s'.", new Object[] { Long.valueOf(lastModified), getDisplayName() })); +- } +- +- private void copyFile(File target) throws IOException +- { +- FileOutputStream outputStream = new FileOutputStream(target); +- try +- { +- copyTo(outputStream); +- } +- finally +- { +- outputStream.close(); +- } +- } +- +- public int getMode() +- { +- return ((isDirectory()) ? 493 : 420); +- } +- } +-} +diff --git a/src/main/java/net/minecraftforge/gradle/delayed/DelayedFileTree.java b/src/main/java/net/minecraftforge/gradle/delayed/DelayedFileTree.java +index 5ecccae..aeed0a3 100644 +--- a/src/main/java/net/minecraftforge/gradle/delayed/DelayedFileTree.java ++++ b/src/main/java/net/minecraftforge/gradle/delayed/DelayedFileTree.java +@@ -1,10 +1,7 @@ + package net.minecraftforge.gradle.delayed; + +-import net.minecraftforge.gradle.ZipFileTree; +- + import org.gradle.api.Project; + import org.gradle.api.file.FileTree; +-import org.gradle.api.internal.file.collections.FileTreeAdapter; + + @SuppressWarnings("serial") + public class DelayedFileTree extends DelayedBase +@@ -40,7 +37,7 @@ public class DelayedFileTree extends DelayedBase + { + if (zipTree) + //resolved = project.zipTree(DelayedString.resolve(pattern, project, resolvers)); +- return new FileTreeAdapter(new ZipFileTree(project.file(DelayedBase.resolve(pattern, project, resolvers)))); ++ return project.zipTree(DelayedBase.resolve(pattern, project, resolvers)); + else + return project.fileTree(DelayedBase.resolve(pattern, project, resolvers)); + } +diff --git a/src/main/java/net/minecraftforge/gradle/user/UserBasePlugin.java b/src/main/java/net/minecraftforge/gradle/user/UserBasePlugin.java +index adbaa27..4d39d52 100644 +--- a/src/main/java/net/minecraftforge/gradle/user/UserBasePlugin.java ++++ b/src/main/java/net/minecraftforge/gradle/user/UserBasePlugin.java +@@ -1129,7 +1129,6 @@ public abstract class UserBasePlugin extends BasePlugin + @Override + public void execute(Object arg0) + { +- ((ScalaCompile) arg0).getScalaCompileOptions().setUseAnt(false); + } + }); + } +-- +2.13.6 + diff --git a/gradle/reprod/patches/forgegradle-1.2/0004-Remove-redundant-sourcepath-compiler-argument.patch b/gradle/reprod/patches/forgegradle-1.2/0004-Remove-redundant-sourcepath-compiler-argument.patch new file mode 100644 index 00000000..142abdab --- /dev/null +++ b/gradle/reprod/patches/forgegradle-1.2/0004-Remove-redundant-sourcepath-compiler-argument.patch @@ -0,0 +1,31 @@ +From 58e8ce507b599b45479aa0d6d823a4e285aecb58 Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Thu, 8 Mar 2018 19:38:05 +0100 +Subject: [PATCH] Remove redundant -sourcepath compiler argument + + +diff --git a/src/main/java/net/minecraftforge/gradle/user/UserBasePlugin.java b/src/main/java/net/minecraftforge/gradle/user/UserBasePlugin.java +index 4d39d52..f2995e9 100644 +--- a/src/main/java/net/minecraftforge/gradle/user/UserBasePlugin.java ++++ b/src/main/java/net/minecraftforge/gradle/user/UserBasePlugin.java +@@ -354,17 +354,6 @@ public abstract class UserBasePlugin extends BasePlugin + + project.getConfigurations().getByName("apiCompile").extendsFrom(project.getConfigurations().getByName("compile")); + project.getConfigurations().getByName("testCompile").extendsFrom(project.getConfigurations().getByName("apiCompile")); +- +- // set compile not to take from libs +- JavaCompile compileTask = ((JavaCompile)project.getTasks().getByName(main.getCompileJavaTaskName())); +- List args = compileTask.getOptions().getCompilerArgs(); +- if (args == null || args.isEmpty()) +- { +- args = Lists.newArrayList(); +- } +- args.add("-sourcepath"); +- args.add("."); +- compileTask.getOptions().setCompilerArgs(args); + } + + private void readAndApplyJson(File file, String depConfig, String nativeConfig, Logger log) +-- +2.13.6 + diff --git a/gradle/reprod/settings.gradle b/gradle/reprod/settings.gradle index b5ed088c..0480c59d 100644 --- a/gradle/reprod/settings.gradle +++ b/gradle/reprod/settings.gradle @@ -1,5 +1,7 @@ include 'mixin' include 'forgeflower' +include 'srg2source-3.2' +include 'forgegradle-1.2' include 'forgegradle-2.1' include 'forgegradle-2.2' include 'forgegradle-2.3' diff --git a/gradle/reprod/upstream/forgegradle-1.2 b/gradle/reprod/upstream/forgegradle-1.2 new file mode 160000 index 00000000..ef378b1e --- /dev/null +++ b/gradle/reprod/upstream/forgegradle-1.2 @@ -0,0 +1 @@ +Subproject commit ef378b1e84f1f10b4bd55cc739f2260b1992d54b diff --git a/gradle/reprod/upstream/srg2source-3.2 b/gradle/reprod/upstream/srg2source-3.2 new file mode 160000 index 00000000..95b5927e --- /dev/null +++ b/gradle/reprod/upstream/srg2source-3.2 @@ -0,0 +1 @@ +Subproject commit 95b5927e6b6aadfc5e981db6ae5a72fc500e42fc From 75a14a7488f8e88b9ff46f62599f20b424ef4f68 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Fri, 16 Mar 2018 16:18:03 +0100 Subject: [PATCH 14/30] Catch _all_ errors during recording setup --- .../com/replaymod/recording/handler/ConnectionEventHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java b/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java index caf966c2..1daef60b 100755 --- a/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java +++ b/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java @@ -110,7 +110,7 @@ public class ConnectionEventHandler { guiOverlay.register(); core.printInfoToChat("replaymod.chat.recordingstarted"); - } catch(Exception e) { + } catch (Throwable e) { e.printStackTrace(); core.printWarningToChat("replaymod.chat.recordingfailed"); } From 0b262d1a7483d898e5da417cd3190f9975253234 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Fri, 16 Mar 2018 16:18:41 +0100 Subject: [PATCH 15/30] [1.7.10] Fix reobf task missing fields due to incorrect classpath The reobf task was not handling certain fields because it was missing the respective classes on its classpath because we removed MC&deps from the compile configuration. --- versions/common.gradle | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/versions/common.gradle b/versions/common.gradle index 1ff1aec0..1b4da904 100644 --- a/versions/common.gradle +++ b/versions/common.gradle @@ -164,6 +164,11 @@ if (mcVersion <= 10710) { 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 + } } } From 63b2f3abcc0c143a3b1dcf050fc8d1a3f3396e4a Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Fri, 16 Mar 2018 16:51:48 +0100 Subject: [PATCH 16/30] Add transformer exclusion for transformers and fix transforming of null classes --- src/main/java/com/replaymod/core/LoadingPlugin.java | 3 +++ .../com/replaymod/core/{ => asm}/GLErrorTransformer.java | 5 ++--- .../replaymod/core/{ => asm}/GLStateTrackerTransformer.java | 5 ++--- 3 files changed, 7 insertions(+), 6 deletions(-) rename src/main/java/com/replaymod/core/{ => asm}/GLErrorTransformer.java (96%) rename src/main/java/com/replaymod/core/{ => asm}/GLStateTrackerTransformer.java (96%) diff --git a/src/main/java/com/replaymod/core/LoadingPlugin.java b/src/main/java/com/replaymod/core/LoadingPlugin.java index a15b9c96..b2a9e0ac 100755 --- a/src/main/java/com/replaymod/core/LoadingPlugin.java +++ b/src/main/java/com/replaymod/core/LoadingPlugin.java @@ -8,6 +8,8 @@ import org.spongepowered.asm.mixin.Mixins; import net.minecraftforge.fml.relauncher.CoreModManager; import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin; //#else +//$$ import com.replaymod.core.asm.GLErrorTransformer; +//$$ import com.replaymod.core.asm.GLStateTrackerTransformer; //$$ import cpw.mods.fml.relauncher.CoreModManager; //$$ import cpw.mods.fml.relauncher.IFMLLoadingPlugin; //$$ @@ -21,6 +23,7 @@ import java.net.URL; import java.security.CodeSource; import java.util.Map; +@IFMLLoadingPlugin.TransformerExclusions("com.replaymod.core.asm.") public class LoadingPlugin implements IFMLLoadingPlugin { public LoadingPlugin() { diff --git a/src/main/java/com/replaymod/core/GLErrorTransformer.java b/src/main/java/com/replaymod/core/asm/GLErrorTransformer.java similarity index 96% rename from src/main/java/com/replaymod/core/GLErrorTransformer.java rename to src/main/java/com/replaymod/core/asm/GLErrorTransformer.java index 91dc3c46..dac9dde9 100644 --- a/src/main/java/com/replaymod/core/GLErrorTransformer.java +++ b/src/main/java/com/replaymod/core/asm/GLErrorTransformer.java @@ -1,5 +1,5 @@ //#if MC<=10710 -//$$ package com.replaymod.core; +//$$ package com.replaymod.core.asm; //$$ //$$ import net.minecraft.launchwrapper.IClassTransformer; //$$ import org.lwjgl.opengl.GL11; @@ -25,8 +25,7 @@ //$$ //$$ @Override //$$ public byte[] transform(String name, String transformedName, byte[] basicClass) { -//$$ // Ignore (anonymous) inner classes of this transformer -//$$ if (name.startsWith(GLErrorTransformer_CLASS)) return basicClass; +//$$ if (basicClass == null) return null; //$$ //$$ ClassReader reader = new ClassReader(basicClass); //$$ ClassWriter writer = new ClassWriter(reader, 0); diff --git a/src/main/java/com/replaymod/core/GLStateTrackerTransformer.java b/src/main/java/com/replaymod/core/asm/GLStateTrackerTransformer.java similarity index 96% rename from src/main/java/com/replaymod/core/GLStateTrackerTransformer.java rename to src/main/java/com/replaymod/core/asm/GLStateTrackerTransformer.java index 47910f13..26129095 100644 --- a/src/main/java/com/replaymod/core/GLStateTrackerTransformer.java +++ b/src/main/java/com/replaymod/core/asm/GLStateTrackerTransformer.java @@ -1,5 +1,5 @@ //#if MC<=10710 -//$$ package com.replaymod.core; +//$$ package com.replaymod.core.asm; //$$ //$$ import net.minecraft.launchwrapper.IClassTransformer; //$$ import org.objectweb.asm.ClassReader; @@ -26,8 +26,7 @@ //$$ //$$ @Override //$$ public byte[] transform(String name, String transformedName, byte[] basicClass) { -//$$ // Ignore (anonymous) inner classes of this transformer -//$$ if (name.startsWith(GLStateTrackerTransformer.class.getName())) return basicClass; +//$$ if (basicClass == null) return null; //$$ // Ignore the state tracker itself //$$ if (name.equals(GLStateTracker_CLASS)) return basicClass; //$$ From 9631f1cf5fc24da63e75d9d50a8c963bec9f9baa Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Fri, 16 Mar 2018 16:53:11 +0100 Subject: [PATCH 17/30] [1.7.10] Fix recording player y position --- .../handler/RecordingEventHandler.java | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java b/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java index 1a9c0ef0..2a44af9e 100755 --- a/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java +++ b/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java @@ -94,6 +94,7 @@ public class RecordingEventHandler { //#else //$$ packetListener.save(new S0CPacketSpawnPlayer(player(mc))); //#endif + lastX = lastY = lastZ = null; } catch(Exception e) { e.printStackTrace(); } @@ -124,17 +125,12 @@ public class RecordingEventHandler { public void onPlayerTick(PlayerTickEvent e) { try { if(e.player != player(mc)) return; - //#if MC>=10800 - double playerY = e.player.posY; - //#else - //$$ double playerY = e.player.boundingBox.minY; // TODO do we need this? if so, also in teleport below? - //#endif boolean force = false; if(lastX == null || lastY == null || lastZ == null) { force = true; lastX = e.player.posX; - lastY = playerY; + lastY = e.player.posY; lastZ = e.player.posZ; } @@ -145,11 +141,11 @@ public class RecordingEventHandler { } double dx = e.player.posX - lastX; - double dy = playerY - lastY; + double dy = e.player.posY - lastY; double dz = e.player.posZ - lastZ; lastX = e.player.posX; - lastY = playerY; + lastY = e.player.posY; lastZ = e.player.posZ; Packet packet; @@ -157,7 +153,18 @@ public class RecordingEventHandler { //#if MC>=10904 packet = new SPacketEntityTeleport(e.player); //#else + //#if MC>=10800 //$$ packet = new S18PacketEntityTeleport(e.player); + //#else + //$$ // In 1.7.10 the client player entity has its posY at eye height + //$$ // but for all other entities it's at their feet (as it should be). + //$$ // So, to correctly position the player, we teleport them to their feet (i.a. directly after spawn). + //$$ // Note: this leaves the lastY value offset by the eye height but because it's only used for relative + //$$ // movement, that doesn't matter. + //$$ S18PacketEntityTeleport teleportPacket = new S18PacketEntityTeleport(e.player); + //$$ teleportPacket.field_149457_c = floor(e.player.boundingBox.minY * 32); + //$$ packet = teleportPacket; + //#endif //#endif } else { byte newYaw = (byte) ((int) (e.player.rotationYaw * 256.0F / 360.0F)); From 8b044b344a1f4b60663c588303db592425c6b890 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Fri, 16 Mar 2018 16:59:15 +0100 Subject: [PATCH 18/30] [1.7.10] Remove unnecessary pre-MixinGradle configuring in common.gradle --- versions/common.gradle | 5 ----- 1 file changed, 5 deletions(-) diff --git a/versions/common.gradle b/versions/common.gradle index 1b4da904..e83147cf 100644 --- a/versions/common.gradle +++ b/versions/common.gradle @@ -47,10 +47,6 @@ if (mcVersion >= 10800) { apply plugin: 'forge' ext { - // FIXME needed? - mixinConfigs = [ - 'compat.shaders', 'extras.playeroverview', 'recording', 'render', 'replay' - ].collect {"mixins.${it}.replaymod.json"} mixinSrg = new File(project.buildDir, 'tmp/mixins/mixins.srg') mixinRefMap = new File(project.buildDir, 'tmp/mixins/mixins.replaymod.refmap.json') } @@ -289,7 +285,6 @@ jar { attributes 'TweakClass': 'org.spongepowered.asm.launch.MixinTweaker', 'TweakOrder': '0', 'FMLCorePluginContainsFMLMod': 'true', - // FIXME is this needed? 'MixinConfigs': project.mixinConfigs.join(','), 'FMLCorePlugin': 'com.replaymod.core.LoadingPlugin', 'FMLAT': 'replaymod_at.cfg' } From 65e3d45c9bb5ed24474cc77a765be55b2b0fda22 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Fri, 16 Mar 2018 17:34:24 +0100 Subject: [PATCH 19/30] Switch submodules from ssh to https --- .gitmodules | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index 8881f4da..db61d60f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -22,8 +22,8 @@ url = https://github.com/SpongePowered/Mixin.git [submodule "gradle/reprod/upstream/forgegradle-1.2"] path = gradle/reprod/upstream/forgegradle-1.2 - url = git@github.com:MinecraftForge/ForgeGradle.git + url = https://github.com/MinecraftForge/ForgeGradle.git branch = FG_1.2 [submodule "gradle/reprod/upstream/srg2source-3.2"] path = gradle/reprod/upstream/srg2source-3.2 - url = git@github.com:MinecraftForge/Srg2Source.git + url = https://github.com/MinecraftForge/Srg2Source.git From feb39f02ecb33e676efa4db398f50b1695bfa05f Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Thu, 22 Mar 2018 14:49:36 +0100 Subject: [PATCH 20/30] Fix Optifine language data missing when localization extra is enabled (fixes #109) --- .../replaymod/compat/optifine/OptifineReflection.java | 11 +++++++++++ .../java/com/replaymod/extras/LocalizationExtra.java | 3 +++ 2 files changed, 14 insertions(+) diff --git a/src/main/java/com/replaymod/compat/optifine/OptifineReflection.java b/src/main/java/com/replaymod/compat/optifine/OptifineReflection.java index 49d54e44..07aab724 100644 --- a/src/main/java/com/replaymod/compat/optifine/OptifineReflection.java +++ b/src/main/java/com/replaymod/compat/optifine/OptifineReflection.java @@ -3,6 +3,7 @@ package com.replaymod.compat.optifine; import net.minecraft.client.settings.GameSettings; import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; public class OptifineReflection { @@ -24,4 +25,14 @@ public class OptifineReflection { } } + public static void reloadLang() { + try { + Class.forName("Lang").getDeclaredMethod("resourcesReloaded").invoke(null); + } catch (ClassNotFoundException ignore) { + // no optifine installed + } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { + e.printStackTrace(); + } + } + } diff --git a/src/main/java/com/replaymod/extras/LocalizationExtra.java b/src/main/java/com/replaymod/extras/LocalizationExtra.java index 1abd70ca..13f4d1d2 100644 --- a/src/main/java/com/replaymod/extras/LocalizationExtra.java +++ b/src/main/java/com/replaymod/extras/LocalizationExtra.java @@ -1,6 +1,7 @@ package com.replaymod.extras; import com.google.common.collect.ImmutableSet; +import com.replaymod.compat.optifine.OptifineReflection; import com.replaymod.core.ReplayMod; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.IResourcePack; @@ -66,6 +67,8 @@ public class LocalizationExtra implements Extra { List defaultResourcePacks = mc.defaultResourcePacks; defaultResourcePacks.add(new LocalizedResourcePack(languages)); mc.getLanguageManager().onResourceManagerReload(mc.getResourceManager()); + // Optifine does its own, additional language data loading + OptifineReflection.reloadLang(); LOGGER.debug("Added language files to resource packs and reloaded LanguageManager"); }); } catch (Throwable t) { From 3f00c1f977ff912375677c41cf1bc466d10370b3 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Thu, 22 Mar 2018 12:35:16 +0100 Subject: [PATCH 21/30] [1.7.10] Update ReplayStudio to fix custom entity types (fixes #117) --- gradle/reprod/checksums.txt | 36 ++++++++++++++++++------------------ versions/common.gradle | 2 +- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/gradle/reprod/checksums.txt b/gradle/reprod/checksums.txt index 789f3fa2..da1e255a 100644 --- a/gradle/reprod/checksums.txt +++ b/gradle/reprod/checksums.txt @@ -30,24 +30,24 @@ cddfc1a07301f2fa07a5e1b6897e455d397d6d5c547d45082c267a1ee2c75f70 /com/github/Mod 7191124b8491d36b9fc1eb1a4e0f8ef710a4b98e27dde92854c24d45457fd9d0 /com/github/ModCoderPack/MCInjector/05aa80e/MCInjector-05aa80e.pom ecf57aab63509ec0ce3937c2215bc3a2e3cb6357cd11095978db18bd3251731a /com/github/ModCoderPack/MCInjector/7258466/MCInjector-7258466.jar dc7ed1f4f0ddd8f5ce3b449db944907a5eb2855dbbbc59b08dad1247ebafba33 /com/github/ModCoderPack/MCInjector/7258466/MCInjector-7258466.pom -2a0317d30d61fb285cc53fa20e2e70f8415cd450bd7dd27316ede1958bd0026a /com/github/ReplayMod/ReplayStudio/1.10.2/464e18a/1.10.2-464e18a.jar -4d23573378855cb19ed826fbf64af7933176009968c346a0dc90db0aaf0b1085 /com/github/ReplayMod/ReplayStudio/1.10.2/464e18a/1.10.2-464e18a.pom -0c2fc451112aea29afea627c6f960c6c2d802bf9ce5171e13141d765cabd1bd3 /com/github/ReplayMod/ReplayStudio/1.11.2/464e18a/1.11.2-464e18a.jar -05897bc9d94d22c632d2f92acb61d3b5a4524bb2c87e084c843d48ec2859b5d0 /com/github/ReplayMod/ReplayStudio/1.11.2/464e18a/1.11.2-464e18a.pom -72a34922cd66c11c4828ea5a6a59a22c7e84704eba6d6569dcb7946c861c6150 /com/github/ReplayMod/ReplayStudio/1.11/464e18a/1.11-464e18a.jar -652eebb442f3735b6dd826f1dfc0b9b0a4a15cc5cbc8838829680593cd1d329c /com/github/ReplayMod/ReplayStudio/1.11/464e18a/1.11-464e18a.pom -09b16315282ff3d230473ef8c1ebc8ecbedecc9e1cfacc11a25c8cf33804df58 /com/github/ReplayMod/ReplayStudio/1.12.1/464e18a/1.12.1-464e18a.jar -1fce1aed0a6d8ec2d98963657affc067cb4e07c919dcb82b08c67567375da4fd /com/github/ReplayMod/ReplayStudio/1.12.1/464e18a/1.12.1-464e18a.pom -09f3bb46fcfe5717824ef98b1fe1ddd168dbaab9bb9733638b372eafdb38e8ea /com/github/ReplayMod/ReplayStudio/1.12.2/464e18a/1.12.2-464e18a.jar -8cfc8fadf77620baea61e9939466ec09c352628867562039fd3fb0d19077de7d /com/github/ReplayMod/ReplayStudio/1.12.2/464e18a/1.12.2-464e18a.pom -5a2768d35614ff979587e7cbfb1e47ee583d6abae5c37d987d092d937ddab1df /com/github/ReplayMod/ReplayStudio/1.12/464e18a/1.12-464e18a.jar -9a3839e479d182c36e0d1c50c5546f4ab2be874c0edf391b8c2da06f0f826b0d /com/github/ReplayMod/ReplayStudio/1.12/464e18a/1.12-464e18a.pom -4608a10f2be2d7d85b63497c0ef1b5c8b6240b219de72507a375349f4060a7c6 /com/github/ReplayMod/ReplayStudio/1.7.10/464e18a/1.7.10-464e18a.jar -932c417dead3f4fde2518ebd97bcb7911f5bdccc015bff8f8a02bbd0e0652150 /com/github/ReplayMod/ReplayStudio/1.7.10/464e18a/1.7.10-464e18a.pom -3e71190a4715c3b75c5cc0c370446ddcd140d0aed81f699a1bb8613d22828060 /com/github/ReplayMod/ReplayStudio/1.8/464e18a/1.8-464e18a.jar -25eec3876744c665225511ab1d6f786e2a763b18e99c29305cabed06187868e5 /com/github/ReplayMod/ReplayStudio/1.8/464e18a/1.8-464e18a.pom -12aab719873f618d2d9fecd39792b95391d33f2a63e59a6def4683603c941234 /com/github/ReplayMod/ReplayStudio/1.9.4/464e18a/1.9.4-464e18a.jar -02fff38653316815a7b0208959fa58d92ccd4ec9eef51b2c9d4b0d0383a72361 /com/github/ReplayMod/ReplayStudio/1.9.4/464e18a/1.9.4-464e18a.pom +2a0317d30d61fb285cc53fa20e2e70f8415cd450bd7dd27316ede1958bd0026a /com/github/ReplayMod/ReplayStudio/1.10.2/3328446/1.10.2-3328446.jar +138fe5069cefa345c1f2d7b5a863e9b4c40bd08fb6cb75743b7f8d804fab7a35 /com/github/ReplayMod/ReplayStudio/1.10.2/3328446/1.10.2-3328446.pom +0c2fc451112aea29afea627c6f960c6c2d802bf9ce5171e13141d765cabd1bd3 /com/github/ReplayMod/ReplayStudio/1.11.2/3328446/1.11.2-3328446.jar +54b66a2ed2312077b177f2e9c23250ff1b09d86d3b781fc1c6682e3958693783 /com/github/ReplayMod/ReplayStudio/1.11.2/3328446/1.11.2-3328446.pom +72a34922cd66c11c4828ea5a6a59a22c7e84704eba6d6569dcb7946c861c6150 /com/github/ReplayMod/ReplayStudio/1.11/3328446/1.11-3328446.jar +1ab36234360fe9f8b1c18a42a87affc36dc7b13dcd1af0f25db647272eccb4cd /com/github/ReplayMod/ReplayStudio/1.11/3328446/1.11-3328446.pom +09b16315282ff3d230473ef8c1ebc8ecbedecc9e1cfacc11a25c8cf33804df58 /com/github/ReplayMod/ReplayStudio/1.12.1/3328446/1.12.1-3328446.jar +3ada3bfb286bcb6436cb81992a099e9adc6850b694bfea0e58708bf61f88f3f5 /com/github/ReplayMod/ReplayStudio/1.12.1/3328446/1.12.1-3328446.pom +09f3bb46fcfe5717824ef98b1fe1ddd168dbaab9bb9733638b372eafdb38e8ea /com/github/ReplayMod/ReplayStudio/1.12.2/3328446/1.12.2-3328446.jar +2f88158c9e54501af126087c411087c68da91a3c59335bca4479f09364b46b64 /com/github/ReplayMod/ReplayStudio/1.12.2/3328446/1.12.2-3328446.pom +5a2768d35614ff979587e7cbfb1e47ee583d6abae5c37d987d092d937ddab1df /com/github/ReplayMod/ReplayStudio/1.12/3328446/1.12-3328446.jar +79bc6a0e171a13a458508f16488716f7a567dfdcaac115a64f8fb989c48dd672 /com/github/ReplayMod/ReplayStudio/1.12/3328446/1.12-3328446.pom +dacb755264170eec62dda2733462dcc68bd25d03122b7a88aa90078dade90c9e /com/github/ReplayMod/ReplayStudio/1.7.10/3328446/1.7.10-3328446.jar +b1cd5eeade89b9a23ea01c7d3399c97cacbc2b88b9f7f24a11783162c7e752b8 /com/github/ReplayMod/ReplayStudio/1.7.10/3328446/1.7.10-3328446.pom +3e71190a4715c3b75c5cc0c370446ddcd140d0aed81f699a1bb8613d22828060 /com/github/ReplayMod/ReplayStudio/1.8/3328446/1.8-3328446.jar +9481d14fdf1e1240e3e85d8d5d68838d89cbaae26a1c417a7d3947cacb5cbaba /com/github/ReplayMod/ReplayStudio/1.8/3328446/1.8-3328446.pom +12aab719873f618d2d9fecd39792b95391d33f2a63e59a6def4683603c941234 /com/github/ReplayMod/ReplayStudio/1.9.4/3328446/1.9.4-3328446.jar +f73130ca1e7714ad50b9c32871571fb9e8d44d387eaab0253152c3b3c25d5a30 /com/github/ReplayMod/ReplayStudio/1.9.4/3328446/1.9.4-3328446.pom bfdcda4cbf23f28392384818a1417c2d6df687e15ce77530ef96381393102f8a /com/github/SpongePowered/MixinGradle/dcfaf61/MixinGradle-dcfaf61.jar 3552e0c04817d91d1b6671a051d0e1d952c8b6a8eec57b54e829de9fa3ddf002 /com/github/SpongePowered/MixinGradle/dcfaf61/MixinGradle-dcfaf61.pom c6ebd74cd6108b8c372c95b842725ee5bd6d3303ba26cb00f18bc92f80b47956 /com/github/tony19/named-regexp/0.2.3/named-regexp-0.2.3.jar diff --git a/versions/common.gradle b/versions/common.gradle index e83147cf..2d244307 100644 --- a/versions/common.gradle +++ b/versions/common.gradle @@ -131,7 +131,7 @@ dependencies { def studioVersion = "${(int)(mcVersion/10000)}.${(int)(mcVersion/100)%100}" + (mcVersion%100==0 ? '' : ".${mcVersion%100}") if (studioVersion == '1.8.9') studioVersion = '1.8' - shade("com.github.ReplayMod.ReplayStudio:$studioVersion:464e18a"){ + shade("com.github.ReplayMod.ReplayStudio:$studioVersion:3328446"){ exclude group: 'com.google.guava', module: 'guava' // provided by MC exclude group: 'org.projectlombok', module: 'lombok' // runtime only for @SneakyThrows which isn't used } From 277e55a2415cfd3d276bb979ab138c881380a878 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Thu, 22 Mar 2018 13:03:52 +0100 Subject: [PATCH 22/30] [1.7.10] Workaround for crash when loading replay with TCNodeTracker (fixes #118) --- .../com/replaymod/replay/ReplayHandler.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/main/java/com/replaymod/replay/ReplayHandler.java b/src/main/java/com/replaymod/replay/ReplayHandler.java index bd96b467..6052a8c7 100755 --- a/src/main/java/com/replaymod/replay/ReplayHandler.java +++ b/src/main/java/com/replaymod/replay/ReplayHandler.java @@ -36,6 +36,7 @@ import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher; import static net.minecraft.client.renderer.GlStateManager.*; //#else +//$$ import cpw.mods.fml.common.Loader; //$$ import cpw.mods.fml.common.network.internal.FMLNetworkHandler; //$$ import com.replaymod.replay.gui.screen.GuiOpeningReplay; //$$ import io.netty.channel.ChannelOutboundHandlerAdapter; @@ -43,7 +44,11 @@ import static net.minecraft.client.renderer.GlStateManager.*; //$$ import net.minecraft.entity.EntityLivingBase; //$$ import net.minecraft.network.EnumConnectionState; //$$ +//$$ import java.net.InetSocketAddress; +//$$ import java.net.SocketAddress; +//$$ //$$ import static com.replaymod.core.versions.MCVer.GlStateManager.*; +//$$ import static com.replaymod.replay.ReplayModReplay.LOGGER; //#endif import static com.replaymod.core.versions.MCVer.*; @@ -196,6 +201,19 @@ public class ReplayHandler { //#else //$$ NetworkManager networkManager = new NetworkManager(true) { //$$ @Override + //$$ public SocketAddress getRemoteAddress() { + //$$ // See https://github.com/Dyonovan/TCNodeTracker/issues/37 + //$$ if (Loader.isModLoaded("tcnodetracker")) { + //$$ StackTraceElement elem = Thread.currentThread().getStackTrace()[2]; + //$$ if ("com.dyonovan.tcnodetracker.events.ClientConnectionEvent".equals(elem.getClassName())) { + //$$ LOGGER.debug("TCNodeTracker crash workaround applied"); + //$$ return new InetSocketAddress("replaymod.dummy", 0); + //$$ } + //$$ } + //$$ return super.getRemoteAddress(); + //$$ } + //$$ + //$$ @Override //$$ public void exceptionCaught(ChannelHandlerContext ctx, Throwable t) { //$$ t.printStackTrace(); //$$ } From efaa5b7c4175e9e0a04be339adf20d016e8cd504 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Mon, 2 Apr 2018 11:34:00 +0200 Subject: [PATCH 23/30] Shouldn't release jars be final.. Well, looks like the jcenter repo doesn't care because the hash for one of its jars has changed (a few bits in the jar were flipped). Maven Central is still serving the original version, so we have to allow both hashes. --- gradle/reprod/checksums.txt | 1 + gradle/reprod/setup.sh | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/gradle/reprod/checksums.txt b/gradle/reprod/checksums.txt index da1e255a..7f8a66b3 100644 --- a/gradle/reprod/checksums.txt +++ b/gradle/reprod/checksums.txt @@ -547,6 +547,7 @@ ddf19054374a2617ba9c10d7a5ec8eeaeb8f62c2c6e430144e81da15718bb585 /org/eclipse/co 17dbfaba6a138e6fc0eb361069470f00aaf70a94e2d3384f398dee4843eb8fe7 /org/eclipse/equinox/app/1.3.200-v20130910-1609/app-1.3.200-v20130910-1609.pom 83a2cde9ed188efcabebbd2db14128c531c5ba73f8abc599dcae83459a779109 /org/eclipse/equinox/app/maven-metadata.xml 6bc086aab7686a5a528d8c4ab2253d6cec7ead04b052576951e90cc561782257 /org/eclipse/equinox/common/3.6.200-v20130402-1505/common-3.6.200-v20130402-1505.jar +843414d0e457898b1615e4c9118f86ae0cf30dd5166b8b0a1d206fbdab5fbbae /org/eclipse/equinox/common/3.6.200-v20130402-1505/common-3.6.200-v20130402-1505.jar 9234dbfd064411a849444abfeb8a10978672690d125beb4194f9e5b0f0a7ee5e /org/eclipse/equinox/common/3.6.200-v20130402-1505/common-3.6.200-v20130402-1505.pom 9274fc22b74d6dc42608049ea51aa046b8fc8fc60b2a7d6ff6d884d76e6ef3f6 /org/eclipse/equinox/common/maven-metadata.xml 32b046de57df2f4887fc5a2c343740d9d12c7fe17541e2cede73cfa4ccbc2436 /org/eclipse/equinox/org.eclipse.equinox.common/3.6.0/org.eclipse.equinox.common-3.6.0.jar diff --git a/gradle/reprod/setup.sh b/gradle/reprod/setup.sh index 791a1b66..439bf93f 100755 --- a/gradle/reprod/setup.sh +++ b/gradle/reprod/setup.sh @@ -15,7 +15,7 @@ sha256val () { # Setup http(s) proxy url="https://github.com/johni0702/proxy-witness" -commit="01f5aa9eb6fa14a0adfa832ba33b6f7c68138c26" +commit="07e79a999991473489d443b8934ccca547ac7985" if [ ! -d "deps/proxy-witness" ] || [ "$(git -C "deps/proxy-witness" rev-parse $commit^{commit})" != "$commit" ]; then rm -rf "deps/proxy-witness" mkdir -p "deps/proxy-witness" From 62d2ce4b37aec7828ace1e1de0b1545d1b24abc3 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Sat, 9 Jun 2018 23:45:22 +0200 Subject: [PATCH 24/30] Fix crash when in replay with Optifine 1.12.2 DX (fixes #120) Re-creating the RenderChunk lost any custom data Optifine had in them which resulted in NPEs. The reason we re-create the RenderChunks is because otherwise, once it's assigned an empty chunk once, it's not getting any further update even when moving back to filled chunks. Since just calling setNeedsUpdate works as well, this commit changes the whole mixin to doing that instead. --- .../replay/mixin/MixinViewFrustum.java | 91 ++++--------------- 1 file changed, 16 insertions(+), 75 deletions(-) diff --git a/src/main/java/com/replaymod/replay/mixin/MixinViewFrustum.java b/src/main/java/com/replaymod/replay/mixin/MixinViewFrustum.java index 5b83156c..2cab845f 100644 --- a/src/main/java/com/replaymod/replay/mixin/MixinViewFrustum.java +++ b/src/main/java/com/replaymod/replay/mixin/MixinViewFrustum.java @@ -1,17 +1,11 @@ //#if MC>=10800 package com.replaymod.replay.mixin; -import com.replaymod.replay.ReplayModReplay; -import net.minecraft.client.renderer.RenderGlobal; import net.minecraft.client.renderer.ViewFrustum; -import net.minecraft.client.renderer.chunk.IRenderChunkFactory; import net.minecraft.client.renderer.chunk.RenderChunk; -import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.Redirect; //#if MC>=10904 import net.minecraft.util.math.BlockPos; @@ -19,77 +13,24 @@ import net.minecraft.util.math.BlockPos; //$$ import net.minecraft.util.BlockPos; //#endif -import static com.replaymod.core.versions.MCVer.*; - @Mixin(ViewFrustum.class) public abstract class MixinViewFrustum { - private IRenderChunkFactory renderChunkFactory; - - @Shadow protected RenderGlobal renderGlobal; - @Shadow protected World world; - @Shadow protected int countChunksY; - @Shadow protected int countChunksX; - @Shadow protected int countChunksZ; - @Shadow public RenderChunk[] renderChunks; - - @Inject(method = "", at = @At("RETURN")) - private void setRenderChunkFactory(World a1, int a2, RenderGlobal a3, IRenderChunkFactory rcf, CallbackInfo ci) { - this.renderChunkFactory = rcf; - } - - /** - * Instead of updating its position, we recreate the render chunk - * which seems to solve the problem that chunks are invisible when you leave an area and return - * to it. - * Any better fixes are welcome. - * Note: Most of this code is copied from {@link ViewFrustum#updateChunkPositions(double, double)} - */ - @Inject(method = "updateChunkPositions", at = @At("HEAD"), cancellable = true) - public void fixedUpdateChunkPositions(double viewEntityX, double viewEntityZ, CallbackInfo ci) { - if (ReplayModReplay.instance.getReplayHandler() == null) { - return; + @Redirect(method = "updateChunkPositions", at=@At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/chunk/RenderChunk;setPosition(III)V")) + private void replayModReplay_updatePositionAndMarkForUpdate(RenderChunk renderChunk, int x, int y, int z) { + BlockPos pos = new BlockPos(x, y, z); + if (!pos.equals(renderChunk.getPosition())) { + //#if MC>=10904 + //#if MC>=11100 + renderChunk.setPosition(x, y, z); + //#else + //$$ renderChunk.setOrigin(x, y, z); + //#endif + renderChunk.setNeedsUpdate(false); + //#else + //$$ renderChunk.setPosition(pos); + //$$ renderChunk.setNeedsUpdate(true); + //#endif } - - int i = floor(viewEntityX) - 8; - int j = floor(viewEntityZ) - 8; - int k = this.countChunksX * 16; - - for (int l = 0; l < this.countChunksX; ++l) { - int i1 = this.getBaseCoordinate(i, k, l); - for (int j1 = 0; j1 < this.countChunksZ; ++j1) { - int k1 = this.getBaseCoordinate(j, k, j1); - for (int l1 = 0; l1 < this.countChunksY; ++l1) { - int i2 = l1 * 16; - RenderChunk renderchunk = this.renderChunks[(j1 * this.countChunksY + l1) * this.countChunksX + l]; - BlockPos blockpos = new BlockPos(i1, i2, k1); - if (!blockpos.equals(renderchunk.getPosition())) { - // Recreate render chunk instead of setting its position - //#if MC>=10904 - (renderChunks[(j1 * this.countChunksY + l1) * this.countChunksX + l] = - renderChunkFactory.create(world, renderGlobal, 0) - //#if MC>= 11100 - ).setPosition(blockpos.getX(), blockpos.getY(), blockpos.getZ()); - //#else - //$$ ).setOrigin(blockpos.getX(), blockpos.getY(), blockpos.getZ()); - //#endif - //#else - //$$ renderChunks[(j1 * this.countChunksY + l1) * this.countChunksX + l] = - //$$ renderChunkFactory.makeRenderChunk(world, renderGlobal, blockpos, 0); - //#endif - } - } - } - } - ci.cancel(); } - - //#if MC>=10904 - @Shadow abstract int getBaseCoordinate(int p_178157_1_, int p_178157_2_, int p_178157_3_); - //#else - //$$ private int getBaseCoordinate(int p_178157_1_, int p_178157_2_, int p_178157_3_) { - //$$ return func_178157_a(p_178157_1_, p_178157_2_, p_178157_3_); - //$$ } - //$$ @Shadow abstract int func_178157_a(int p_178157_1_, int p_178157_2_, int p_178157_3_); - //#endif } //#endif From 1b9d43017616794b7c77eff836cedc26ae9dfd88 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Sun, 10 Jun 2018 13:12:42 +0200 Subject: [PATCH 25/30] Handle unbalanced quotes in ffmpeg arguments (fixes #119) --- src/main/java/com/replaymod/render/VideoWriter.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/replaymod/render/VideoWriter.java b/src/main/java/com/replaymod/render/VideoWriter.java index e4c5f280..d3502a3c 100755 --- a/src/main/java/com/replaymod/render/VideoWriter.java +++ b/src/main/java/com/replaymod/render/VideoWriter.java @@ -66,7 +66,13 @@ public class VideoWriter implements FrameConsumer { String executable = settings.getExportCommand().isEmpty() ? findFFmpeg() : settings.getExportCommand(); LOGGER.info("Starting {} with args: {}", executable, commandArgs); - String[] cmdline = new CommandLine(executable).addArguments(commandArgs).toStrings(); + String[] cmdline; + try { + cmdline = new CommandLine(executable).addArguments(commandArgs).toStrings(); + } catch (IllegalArgumentException e) { + LOGGER.error("Failed to parse ffmpeg command line:", e); + throw new FFmpegStartupException(settings, e.getLocalizedMessage()); + } try { process = new ProcessBuilder(cmdline).directory(outputFolder).start(); } catch (IOException e) { From 5e6a85d475180ef169664772b2da110e6941815d Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Sun, 10 Jun 2018 13:39:21 +0200 Subject: [PATCH 26/30] Update dependency checksums --- gradle/reprod/checksums.txt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/gradle/reprod/checksums.txt b/gradle/reprod/checksums.txt index 7f8a66b3..d49f51b0 100644 --- a/gradle/reprod/checksums.txt +++ b/gradle/reprod/checksums.txt @@ -70,8 +70,6 @@ c885ce34249682bc0236b4a7d56efcc12048e6135a5baf7a9cde8ad8cda13fcd /com/google/cod 4170a761dc5bfd3981a8e6f7aab9e2acdce82d34fd5aa9bb11e3c090d25314ce /com/google/code/findbugs/jsr305/3.0.1/jsr305-3.0.1.pom 8cc1f0813a186079f82d300a43156bdf852a88008f4f1a1fa71e788fb3b9a86d /com/google/code/google-collections/google-collect/snapshot-20080530/google-collect-snapshot-20080530.jar 7d131d6a082a33363bdfbf55d2fee2219d9bc8d1c455cc3f7c6403cf2a4496a5 /com/google/code/google-collections/google-collect/snapshot-20080530/google-collect-snapshot-20080530.pom -35c94198255e95f6f11501eb4b3d43a5276bfdd142ab7c904722e69bff51f69e /com/google/code/gson/gson/2.1/gson-2.1.jar -894da89d477e805389c9df1d6fa8bd552285aed56a399d5749213520a7c74054 /com/google/code/gson/gson/2.1/gson-2.1.pom c0328cd07ca9e363a5acd00c1cf4afe8cf554bd6d373834981ba05cebec687fb /com/google/code/gson/gson/2.2.4/gson-2.2.4.jar ae984d5d19894ce6dc4689866eaa12f8fc31409113e60ee3b44853b8ac4fd380 /com/google/code/gson/gson/2.2.4/gson-2.2.4.pom c6221763bd79c4f1c3dc7f750b5f29a0bb38b367b81314c4f71896e340c40825 /com/google/code/gson/gson/2.8.0/gson-2.8.0.jar @@ -142,8 +140,8 @@ a74b4370bc60e368b9c29940d3b6aae334aef3f5cf16b5c2ee5d0b775ef6ea18 /com/mojang/rea 23c16b609458580d2f12abba28604264bfc71451374584a673bd52ad3b99c25c /com/mojang/realms/1.10.16/realms-1.10.16.pom e3ab95d053a4e180693422bf56592f3c62ff273b0deb1d4a3cb5f76d8fb6994a /com/mojang/realms/1.10.17/realms-1.10.17.jar 152235c4a886c6c9a9af7c76092a8161c5e505199b728c1a965f069a7519290f /com/mojang/realms/1.10.17/realms-1.10.17.pom -50ab8f15526ef8166529159fdd56b511a38ea64f91e95619acbbc9b6914848ba /com/mojang/realms/1.10.19/realms-1.10.19.jar -b69780ed88a3df0941e10321685bbdbea80b415c5523ced071301189ea295de5 /com/mojang/realms/1.10.19/realms-1.10.19.pom +7765dab63907f149910b849de5e1f5d000b3245e806390601395c3adca000e0a /com/mojang/realms/1.10.21/realms-1.10.21.jar +59a779e5d9ad935f32efb2f971885d1bb3ec544de5ebf80727ec260dc459862d /com/mojang/realms/1.10.21/realms-1.10.21.pom 9076a115056a4a3ce85b3f8b8c06b8e4ea723d856ab87592d72ac9fd3fa67c9f /com/mojang/realms/1.10.4/realms-1.10.4.jar 0e436798162614ebaa8a04c225ff0100d046848759a3d8a5f5bc3c73dcdaea13 /com/mojang/realms/1.10.4/realms-1.10.4.pom a8ced4924d0e285ab287d94889e9920f855b9e13ef42e1c7468377b3c13bdb2b /com/mojang/realms/1.3.5/realms-1.3.5.jar From ab4153f3756bbcf3c6afba6b69524f47362e79e3 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Sun, 10 Jun 2018 15:53:17 +0200 Subject: [PATCH 27/30] Update ReplayStudio to fix custom potion effects (fixes #126) --- gradle/reprod/checksums.txt | 36 ++++++++++++++++++------------------ versions/common.gradle | 2 +- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/gradle/reprod/checksums.txt b/gradle/reprod/checksums.txt index d49f51b0..04ec2f70 100644 --- a/gradle/reprod/checksums.txt +++ b/gradle/reprod/checksums.txt @@ -30,24 +30,24 @@ cddfc1a07301f2fa07a5e1b6897e455d397d6d5c547d45082c267a1ee2c75f70 /com/github/Mod 7191124b8491d36b9fc1eb1a4e0f8ef710a4b98e27dde92854c24d45457fd9d0 /com/github/ModCoderPack/MCInjector/05aa80e/MCInjector-05aa80e.pom ecf57aab63509ec0ce3937c2215bc3a2e3cb6357cd11095978db18bd3251731a /com/github/ModCoderPack/MCInjector/7258466/MCInjector-7258466.jar dc7ed1f4f0ddd8f5ce3b449db944907a5eb2855dbbbc59b08dad1247ebafba33 /com/github/ModCoderPack/MCInjector/7258466/MCInjector-7258466.pom -2a0317d30d61fb285cc53fa20e2e70f8415cd450bd7dd27316ede1958bd0026a /com/github/ReplayMod/ReplayStudio/1.10.2/3328446/1.10.2-3328446.jar -138fe5069cefa345c1f2d7b5a863e9b4c40bd08fb6cb75743b7f8d804fab7a35 /com/github/ReplayMod/ReplayStudio/1.10.2/3328446/1.10.2-3328446.pom -0c2fc451112aea29afea627c6f960c6c2d802bf9ce5171e13141d765cabd1bd3 /com/github/ReplayMod/ReplayStudio/1.11.2/3328446/1.11.2-3328446.jar -54b66a2ed2312077b177f2e9c23250ff1b09d86d3b781fc1c6682e3958693783 /com/github/ReplayMod/ReplayStudio/1.11.2/3328446/1.11.2-3328446.pom -72a34922cd66c11c4828ea5a6a59a22c7e84704eba6d6569dcb7946c861c6150 /com/github/ReplayMod/ReplayStudio/1.11/3328446/1.11-3328446.jar -1ab36234360fe9f8b1c18a42a87affc36dc7b13dcd1af0f25db647272eccb4cd /com/github/ReplayMod/ReplayStudio/1.11/3328446/1.11-3328446.pom -09b16315282ff3d230473ef8c1ebc8ecbedecc9e1cfacc11a25c8cf33804df58 /com/github/ReplayMod/ReplayStudio/1.12.1/3328446/1.12.1-3328446.jar -3ada3bfb286bcb6436cb81992a099e9adc6850b694bfea0e58708bf61f88f3f5 /com/github/ReplayMod/ReplayStudio/1.12.1/3328446/1.12.1-3328446.pom -09f3bb46fcfe5717824ef98b1fe1ddd168dbaab9bb9733638b372eafdb38e8ea /com/github/ReplayMod/ReplayStudio/1.12.2/3328446/1.12.2-3328446.jar -2f88158c9e54501af126087c411087c68da91a3c59335bca4479f09364b46b64 /com/github/ReplayMod/ReplayStudio/1.12.2/3328446/1.12.2-3328446.pom -5a2768d35614ff979587e7cbfb1e47ee583d6abae5c37d987d092d937ddab1df /com/github/ReplayMod/ReplayStudio/1.12/3328446/1.12-3328446.jar -79bc6a0e171a13a458508f16488716f7a567dfdcaac115a64f8fb989c48dd672 /com/github/ReplayMod/ReplayStudio/1.12/3328446/1.12-3328446.pom -dacb755264170eec62dda2733462dcc68bd25d03122b7a88aa90078dade90c9e /com/github/ReplayMod/ReplayStudio/1.7.10/3328446/1.7.10-3328446.jar -b1cd5eeade89b9a23ea01c7d3399c97cacbc2b88b9f7f24a11783162c7e752b8 /com/github/ReplayMod/ReplayStudio/1.7.10/3328446/1.7.10-3328446.pom -3e71190a4715c3b75c5cc0c370446ddcd140d0aed81f699a1bb8613d22828060 /com/github/ReplayMod/ReplayStudio/1.8/3328446/1.8-3328446.jar -9481d14fdf1e1240e3e85d8d5d68838d89cbaae26a1c417a7d3947cacb5cbaba /com/github/ReplayMod/ReplayStudio/1.8/3328446/1.8-3328446.pom -12aab719873f618d2d9fecd39792b95391d33f2a63e59a6def4683603c941234 /com/github/ReplayMod/ReplayStudio/1.9.4/3328446/1.9.4-3328446.jar -f73130ca1e7714ad50b9c32871571fb9e8d44d387eaab0253152c3b3c25d5a30 /com/github/ReplayMod/ReplayStudio/1.9.4/3328446/1.9.4-3328446.pom +e1a215146621ab100c5d88c6c65e7b76c91f2a06ab8714ac438738ddec5ea904 /com/github/ReplayMod/ReplayStudio/1.10.2/3680c2e/1.10.2-3680c2e.jar +da0b27f2719bf829f91eb4d6ea7d6e54c71b301a19578bafe6ec05e72ed04a6a /com/github/ReplayMod/ReplayStudio/1.10.2/3680c2e/1.10.2-3680c2e.pom +67e8b400d005235bd2825717864c4a9341567302877c857c3681adc74802b2ba /com/github/ReplayMod/ReplayStudio/1.11.2/3680c2e/1.11.2-3680c2e.jar +ff786e8da1d52bfdca8abe58bc83cf9200e027a85212da633e795811b5c8b1ee /com/github/ReplayMod/ReplayStudio/1.11.2/3680c2e/1.11.2-3680c2e.pom +68da074f5cccd590c9584efc885f6ea842a15f1ce968aad04cbac6af2c8ecf49 /com/github/ReplayMod/ReplayStudio/1.11/3680c2e/1.11-3680c2e.jar +79a6ed9587d6b23f5221b0fdff12f01de4859dc985f3cdbebf081edd4e478a54 /com/github/ReplayMod/ReplayStudio/1.11/3680c2e/1.11-3680c2e.pom +60549740b778011d5e4a8b786805c6de8c518ce8f627cf70369b2c71f0d399c4 /com/github/ReplayMod/ReplayStudio/1.12.1/3680c2e/1.12.1-3680c2e.jar +da248126087579d384175fa36eb654c8755027727aff6c285cd8e4e056ddf424 /com/github/ReplayMod/ReplayStudio/1.12.1/3680c2e/1.12.1-3680c2e.pom +30ecf796e3697cf7d86c21f245695e659b39f55f2aecf40864ec6ac2c0eeae87 /com/github/ReplayMod/ReplayStudio/1.12.2/3680c2e/1.12.2-3680c2e.jar +73c4c53e5f18cffd921db81019510c47afb306eb2aea86377f44fc91e8b45130 /com/github/ReplayMod/ReplayStudio/1.12.2/3680c2e/1.12.2-3680c2e.pom +2f0e27b40a0c3ac298573c6a2fad24829e968731676305b5f1c471a827ac7458 /com/github/ReplayMod/ReplayStudio/1.12/3680c2e/1.12-3680c2e.jar +282e2fa0ef80206ab592f90f8585d5ecf5adfb110dcd1cb5204971257e3fd44e /com/github/ReplayMod/ReplayStudio/1.12/3680c2e/1.12-3680c2e.pom +1aa22b15d5e89258fc58c2a310c915937cf93b42bf27b9fefc04d20b6b07b19c /com/github/ReplayMod/ReplayStudio/1.7.10/3680c2e/1.7.10-3680c2e.jar +fbd4bfe141d845248bb095d59f3aaf273bf20ad849cec89d21594754a69f3f53 /com/github/ReplayMod/ReplayStudio/1.7.10/3680c2e/1.7.10-3680c2e.pom +96b37e76cf8b4aac4f0419d84ba6427da156cd7c4f41f9b9380d149893dd50a7 /com/github/ReplayMod/ReplayStudio/1.8/3680c2e/1.8-3680c2e.jar +7a68b798f4029b98b391076992d39633b3060d06d43edc25422edbbed09914f5 /com/github/ReplayMod/ReplayStudio/1.8/3680c2e/1.8-3680c2e.pom +5e5bea81fd85631a5f80973fab581e991d793d543e2bbbdbf1bebc15b4a279cd /com/github/ReplayMod/ReplayStudio/1.9.4/3680c2e/1.9.4-3680c2e.jar +cb0a152f7c720de75325b2cb857879596edf8c4b0de6f5b39168a1be1aa6709f /com/github/ReplayMod/ReplayStudio/1.9.4/3680c2e/1.9.4-3680c2e.pom bfdcda4cbf23f28392384818a1417c2d6df687e15ce77530ef96381393102f8a /com/github/SpongePowered/MixinGradle/dcfaf61/MixinGradle-dcfaf61.jar 3552e0c04817d91d1b6671a051d0e1d952c8b6a8eec57b54e829de9fa3ddf002 /com/github/SpongePowered/MixinGradle/dcfaf61/MixinGradle-dcfaf61.pom c6ebd74cd6108b8c372c95b842725ee5bd6d3303ba26cb00f18bc92f80b47956 /com/github/tony19/named-regexp/0.2.3/named-regexp-0.2.3.jar diff --git a/versions/common.gradle b/versions/common.gradle index 2d244307..3609449b 100644 --- a/versions/common.gradle +++ b/versions/common.gradle @@ -131,7 +131,7 @@ dependencies { def studioVersion = "${(int)(mcVersion/10000)}.${(int)(mcVersion/100)%100}" + (mcVersion%100==0 ? '' : ".${mcVersion%100}") if (studioVersion == '1.8.9') studioVersion = '1.8' - shade("com.github.ReplayMod.ReplayStudio:$studioVersion:3328446"){ + shade("com.github.ReplayMod.ReplayStudio:$studioVersion:3680c2e"){ exclude group: 'com.google.guava', module: 'guava' // provided by MC exclude group: 'org.projectlombok', module: 'lombok' // runtime only for @SneakyThrows which isn't used } From 38892026c56651b31d7772e415c09354bf90e740 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Sun, 10 Jun 2018 16:43:37 +0200 Subject: [PATCH 28/30] Add .gitkeep to versions/1.7.10 directory This is required for it to be included in the versions.json on the master branch for the next release. --- versions/1.7.10/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 versions/1.7.10/.gitkeep diff --git a/versions/1.7.10/.gitkeep b/versions/1.7.10/.gitkeep new file mode 100644 index 00000000..e69de29b From 16b40a5725d813dd163a6af9a76cd27b29d5e291 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Sun, 10 Jun 2018 17:58:44 +0200 Subject: [PATCH 29/30] Only try to sign jars if the current call built any --- gradle/reprod/setup.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/gradle/reprod/setup.sh b/gradle/reprod/setup.sh index 439bf93f..46d93973 100755 --- a/gradle/reprod/setup.sh +++ b/gradle/reprod/setup.sh @@ -49,6 +49,7 @@ if [ "$(git blame -p version.txt | head -n1 | cut -d' ' -f1)" == "$(git rev-pars pushd versions for ver in */; do [ "$ver" == "core/" ] && continue + [ -d "$ver/build/libs" ] || continue pushd "$ver" # Note: This requires there to be one and only one jar file (ignoring source artifacts) jar="build/libs/$(ls build/libs | grep -v sources)" From f96e715b0bd63862b1ca9d1cce4baffb1c66581b Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Sun, 10 Jun 2018 16:44:49 +0200 Subject: [PATCH 30/30] Release 2.1.3 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index eca07e4c..ac2cdeba 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.1.2 +2.1.3