diff --git a/.drone.yml b/.drone.yml index 924509f8..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 :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 + - 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 fd87f838..3bd52b21 100644 --- a/.drone.yml.sig +++ b/.drone.yml.sig @@ -1 +1 @@ -eyJhbGciOiJIUzI1NiJ9.cGlwZWxpbmU6CiAgY2xvbmU6CiAgICBpbWFnZTogcGx1Z2lucy9naXQKICAgIHRhZ3M6IHRydWUKICAgIHJlY3Vyc2l2ZTogdHJ1ZQogIGJ1aWxkOgogICAgaW1hZ2U6IG1hdmVuOjMuMy45LWpkay04CiAgICBjb21tYW5kczoKICAgICAgLSBjdXJsIC0tZmFpbCAtLWNyZWF0ZS1kaXJzIC1vICRIT01FLy5ncmFkbGUvaW5pdC5kL21pcnJvci5ncmFkbGUgaHR0cHM6Ly9tYXZlbi5qb2huaTA3MDIuZGUvY29uZmlnL2dyYWRsZQogICAgICAtIGdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5lbWFpbCAicmVwbGF5bW9kQGRyb25lIiAmJiBnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIubmFtZSAiRHJvbmUiCiAgICAgIC0gU0lHTkVEX0pBUj0kKCEgZ2l0IGRlc2NyaWJlIC0tZXhhY3QgMj4mMSA-IC9kZXYvbnVsbDsgZWNobyAkPykgUkVQUk9EVUNJQkxFX0JVSUxEPTEgLi9ncmFkbGV3ICQoYmFzaCAtYyAiZWNobyA6dmVyc2lvbnM6ezEuOCwxLjguOSwxLjkuNCwxLjEwLjIsMS4xMSwxLjExLjIsMS4xMiwxLjEyLjEsMS4xMi4yfTpyZW9iZkphciIpIC0tcGFyYWxsZWwKICAgICAgLSBta2RpciAtcCBidWlsZC9saWJzICYmIG12IHZlcnNpb25zLyovYnVpbGQvbGlicy8qIGJ1aWxkL2xpYnMvCiAgYXJjaGl2ZToKICAgIGltYWdlOiBwbHVnaW5zL3MzCiAgICBhY2w6IHB1YmxpYy1yZWFkCiAgICByZWdpb246ICJ1cy1lYXN0LTEiCiAgICBidWNrZXQ6ICJyZXBsYXltb2QiCiAgICBwYXRoX3N0eWxlOiB0cnVlCiAgICBzb3VyY2U6IGJ1aWxkL2xpYnMvKgogICAgc3RyaXBfcHJlZml4OiBidWlsZC9saWJzLwogICAgdGFyZ2V0OiAvCg.GrAnS7L_wYnMV2eTmPJGweU_8ITxbbqZK9ptC6llIDg \ 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..db61d60f 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 = 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 = https://github.com/MinecraftForge/Srg2Source.git diff --git a/README.md b/README.md index 9694bdc3..cc6f2ed1 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`. @@ -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 @@ -74,15 +72,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/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..04ec2f70 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 +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 @@ -64,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 @@ -73,6 +77,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 +118,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 @@ -132,10 +140,12 @@ 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 +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 +221,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 +247,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 +287,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 +304,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 +322,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 +338,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 @@ -520,6 +545,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 @@ -533,9 +559,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 +679,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 +702,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 +747,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/setup.sh b/gradle/reprod/setup.sh index 1ec58939..46d93973 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" @@ -44,11 +44,12 @@ 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 [ "$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)" 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 diff --git a/jGui b/jGui index 88cf6782..09713104 160000 --- a/jGui +++ b/jGui @@ -1 +1 @@ -Subproject commit 88cf67823672bf78302775784a6bbd129d75d433 +Subproject commit 097131041b4293245820b6f9b46271b5d5f4a830 diff --git a/settings.gradle b/settings.gradle index 27d78551..f67c539b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,16 +1,22 @@ include ':jGui' -([ +[ 'core', + '1.7.10', '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 = [ 'core', + '1.7.10', '1.8', '1.8.9', '1.9.4', @@ -21,6 +27,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/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/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/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/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 af5af130..c3a7ea35 100755 --- a/src/main/java/com/replaymod/core/LoadingPlugin.java +++ b/src/main/java/com/replaymod/core/LoadingPlugin.java @@ -1,17 +1,29 @@ 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 com.replaymod.core.asm.GLErrorTransformer; +//$$ import com.replaymod.core.asm.GLStateTrackerTransformer; +//$$ 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; import java.security.CodeSource; import java.util.Map; +@IFMLLoadingPlugin.TransformerExclusions("com.replaymod.core.asm.") public class LoadingPlugin implements IFMLLoadingPlugin { public LoadingPlugin() { @@ -36,6 +48,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) { @@ -49,8 +64,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/asm/GLErrorTransformer.java b/src/main/java/com/replaymod/core/asm/GLErrorTransformer.java new file mode 100644 index 00000000..dac9dde9 --- /dev/null +++ b/src/main/java/com/replaymod/core/asm/GLErrorTransformer.java @@ -0,0 +1,95 @@ +//#if MC<=10710 +//$$ package com.replaymod.core.asm; +//$$ +//$$ 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) { +//$$ if (basicClass == null) return null; +//$$ +//$$ 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/asm/GLStateTrackerTransformer.java b/src/main/java/com/replaymod/core/asm/GLStateTrackerTransformer.java new file mode 100644 index 00000000..26129095 --- /dev/null +++ b/src/main/java/com/replaymod/core/asm/GLStateTrackerTransformer.java @@ -0,0 +1,106 @@ +//#if MC<=10710 +//$$ package com.replaymod.core.asm; +//$$ +//$$ 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) { +//$$ if (basicClass == null) return null; +//$$ // 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/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 6de9133e..32fd7c85 100644 --- a/src/main/java/com/replaymod/core/versions/MCVer.java +++ b/src/main/java/com/replaymod/core/versions/MCVer.java @@ -13,12 +13,13 @@ 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.renderer.texture.TextureMap; import net.minecraft.client.renderer.vertex.VertexFormat; import net.minecraft.client.renderer.vertex.VertexFormatElement; 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; @@ -27,13 +28,11 @@ import net.minecraft.network.Packet; import net.minecraft.network.PacketBuffer; import net.minecraft.util.ResourceLocation; 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 @@ -45,16 +44,39 @@ import net.minecraft.client.particle.Particle; import net.minecraft.util.math.MathHelper; //#else //$$ import net.minecraft.client.particle.EntityFX; +//#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; @@ -151,7 +173,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 } @@ -187,12 +217,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 ResourceLocation LOCATION_BLOCKS_TEXTURE //#if MC>=10904 @@ -248,7 +300,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") @@ -261,19 +317,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 } @@ -309,7 +389,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 } @@ -317,7 +412,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 } @@ -328,7 +427,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 } @@ -341,7 +444,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(); @@ -358,7 +465,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 } @@ -371,7 +482,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(); @@ -387,7 +502,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 } @@ -400,7 +519,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(); @@ -431,6 +554,22 @@ public class MCVer { return vertexFormat.getElements(); } + 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); @@ -470,4 +609,21 @@ public class MCVer { //$$ return EntityFX.interpPosZ; //#endif } + + //#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/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()) ); }); } 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/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) { 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 f7f29e77..9f7bfd25 100644 --- a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java @@ -3,7 +3,6 @@ package com.replaymod.extras.advancedscreenshots; import com.replaymod.render.RenderSettings; import com.replaymod.render.blend.BlendState; 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; @@ -11,6 +10,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 { @@ -18,6 +21,8 @@ public class ScreenshotRenderer implements RenderInfo { private final RenderSettings settings; + private int framesDone; + public boolean renderScreenshot() throws Throwable { try { int displayWidthBefore = mc.displayWidth; @@ -26,7 +31,9 @@ public class ScreenshotRenderer implements RenderInfo { boolean hideGUIBefore = mc.gameSettings.hideGUI; mc.gameSettings.hideGUI = true; + //#if MC>=10800 ChunkLoadingRenderGlobal clrg = new ChunkLoadingRenderGlobal(mc.renderGlobal); + //#endif if (settings.getRenderMethod() == RenderSettings.RenderMethod.BLEND) { BlendState.setState(new BlendState(settings.getOutputFile())); @@ -36,7 +43,9 @@ public class ScreenshotRenderer implements RenderInfo { new ScreenshotWriter(settings.getOutputFile())).run(); } + //#if MC>=10800 clrg.uninstall(); + //#endif mc.gameSettings.hideGUI = hideGUIBefore; mc.resize(displayWidthBefore, displayHeightBefore); @@ -54,6 +63,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 @@ -62,6 +76,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..1daef60b 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; @@ -102,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"); } 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..2a44af9e 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; @@ -85,6 +94,7 @@ public class RecordingEventHandler { //#else //$$ packetListener.save(new S0CPacketSpawnPlayer(player(mc))); //#endif + lastX = lastY = lastZ = null; } catch(Exception e) { e.printStackTrace(); } @@ -143,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)); @@ -156,7 +177,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 +378,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 +419,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/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/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..d3502a3c 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; @@ -61,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) { 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..8fe6c2b9 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; @@ -22,15 +23,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(); @@ -128,3 +144,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 6dad7f05..e542e409 100644 --- a/src/main/java/com/replaymod/render/mixin/MixinEffectRenderer.java +++ b/src/main/java/com/replaymod/render/mixin/MixinEffectRenderer.java @@ -7,38 +7,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; @@ -60,7 +90,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..c81175b0 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; @@ -9,6 +10,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 +68,19 @@ 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); + } + } } +//#endif diff --git a/src/main/java/com/replaymod/render/rendering/Pipelines.java b/src/main/java/com/replaymod/render/rendering/Pipelines.java index 0d4fd80c..012258e4 100644 --- a/src/main/java/com/replaymod/render/rendering/Pipelines.java +++ b/src/main/java/com/replaymod/render/rendering/Pipelines.java @@ -51,9 +51,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); } @@ -62,9 +62,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); } @@ -73,9 +73,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); } @@ -84,9 +84,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); } @@ -94,20 +94,20 @@ 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); } - public static Pipeline newBlendPipeline(RenderInfo renderInfo) throws IOException { + public static Pipeline newBlendPipeline(RenderInfo renderInfo) { RenderSettings settings = renderInfo.getRenderSettings(); - FrameCapturer capturer = new BlendFrameCapturer(new EntityRendererHandler(settings), renderInfo); + FrameCapturer capturer = new BlendFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo); FrameConsumer consumer = new FrameConsumer() { @Override public void consume(RGBFrame frame) { } @Override - public void close() throws IOException { + public void close() { } }; return new Pipeline<>(capturer, new DummyProcessor<>(), consumer); diff --git a/src/main/java/com/replaymod/render/rendering/VideoRenderer.java b/src/main/java/com/replaymod/render/rendering/VideoRenderer.java index cb3286ec..39cfa4ee 100644 --- a/src/main/java/com/replaymod/render/rendering/VideoRenderer.java +++ b/src/main/java/com/replaymod/render/rendering/VideoRenderer.java @@ -13,7 +13,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; @@ -36,6 +35,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; @@ -47,10 +53,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.clear; -import static net.minecraft.client.renderer.GlStateManager.enableTexture2D; -import static net.minecraft.client.renderer.GlStateManager.popMatrix; -import static net.minecraft.client.renderer.GlStateManager.pushMatrix; import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; @@ -73,7 +75,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; @@ -262,7 +266,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); @@ -288,9 +294,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(); @@ -314,11 +322,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() { @@ -339,6 +351,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) { @@ -346,6 +359,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; @@ -363,7 +379,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..6052a8c7 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,41 @@ 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.Loader; +//$$ 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 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.*; import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; @@ -82,7 +100,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 +108,8 @@ public class ReplayHandler { overlay.setVisible(true); FML_BUS.post(new ReplayOpenEvent.Post(this)); + + replaySender.setAsyncMode(asyncMode); } void restartedReplay() { @@ -148,6 +168,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 +198,44 @@ public class ReplayHandler { //$$ channel.pipeline().addAfter("ReplayModReplay_replaySender", "fml:packet_handler", networkDispatcher); //$$ channel.pipeline().fireChannelActive(); //#endif + //#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(); + //$$ } + //$$ }; + //$$ 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 +295,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 +317,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 +336,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 +437,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..2cab845f 100644 --- a/src/main/java/com/replaymod/replay/mixin/MixinViewFrustum.java +++ b/src/main/java/com/replaymod/replay/mixin/MixinViewFrustum.java @@ -1,16 +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; @@ -18,76 +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 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 8b0fbfb6..b5d3cbf5 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..a7429f91 100644 --- a/src/main/resources/mixins.recording.replaymod.json +++ b/src/main/resources/mixins.recording.replaymod.json @@ -8,6 +8,10 @@ "MixinPlayerControllerMP", "MixinWorldClient", //#endif + //#if MC<=10710 + //$$ "MixinGuiScreen", + //$$ "MixinS26PacketMapChunkBulk", + //#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/version.txt b/version.txt index 7ec1d6db..ac2cdeba 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.1.0 +2.1.3 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.7.10/.gitkeep b/versions/1.7.10/.gitkeep new file mode 100644 index 00000000..e69de29b 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 3c1b79f6..ae86cae7 100644 --- a/versions/common.gradle +++ b/versions/common.gradle @@ -1,24 +1,56 @@ 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' : + 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 { + 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 @@ -30,8 +62,35 @@ group= "com.replaymod" archivesBaseName = "replaymod" minecraft { - coreMod = 'com.replaymod.core.LoadingPlugin' + if (mcVersion >= 10800) { + 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', + 10710: '1.7.10-10.13.4.1558-1.7.10', + ][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", + 10710: "stable_12", + ][mcVersion] } afterEvaluate { // Note cannot use minecraft.replace because that has already been forwarded to the task by FG by now @@ -49,18 +108,11 @@ 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 + + shade.exclude group: 'com.google.code.gson', module: 'gson' // provided by MC } dependencies { @@ -79,9 +131,9 @@ dependencies { shade 'com.github.ReplayMod.JavaBlend:2.79.0:e0a1b9a' - 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: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 } @@ -89,7 +141,8 @@ 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")){ + 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 } @@ -98,6 +151,25 @@ 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 + } + // 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 + } + } +} + if (project.name != 'core') { apply from: '../preprocessor.gradle' @@ -105,8 +177,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 { @@ -132,24 +202,30 @@ 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 } minecraft.accessTransformer preprocessedRes + '/META-INF/replaymod_at.cfg' +} else { + sourceSets { + main.java.srcDirs = ['../../src/main/java'] + main.resources.srcDirs = ['../../src/main/resources'] + } } +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 @@ -162,7 +238,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 @@ -170,6 +253,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 @@ -200,6 +287,7 @@ jar { attributes 'TweakClass': 'org.spongepowered.asm.launch.MixinTweaker', 'TweakOrder': '0', 'FMLCorePluginContainsFMLMod': 'true', + 'FMLCorePlugin': 'com.replaymod.core.LoadingPlugin', 'FMLAT': 'replaymod_at.cfg' } } @@ -248,13 +336,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 = { @@ -287,7 +392,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") @@ -322,6 +427,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' 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 -} 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")