Merge branch 'johni/1.7.10' into johni/develop

This commit is contained in:
Jonas Herzig
2018-04-02 11:53:06 +02:00
142 changed files with 2721 additions and 498 deletions

View File

@@ -8,7 +8,8 @@ pipeline:
commands: commands:
- curl --fail --create-dirs -o $HOME/.gradle/init.d/mirror.gradle https://maven.johni0702.de/config/gradle - 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" - 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/ - mkdir -p build/libs && mv versions/*/build/libs/* build/libs/
archive: archive:
image: plugins/s3 image: plugins/s3

View File

@@ -1 +1 @@
eyJhbGciOiJIUzI1NiJ9.cGlwZWxpbmU6CiAgY2xvbmU6CiAgICBpbWFnZTogcGx1Z2lucy9naXQKICAgIHRhZ3M6IHRydWUKICAgIHJlY3Vyc2l2ZTogdHJ1ZQogIGJ1aWxkOgogICAgaW1hZ2U6IG1hdmVuOjMuMy45LWpkay04CiAgICBjb21tYW5kczoKICAgICAgLSBjdXJsIC0tZmFpbCAtLWNyZWF0ZS1kaXJzIC1vICRIT01FLy5ncmFkbGUvaW5pdC5kL21pcnJvci5ncmFkbGUgaHR0cHM6Ly9tYXZlbi5qb2huaTA3MDIuZGUvY29uZmlnL2dyYWRsZQogICAgICAtIGdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5lbWFpbCAicmVwbGF5bW9kQGRyb25lIiAmJiBnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIubmFtZSAiRHJvbmUiCiAgICAgIC0gU0lHTkVEX0pBUj0kKCEgZ2l0IGRlc2NyaWJlIC0tZXhhY3QgMj4mMSA-IC9kZXYvbnVsbDsgZWNobyAkPykgUkVQUk9EVUNJQkxFX0JVSUxEPTEgLi9ncmFkbGV3ICQoYmFzaCAtYyAiZWNobyA6dmVyc2lvbnM6ezEuOCwxLjguOSwxLjkuNCwxLjEwLjIsMS4xMSwxLjExLjIsMS4xMiwxLjEyLjEsMS4xMi4yfTpyZW9iZkphciIpIC0tcGFyYWxsZWwKICAgICAgLSBta2RpciAtcCBidWlsZC9saWJzICYmIG12IHZlcnNpb25zLyovYnVpbGQvbGlicy8qIGJ1aWxkL2xpYnMvCiAgYXJjaGl2ZToKICAgIGltYWdlOiBwbHVnaW5zL3MzCiAgICBhY2w6IHB1YmxpYy1yZWFkCiAgICByZWdpb246ICJ1cy1lYXN0LTEiCiAgICBidWNrZXQ6ICJyZXBsYXltb2QiCiAgICBwYXRoX3N0eWxlOiB0cnVlCiAgICBzb3VyY2U6IGJ1aWxkL2xpYnMvKgogICAgc3RyaXBfcHJlZml4OiBidWlsZC9saWJzLwogICAgdGFyZ2V0OiAvCg.GrAnS7L_wYnMV2eTmPJGweU_8ITxbbqZK9ptC6llIDg eyJhbGciOiJIUzI1NiJ9.cGlwZWxpbmU6CiAgY2xvbmU6CiAgICBpbWFnZTogcGx1Z2lucy9naXQKICAgIHRhZ3M6IHRydWUKICAgIHJlY3Vyc2l2ZTogdHJ1ZQogIGJ1aWxkOgogICAgaW1hZ2U6IG1hdmVuOjMuMy45LWpkay04CiAgICBjb21tYW5kczoKICAgICAgLSBjdXJsIC0tZmFpbCAtLWNyZWF0ZS1kaXJzIC1vICRIT01FLy5ncmFkbGUvaW5pdC5kL21pcnJvci5ncmFkbGUgaHR0cHM6Ly9tYXZlbi5qb2huaTA3MDIuZGUvY29uZmlnL2dyYWRsZQogICAgICAtIGdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5lbWFpbCAicmVwbGF5bW9kQGRyb25lIiAmJiBnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIubmFtZSAiRHJvbmUiCiAgICAgIC0gUkVQUk9EVUNJQkxFX0JVSUxEPTEgLi9ncmFkbGV3IDoxLjcuMTA6c2V0dXBDSVdvcmtzcGFjZSA6akd1aToxLjcuMTA6c2V0dXBDSVdvcmtzcGFjZQogICAgICAtIFNJR05FRF9KQVI9JCghIGdpdCBkZXNjcmliZSAtLWV4YWN0IDI-JjEgPiAvZGV2L251bGw7IGVjaG8gJD8pIFJFUFJPRFVDSUJMRV9CVUlMRD0xIC4vZ3JhZGxldyAkKGJhc2ggLWMgImVjaG8gOnsxLjcuMTAsMS44LDEuOC45LDEuOS40LDEuMTAuMiwxLjExLDEuMTEuMiwxLjEyLDEuMTIuMSwxLjEyLjJ9OnJlb2JmSmFyIikgLS1wYXJhbGxlbAogICAgICAtIG1rZGlyIC1wIGJ1aWxkL2xpYnMgJiYgbXYgdmVyc2lvbnMvKi9idWlsZC9saWJzLyogYnVpbGQvbGlicy8KICBhcmNoaXZlOgogICAgaW1hZ2U6IHBsdWdpbnMvczMKICAgIGFjbDogcHVibGljLXJlYWQKICAgIHJlZ2lvbjogInVzLWVhc3QtMSIKICAgIGJ1Y2tldDogInJlcGxheW1vZCIKICAgIHBhdGhfc3R5bGU6IHRydWUKICAgIHNvdXJjZTogYnVpbGQvbGlicy8qCiAgICBzdHJpcF9wcmVmaXg6IGJ1aWxkL2xpYnMvCiAgICB0YXJnZXQ6IC8K.2bNe9Pd4FUTIP9VTrFR4YuHJkgCmjIbfBCUu-Wrvap8

7
.gitmodules vendored
View File

@@ -20,3 +20,10 @@
[submodule "gradle/reprod/upstream/mixin"] [submodule "gradle/reprod/upstream/mixin"]
path = gradle/reprod/upstream/mixin path = gradle/reprod/upstream/mixin
url = https://github.com/SpongePowered/Mixin.git 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

View File

@@ -10,7 +10,7 @@ to access private fields is a good indication that this has happened).
### No IDE ### 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 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 ### IntelliJ
For the initial setup run `./gradlew idea genIntellijRuns`. 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 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. 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 ### The Preprocessor
To support multiple Minecraft versions with the ReplayMod, a [JCP](https://github.com/raydac/java-comment-preprocessor)-inspired preprocessor is used: To support multiple Minecraft versions with the ReplayMod, a [JCP](https://github.com/raydac/java-comment-preprocessor)-inspired preprocessor is used:
```java ```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. 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. 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 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 `:versions:1.8`, `:versions:1.8.9`, etc.). 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. 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: You can pass the original source code through the preprocessor if you wish to develop/debug with another version of Minecraft:
```bash ```bash
./gradle -PmcVersion=10904 :setCoreVersion # switches all sources in src/main to 1.9.4 ./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. followed by a refresh of the project in your IDE.
Make sure to switch back to the most recent branch before committing! Make sure to switch back to the most recent branch before committing!

View File

@@ -21,25 +21,8 @@ group= "com.replaymod"
subprojects { subprojects {
buildscript { buildscript {
repositories { 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' } 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 -> configurations.classpath.resolutionStrategy.eachDependency { dep ->
if (System.getenv('REPRODUCIBLE_BUILD') == '1') return if (System.getenv('REPRODUCIBLE_BUILD') == '1') return
def req = dep.target def req = dep.target
@@ -80,7 +63,7 @@ task setCoreVersion() {
def vars = [MC: project.mcVersion as int, DEV_ENV: 1] def vars = [MC: project.mcVersion as int, DEV_ENV: 1]
project.convertTree(vars, 'src/main/java') project.convertTree(vars, 'src/main/java')
project.convertTree(vars, 'src/main/resources') project.convertTree(vars, 'src/main/resources')
project.convertTree(vars, 'versions/core/build.gradle') project.file('versions/core/mcVersion').write(vars.MC.toString())
} }
} }

View File

@@ -21,6 +21,9 @@ subprojects {
task build(type: Exec) { task build(type: Exec) {
dependsOn applyPatches dependsOn applyPatches
if (project.name == 'forgegradle-1.2') {
dependsOn ':srg2source-3.2:build'
}
if (project.name == 'forgegradle-2.3') { if (project.name == 'forgegradle-2.3') {
dependsOn ':forgeflower:build' dependsOn ':forgeflower:build'
} }
@@ -28,6 +31,8 @@ subprojects {
!rootProject.file('deps/repo/' + [ !rootProject.file('deps/repo/' + [
'mixin': 'org/spongepowered/mixin/0.7.5-SNAPSHOT', 'mixin': 'org/spongepowered/mixin/0.7.5-SNAPSHOT',
'forgeflower': 'net/minecraftforge/forgeflower/1.0.342-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.1': 'net/minecraftforge/gradle/ForgeGradle/2.1-SNAPSHOT',
'forgegradle-2.2': 'net/minecraftforge/gradle/ForgeGradle/2.2-SNAPSHOT', 'forgegradle-2.2': 'net/minecraftforge/gradle/ForgeGradle/2.2-SNAPSHOT',
'forgegradle-2.3': 'net/minecraftforge/gradle/ForgeGradle/2.3-SNAPSHOT', 'forgegradle-2.3': 'net/minecraftforge/gradle/ForgeGradle/2.3-SNAPSHOT',

View File

@@ -6,6 +6,8 @@ a09a4ac520f9ec5ccd16195272fd8ed4c667285f9e129da5acf633bb21a7d174 /com/cloudbees/
754184022345800c2d066eceeaf2f7a88a7c2aaeae23eb1c76ef598854aa9157 /com/fasterxml/jackson/core/jackson-core/2.1.3/jackson-core-2.1.3.jar 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 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 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 4cad4ee2f1c379fa1f6496912fe026d8a4f2febf0a140ff867206b00a22f988f /com/github/abrarsyed/jastyle/jAstyle/1.3/jAstyle-1.3.jar
cd62bdfd946618c26b49451084361edf79cd6ddb3eae1a485ecb05319295896d /com/github/abrarsyed/jastyle/jAstyle/1.3/jAstyle-1.3.pom cd62bdfd946618c26b49451084361edf79cd6ddb3eae1a485ecb05319295896d /com/github/abrarsyed/jastyle/jAstyle/1.3/jAstyle-1.3.pom
bd1f6f51d00168a82c25f89204cfe6cbf120f8b92f5929f8b77ed123375d8488 /com/github/fesh0r/fernflower/adbf29f8/fernflower-adbf29f8.jar 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 485f5625683d9261d32a89c3725df4c361d4b35bfaf866fb68db17833f1fb820 /com/github/MinecraftForge/Srg2Source/dcad1a6/Srg2Source-dcad1a6.pom
f539e2ca00d43e3d2261b7334eb05137f0eb1d3d5e3cc2c2716b0071e27783ed /com/github/MinecraftForge/Srg2Source/ea4ea62/Srg2Source-ea4ea62.jar f539e2ca00d43e3d2261b7334eb05137f0eb1d3d5e3cc2c2716b0071e27783ed /com/github/MinecraftForge/Srg2Source/ea4ea62/Srg2Source-ea4ea62.jar
fe525f413965d4f5f65b70f08b90b3d3f944714f665e2c5636a6e8fec08d3c74 /com/github/MinecraftForge/Srg2Source/ea4ea62/Srg2Source-ea4ea62.pom 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 ecf57aab63509ec0ce3937c2215bc3a2e3cb6357cd11095978db18bd3251731a /com/github/ModCoderPack/MCInjector/7258466/MCInjector-7258466.jar
dc7ed1f4f0ddd8f5ce3b449db944907a5eb2855dbbbc59b08dad1247ebafba33 /com/github/ModCoderPack/MCInjector/7258466/MCInjector-7258466.pom dc7ed1f4f0ddd8f5ce3b449db944907a5eb2855dbbbc59b08dad1247ebafba33 /com/github/ModCoderPack/MCInjector/7258466/MCInjector-7258466.pom
5a3ec92e5507df0c39475a7162104bdaebf9846b3ff057bc8beb62b0e600a58b /com/github/ReplayMod/ReplayStudio/1.10.2/6cfc69b/1.10.2-6cfc69b.pom 2a0317d30d61fb285cc53fa20e2e70f8415cd450bd7dd27316ede1958bd0026a /com/github/ReplayMod/ReplayStudio/1.10.2/3328446/1.10.2-3328446.jar
1e464084d1471e7b11994a62f5b837e8e2d0d2786481c6c63b26c1d91820dd0d /com/github/ReplayMod/ReplayStudio/1.10.2/6cfc69b/1.10.2-6cfc69b.jar 138fe5069cefa345c1f2d7b5a863e9b4c40bd08fb6cb75743b7f8d804fab7a35 /com/github/ReplayMod/ReplayStudio/1.10.2/3328446/1.10.2-3328446.pom
cdae4a16367dd0f6c921e45364fd8a4bc6b8b864a690d30acd97ec5138c4259c /com/github/ReplayMod/ReplayStudio/1.11.2/6cfc69b/1.11.2-6cfc69b.pom 0c2fc451112aea29afea627c6f960c6c2d802bf9ce5171e13141d765cabd1bd3 /com/github/ReplayMod/ReplayStudio/1.11.2/3328446/1.11.2-3328446.jar
a155ed9db00891c34c4c5032b90f1b959cc3b9beeea1dcbb54c5125ee29cf0a8 /com/github/ReplayMod/ReplayStudio/1.11.2/6cfc69b/1.11.2-6cfc69b.jar 54b66a2ed2312077b177f2e9c23250ff1b09d86d3b781fc1c6682e3958693783 /com/github/ReplayMod/ReplayStudio/1.11.2/3328446/1.11.2-3328446.pom
a9d2c26ec4a56ab6714d7887504fffb71b728af91809a2c20b31be0d08e94dc5 /com/github/ReplayMod/ReplayStudio/1.11/6cfc69b/1.11-6cfc69b.pom 72a34922cd66c11c4828ea5a6a59a22c7e84704eba6d6569dcb7946c861c6150 /com/github/ReplayMod/ReplayStudio/1.11/3328446/1.11-3328446.jar
49b230872bf25d3568f90bab46a786f58d8c8f9044255f37c53e65b19a321ca0 /com/github/ReplayMod/ReplayStudio/1.11/6cfc69b/1.11-6cfc69b.jar 1ab36234360fe9f8b1c18a42a87affc36dc7b13dcd1af0f25db647272eccb4cd /com/github/ReplayMod/ReplayStudio/1.11/3328446/1.11-3328446.pom
6acdb31e12dbe3df1e339ca2622484f67f7cd7d7ae55210612f17d028aa4114f /com/github/ReplayMod/ReplayStudio/1.12.2/6cfc69b/1.12.2-6cfc69b.pom 09b16315282ff3d230473ef8c1ebc8ecbedecc9e1cfacc11a25c8cf33804df58 /com/github/ReplayMod/ReplayStudio/1.12.1/3328446/1.12.1-3328446.jar
2beee4b8946d787f228ad3a9c2c6fdd9243f0972406d3bbb182b7929c6291170 /com/github/ReplayMod/ReplayStudio/1.12.2/6cfc69b/1.12.2-6cfc69b.jar 3ada3bfb286bcb6436cb81992a099e9adc6850b694bfea0e58708bf61f88f3f5 /com/github/ReplayMod/ReplayStudio/1.12.1/3328446/1.12.1-3328446.pom
2abd042a4465d3efeb636181c66ab58fa8b4165818d80f59f322e06efc69e386 /com/github/ReplayMod/ReplayStudio/1.12.1/6cfc69b/1.12.1-6cfc69b.pom 09f3bb46fcfe5717824ef98b1fe1ddd168dbaab9bb9733638b372eafdb38e8ea /com/github/ReplayMod/ReplayStudio/1.12.2/3328446/1.12.2-3328446.jar
add89b61bbfd24a2eccffadfa6b5293d8fbb9dd0bde2bc332553208b57faf461 /com/github/ReplayMod/ReplayStudio/1.12.1/6cfc69b/1.12.1-6cfc69b.jar 2f88158c9e54501af126087c411087c68da91a3c59335bca4479f09364b46b64 /com/github/ReplayMod/ReplayStudio/1.12.2/3328446/1.12.2-3328446.pom
0dd0ea826dd559d151ffa6d78f90c88fd0b69062f9f34610283144d8bef75f6d /com/github/ReplayMod/ReplayStudio/1.12/6cfc69b/1.12-6cfc69b.pom 5a2768d35614ff979587e7cbfb1e47ee583d6abae5c37d987d092d937ddab1df /com/github/ReplayMod/ReplayStudio/1.12/3328446/1.12-3328446.jar
d5761025f4ff975753f4f5ae044fb0bba3a0d2e85ac4698c123f3bd80d88bbc5 /com/github/ReplayMod/ReplayStudio/1.12/6cfc69b/1.12-6cfc69b.jar 79bc6a0e171a13a458508f16488716f7a567dfdcaac115a64f8fb989c48dd672 /com/github/ReplayMod/ReplayStudio/1.12/3328446/1.12-3328446.pom
479a762a47c1bcdaf44586594793b2d6a8f4d12b784826373ab80f52f01b3a24 /com/github/ReplayMod/ReplayStudio/1.8/6cfc69b/1.8-6cfc69b.pom dacb755264170eec62dda2733462dcc68bd25d03122b7a88aa90078dade90c9e /com/github/ReplayMod/ReplayStudio/1.7.10/3328446/1.7.10-3328446.jar
cd5b202b4f9857147d4a1c5ead57242dccc10daee7895aeeead4155046f307f9 /com/github/ReplayMod/ReplayStudio/1.8/6cfc69b/1.8-6cfc69b.jar b1cd5eeade89b9a23ea01c7d3399c97cacbc2b88b9f7f24a11783162c7e752b8 /com/github/ReplayMod/ReplayStudio/1.7.10/3328446/1.7.10-3328446.pom
c1e24a8d5dbf77c5f1d0e3d1604a752951ef7036979e4023bbfc7eb08e6e877b /com/github/ReplayMod/ReplayStudio/1.9.4/6cfc69b/1.9.4-6cfc69b.pom 3e71190a4715c3b75c5cc0c370446ddcd140d0aed81f699a1bb8613d22828060 /com/github/ReplayMod/ReplayStudio/1.8/3328446/1.8-3328446.jar
6f734a6825344b818c2d0774410e27e57904c29974a2f8919c4e98e1bdcb82a0 /com/github/ReplayMod/ReplayStudio/1.9.4/6cfc69b/1.9.4-6cfc69b.jar 9481d14fdf1e1240e3e85d8d5d68838d89cbaae26a1c417a7d3947cacb5cbaba /com/github/ReplayMod/ReplayStudio/1.8/3328446/1.8-3328446.pom
12aab719873f618d2d9fecd39792b95391d33f2a63e59a6def4683603c941234 /com/github/ReplayMod/ReplayStudio/1.9.4/3328446/1.9.4-3328446.jar
f73130ca1e7714ad50b9c32871571fb9e8d44d387eaab0253152c3b3c25d5a30 /com/github/ReplayMod/ReplayStudio/1.9.4/3328446/1.9.4-3328446.pom
bfdcda4cbf23f28392384818a1417c2d6df687e15ce77530ef96381393102f8a /com/github/SpongePowered/MixinGradle/dcfaf61/MixinGradle-dcfaf61.jar bfdcda4cbf23f28392384818a1417c2d6df687e15ce77530ef96381393102f8a /com/github/SpongePowered/MixinGradle/dcfaf61/MixinGradle-dcfaf61.jar
3552e0c04817d91d1b6671a051d0e1d952c8b6a8eec57b54e829de9fa3ddf002 /com/github/SpongePowered/MixinGradle/dcfaf61/MixinGradle-dcfaf61.pom 3552e0c04817d91d1b6671a051d0e1d952c8b6a8eec57b54e829de9fa3ddf002 /com/github/SpongePowered/MixinGradle/dcfaf61/MixinGradle-dcfaf61.pom
c6ebd74cd6108b8c372c95b842725ee5bd6d3303ba26cb00f18bc92f80b47956 /com/github/tony19/named-regexp/0.2.3/named-regexp-0.2.3.jar c6ebd74cd6108b8c372c95b842725ee5bd6d3303ba26cb00f18bc92f80b47956 /com/github/tony19/named-regexp/0.2.3/named-regexp-0.2.3.jar
@@ -73,6 +79,8 @@ a5331a0ecb548f9942ab5b93c7ac43c38a21e897763dde1bcdbf0774f416ca6f /com/google/cod
0f1d8369b1e9f1bc4b467c8dcfdd8b59733aad5b5c8419c3a59b2f9abaf04cd2 /com/google/code/gson/gson-parent/2.8.0/gson-parent-2.8.0.pom 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 4838f4f29a027522363cef1bcda1b48808880b0de4953fab6db4121ee27b649b /com/googlecode/jarjar/jarjar/1.1/jarjar-1.1.jar
be4f53c0bc04da4e3d6c65c8f3243d1ea4135e35c7d7dda88af1c582687263d7 /com/googlecode/jarjar/jarjar/1.1/jarjar-1.1.pom 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 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 6890ebacb23d3ab51a5751a830f5269b7e8fdd19d08b7e055bc739f62b4bd174 /com/googlecode/mp4parser/isoparser/1.1.7/isoparser-1.1.7.pom
8c36a80ea613d0b6b8040a17cf837c5bbe3677bc1b06a058a6c174fdb787ebbc /com/google/guava/guava/17.0/guava-17.0.jar 8c36a80ea613d0b6b8040a17cf837c5bbe3677bc1b06a058a6c174fdb787ebbc /com/google/guava/guava/17.0/guava-17.0.jar
@@ -112,6 +120,8 @@ bbc21cab2e0b0c76c9977fdf8b80c311788094d81e6910a2a6e63d80910102c7 /com/gradle/pub
89aa507536b0a93d8c9d3087d738255eefffc002cefa255ebdbd6891b8165447 /com/gradle/publish/plugin-publish-plugin/0.9.1/plugin-publish-plugin-0.9.1.pom 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 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 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 331746fa62cfbc3368260c5a2e660936ad11be612308c120a044e120361d474e /com/martiansoftware/jsap/2.1/jsap-2.1.jar
9acf56a8579c05bedd819d99232363e2bf327e8f73c67598dbd9885a845a3c69 /com/martiansoftware/jsap/2.1/jsap-2.1.pom 9acf56a8579c05bedd819d99232363e2bf327e8f73c67598dbd9885a845a3c69 /com/martiansoftware/jsap/2.1/jsap-2.1.pom
2c149735a093b6c65a27db760896ad5c5b06e29100bb8969937667784fef4ba0 /com/mojang/authlib/1.5.16/authlib-1.5.16.jar 2c149735a093b6c65a27db760896ad5c5b06e29100bb8969937667784fef4ba0 /com/mojang/authlib/1.5.16/authlib-1.5.16.jar
@@ -136,6 +146,8 @@ e3ab95d053a4e180693422bf56592f3c62ff273b0deb1d4a3cb5f76d8fb6994a /com/mojang/rea
b69780ed88a3df0941e10321685bbdbea80b415c5523ced071301189ea295de5 /com/mojang/realms/1.10.19/realms-1.10.19.pom b69780ed88a3df0941e10321685bbdbea80b415c5523ced071301189ea295de5 /com/mojang/realms/1.10.19/realms-1.10.19.pom
9076a115056a4a3ce85b3f8b8c06b8e4ea723d856ab87592d72ac9fd3fa67c9f /com/mojang/realms/1.10.4/realms-1.10.4.jar 9076a115056a4a3ce85b3f8b8c06b8e4ea723d856ab87592d72ac9fd3fa67c9f /com/mojang/realms/1.10.4/realms-1.10.4.jar
0e436798162614ebaa8a04c225ff0100d046848759a3d8a5f5bc3c73dcdaea13 /com/mojang/realms/1.10.4/realms-1.10.4.pom 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 0ad91190cd480af14954d361d7b9ffc53ab3c5344797e3c9fd90c29bf5d28499 /com/mojang/realms/1.6.1/realms-1.6.1.jar
6c724ad415af96416e035a5ae96b113b1df9247d5833fbf73135c66b23263904 /com/mojang/realms/1.6.1/realms-1.6.1.pom 6c724ad415af96416e035a5ae96b113b1df9247d5833fbf73135c66b23263904 /com/mojang/realms/1.6.1/realms-1.6.1.pom
4a6a90ed956609d6cd3a7f84622fcac87d22e9a5d4858c6d1e965af860d07a63 /com/mojang/realms/1.7.59/realms-1.7.59.jar 4a6a90ed956609d6cd3a7f84622fcac87d22e9a5d4858c6d1e965af860d07a63 /com/mojang/realms/1.7.59/realms-1.7.59.jar
@@ -211,20 +223,25 @@ ea6fdd37e68569a378fd149b0ab7cfede1de7fa3e794f4ed81f9018366fbdc51 /de/oceanlabs/m
755416d68281e0c6998fc743929f36e14563510467d1c749d4bf66ba5bf82b19 /de/oceanlabs/mcp/mcp_snapshot/20161220-1.11/mcp_snapshot-20161220-1.11.zip 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 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 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 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 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 d6f165bb39aaa20ee14fdcbbdb0b8fffae38067087f333ec6e0acd3f6666b2ad /de/oceanlabs/mcp/RetroGuard/3.6.6/RetroGuard-3.6.6.pom
* /de/oceanlabs/mcp/versions.json * /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 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 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 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 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 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 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 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 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 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 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 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 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 117ff8d9069d0278585c284ab0817f826f018d9cf4e30f7e1b11f4fbc73013d1 /io/netty/netty-parent/4.1.9.Final/netty-parent-4.1.9.Final.pom
@@ -232,6 +249,8 @@ b4533f3b4029e480288d85187fc9ee6789f3d362c6633d8e9b092ec455ad2f28 /it/unimi/dsi/f
2b3db089f1f78a49a628d9015cca6a95e87421fa04262553cd2c4c79d66d04a7 /it/unimi/dsi/fastutil/7.0.12_mojang/fastutil-7.0.12_mojang.pom 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 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 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 09adf7955baa6bddf57a4bdbf9a91cf690261314969b59a18085ece1e05eccf9 /java3d/vecmath/1.5.2/vecmath-1.5.2.jar
a4aee4668f1b127c95c9afe1b922f4c5a0b1ad879ba811077cb7d0e048dce231 /java3d/vecmath/1.5.2/vecmath-1.5.2.pom a4aee4668f1b127c95c9afe1b922f4c5a0b1ad879ba811077cb7d0e048dce231 /java3d/vecmath/1.5.2/vecmath-1.5.2.pom
a6d2c9c0ddff7702662073b69c6dc4ec83011d22e4eb2dada28aa2d66ee47f97 /jline/jline/2.13/jline-2.13.jar a6d2c9c0ddff7702662073b69c6dc4ec83011d22e4eb2dada28aa2d66ee47f97 /jline/jline/2.13/jline-2.13.jar
@@ -270,6 +289,9 @@ ccccd0a92f76fbb24279691daad9b67f85d80471a37e59e0da76d7754982dfe8 /mc/game/1.8/cl
* /mc/game/cdcd308b7cbd15bc595850ce6557d4ade48cee7a/1.9.4.json * /mc/game/cdcd308b7cbd15bc595850ce6557d4ade48cee7a/1.9.4.json
* /mc/game/cf72a57ff499d6d9ade870b2143ee54958bd33ef/1.12.2.json * /mc/game/cf72a57ff499d6d9ade870b2143ee54958bd33ef/1.12.2.json
* /mc/game/d74a4b45e8877084e1bcc8121012845f28def238/1.8.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 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 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 c4dadeeecaa90c8847902082aee5eb107fcf59c5d0e63a17fcaf273c0e2d2bd1 /net/java/dev/jna/jna/4.4.0/jna-4.4.0.jar
@@ -284,6 +306,8 @@ ea89d5090c8303ba4e9a0056e6d8a20429f3e021411e950bfd9eba3b6e6cf15c /net/java/dev/j
ba27597365ae85a836c1f51819903668b4a1a7490e39e530633cc8a7b40b5500 /net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5.pom 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 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 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 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 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 ea608fe91f9c77a7e91061fab2c4d8eb1b865db4d062ea0fcc12a76db06c9dea /net/md-5/SpecialSource/1.8.2/SpecialSource-1.8.2.jar
@@ -300,6 +324,7 @@ c8396b067c800425d4f4e97ec6879262f2133b5c53575c6b82c4eb6feb22f2a1 /net/minecraftf
ce0229a5c0873e5085bfb67eaea93aeed2e9f95e0534d87eadba5f1864a90778 /net/minecraftforge/forge/1.12-14.21.1.2387/forge-1.12-14.21.1.2387-userdev.jar 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 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 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 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 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 029ba9ca09212fbb850ea78a6b53b96b1288195b4e191194793cf5cf80d5758a /net/minecraftforge/forge/1.8.9-11.15.1.1722/forge-1.8.9-11.15.1.1722.pom
@@ -315,6 +340,8 @@ e74b65b8948446982a506a96176dd8baf4688237ba4903f56ca6f667b6c7ee42 /net/minecraft/
60f08a3d6fc0e7948fd00fc95fad014fae5a5dc7eb991a631e0efee8bfad0b27 /net/sf/jopt-simple/jopt-simple/4.5/jopt-simple-4.5.pom 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 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 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 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 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 9f0c8d50fa4b79b6ff1502dbec8502179d6b9497cacbe17a13074001aed537ec /net/sf/jopt-simple/jopt-simple/5.0.1/jopt-simple-5.0.1.jar
@@ -533,9 +560,14 @@ cb7c954965e6b2946c2f7be78c1e089b530e0444b1fefc2d8079a5681362bfa1 /org/eclipse/eq
d7cd093fdad45c7cc979f44f7166f259607b41cf44a8afe77561594cef4c39d3 /org/eclipse/equinox/registry/maven-metadata.xml d7cd093fdad45c7cc979f44f7166f259607b41cf44a8afe77561594cef4c39d3 /org/eclipse/equinox/registry/maven-metadata.xml
9cddda75f4a1b4469e73f44e7b61a3e897d0f657df4797f9106ffe88c4eeade0 /org/eclipse/jdt/core/compiler/ecj/4.6.1/ecj-4.6.1.jar 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 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 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 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 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 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 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 bddf4d130cb65fdfc1df7df1febde313fc2ff1ac83c8574ff97befd6c515cc30 /org/eclipse/osgi/3.9.1-v20130814-1242/osgi-3.9.1-v20130814-1242.pom
@@ -648,8 +680,11 @@ cd1a673205be12880e73c9c11234d809a901c024a256f4f4c7ae59b0a7aecc75 /org/scala-lang
abe89207b0bfcbcf164c820cbba2c962ab5e9f3a0d0f37d81bde4f6c293a874b /org/scala-lang/scala-compiler/2.11.1/scala-compiler-2.11.1.pom 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 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 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 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 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 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 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 1dffae3ce768d0547e261c96898cf5d9d194bffd5600f597c9751cc6a73d33d4 /org/slf4j/slf4j-parent/1.7.7/slf4j-parent-1.7.7.pom
@@ -668,6 +703,7 @@ c14fb9c32b59cc03251f609416db7c0cff01f811edcccb4f6a865d6e7046bd0b /org/sonatype/f
e56188aa8ce51278006aa90bc7e0f304a81e2f1219f462e7d21f262535cd2795 /org/sonatype/forge/forge-parent/5/forge-parent-5.pom e56188aa8ce51278006aa90bc7e0f304a81e2f1219f462e7d21f262535cd2795 /org/sonatype/forge/forge-parent/5/forge-parent-5.pom
9c5f7cd5226ac8c3798cb1f800c031f7dedc1606dc50dc29567877c8224459a7 /org/sonatype/forge/forge-parent/6/forge-parent-6.pom 9c5f7cd5226ac8c3798cb1f800c031f7dedc1606dc50dc29567877c8224459a7 /org/sonatype/forge/forge-parent/6/forge-parent-6.pom
1678d4120a585d8a630131aeec4c524d928398583b7eab616ee7d5a87f520d3d /org/sonatype/oss/oss-parent/5/oss-parent-5.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 b51f8867c92b6a722499557fc3a1fdea77bdf9ef574722fe90ce436a29559454 /org/sonatype/oss/oss-parent/7/oss-parent-7.pom
fb40265f982548212ff82e362e59732b2187ec6f0d80182885c14ef1f982827a /org/sonatype/oss/oss-parent/9/oss-parent-9.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 5a15fdba22669e0fdd06e10dcce6320879e1f7398fbc910cd0677b50672a78c4 /org/sonatype/plexus/plexus-cipher/1.4/plexus-cipher-1.4.jar
@@ -712,11 +748,17 @@ d1968436fc216c901fb9b82c7e878b50fd1d30091676da95b2edd3a9c0ccf92e /stax/stax-api/
87b13ae136a2bb9299271a0dfe8c351f76661b654ed8fde035c2cabb198cf259 /stax/stax-api/1.0.1/stax-api-1.0.1.pom 87b13ae136a2bb9299271a0dfe8c351f76661b654ed8fde035c2cabb198cf259 /stax/stax-api/1.0.1/stax-api-1.0.1.pom
ad68a86cfd0255a2bc0525ce11ec49640caea7e34ff91eb89c3193dcccd77f05 /trove/trove/1.0.2/trove-1.0.2.jar ad68a86cfd0255a2bc0525ce11ec49640caea7e34ff91eb89c3193dcccd77f05 /trove/trove/1.0.2/trove-1.0.2.jar
83f2682bd3ded1fe417b7e98e7ac86510cd747378eae7e3a5d1d35c7c7f0d2ea /trove/trove/1.0.2/trove-1.0.2.pom 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 3b90f9f7ad968b9588482e3a09b6e7d0d81c6cf7c214c5cecd8120e3ee509ae9 /tv/twitch/twitch/6.5/twitch-6.5.jar
56820ae80518871ff0af04dbfa54e311f6fa54de922d201f71bd2d3f210e94ba /tv/twitch/twitch/6.5/twitch-6.5.pom 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 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 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 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 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 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 75337e7362e489a6f8c9712aeced9e131e82a3ce851cafbd4d03fda284cc7116 /tv/twitch/twitch-platform/6.5/twitch-platform-6.5-natives-windows-64.jar

View File

@@ -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) // 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' dep.useTarget 'net.minecraftforge.gradle:ForgeGradle:2.1-SNAPSHOT'
} }
if (req.group == 'de.oceanlabs.mcp' && req.name == 'mcinjector' && req.version == '3.4-SNAPSHOT') { 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' dep.useTarget 'com.github.ModCoderPack:MCInjector:7258466'
break
}
} }
if (req.group == 'net.minecraftforge.srg2source' && req.name == 'Srg2Source') { if (req.group == 'net.minecraftforge.srg2source' && req.name == 'Srg2Source') {
switch (req.version) { 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': case '3.3-SNAPSHOT':
// Note: 3.3-SNAPSHOT is actually 5f11e29 but that doesn't build due to broken javadoc // Note: 3.3-SNAPSHOT is actually 5f11e29 but that doesn't build due to broken javadoc
dep.useTarget 'com.github.MinecraftForge:Srg2Source:dcad1a6' dep.useTarget 'com.github.MinecraftForge:Srg2Source:dcad1a6'
@@ -95,11 +107,19 @@ allprojects {
configurations.all setupDependencySubstitution configurations.all setupDependencySubstitution
project.tasks.all { task -> project.tasks.all { task ->
if (task.name == 'reobfJar') { if (task.name == 'reobfJar' && task.metaClass.respondsTo(task, 'getJar')) {
task.doLast { task.doLast {
println 'Manually repacking archive after reobfJar task' println 'Manually repacking archive after reobfJar task'
project.plugins.findPlugin(de.johni0702.gradle.ReproducibleBuildsPlugin.class).stripJar(task.getJar()) 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)
}
}
}
} }
} }

View File

@@ -0,0 +1,22 @@
From bf77ac2f526b90bd0c04a2aca7e8d9a1bc90d014 Mon Sep 17 00:00:00 2001
From: Jonas Herzig <me@johni0702.de>
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

View File

@@ -0,0 +1,22 @@
From f9056380f0e5955817df282c2ac1c8e60c9fedc2 Mon Sep 17 00:00:00 2001
From: Jonas Herzig <me@johni0702.de>
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

View File

@@ -0,0 +1,318 @@
From 76ef837020b1d7aa826a01bd2d3a8cdc0704a040 Mon Sep 17 00:00:00 2001
From: Jonas Herzig <me@johni0702.de>
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<String, ZipEntry> entriesByName = new TreeMap<String, ZipEntry>();
- Enumeration<? extends ZipEntry> entries = zip.entries();
- while (entries.hasMoreElements())
- {
- ZipEntry entry = (ZipEntry) entries.nextElement();
- entriesByName.put(entry.getName(), entry);
- }
- Iterator<ZipEntry> 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<FileTree>
@@ -40,7 +37,7 @@ public class DelayedFileTree extends DelayedBase<FileTree>
{
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<T extends UserExtension> extends BasePlugin
@Override
public void execute(Object arg0)
{
- ((ScalaCompile) arg0).getScalaCompileOptions().setUseAnt(false);
}
});
}
--
2.13.6

View File

@@ -0,0 +1,31 @@
From 58e8ce507b599b45479aa0d6d823a4e285aecb58 Mon Sep 17 00:00:00 2001
From: Jonas Herzig <me@johni0702.de>
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<T extends UserExtension> 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<String> 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

View File

@@ -1,5 +1,7 @@
include 'mixin' include 'mixin'
include 'forgeflower' include 'forgeflower'
include 'srg2source-3.2'
include 'forgegradle-1.2'
include 'forgegradle-2.1' include 'forgegradle-2.1'
include 'forgegradle-2.2' include 'forgegradle-2.2'
include 'forgegradle-2.3' include 'forgegradle-2.3'

2
jGui

Submodule jGui updated: 88cf678236...097131041b

View File

@@ -1,16 +1,22 @@
include ':jGui' include ':jGui'
([ [
'core', 'core',
'1.7.10',
'1.8', '1.8',
'1.8.9', '1.8.9',
'1.9.4', '1.9.4',
'1.12' '1.12'
].collect {":jGui:versions:$it"} as String[]).each { ].each { version ->
include it include ":jGui:$version"
project(":jGui:$version").with {
projectDir = file("jGui/versions/$version")
buildFileName = '../common.gradle'
}
} }
def versions = [ def versions = [
'core', 'core',
'1.7.10',
'1.8', '1.8',
'1.8.9', '1.8.9',
'1.9.4', '1.9.4',
@@ -21,6 +27,10 @@ def versions = [
'1.12.1', '1.12.1',
'1.12.2' '1.12.2'
] ]
versions.collect {":versions:$it"}.each { versions.each { version ->
include it include ":$version"
project(":$version").with {
projectDir = file("versions/$version")
buildFileName = '../common.gradle'
}
} }

View File

@@ -3,12 +3,20 @@ package com.replaymod.compat;
import com.replaymod.compat.bettersprinting.DisableBetterSprinting; import com.replaymod.compat.bettersprinting.DisableBetterSprinting;
import com.replaymod.compat.optifine.DisableFastRender; import com.replaymod.compat.optifine.DisableFastRender;
import com.replaymod.compat.oranges17animations.HideInvisibleEntities; import com.replaymod.compat.oranges17animations.HideInvisibleEntities;
import org.apache.logging.log4j.Logger;
//#if MC>=10800
import com.replaymod.compat.shaders.ShaderBeginRender; import com.replaymod.compat.shaders.ShaderBeginRender;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.EventBus; 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.*; import static com.replaymod.core.versions.MCVer.*;
@@ -16,7 +24,9 @@ import static com.replaymod.core.versions.MCVer.*;
version = "@MOD_VERSION@", version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*", acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true, clientSideOnly = true,
//#endif
useMetadata = true) useMetadata = true)
public class ReplayModCompat { public class ReplayModCompat {
public static final String MOD_ID = "replaymod-compat"; public static final String MOD_ID = "replaymod-compat";
@@ -31,7 +41,9 @@ public class ReplayModCompat {
@Mod.EventHandler @Mod.EventHandler
public void init(FMLInitializationEvent event) { public void init(FMLInitializationEvent event) {
EventBus bus = FML_BUS; EventBus bus = FML_BUS;
//#if MC>=10800
bus.register(new ShaderBeginRender()); bus.register(new ShaderBeginRender());
//#endif
bus.register(new DisableFastRender()); bus.register(new DisableFastRender());
bus.register(new HideInvisibleEntities()); bus.register(new HideInvisibleEntities());
DisableBetterSprinting.register(); DisableBetterSprinting.register();

View File

@@ -8,13 +8,6 @@ import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraftforge.client.event.GuiOpenEvent; import net.minecraftforge.client.event.GuiOpenEvent;
import net.minecraftforge.common.MinecraftForge; 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 //#if MC>=10904
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
@@ -26,10 +19,30 @@ import net.minecraft.world.World;
import javax.annotation.Nullable; import javax.annotation.Nullable;
//#else //#else
//#if MC>= 10800
//$$ import net.minecraft.util.BlockPos; //$$ import net.minecraft.util.BlockPos;
//#endif
//$$ import net.minecraft.world.IWorldAccess; //$$ import net.minecraft.world.IWorldAccess;
//#endif //#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 java.util.Collections;
import static com.replaymod.compat.ReplayModCompat.LOGGER; import static com.replaymod.compat.ReplayModCompat.LOGGER;
@@ -106,7 +119,11 @@ public class DisableBetterSprinting {
//#endif //#endif
{ {
@Override @Override
//#if MC>=10800
public void onEntityRemoved(Entity entityIn) { 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)) { 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. // 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. // 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) {} @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 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 onEntityAdded(Entity entityIn) {}
@Override public void broadcastSound(int p_180440_1_, BlockPos p_180440_2_, int p_180440_3_) {} @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) {} @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 //#if MC>=10904
@Override public void notifyBlockUpdate(World worldIn, BlockPos pos, IBlockState oldState, IBlockState newState, int flags) {} @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) {} @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
//#endif //#endif
//#else //#else
//#if MC>=10800
//$$ @Override public void markBlockForUpdate(BlockPos pos) {} //$$ @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 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 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 //#if MC>=10809
//$$ @Override public void playAuxSFX(EntityPlayer p_180439_1_, int p_180439_2_, BlockPos blockPosIn, int p_180439_4_) {} //$$ @Override public void playAuxSFX(EntityPlayer p_180439_1_, int p_180439_2_, BlockPos blockPosIn, int p_180439_4_) {}
//#else //#else
//#if MC>=10800
//$$ @Override public void playAusSFX(EntityPlayer p_180439_1_, int p_180439_2_, BlockPos blockPosIn, int p_180439_4_) {} //$$ @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
//#endif //#endif
} }

View File

@@ -3,13 +3,18 @@ package com.replaymod.compat.mapwriter.mixin;
import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.ReplayModReplay;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.multiplayer.ServerData;
import net.minecraftforge.fml.common.Loader;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 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 * Approximately this for <1.12: https://github.com/Vectron/mapwriter/commit/68234520c7a3a0ae8201a085d7e66369900586ac
*/ */

View File

@@ -2,8 +2,14 @@ package com.replaymod.compat.optifine;
import com.replaymod.render.events.ReplayRenderEvent; import com.replaymod.render.events.ReplayRenderEvent;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
//#if MC>=10800
import net.minecraftforge.fml.client.FMLClientHandler; import net.minecraftforge.fml.client.FMLClientHandler;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; 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 { public class DisableFastRender {

View File

@@ -3,9 +3,16 @@ package com.replaymod.compat.oranges17animations;
import com.replaymod.replay.camera.CameraEntity; import com.replaymod.replay.camera.CameraEntity;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraftforge.client.event.RenderLivingEvent; import net.minecraftforge.client.event.RenderLivingEvent;
//#if MC>=10800
import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; 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.*; import static com.replaymod.core.versions.MCVer.*;

View File

@@ -1,3 +1,4 @@
//#if MC>=10800
package com.replaymod.compat.shaders; package com.replaymod.compat.shaders;
import com.replaymod.render.hooks.EntityRendererHandler; import com.replaymod.render.hooks.EntityRendererHandler;
@@ -37,3 +38,4 @@ public class ShaderBeginRender {
} }
} }
//#endif

View File

@@ -1,3 +1,4 @@
//#if MC>=10800
package com.replaymod.compat.shaders; package com.replaymod.compat.shaders;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
@@ -51,3 +52,4 @@ public class ShaderReflection {
} }
} }
} }
//#endif

View File

@@ -1,3 +1,4 @@
//#if MC>=10800
package com.replaymod.compat.shaders.mixin; package com.replaymod.compat.shaders.mixin;
import com.replaymod.compat.shaders.ShaderReflection; import com.replaymod.compat.shaders.ShaderReflection;
@@ -26,3 +27,4 @@ public abstract class MixinShaderEntityRenderer {
} }
} }
} }
//#endif

View File

@@ -1,3 +1,4 @@
//#if MC>=10800
package com.replaymod.compat.shaders.mixin; package com.replaymod.compat.shaders.mixin;
import com.replaymod.render.hooks.EntityRendererHandler; import com.replaymod.render.hooks.EntityRendererHandler;
@@ -27,3 +28,4 @@ public abstract class MixinShaderRenderChunk {
} }
//#endif

View File

@@ -1,3 +1,4 @@
//#if MC>=10800
package com.replaymod.compat.shaders.mixin; package com.replaymod.compat.shaders.mixin;
import com.replaymod.compat.shaders.ShaderReflection; import com.replaymod.compat.shaders.ShaderReflection;
@@ -38,3 +39,4 @@ public abstract class MixinShaderRenderGlobal {
} }
} }
//#endif

View File

@@ -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

View File

@@ -7,17 +7,27 @@ import net.minecraft.client.settings.KeyBinding;
import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReport;
import net.minecraft.crash.CrashReportCategory; import net.minecraft.crash.CrashReportCategory;
import net.minecraft.util.ReportedException; import net.minecraft.util.ReportedException;
import org.lwjgl.input.Keyboard;
//#if MC>=10800
import net.minecraftforge.fml.client.registry.ClientRegistry; import net.minecraftforge.fml.client.registry.ClientRegistry;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.InputEvent; import net.minecraftforge.fml.common.gameevent.InputEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent; 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.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import static com.replaymod.core.versions.MCVer.*;
public class KeyBindingRegistry { public class KeyBindingRegistry {
private Map<String, KeyBinding> keyBindings = new HashMap<String, KeyBinding>(); private Map<String, KeyBinding> keyBindings = new HashMap<String, KeyBinding>();
private Multimap<KeyBinding, Runnable> keyBindingHandlers = ArrayListMultimap.create(); private Multimap<KeyBinding, Runnable> keyBindingHandlers = ArrayListMultimap.create();
@@ -64,7 +74,7 @@ public class KeyBindingRegistry {
public void handleRepeatedKeyBindings() { public void handleRepeatedKeyBindings() {
for (Map.Entry<KeyBinding, Collection<Runnable>> entry : repeatedKeyBindingHandlers.asMap().entrySet()) { for (Map.Entry<KeyBinding, Collection<Runnable>> entry : repeatedKeyBindingHandlers.asMap().entrySet()) {
if (entry.getKey().isKeyDown()) { if (isKeyDown(entry.getKey())) {
invokeKeyBindingHandlers(entry.getKey(), entry.getValue()); invokeKeyBindingHandlers(entry.getKey(), entry.getValue());
} }
} }

View File

@@ -1,17 +1,29 @@
package com.replaymod.core; package com.replaymod.core;
import net.minecraftforge.fml.relauncher.CoreModManager;
import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.spongepowered.asm.launch.MixinBootstrap; import org.spongepowered.asm.launch.MixinBootstrap;
import org.spongepowered.asm.mixin.Mixins; 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.io.File;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.net.URL; import java.net.URL;
import java.security.CodeSource; import java.security.CodeSource;
import java.util.Map; import java.util.Map;
@IFMLLoadingPlugin.TransformerExclusions("com.replaymod.core.asm.")
public class LoadingPlugin implements IFMLLoadingPlugin { public class LoadingPlugin implements IFMLLoadingPlugin {
public LoadingPlugin() { public LoadingPlugin() {
@@ -35,6 +47,9 @@ public class LoadingPlugin implements IFMLLoadingPlugin {
CoreModManager.getIgnoredMods().remove(file.getName()); CoreModManager.getIgnoredMods().remove(file.getName());
//#else //#else
//$$ CoreModManager.getLoadedCoremods().remove(file.getName()); //$$ CoreModManager.getLoadedCoremods().remove(file.getName());
//#if MC<=10710
//$$ CoreModManager.getReparseableCoremods().add(file.getName());
//#endif
//#endif //#endif
} }
} catch (URISyntaxException e) { } catch (URISyntaxException e) {
@@ -48,8 +63,17 @@ public class LoadingPlugin implements IFMLLoadingPlugin {
@Override @Override
public String[] getASMTransformerClass() { public String[] getASMTransformerClass() {
//#if MC>=10800
return new String[]{ return new String[]{
}; };
//#else
//$$ List<String> 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 @Override

View File

@@ -12,11 +12,23 @@ import lombok.Getter;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.resources.FolderResourcePack; import net.minecraft.client.resources.FolderResourcePack;
import net.minecraft.client.resources.IResourcePack; 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.minecraft.util.ResourceLocation;
import net.minecraftforge.common.config.Configuration; 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.client.FMLClientHandler;
import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.Mod; 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.EventBus;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent; 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 //#else
//$$ import net.minecraft.util.ChatComponentText; //$$ import cpw.mods.fml.common.Loader;
//$$ import net.minecraft.util.ChatComponentTranslation; //$$ import cpw.mods.fml.common.Mod;
//$$ import net.minecraft.util.ChatStyle; //$$ import cpw.mods.fml.common.Mod.EventHandler;
//$$ import net.minecraft.util.EnumChatFormatting; //$$ import cpw.mods.fml.common.Mod.Instance;
//$$ import net.minecraft.util.IChatComponent; //$$ 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 //#endif
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
@@ -57,8 +73,10 @@ import static com.replaymod.core.versions.MCVer.*;
version = "@MOD_VERSION@", version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*", acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true, clientSideOnly = true,
updateJSON = "https://raw.githubusercontent.com/ReplayMod/ReplayMod/master/versions.json", updateJSON = "https://raw.githubusercontent.com/ReplayMod/ReplayMod/master/versions.json",
//#endif
guiFactory = "com.replaymod.core.gui.GuiFactory") guiFactory = "com.replaymod.core.gui.GuiFactory")
public class ReplayMod { public class ReplayMod {
@@ -67,18 +85,7 @@ public class ReplayMod {
} }
@Getter(lazy = true) @Getter(lazy = true)
private static final String minecraftVersion = parseMinecraftVersion(); private static final String minecraftVersion = Loader.MC_VERSION;
private static String parseMinecraftVersion() {
CrashReport crashReport = new CrashReport("", new Throwable());
@SuppressWarnings("unchecked")
List<CrashReportCategory.Entry> list = crashReport.getCategory().children;
for (CrashReportCategory.Entry entry : list) {
if ("Minecraft Version".equals(entry.getKey())) {
return entry.getValue();
}
}
return "Unknown";
}
public static final String MOD_ID = "replaymod"; public static final String MOD_ID = "replaymod";
@@ -127,6 +134,8 @@ public class ReplayMod {
//#ifdef DEV_ENV //#ifdef DEV_ENV
static { // Note: even preInit is too late and we'd have to issue another resource reload static { // Note: even preInit is too late and we'd have to issue another resource reload
@SuppressWarnings("unchecked")
List<IResourcePack> defaultResourcePacks = mc.defaultResourcePacks;
FolderResourcePack jGuiResourcePack = new FolderResourcePack(new File("../jGui/src/main/resources")) { FolderResourcePack jGuiResourcePack = new FolderResourcePack(new File("../jGui/src/main/resources")) {
@Override @Override
protected InputStream getInputStreamByName(String resourceName) throws IOException { protected InputStream getInputStreamByName(String resourceName) throws IOException {
@@ -140,9 +149,23 @@ public class ReplayMod {
} }
} }
}; };
@SuppressWarnings("unchecked")
List<IResourcePack> defaultResourcePacks = mc.defaultResourcePacks;
defaultResourcePacks.add(jGuiResourcePack); 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 //#endif
@@ -152,6 +175,9 @@ public class ReplayMod {
new MainMenuHandler().register(); new MainMenuHandler().register();
//#if MC<=10710
//$$ FML_BUS.register(this); // For runLater(Runnable)
//#endif
FML_BUS.register(keyBindingRegistry); FML_BUS.register(keyBindingRegistry);
getKeyBindingRegistry().registerKeyBinding("replaymod.input.settings", 0, () -> { getKeyBindingRegistry().registerKeyBinding("replaymod.input.settings", 0, () -> {
@@ -163,8 +189,11 @@ public class ReplayMod {
public void postInit(FMLPostInitializationEvent event) throws IOException { public void postInit(FMLPostInitializationEvent event) throws IOException {
settingsRegistry.save(); // Save default values to disk settingsRegistry.save(); // Save default values to disk
// 1.7.10 crashes when render distance > 16
//#if MC>=10800
if(!FMLClientHandler.instance().hasOptifine()) if(!FMLClientHandler.instance().hasOptifine())
GameSettings.Options.RENDER_DISTANCE.setValueMax(64f); GameSettings.Options.RENDER_DISTANCE.setValueMax(64f);
//#endif
testIfMoeshAndExitMinecraft(); testIfMoeshAndExitMinecraft();
@@ -212,6 +241,7 @@ public class ReplayMod {
public void runLater(Runnable runnable) { public void runLater(Runnable runnable) {
if (mc.isCallingFromMinecraftThread() && inRunLater) { if (mc.isCallingFromMinecraftThread() && inRunLater) {
EventBus bus = FORGE_BUS; EventBus bus = FORGE_BUS;
//#if MC>=10800
bus.register(new Object() { bus.register(new Object() {
@SubscribeEvent @SubscribeEvent
public void onRenderTick(TickEvent.RenderTickEvent event) { public void onRenderTick(TickEvent.RenderTickEvent event) {
@@ -221,13 +251,21 @@ public class ReplayMod {
} }
} }
}); });
//#else
//$$ bus.register(new RunLaterHelper(runnable));
//#endif
return; return;
} }
//#if MC>=10800
//#if MC<10904 //#if MC<10904
//$$ @SuppressWarnings("unchecked") //$$ @SuppressWarnings("unchecked")
//#endif //#endif
Queue<FutureTask<?>> tasks = mc.scheduledTasks; Queue<FutureTask<?>> tasks = mc.scheduledTasks;
synchronized (mc.scheduledTasks) { synchronized (mc.scheduledTasks) {
//#else
//$$ Queue<ListenableFutureTask<?>> tasks = scheduledTasks;
//$$ synchronized (scheduledTasks) {
//#endif
tasks.add(ListenableFutureTask.create(() -> { tasks.add(ListenableFutureTask.create(() -> {
inRunLater = true; inRunLater = true;
try { 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<ListenableFutureTask<?>> 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() { public String getVersion() {
return getContainer().getVersion(); return getContainer().getVersion();
} }

View File

@@ -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

View File

@@ -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<Method> 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<Method> findEligibleMethods(ClassReader reader) {
//$$ Set<Method> 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

View File

@@ -3,7 +3,12 @@ package com.replaymod.core.events;
import com.replaymod.core.SettingsRegistry; import com.replaymod.core.SettingsRegistry;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.Event; import net.minecraftforge.fml.common.eventhandler.Event;
//#else
//$$ import cpw.mods.fml.common.eventhandler.Event;
//#endif
@RequiredArgsConstructor @RequiredArgsConstructor
public class SettingsChangedEvent extends Event { public class SettingsChangedEvent extends Event {

View File

@@ -3,7 +3,12 @@ package com.replaymod.core.gui;
import com.replaymod.core.ReplayMod; import com.replaymod.core.ReplayMod;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.GuiScreen;
//#if MC>=10800
import net.minecraftforge.fml.client.IModGuiFactory; import net.minecraftforge.fml.client.IModGuiFactory;
//#else
//$$ import cpw.mods.fml.client.IModGuiFactory;
//#endif
import java.util.Set; import java.util.Set;

View File

@@ -6,9 +6,14 @@ import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.GuiScreenRealmsProxy; import net.minecraft.client.gui.GuiScreenRealmsProxy;
import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import org.lwjgl.opengl.GL11; 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 java.io.IOException;
import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.core.versions.MCVer.*;
@@ -50,6 +55,7 @@ public class MainMenuHandler {
} }
} }
//#if MC>=11202
private static class RealmsNotificationProxy extends GuiScreen { private static class RealmsNotificationProxy extends GuiScreen {
private final GuiScreenRealmsProxy proxy; private final GuiScreenRealmsProxy proxy;
private final int offset; private final int offset;
@@ -59,12 +65,10 @@ public class MainMenuHandler {
this.offset = offset; this.offset = offset;
} }
//#if MC>=11202
@Override @Override
public void setGuiSize(int w, int h) { public void setGuiSize(int w, int h) {
proxy.setGuiSize(w, h); proxy.setGuiSize(w, h);
} }
//#endif
@Override @Override
public void initGui() { public void initGui() {
@@ -93,4 +97,5 @@ public class MainMenuHandler {
proxy.onGuiClosed(); proxy.onGuiClosed();
} }
} }
//#endif
} }

View File

@@ -2,13 +2,23 @@ package com.replaymod.core.utils;
import com.replaymod.replaystudio.data.ModInfo; import com.replaymod.replaystudio.data.ModInfo;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.ModContainer;
//#if MC>=11200 //#if MC>=11200
import net.minecraftforge.registries.ForgeRegistry; import net.minecraftforge.registries.ForgeRegistry;
import net.minecraftforge.registries.RegistryManager; import net.minecraftforge.registries.RegistryManager;
//#else //#else
//#if MC>=10800
//$$ import net.minecraftforge.fml.common.registry.GameData; //$$ 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 //#endif
import java.util.*; import java.util.*;
@@ -30,6 +40,7 @@ public class ModCompat {
.map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion())) .map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion()))
.collect(Collectors.toList()); .collect(Collectors.toList());
//#else //#else
//#if MC>=10800
//$$ return Stream.concat( //$$ return Stream.concat(
//$$ ((Set<ResourceLocation>) GameData.getBlockRegistry().getKeys()).stream(), //$$ ((Set<ResourceLocation>) GameData.getBlockRegistry().getKeys()).stream(),
//$$ ((Set<ResourceLocation>) GameData.getItemRegistry().getKeys()).stream() //$$ ((Set<ResourceLocation>) GameData.getItemRegistry().getKeys()).stream()
@@ -37,6 +48,18 @@ public class ModCompat {
//$$ .map(String::toLowerCase).map(ignoreCaseMap::get).filter(mod -> mod != null) //$$ .map(String::toLowerCase).map(ignoreCaseMap::get).filter(mod -> mod != null)
//$$ .map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion())) //$$ .map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion()))
//$$ .collect(Collectors.toList()); //$$ .collect(Collectors.toList());
//#else
//$$ return Stream.concat(
//$$ ((Set<String>) GameData.getBlockRegistry().getKeys()).stream(),
//$$ ((Set<String>) 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 //#endif
} }

View File

@@ -7,6 +7,10 @@ import net.minecraft.network.play.server.SPacketCustomPayload;
//$$ import net.minecraft.network.play.server.S3FPacketCustomPayload; //$$ import net.minecraft.network.play.server.S3FPacketCustomPayload;
//#endif //#endif
//#if MC<=10710
//$$ import io.netty.buffer.Unpooled;
//#endif
import static com.replaymod.core.versions.MCVer.readString; import static com.replaymod.core.versions.MCVer.readString;
/** /**
@@ -25,7 +29,11 @@ public class Restrictions {
//#else //#else
//$$ public String handle(S3FPacketCustomPayload packet) { //$$ public String handle(S3FPacketCustomPayload packet) {
//#endif //#endif
//#if MC>=10800
PacketBuffer buffer = packet.getBufferData(); PacketBuffer buffer = packet.getBufferData();
//#else
//$$ PacketBuffer buffer = new PacketBuffer(Unpooled.wrappedBuffer(packet.func_149168_d()));
//#endif
while (buffer.isReadable()) { while (buffer.isReadable()) {
String name = readString(buffer, 64); String name = readString(buffer, 64);
boolean active = buffer.readBoolean(); boolean active = buffer.readBoolean();

View File

@@ -19,8 +19,6 @@ import de.johni0702.minecraft.gui.layout.VerticalLayout;
import de.johni0702.minecraft.gui.popup.GuiInfoPopup; import de.johni0702.minecraft.gui.popup.GuiInfoPopup;
import de.johni0702.minecraft.gui.utils.Colors; import de.johni0702.minecraft.gui.utils.Colors;
import net.minecraft.client.gui.GuiScreen; 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.crash.CrashReport;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import org.apache.commons.io.Charsets; import org.apache.commons.io.Charsets;
@@ -30,6 +28,17 @@ import org.lwjgl.input.Keyboard;
import org.lwjgl.util.Dimension; import org.lwjgl.util.Dimension;
import org.lwjgl.util.ReadableDimension; 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.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
@@ -55,7 +64,6 @@ import java.util.Date;
import java.util.UUID; import java.util.UUID;
import java.util.function.Consumer; import java.util.function.Consumer;
import static com.replaymod.core.versions.MCVer.getConnection;
import static net.minecraft.client.Minecraft.getMinecraft; import static net.minecraft.client.Minecraft.getMinecraft;
public class Utils { public class Utils {
@@ -162,6 +170,7 @@ public class Utils {
} }
public static ResourceLocation getResourceLocationForPlayerUUID(UUID uuid) { public static ResourceLocation getResourceLocationForPlayerUUID(UUID uuid) {
//#if MC>=10800
NetworkPlayerInfo info = getConnection(getMinecraft()).getPlayerInfo(uuid); NetworkPlayerInfo info = getConnection(getMinecraft()).getPlayerInfo(uuid);
ResourceLocation skinLocation; ResourceLocation skinLocation;
if (info != null && info.hasLocationSkin()) { if (info != null && info.hasLocationSkin()) {
@@ -170,6 +179,13 @@ public class Utils {
skinLocation = DefaultPlayerSkin.getDefaultSkin(uuid); skinLocation = DefaultPlayerSkin.getDefaultSkin(uuid);
} }
return skinLocation; 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() { public static boolean isCtrlDown() {

View File

@@ -11,9 +11,10 @@ import net.minecraft.client.multiplayer.ServerData;
import net.minecraft.client.multiplayer.ServerList; import net.minecraft.client.multiplayer.ServerList;
import net.minecraft.client.multiplayer.WorldClient; import net.minecraft.client.multiplayer.WorldClient;
import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.client.network.NetHandlerPlayClient;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.client.resources.ResourcePackRepository; import net.minecraft.client.resources.ResourcePackRepository;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.crash.CrashReportCategory; import net.minecraft.crash.CrashReportCategory;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.EntityLivingBase;
@@ -21,13 +22,11 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.network.Packet; import net.minecraft.network.Packet;
import net.minecraft.network.PacketBuffer; import net.minecraft.network.PacketBuffer;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.WorldType;
import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.Chunk;
import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.client.event.RenderLivingEvent; import net.minecraftforge.client.event.RenderLivingEvent;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.eventhandler.EventBus;
//#if MC>=10904 //#if MC>=10904
//#if MC>=11200 //#if MC>=11200
@@ -37,16 +36,39 @@ import net.minecraft.client.renderer.BufferBuilder;
//#endif //#endif
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
//#else //#else
//#if MC>=10800
//$$ import net.minecraft.client.renderer.WorldRenderer; //$$ import net.minecraft.client.renderer.WorldRenderer;
//#endif
//$$ import net.minecraft.util.MathHelper; //$$ import net.minecraft.util.MathHelper;
//#endif //#endif
//#if MC>=10809 //#if MC>=10809
import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
//#else //#else
//#if MC>=10800
//$$ import net.minecraftforge.fml.common.FMLCommonHandler; //$$ 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 //#endif
import java.io.File; import java.io.File;
import java.io.IOException;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
@@ -143,7 +165,15 @@ public class MCVer {
//#if MC>=11102 //#if MC>=11102
return buffer.readString(max); return buffer.readString(max);
//#else //#else
//#if MC>=10800
//$$ return buffer.readStringFromBuffer(max); //$$ return buffer.readStringFromBuffer(max);
//#else
//$$ try {
//$$ return buffer.readStringFromBuffer(max);
//$$ } catch (IOException e) {
//$$ throw new DecoderException(e);
//$$ }
//#endif
//#endif //#endif
} }
@@ -179,12 +209,34 @@ public class MCVer {
//#endif //#endif
} }
//#if MC>=10800
public static WorldType WorldType_DEBUG_ALL_BLOCK_STATES public static WorldType WorldType_DEBUG_ALL_BLOCK_STATES
//#if MC>=11200 //#if MC>=11200
= WorldType.DEBUG_ALL_BLOCK_STATES; = WorldType.DEBUG_ALL_BLOCK_STATES;
//#else //#else
//$$ = WorldType.DEBUG_WORLD; //$$ = WorldType.DEBUG_WORLD;
//#endif //#endif
//#endif
//#if MC>=10800
public static Entity getRenderViewEntity(Minecraft mc) {
return mc.getRenderViewEntity();
}
//#else
//$$ public static EntityLivingBase getRenderViewEntity(Minecraft mc) {
//$$ return mc.renderViewEntity;
//$$ }
//#endif
//#if MC>=10800
public static void setRenderViewEntity(Minecraft mc, Entity entity) {
mc.setRenderViewEntity(entity);
}
//#else
//$$ public static void setRenderViewEntity(Minecraft mc, EntityLivingBase entity) {
//$$ mc.renderViewEntity = entity;
//$$ }
//#endif
public static EntityPlayerSP player(Minecraft mc) { public static EntityPlayerSP player(Minecraft mc) {
//#if MC>=11102 //#if MC>=11102
@@ -233,7 +285,11 @@ public class MCVer {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static Collection<Entity>[] getEntityLists(Chunk chunk) { public static Collection<Entity>[] getEntityLists(Chunk chunk) {
//#if MC>=10800
return chunk.getEntityLists(); return chunk.getEntityLists();
//#else
//$$ return chunk.entityLists;
//#endif
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@@ -241,19 +297,43 @@ public class MCVer {
return world.playerEntities; return world.playerEntities;
} }
public static GlStateManager.BooleanState fog(GlStateManager.FogState fogState) { public static BooleanState fog() {
//#if MC>=10809 //#if MC>=10809
return fogState.fog; return GlStateManager.fogState.fog;
//#else //#else
//$$ return fogState.field_179049_a; //#if MC>=10800
//$$ return GlStateManager.fogState.field_179049_a;
//#else
//$$ return GLStateTracker.getInstance().fog;
//#endif
//#endif //#endif
} }
public static void fog(GlStateManager.FogState fogState, GlStateManager.BooleanState fog) { public static void fog(BooleanState fog) {
//#if MC>=10809 //#if MC>=10809
fogState.fog = fog; GlStateManager.fogState.fog = fog;
//#else //#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 //#endif
} }
@@ -289,7 +369,22 @@ public class MCVer {
//$$ return repo.setResourcePackInstance(file); //$$ return repo.setResourcePackInstance(file);
//#endif //#endif
//#else //#else
//#if MC>=10800
//$$ return repo.func_177319_a(file); //$$ 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 //#endif
} }
@@ -297,7 +392,11 @@ public class MCVer {
//#if MC>=10904 //#if MC>=10904
Tessellator.getInstance().getBuffer().setTranslation(x, y, z); Tessellator.getInstance().getBuffer().setTranslation(x, y, z);
//#else //#else
//#if MC>=10800
//$$ Tessellator.getInstance().getWorldRenderer().setTranslation(x, y, z); //$$ Tessellator.getInstance().getWorldRenderer().setTranslation(x, y, z);
//#else
//$$ Tessellator.instance.setTranslation(x, y, z);
//#endif
//#endif //#endif
} }
@@ -308,7 +407,11 @@ public class MCVer {
//#if MC>=10809 //#if MC>=10809
//$$ Tessellator.getInstance().getWorldRenderer().begin(mode, DefaultVertexFormats.POSITION_COLOR); //$$ Tessellator.getInstance().getWorldRenderer().begin(mode, DefaultVertexFormats.POSITION_COLOR);
//#else //#else
//#if MC>=10800
//$$ Tessellator.getInstance().getWorldRenderer().startDrawing(mode); //$$ Tessellator.getInstance().getWorldRenderer().startDrawing(mode);
//#else
//$$ Tessellator.instance.startDrawing(mode);
//#endif
//#endif //#endif
//#endif //#endif
} }
@@ -321,7 +424,11 @@ public class MCVer {
//$$ VertexBuffer worldRenderer = Tessellator.getInstance().getBuffer(); //$$ VertexBuffer worldRenderer = Tessellator.getInstance().getBuffer();
//#endif //#endif
//#else //#else
//#if MC>=10800
//$$ WorldRenderer worldRenderer = Tessellator.getInstance().getWorldRenderer(); //$$ WorldRenderer worldRenderer = Tessellator.getInstance().getWorldRenderer();
//#else
//$$ Tessellator worldRenderer = Tessellator.instance;
//#endif
//#endif //#endif
//#if MC>=10809 //#if MC>=10809
worldRenderer.pos(x, y, z).color(r, g, b, a).endVertex(); worldRenderer.pos(x, y, z).color(r, g, b, a).endVertex();
@@ -338,7 +445,11 @@ public class MCVer {
//#if MC>=10809 //#if MC>=10809
//$$ Tessellator.getInstance().getWorldRenderer().begin(mode, DefaultVertexFormats.POSITION_TEX); //$$ Tessellator.getInstance().getWorldRenderer().begin(mode, DefaultVertexFormats.POSITION_TEX);
//#else //#else
//#if MC>=10800
//$$ Tessellator.getInstance().getWorldRenderer().startDrawing(mode); //$$ Tessellator.getInstance().getWorldRenderer().startDrawing(mode);
//#else
//$$ Tessellator.instance.startDrawing(mode);
//#endif
//#endif //#endif
//#endif //#endif
} }
@@ -351,7 +462,11 @@ public class MCVer {
//$$ VertexBuffer worldRenderer = Tessellator.getInstance().getBuffer(); //$$ VertexBuffer worldRenderer = Tessellator.getInstance().getBuffer();
//#endif //#endif
//#else //#else
//#if MC>=10800
//$$ WorldRenderer worldRenderer = Tessellator.getInstance().getWorldRenderer(); //$$ WorldRenderer worldRenderer = Tessellator.getInstance().getWorldRenderer();
//#else
//$$ Tessellator worldRenderer = Tessellator.instance;
//#endif
//#endif //#endif
//#if MC>=10809 //#if MC>=10809
worldRenderer.pos(x, y, z).tex(u, v).endVertex(); worldRenderer.pos(x, y, z).tex(u, v).endVertex();
@@ -367,7 +482,11 @@ public class MCVer {
//#if MC>=10809 //#if MC>=10809
//$$ Tessellator.getInstance().getWorldRenderer().begin(mode, DefaultVertexFormats.POSITION_TEX_COLOR); //$$ Tessellator.getInstance().getWorldRenderer().begin(mode, DefaultVertexFormats.POSITION_TEX_COLOR);
//#else //#else
//#if MC>=10800
//$$ Tessellator.getInstance().getWorldRenderer().startDrawing(mode); //$$ Tessellator.getInstance().getWorldRenderer().startDrawing(mode);
//#else
//$$ Tessellator.instance.startDrawing(mode);
//#endif
//#endif //#endif
//#endif //#endif
} }
@@ -380,7 +499,11 @@ public class MCVer {
//$$ VertexBuffer worldRenderer = Tessellator.getInstance().getBuffer(); //$$ VertexBuffer worldRenderer = Tessellator.getInstance().getBuffer();
//#endif //#endif
//#else //#else
//#if MC>=10800
//$$ WorldRenderer worldRenderer = Tessellator.getInstance().getWorldRenderer(); //$$ WorldRenderer worldRenderer = Tessellator.getInstance().getWorldRenderer();
//#else
//$$ Tessellator worldRenderer = Tessellator.instance;
//#endif
//#endif //#endif
//#if MC>=10809 //#if MC>=10809
worldRenderer.pos(x, y, z).tex(u, v).color(r, g, b, a).endVertex(); worldRenderer.pos(x, y, z).tex(u, v).color(r, g, b, a).endVertex();
@@ -389,6 +512,23 @@ public class MCVer {
//$$ worldRenderer.addVertexWithUV(x, y, z, u, v); //$$ worldRenderer.addVertexWithUV(x, y, z, u, v);
//#endif //#endif
} }
public static Tessellator Tessellator_getInstance() {
//#if MC>=10800
return Tessellator.getInstance();
//#else
//$$ return Tessellator.instance;
//#endif
}
public static RenderManager getRenderManager() {
//#if MC>=10800
return Minecraft.getMinecraft().getRenderManager();
//#else
//$$ return RenderManager.instance;
//#endif
}
public static int floor(double val) { public static int floor(double val) {
//#if MC>=11102 //#if MC>=11102
return MathHelper.floor(val); return MathHelper.floor(val);
@@ -404,4 +544,21 @@ public class MCVer {
public static float sin(float val) { public static float sin(float val) {
return MathHelper.sin(val); return MathHelper.sin(val);
} }
//#if MC<=10710
//$$ public static class GlStateManager {
//$$ public static void resetColor() { /* nop */ }
//$$ public static void clearColor(float r, float g, float b, float a) { glClearColor(r, g, b, a); }
//$$ public static void enableTexture2D() { glEnable(GL_TEXTURE_2D); }
//$$ public static void enableAlpha() { glEnable(GL_ALPHA_TEST); }
//$$ public static void alphaFunc(int func, float ref) { glAlphaFunc(func, ref); }
//$$ public static void enableDepth() { glEnable(GL_DEPTH_TEST); }
//$$ public static void pushMatrix() { glPushMatrix(); }
//$$ public static void popAttrib() { glPopAttrib(); }
//$$ public static void popMatrix() { glPopMatrix(); }
//$$ public static void clear(int mask) { glClear(mask); }
//$$ public static void translate(double x, double y, double z) { glTranslated(x, y, z); }
//$$ public static void rotate(float angle, float x, float y, float z) { glRotatef(angle, x, y, z); }
//$$ }
//#endif
} }

View File

@@ -3,16 +3,25 @@ package com.replaymod.editor;
import com.replaymod.core.ReplayMod; import com.replaymod.core.ReplayMod;
import com.replaymod.editor.handler.GuiHandler; import com.replaymod.editor.handler.GuiHandler;
import com.replaymod.online.Setting; 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.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; 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, @Mod(modid = ReplayModEditor.MOD_ID,
version = "@MOD_VERSION@", version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*", acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true, clientSideOnly = true,
//#endif
useMetadata = true) useMetadata = true)
public class ReplayModEditor { public class ReplayModEditor {
public static final String MOD_ID = "replaymod-editor"; public static final String MOD_ID = "replaymod-editor";

View File

@@ -7,8 +7,12 @@ import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiMainMenu; import net.minecraft.client.gui.GuiMainMenu;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.common.MinecraftForge;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.core.versions.MCVer.*;

View File

@@ -9,9 +9,15 @@ import de.johni0702.minecraft.gui.element.GuiImage;
import de.johni0702.minecraft.gui.element.IGuiImage; import de.johni0702.minecraft.gui.element.IGuiImage;
import de.johni0702.minecraft.gui.layout.HorizontalLayout; import de.johni0702.minecraft.gui.layout.HorizontalLayout;
import net.minecraft.client.settings.GameSettings; 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.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent; 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.*; import static com.replaymod.core.versions.MCVer.*;

View File

@@ -17,11 +17,16 @@ import de.johni0702.minecraft.gui.layout.GridLayout;
import de.johni0702.minecraft.gui.layout.HorizontalLayout; import de.johni0702.minecraft.gui.layout.HorizontalLayout;
import de.johni0702.minecraft.gui.layout.LayoutData; import de.johni0702.minecraft.gui.layout.LayoutData;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import org.lwjgl.input.Keyboard; import org.lwjgl.input.Keyboard;
import org.lwjgl.util.Dimension; import org.lwjgl.util.Dimension;
import org.lwjgl.util.ReadableDimension; 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.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;

View File

@@ -14,9 +14,14 @@ import de.johni0702.minecraft.gui.layout.HorizontalLayout;
import de.johni0702.minecraft.gui.layout.VerticalLayout; import de.johni0702.minecraft.gui.layout.VerticalLayout;
import de.johni0702.minecraft.gui.popup.AbstractGuiPopup; import de.johni0702.minecraft.gui.popup.AbstractGuiPopup;
import de.johni0702.minecraft.gui.utils.Colors; import de.johni0702.minecraft.gui.utils.Colors;
import net.minecraftforge.fml.common.Loader;
import org.apache.commons.io.FileUtils; 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 javax.net.ssl.HttpsURLConnection;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;

View File

@@ -5,10 +5,17 @@ import com.replaymod.extras.advancedscreenshots.AdvancedScreenshots;
import com.replaymod.extras.playeroverview.PlayerOverview; import com.replaymod.extras.playeroverview.PlayerOverview;
import com.replaymod.extras.urischeme.UriSchemeExtra; import com.replaymod.extras.urischeme.UriSchemeExtra;
import com.replaymod.extras.youtube.YoutubeUpload; 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.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; 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.Arrays;
import java.util.HashMap; import java.util.HashMap;
@@ -20,7 +27,9 @@ import java.util.Optional;
version = "@MOD_VERSION@", version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*", acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true, clientSideOnly = true,
//#endif
useMetadata = true) useMetadata = true)
public class ReplayModExtras { public class ReplayModExtras {
public static final String MOD_ID = "replaymod-extras"; public static final String MOD_ID = "replaymod-extras";

View File

@@ -6,9 +6,14 @@ import com.replaymod.replay.events.ReplayDispatchKeypressesEvent;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiControls; import net.minecraft.client.gui.GuiControls;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import org.lwjgl.input.Keyboard; 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 { public class AdvancedScreenshots implements Extra {
private ReplayMod mod; private ReplayMod mod;

View File

@@ -2,7 +2,6 @@ package com.replaymod.extras.advancedscreenshots;
import com.replaymod.render.RenderSettings; import com.replaymod.render.RenderSettings;
import com.replaymod.render.capturer.RenderInfo; import com.replaymod.render.capturer.RenderInfo;
import com.replaymod.render.hooks.ChunkLoadingRenderGlobal;
import com.replaymod.render.rendering.Pipelines; import com.replaymod.render.rendering.Pipelines;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
@@ -10,6 +9,10 @@ import net.minecraft.crash.CrashReport;
import org.lwjgl.util.Dimension; import org.lwjgl.util.Dimension;
import org.lwjgl.util.ReadableDimension; import org.lwjgl.util.ReadableDimension;
//#if MC>=10800
import com.replaymod.render.hooks.ChunkLoadingRenderGlobal;
//#endif
@RequiredArgsConstructor @RequiredArgsConstructor
public class ScreenshotRenderer implements RenderInfo { public class ScreenshotRenderer implements RenderInfo {
@@ -17,6 +20,8 @@ public class ScreenshotRenderer implements RenderInfo {
private final RenderSettings settings; private final RenderSettings settings;
private int framesDone;
public boolean renderScreenshot() throws Throwable { public boolean renderScreenshot() throws Throwable {
try { try {
int displayWidthBefore = mc.displayWidth; int displayWidthBefore = mc.displayWidth;
@@ -25,12 +30,16 @@ public class ScreenshotRenderer implements RenderInfo {
boolean hideGUIBefore = mc.gameSettings.hideGUI; boolean hideGUIBefore = mc.gameSettings.hideGUI;
mc.gameSettings.hideGUI = true; mc.gameSettings.hideGUI = true;
//#if MC>=10800
ChunkLoadingRenderGlobal clrg = new ChunkLoadingRenderGlobal(mc.renderGlobal); ChunkLoadingRenderGlobal clrg = new ChunkLoadingRenderGlobal(mc.renderGlobal);
//#endif
Pipelines.newPipeline(settings.getRenderMethod(),this, Pipelines.newPipeline(settings.getRenderMethod(),this,
new ScreenshotWriter(settings.getOutputFile())).run(); new ScreenshotWriter(settings.getOutputFile())).run();
//#if MC>=10800
clrg.uninstall(); clrg.uninstall();
//#endif
mc.gameSettings.hideGUI = hideGUIBefore; mc.gameSettings.hideGUI = hideGUIBefore;
mc.resize(displayWidthBefore, displayHeightBefore); mc.resize(displayWidthBefore, displayHeightBefore);
@@ -48,6 +57,11 @@ public class ScreenshotRenderer implements RenderInfo {
return new Dimension(settings.getVideoWidth(), settings.getVideoHeight()); return new Dimension(settings.getVideoWidth(), settings.getVideoHeight());
} }
@Override
public int getFramesDone() {
return framesDone;
}
@Override @Override
public int getTotalFrames() { public int getTotalFrames() {
// render 2 frames, because only the second contains all frames fully loaded // render 2 frames, because only the second contains all frames fully loaded
@@ -56,6 +70,7 @@ public class ScreenshotRenderer implements RenderInfo {
@Override @Override
public float updateForNextFrame() { public float updateForNextFrame() {
framesDone++;
return mc.timer.renderPartialTicks; return mc.timer.renderPartialTicks;
} }

View File

@@ -1,7 +1,6 @@
package com.replaymod.extras.playeroverview; package com.replaymod.extras.playeroverview;
import com.google.common.base.Optional; import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.replaymod.core.ReplayMod; import com.replaymod.core.ReplayMod;
import com.replaymod.core.utils.Utils; import com.replaymod.core.utils.Utils;
import com.replaymod.extras.Extra; import com.replaymod.extras.Extra;
@@ -12,12 +11,20 @@ import com.replaymod.replay.events.ReplayOpenEvent;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraftforge.client.event.RenderHandEvent; import net.minecraftforge.client.event.RenderHandEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import org.lwjgl.input.Keyboard; 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.io.IOException;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.core.versions.MCVer.*;
@@ -36,12 +43,19 @@ public class PlayerOverview implements Extra {
public void run() { public void run() {
if (module.getReplayHandler() != null) { if (module.getReplayHandler() != null) {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
//#if MC>=10800
List<EntityPlayer> players = world(mod.getMinecraft()).getPlayers(EntityPlayer.class, new Predicate() { List<EntityPlayer> players = world(mod.getMinecraft()).getPlayers(EntityPlayer.class, new Predicate() {
@Override @Override
public boolean apply(Object input) { public boolean apply(Object input) {
return !(input instanceof CameraEntity); // Exclude the camera entity return !(input instanceof CameraEntity); // Exclude the camera entity
} }
}); });
//#else
//$$ List<EntityPlayer> players = mod.getMinecraft().theWorld.playerEntities;
//$$ players = players.stream()
//$$ .filter(it -> !(it instanceof CameraEntity)) // Exclude the camera entity
//$$ .collect(Collectors.toList());
//#endif
if (!Utils.isCtrlDown()) { if (!Utils.isCtrlDown()) {
// Hide all players that have an UUID v2 (commonly used for NPCs) // Hide all players that have an UUID v2 (commonly used for NPCs)
Iterator<EntityPlayer> iter = players.iterator(); Iterator<EntityPlayer> iter = players.iterator();
@@ -91,12 +105,22 @@ public class PlayerOverview implements Extra {
@SubscribeEvent @SubscribeEvent
public void oRenderHand(RenderHandEvent event) { public void oRenderHand(RenderHandEvent event) {
Entity view = module.getCore().getMinecraft().getRenderViewEntity(); Entity view = getRenderViewEntity(module.getCore().getMinecraft());
if (view != null && isHidden(view.getUniqueID())) { if (view != null && isHidden(view.getUniqueID())) {
event.setCanceled(true); 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() { public boolean isSavingEnabled() {
return savingEnabled; return savingEnabled;
} }

View File

@@ -20,7 +20,6 @@ import de.johni0702.minecraft.gui.layout.HorizontalLayout;
import de.johni0702.minecraft.gui.utils.Colors; import de.johni0702.minecraft.gui.utils.Colors;
import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.audio.PositionedSoundRecord;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EnumPlayerModelParts;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import org.lwjgl.util.Dimension; import org.lwjgl.util.Dimension;
import org.lwjgl.util.ReadableDimension; import org.lwjgl.util.ReadableDimension;
@@ -32,6 +31,10 @@ import net.minecraft.init.SoundEvents;
//$$ import net.minecraft.potion.Potion; //$$ import net.minecraft.potion.Potion;
//#endif //#endif
//#if MC>=10800
import net.minecraft.entity.player.EnumPlayerModelParts;
//#endif
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
@@ -55,7 +58,11 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable {
//#if MC>=10904 //#if MC>=10904
getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(SoundEvents.UI_BUTTON_CLICK, 1.0F)); getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(SoundEvents.UI_BUTTON_CLICK, 1.0F));
//#else //#else
//#if MC>=10800
//$$ getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create(BUTTON_SOUND, 1.0F)); //$$ getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create(BUTTON_SOUND, 1.0F));
//#else
//$$ getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.createPositionedSoundRecord(BUTTON_SOUND, 1.0F));
//#endif
//#endif //#endif
playersScrollable.forEach(IGuiCheckbox.class).setChecked(true); playersScrollable.forEach(IGuiCheckbox.class).setChecked(true);
} }
@@ -66,7 +73,11 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable {
//#if MC>=10904 //#if MC>=10904
getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(SoundEvents.UI_BUTTON_CLICK, 1.0F)); getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(SoundEvents.UI_BUTTON_CLICK, 1.0F));
//#else //#else
//#if MC>=10800
//$$ getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create(BUTTON_SOUND, 1.0F)); //$$ getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create(BUTTON_SOUND, 1.0F));
//#else
//$$ getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.createPositionedSoundRecord(BUTTON_SOUND, 1.0F));
//#endif
//#endif //#endif
playersScrollable.forEach(IGuiCheckbox.class).setChecked(false); playersScrollable.forEach(IGuiCheckbox.class).setChecked(false);
} }
@@ -113,13 +124,23 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable {
//#if MC>=10809 //#if MC>=10809
if (p.isWearing(EnumPlayerModelParts.HAT)) { if (p.isWearing(EnumPlayerModelParts.HAT)) {
//#else //#else
//#if MC>=10800
//$$ if (p.func_175148_a(EnumPlayerModelParts.HAT)) { //$$ if (p.func_175148_a(EnumPlayerModelParts.HAT)) {
//#else
//$$ {
//#endif
//#endif //#endif
renderer.drawTexturedRect(0, 0, 40, 8, size.getWidth(), size.getHeight(), 8, 8, 64, 64); renderer.drawTexturedRect(0, 0, 40, 8, size.getWidth(), size.getHeight(), 8, 8, 64, 64);
} }
} }
}.setSize(16, 16), }.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() { ).onClick(new Runnable() {
@Override @Override
public void run() { public void run() {
@@ -175,7 +196,11 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable {
public int compare(EntityPlayer o1, EntityPlayer o2) { public int compare(EntityPlayer o1, EntityPlayer o2) {
if (isSpectator(o1) && !isSpectator(o2)) return 1; if (isSpectator(o1) && !isSpectator(o2)) return 1;
if (isSpectator(o2) && !isSpectator(o1)) return -1; if (isSpectator(o2) && !isSpectator(o1)) return -1;
//#if MC>=10800
return o1.getName().compareToIgnoreCase(o2.getName()); return o1.getName().compareToIgnoreCase(o2.getName());
//#else
//$$ return o1.getDisplayName().compareToIgnoreCase(o2.getDisplayName());
//#endif
} }
} }
} }

View File

@@ -2,14 +2,19 @@ package com.replaymod.extras.playeroverview.mixin;
import com.replaymod.extras.ReplayModExtras; import com.replaymod.extras.ReplayModExtras;
import com.replaymod.extras.playeroverview.PlayerOverview; import com.replaymod.extras.playeroverview.PlayerOverview;
import net.minecraft.client.renderer.culling.ICamera;
import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.Render;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; 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; 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. * 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 * 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 * 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. * 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) @Mixin(value = Render.class, priority = 1200)
public abstract class MixinRender { public abstract class MixinRender {
//#if MC>=10800
@Inject(method = "shouldRender", at=@At("HEAD"), cancellable = true) @Inject(method = "shouldRender", at=@At("HEAD"), cancellable = true)
public void replayModExtras_isPlayerHidden(Entity entity, ICamera camera, double camX, double camY, double camZ, CallbackInfoReturnable<Boolean> ci) { public void replayModExtras_isPlayerHidden(Entity entity, ICamera camera, double camX, double camY, double camZ, CallbackInfoReturnable<Boolean> ci) {
ReplayModExtras.instance.get(PlayerOverview.class).ifPresent(playerOverview -> { 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
} }

View File

@@ -7,7 +7,12 @@ import de.johni0702.minecraft.gui.container.GuiScreen;
import de.johni0702.minecraft.gui.element.GuiButton; import de.johni0702.minecraft.gui.element.GuiButton;
import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.core.versions.MCVer.*;

View File

@@ -13,12 +13,21 @@ import com.replaymod.replaystudio.replay.ZipReplayFile;
import com.replaymod.replaystudio.studio.ReplayStudio; import com.replaymod.replaystudio.studio.ReplayStudio;
import de.johni0702.minecraft.gui.container.GuiScreen; import de.johni0702.minecraft.gui.container.GuiScreen;
import net.minecraftforge.common.config.Configuration; 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.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; 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.File;
import java.io.IOException; import java.io.IOException;
@@ -30,7 +39,9 @@ import static net.minecraft.client.Minecraft.getMinecraft;
version = "@MOD_VERSION@", version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*", acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true, clientSideOnly = true,
//#endif
useMetadata = true) useMetadata = true)
public class ReplayModOnline { public class ReplayModOnline {
public static final String MOD_ID = "replaymod-online"; public static final String MOD_ID = "replaymod-online";

View File

@@ -13,8 +13,12 @@ import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiMainMenu; import net.minecraft.client.gui.GuiMainMenu;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.common.MinecraftForge;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import java.io.File; import java.io.File;

View File

@@ -12,8 +12,12 @@ import com.replaymod.replaystudio.pathing.path.Keyframe;
import com.replaymod.replaystudio.pathing.path.Path; import com.replaymod.replaystudio.pathing.path.Path;
import com.replaymod.replaystudio.pathing.path.Timeline; import com.replaymod.replaystudio.pathing.path.Timeline;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraftforge.common.MinecraftForge;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.Iterator; import java.util.Iterator;

View File

@@ -4,6 +4,10 @@ import com.google.common.util.concurrent.ListenableFuture;
import com.replaymod.replay.ReplayHandler; import com.replaymod.replay.ReplayHandler;
import com.replaymod.replaystudio.pathing.path.Timeline; import com.replaymod.replaystudio.pathing.path.Timeline;
//#if MC<=10710
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
/** /**
* Timeline player using the system time. * Timeline player using the system time.
*/ */
@@ -32,6 +36,9 @@ public class RealtimeTimelinePlayer extends AbstractTimelinePlayer {
} }
@Override @Override
//#if MC<=10710
//$$ @SubscribeEvent
//#endif
public void onTick(ReplayTimer.UpdatedEvent event) { public void onTick(ReplayTimer.UpdatedEvent event) {
if (secondFrame) { if (secondFrame) {
secondFrame = false; secondFrame = false;

View File

@@ -2,7 +2,12 @@ package com.replaymod.pathing.player;
import com.replaymod.core.utils.WrappedTimer; import com.replaymod.core.utils.WrappedTimer;
import net.minecraft.util.Timer; import net.minecraft.util.Timer;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.Event; import net.minecraftforge.fml.common.eventhandler.Event;
//#else
//$$ import cpw.mods.fml.common.eventhandler.Event;
//#endif
import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.core.versions.MCVer.*;

View File

@@ -8,6 +8,7 @@ import com.replaymod.replaystudio.pathing.property.PropertyPart;
import com.replaymod.replaystudio.pathing.property.PropertyParts; import com.replaymod.replaystudio.pathing.property.PropertyParts;
import lombok.NonNull; import lombok.NonNull;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.world.World; import net.minecraft.world.World;
import java.io.IOException; import java.io.IOException;
@@ -36,7 +37,13 @@ public class SpectatorProperty extends AbstractProperty<Integer> {
// Lookup entity by id, returns null if an entity with the id does not exists // Lookup entity by id, returns null if an entity with the id does not exists
Entity target = world.getEntityByID(value); Entity target = world.getEntityByID(value);
// Spectate entity, when called with null, returns to camera // Spectate entity, when called with null, returns to camera
//#if MC>=10800
handler.spectateEntity(target); handler.spectateEntity(target);
//#else
//$$ if (target instanceof EntityLivingBase) {
//$$ handler.spectateEntity(((EntityLivingBase) target));
//$$ }
//#endif
} }
@Override @Override

View File

@@ -8,13 +8,22 @@ import com.replaymod.recording.packet.PacketListener;
import io.netty.channel.ChannelDuplexHandler; import io.netty.channel.ChannelDuplexHandler;
import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandler;
import net.minecraft.network.NetworkManager; 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.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.EventBus; import net.minecraftforge.fml.common.eventhandler.EventBus;
import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraftforge.fml.common.network.NetworkRegistry;
import org.apache.logging.log4j.Logger; //#else
import org.lwjgl.input.Keyboard; //$$ 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.*; import static com.replaymod.core.versions.MCVer.*;
@@ -22,7 +31,9 @@ import static com.replaymod.core.versions.MCVer.*;
version = "@MOD_VERSION@", version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*", acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true, clientSideOnly = true,
//#endif
useMetadata = true) useMetadata = true)
public class ReplayModRecording { public class ReplayModRecording {
public static final String MOD_ID = "replaymod-recording"; public static final String MOD_ID = "replaymod-recording";

View File

@@ -5,16 +5,20 @@ import com.replaymod.recording.Setting;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.Gui;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
//#if MC>=10800
import net.minecraft.client.renderer.GlStateManager;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; 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;
import static com.replaymod.core.ReplayMod.TEXTURE_SIZE; import static com.replaymod.core.ReplayMod.TEXTURE_SIZE;
import static com.replaymod.core.versions.MCVer.getFontRenderer; import static com.replaymod.core.versions.MCVer.*;
import static com.replaymod.core.versions.MCVer.getType;
/** /**
* Renders overlay during recording. * Renders overlay during recording.

View File

@@ -12,16 +12,22 @@ import com.replaymod.replaystudio.replay.ZipReplayFile;
import com.replaymod.replaystudio.studio.ReplayStudio; import com.replaymod.replaystudio.studio.ReplayStudio;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.network.NetworkManager; 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.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.network.FMLNetworkEvent.ClientDisconnectionFromServerEvent; 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.io.File;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Calendar; import java.util.Calendar;
import static com.replaymod.core.versions.MCVer.WorldType_DEBUG_ALL_BLOCK_STATES;
/** /**
* Handles connection events and initiates recording if enabled. * Handles connection events and initiates recording if enabled.
*/ */
@@ -48,10 +54,12 @@ public class ConnectionEventHandler {
try { try {
boolean local = networkManager.isLocalChannel(); boolean local = networkManager.isLocalChannel();
if (local) { if (local) {
//#if MC>=10800
if (mc.getIntegratedServer().getEntityWorld().getWorldType() == WorldType_DEBUG_ALL_BLOCK_STATES) { if (mc.getIntegratedServer().getEntityWorld().getWorldType() == WorldType_DEBUG_ALL_BLOCK_STATES) {
logger.info("Debug World recording is not supported."); logger.info("Debug World recording is not supported.");
return; return;
} }
//#endif
if(!core.getSettingsRegistry().get(Setting.RECORD_SINGLEPLAYER)) { if(!core.getSettingsRegistry().get(Setting.RECORD_SINGLEPLAYER)) {
logger.info("Singleplayer Recording is disabled"); logger.info("Singleplayer Recording is disabled");
return; return;
@@ -102,7 +110,7 @@ public class ConnectionEventHandler {
guiOverlay.register(); guiOverlay.register();
core.printInfoToChat("replaymod.chat.recordingstarted"); core.printInfoToChat("replaymod.chat.recordingstarted");
} catch(Exception e) { } catch (Throwable e) {
e.printStackTrace(); e.printStackTrace();
core.printWarningToChat("replaymod.chat.recordingfailed"); core.printWarningToChat("replaymod.chat.recordingfailed");
} }

View File

@@ -2,7 +2,12 @@ package com.replaymod.recording.handler;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.SimpleChannelInboundHandler;
//#if MC>=10800
import net.minecraftforge.fml.common.network.handshake.FMLHandshakeMessage; 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 * 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<FMLHandshakeMessage> { public class FMLHandshakeFilter extends SimpleChannelInboundHandler<FMLHandshakeMessage> {
@Override @Override
protected void channelRead0(ChannelHandlerContext ctx, FMLHandshakeMessage msg) throws Exception { protected void channelRead0(ChannelHandlerContext ctx, FMLHandshakeMessage msg) throws Exception {
//#if MC>=10800
if (!(msg instanceof FMLHandshakeMessage.RegistryData)) { if (!(msg instanceof FMLHandshakeMessage.RegistryData)) {
//#else
//$$ if (!(msg instanceof FMLHandshakeMessage.ModIdData)) {
//#endif
// Pass on everything but RegistryData messages // Pass on everything but RegistryData messages
ctx.fireChannelRead(msg); ctx.fireChannelRead(msg);
} }

View File

@@ -15,7 +15,12 @@ import net.minecraft.client.gui.GuiWorldSelection;
//#endif //#endif
import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
import static com.replaymod.core.versions.MCVer.getGui; import static com.replaymod.core.versions.MCVer.getGui;

View File

@@ -7,13 +7,8 @@ import net.minecraft.item.ItemStack;
import net.minecraft.network.Packet; import net.minecraft.network.Packet;
import net.minecraft.network.play.server.*; import net.minecraft.network.play.server.*;
import net.minecraft.server.integrated.IntegratedServer; import net.minecraft.server.integrated.IntegratedServer;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.minecart.MinecartInteractEvent; import net.minecraftforge.event.entity.minecart.MinecartInteractEvent;
import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent; 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 //#if MC>=10904
import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLiving;
@@ -24,8 +19,22 @@ import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvent; import net.minecraft.util.SoundEvent;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
//#else //#else
//#if MC>=10800
//$$ import net.minecraft.util.BlockPos; //$$ import net.minecraft.util.BlockPos;
//#endif //#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; import java.util.Objects;
@@ -85,6 +94,7 @@ public class RecordingEventHandler {
//#else //#else
//$$ packetListener.save(new S0CPacketSpawnPlayer(player(mc))); //$$ packetListener.save(new S0CPacketSpawnPlayer(player(mc)));
//#endif //#endif
lastX = lastY = lastZ = null;
} catch(Exception e) { } catch(Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
@@ -143,7 +153,18 @@ public class RecordingEventHandler {
//#if MC>=10904 //#if MC>=10904
packet = new SPacketEntityTeleport(e.player); packet = new SPacketEntityTeleport(e.player);
//#else //#else
//#if MC>=10800
//$$ packet = new S18PacketEntityTeleport(e.player); //$$ 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 //#endif
} else { } else {
byte newYaw = (byte) ((int) (e.player.rotationYaw * 256.0F / 360.0F)); byte newYaw = (byte) ((int) (e.player.rotationYaw * 256.0F / 360.0F));
@@ -156,7 +177,11 @@ public class RecordingEventHandler {
//#else //#else
//$$ packet = new S14PacketEntity.S17PacketEntityLookMove(e.player.getEntityId(), //$$ packet = new S14PacketEntity.S17PacketEntityLookMove(e.player.getEntityId(),
//$$ (byte) Math.round(dx * 32), (byte) Math.round(dy * 32), (byte) Math.round(dz * 32), //$$ (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 //#endif
} }
@@ -353,7 +378,13 @@ public class RecordingEventHandler {
//$$ return; //$$ 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 //#endif
wasSleeping = true; wasSleeping = true;
@@ -388,13 +419,23 @@ public class RecordingEventHandler {
} }
} }
//#if MC>=10800
public void onBlockBreakAnim(int breakerId, BlockPos pos, int progress) { 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); EntityPlayer thePlayer = player(mc);
if (thePlayer != null && breakerId == thePlayer.getEntityId()) { if (thePlayer != null && breakerId == thePlayer.getEntityId()) {
//#if MC>=10904 //#if MC>=10904
packetListener.save(new SPacketBlockBreakAnim(breakerId, pos, progress)); packetListener.save(new SPacketBlockBreakAnim(breakerId, pos, progress));
//#else //#else
//$$ packetListener.save(new S25PacketBlockBreakAnim(breakerId, pos, progress)); //$$ packetListener.save(new S25PacketBlockBreakAnim(breakerId,
//#if MC>=10800
//$$ pos,
//#else
//$$ x, y, z,
//#endif
//$$ progress));
//#endif //#endif
} }
} }

View File

@@ -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

View File

@@ -9,20 +9,34 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 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) @Mixin(NetHandlerLoginClient.class)
public abstract class MixinNetHandlerLoginClient { public abstract class MixinNetHandlerLoginClient {
@Shadow @Shadow
//#if MC>=10800
private NetworkManager networkManager; private NetworkManager networkManager;
//#else
//$$ private NetworkManager field_147393_d;
//#endif
/** /**
* Starts the recording right before switching into PLAY state. * 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. * as it only fires after the forge handshake.
*/ */
@Inject(method = "handleLoginSuccess", at=@At("HEAD")) @Inject(method = "handleLoginSuccess", at=@At("HEAD"))
public void replayModRecording_initiateRecording(CallbackInfo cb) { public void replayModRecording_initiateRecording(CallbackInfo cb) {
//#if MC>=10800
ReplayModRecording.instance.initiateRecording(networkManager); ReplayModRecording.instance.initiateRecording(networkManager);
//#else
//$$ ReplayModRecording.instance.initiateRecording(field_147393_d);
//#endif
} }
//#if MC>=11200 //#if MC>=11200

View File

@@ -3,7 +3,6 @@ package com.replaymod.recording.mixin;
import com.replaymod.recording.handler.RecordingEventHandler; import com.replaymod.recording.handler.RecordingEventHandler;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.client.network.NetHandlerPlayClient;
import net.minecraft.client.network.NetworkPlayerInfo;
import net.minecraft.network.play.server.*; import net.minecraft.network.play.server.*;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; 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.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#if MC>=10800
//#if MC>=10904 //#if MC>=10904
import net.minecraft.network.play.server.SPacketPlayerListItem.Action; import net.minecraft.network.play.server.SPacketPlayerListItem.Action;
import net.minecraft.network.play.server.SPacketPlayerListItem.AddPlayerData; 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.Action;
//$$ import net.minecraft.network.play.server.S38PacketPlayerListItem.AddPlayerData; //$$ import net.minecraft.network.play.server.S38PacketPlayerListItem.AddPlayerData;
//#endif //#endif
import net.minecraft.client.network.NetworkPlayerInfo;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.core.versions.MCVer.*;
//#endif
@Mixin(NetHandlerPlayClient.class) @Mixin(NetHandlerPlayClient.class)
public abstract class MixinNetHandlerPlayClient { public abstract class MixinNetHandlerPlayClient {
@@ -32,8 +33,10 @@ public abstract class MixinNetHandlerPlayClient {
@Shadow @Shadow
private Minecraft gameController; private Minecraft gameController;
//#if MC>=10800
@Shadow @Shadow
private Map<UUID, NetworkPlayerInfo> playerInfoMap; private Map<UUID, NetworkPlayerInfo> playerInfoMap;
//#endif
public RecordingEventHandler getRecordingEventHandler() { public RecordingEventHandler getRecordingEventHandler() {
return ((RecordingEventHandler.RecordingEventSender) gameController.renderGlobal).getRecordingEventHandler(); return ((RecordingEventHandler.RecordingEventSender) gameController.renderGlobal).getRecordingEventHandler();
@@ -46,6 +49,7 @@ public abstract class MixinNetHandlerPlayClient {
* @param packet The packet * @param packet The packet
* @param ci Callback info * @param ci Callback info
*/ */
//#if MC>=10800
@Inject(method = "handlePlayerListItem", at=@At("HEAD")) @Inject(method = "handlePlayerListItem", at=@At("HEAD"))
//#if MC>=10809 //#if MC>=10809
//#if MC>=10904 //#if MC>=10904
@@ -86,6 +90,15 @@ public abstract class MixinNetHandlerPlayClient {
//$$ } //$$ }
//$$ } //$$ }
//#endif //#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. * Record the own player entity respawning.

View File

@@ -3,9 +3,6 @@ package com.replaymod.recording.mixin;
import com.replaymod.recording.handler.FMLHandshakeFilter; import com.replaymod.recording.handler.FMLHandshakeFilter;
import io.netty.channel.ChannelPipeline; import io.netty.channel.ChannelPipeline;
import io.netty.channel.embedded.EmbeddedChannel; 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.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
@@ -19,6 +16,16 @@ import net.minecraft.network.NetworkManager;
import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.Redirect;
//#endif //#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) @Mixin(value = NetworkDispatcher.class, remap = false)
public abstract class MixinNetworkDispatcher { public abstract class MixinNetworkDispatcher {

View File

@@ -10,8 +10,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#if MC>=10904 //#if MC>=10904
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
//#else //#else
//#if MC>=10800
//$$ import net.minecraft.util.BlockPos; //$$ import net.minecraft.util.BlockPos;
//#endif //#endif
//#endif
@Mixin(RenderGlobal.class) @Mixin(RenderGlobal.class)
public abstract class MixinRenderGlobal implements RecordingEventHandler.RecordingEventSender { public abstract class MixinRenderGlobal implements RecordingEventHandler.RecordingEventSender {
@@ -28,10 +30,26 @@ public abstract class MixinRenderGlobal implements RecordingEventHandler.Recordi
return recordingEventHandler; return recordingEventHandler;
} }
//#if MC>=10800
@Inject(method = "sendBlockBreakProgress", at = @At("HEAD")) @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) { if (recordingEventHandler != null) {
recordingEventHandler.onBlockBreakAnim(breakerId, pos, progress); recordingEventHandler.onBlockBreakAnim(breakerId,
//#if MC>=10800
pos,
//#else
//$$ x, y, z,
//#endif
progress);
} }
} }
} }

View File

@@ -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

View File

@@ -11,11 +11,9 @@ import io.netty.channel.ChannelInboundHandlerAdapter;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.network.EnumConnectionState; import net.minecraft.network.EnumConnectionState;
import net.minecraft.network.EnumPacketDirection;
import net.minecraft.network.Packet; import net.minecraft.network.Packet;
import net.minecraft.network.PacketBuffer; import net.minecraft.network.PacketBuffer;
import net.minecraft.network.play.server.*; 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.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@@ -29,6 +27,13 @@ import net.minecraft.util.text.TextComponentString;
//$$ import java.util.List; //$$ import java.util.List;
//#endif //#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.DataOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays; import java.util.Arrays;
@@ -105,7 +110,11 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
//#if MC>=10809 //#if MC>=10809
//$$ UUID uuid = ((S0CPacketSpawnPlayer) packet).getPlayer(); //$$ UUID uuid = ((S0CPacketSpawnPlayer) packet).getPlayer();
//#else //#else
//#if MC>=10800
//$$ UUID uuid = ((S0CPacketSpawnPlayer) packet).func_179819_c(); //$$ UUID uuid = ((S0CPacketSpawnPlayer) packet).func_179819_c();
//#else
//$$ UUID uuid = ((S0CPacketSpawnPlayer) packet).field_148955_b.getId();
//#endif
//#endif //#endif
//#endif //#endif
Set<String> uuids = new HashSet<>(Arrays.asList(metaData.getPlayers())); Set<String> uuids = new HashSet<>(Arrays.asList(metaData.getPlayers()));
@@ -114,10 +123,12 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
saveMetaData(); saveMetaData();
} }
//#if MC<10904 //#if MC<10904
//#if MC>=10800
//$$ if (packet instanceof S46PacketSetCompressionLevel) { //$$ if (packet instanceof S46PacketSetCompressionLevel) {
//$$ return; // Replay data is never compressed on the packet level //$$ return; // Replay data is never compressed on the packet level
//$$ } //$$ }
//#endif //#endif
//#endif
byte[] bytes = getPacketData(packet); byte[] bytes = getPacketData(packet);
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
@@ -199,16 +210,32 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
//#if MC>=10904 //#if MC>=10904
if (packet instanceof SPacketResourcePackSend) { if (packet instanceof SPacketResourcePackSend) {
save(resourcePackRecorder.handleResourcePack((SPacketResourcePackSend) packet)); save(resourcePackRecorder.handleResourcePack((SPacketResourcePackSend) packet));
//#else
//$$ if (packet instanceof S48PacketResourcePackSend) {
//$$ save(resourcePackRecorder.handleResourcePack((S48PacketResourcePackSend) packet));
//#endif
return; 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) { if (packet instanceof FMLProxyPacket) {
// This packet requires special handling // This packet requires special handling
//#if MC>=10800
((FMLProxyPacket) packet).toS3FPackets().forEach(this::save); ((FMLProxyPacket) packet).toS3FPackets().forEach(this::save);
//#else
//$$ save(((FMLProxyPacket) packet).toS3FPacket());
//#endif
super.channelRead(ctx, msg); super.channelRead(ctx, msg);
return; return;
} }
@@ -223,7 +250,12 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
//#else //#else
//$$ if (packet instanceof S3FPacketCustomPayload) { //$$ if (packet instanceof S3FPacketCustomPayload) {
//$$ S3FPacketCustomPayload p = (S3FPacketCustomPayload) packet; //$$ 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.")); //$$ packet = new S40PacketDisconnect(new ChatComponentText("Please update to view this replay."));
//#endif //#endif
save(packet); save(packet);
@@ -304,7 +336,11 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
//$$ } //$$ }
//#endif //#endif
//#if MC>=10800
Integer packetId = EnumConnectionState.PLAY.getPacketId(EnumPacketDirection.CLIENTBOUND, packet); 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) { if (packetId == null) {
throw new IOException("Unknown packet type:" + packet.getClass()); throw new IOException("Unknown packet type:" + packet.getClass());
} }
@@ -322,7 +358,7 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
} }
public void addMarker() { public void addMarker() {
Entity view = Minecraft.getMinecraft().getRenderViewEntity(); Entity view = getRenderViewEntity(Minecraft.getMinecraft());
int timestamp = (int) (System.currentTimeMillis() - startTime); int timestamp = (int) (System.currentTimeMillis() - startTime);
Marker marker = new Marker(); Marker marker = new Marker();

View File

@@ -2,21 +2,15 @@ package com.replaymod.recording.packet;
import com.google.common.hash.Hashing; import com.google.common.hash.Hashing;
import com.google.common.io.Files; 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 com.replaymod.replaystudio.replay.ReplayFile;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreenWorking; import net.minecraft.client.gui.GuiScreenWorking;
import net.minecraft.client.gui.GuiYesNo; import net.minecraft.client.gui.GuiYesNo;
import net.minecraft.client.gui.GuiYesNoCallback; import net.minecraft.client.gui.GuiYesNoCallback;
import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.multiplayer.ServerData;
import net.minecraft.client.network.NetHandlerPlayClient;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
import net.minecraft.client.resources.ResourcePackRepository; import net.minecraft.client.resources.ResourcePackRepository;
import net.minecraft.network.NetworkManager;
import net.minecraft.util.HttpUtil; import net.minecraft.util.HttpUtil;
import org.apache.commons.io.FileUtils;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; 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.client.CPacketResourcePackStatus.Action;
import net.minecraft.network.play.server.SPacketResourcePackSend; import net.minecraft.network.play.server.SPacketResourcePackSend;
//#else //#else
//#if MC>=10800
//$$ import net.minecraft.network.play.client.C19PacketResourcePackStatus; //$$ import net.minecraft.network.play.client.C19PacketResourcePackStatus;
//$$ import net.minecraft.network.play.client.C19PacketResourcePackStatus.Action; //$$ import net.minecraft.network.play.client.C19PacketResourcePackStatus.Action;
//$$ import net.minecraft.network.play.server.S48PacketResourcePackSend; //$$ import net.minecraft.network.play.server.S48PacketResourcePackSend;
//#else
//#endif
//#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 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.File;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import static com.replaymod.core.versions.MCVer.*;
/** /**
* Records resource packs and handles incoming resource pack packets during recording. * Records resource packs and handles incoming resource pack packets during recording.
*/ */
@@ -84,6 +97,7 @@ public class ResourcePackRecorder {
} }
} }
//#if MC>=10800
//#if MC>=10904 //#if MC>=10904
public CPacketResourcePackStatus makeStatusPacket(String hash, Action action) { public CPacketResourcePackStatus makeStatusPacket(String hash, Action action) {
//#if MC>=11002 //#if MC>=11002
@@ -282,5 +296,78 @@ public class ResourcePackRecorder {
//#endif //#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<String, String> 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
} }

View File

@@ -6,11 +6,18 @@ import com.replaymod.replay.events.ReplayCloseEvent;
import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReport;
import net.minecraft.util.ReportedException; import net.minecraft.util.ReportedException;
import net.minecraftforge.common.config.Configuration; 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.Mod;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import org.apache.commons.io.FileUtils; //#else
import org.apache.logging.log4j.Logger; //$$ 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.File;
import java.io.IOException; import java.io.IOException;
@@ -23,7 +30,9 @@ import static com.replaymod.core.versions.MCVer.*;
version = "@MOD_VERSION@", version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*", acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true, clientSideOnly = true,
//#endif
useMetadata = true) useMetadata = true)
public class ReplayModRender { public class ReplayModRender {
public static final String MOD_ID = "replaymod-render"; public static final String MOD_ID = "replaymod-render";

View File

@@ -9,7 +9,6 @@ import net.minecraft.client.Minecraft;
import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReport;
import net.minecraft.crash.CrashReportCategory; import net.minecraft.crash.CrashReportCategory;
import net.minecraft.util.Util; import net.minecraft.util.Util;
import net.minecraftforge.fml.common.versioning.ComparableVersion;
import org.apache.commons.exec.CommandLine; import org.apache.commons.exec.CommandLine;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
@@ -28,6 +27,12 @@ import java.util.Comparator;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.TimeUnit; 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 com.replaymod.render.ReplayModRender.LOGGER;
import static org.apache.commons.lang3.Validate.isTrue; import static org.apache.commons.lang3.Validate.isTrue;

View File

@@ -7,16 +7,22 @@ import com.replaymod.render.frame.OpenGlFrame;
import com.replaymod.render.rendering.FrameCapturer; import com.replaymod.render.rendering.FrameCapturer;
import com.replaymod.render.shader.Program; import com.replaymod.render.shader.Program;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReport;
import net.minecraft.util.ReportedException; import net.minecraft.util.ReportedException;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import org.lwjgl.util.ReadableDimension; 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 java.io.IOException;
import static com.replaymod.core.versions.MCVer.fog; import static com.replaymod.core.versions.MCVer.*;
import static net.minecraft.client.renderer.GlStateManager.*;
import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
@@ -43,6 +49,11 @@ public class ODSFrameCapturer implements FrameCapturer<ODSOpenGlFrame> {
return renderInfo.getFrameSize(); return renderInfo.getFrameSize();
} }
@Override
public int getFramesDone() {
return renderInfo.getFramesDone();
}
@Override @Override
public int getTotalFrames() { public int getTotalFrames() {
return renderInfo.getTotalFrames(); return renderInfo.getTotalFrames();
@@ -76,9 +87,9 @@ public class ODSFrameCapturer implements FrameCapturer<ODSOpenGlFrame> {
linkState(1, "lightMapEnabled"); linkState(1, "lightMapEnabled");
linkState(2, "hurtTextureEnabled"); linkState(2, "hurtTextureEnabled");
final Program.Uniform uniform = shaderProgram.getUniformVariable("fogEnabled"); final Program.Uniform uniform = shaderProgram.getUniformVariable("fogEnabled");
previousFogState = fog(GlStateManager.fogState); previousFogState = fog();
uniform.set(previousFogState.currentState); uniform.set(previousFogState.currentState);
fog(GlStateManager.fogState, new BooleanState(previousFogState.capability) { fog(new BooleanState(previousFogState.capability) {
@Override @Override
public void setState(boolean state) { public void setState(boolean state) {
super.setState(state); super.setState(state);
@@ -97,15 +108,15 @@ public class ODSFrameCapturer implements FrameCapturer<ODSOpenGlFrame> {
private void linkState(int id, String var) { private void linkState(int id, String var) {
final Program.Uniform uniform = shaderProgram.getUniformVariable(var); final Program.Uniform uniform = shaderProgram.getUniformVariable(var);
previousStates[id] = GlStateManager.textureState[id].texture2DState; previousStates[id] = texture2DState(id);
uniform.set(previousStates[id].currentState); uniform.set(previousStates[id].currentState);
GlStateManager.textureState[id].texture2DState = new BooleanState(previousStates[id].capability) { texture2DState(id, new BooleanState(previousStates[id].capability) {
@Override @Override
public void setState(boolean state) { public void setState(boolean state) {
super.setState(state); super.setState(state);
uniform.set(state); uniform.set(state);
} }
}; });
} }
@Override @Override
@@ -133,10 +144,10 @@ public class ODSFrameCapturer implements FrameCapturer<ODSOpenGlFrame> {
left.close(); left.close();
right.close(); right.close();
shaderProgram.delete(); shaderProgram.delete();
for (int i = 0; i < 3; i++) { for (int i = 0; i < previousStates.length; i++) {
GlStateManager.textureState[i].texture2DState = previousStates[i]; texture2DState(i, previousStates[i]);
} }
fog(GlStateManager.fogState, previousFogState); fog(previousFogState);
} }
private class CubicStereoFrameCapturer extends CubicPboOpenGlFrameCapturer { private class CubicStereoFrameCapturer extends CubicPboOpenGlFrameCapturer {

View File

@@ -15,7 +15,12 @@ import org.lwjgl.util.WritableDimension;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
//#if MC>=10800
import static net.minecraft.client.renderer.GlStateManager.*; 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_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;

View File

@@ -6,6 +6,8 @@ import org.lwjgl.util.ReadableDimension;
public interface RenderInfo { public interface RenderInfo {
ReadableDimension getFrameSize(); ReadableDimension getFrameSize();
int getFramesDone();
int getTotalFrames(); int getTotalFrames();
float updateForNextFrame(); float updateForNextFrame();

View File

@@ -3,7 +3,12 @@ package com.replaymod.render.events;
import com.replaymod.render.rendering.VideoRenderer; import com.replaymod.render.rendering.VideoRenderer;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.Event; import net.minecraftforge.fml.common.eventhandler.Event;
//#else
//$$ import cpw.mods.fml.common.eventhandler.Event;
//#endif
@RequiredArgsConstructor @RequiredArgsConstructor
public abstract class ReplayRenderEvent extends Event { public abstract class ReplayRenderEvent extends Event {

View File

@@ -1,3 +1,4 @@
//#if MC>=10800
package com.replaymod.render.hooks; package com.replaymod.render.hooks;
import com.replaymod.render.utils.JailingQueue; import com.replaymod.render.utils.JailingQueue;
@@ -143,3 +144,4 @@ public class ChunkLoadingRenderGlobal {
} }
} }
} }
//#endif

View File

@@ -2,11 +2,18 @@ package com.replaymod.render.hooks;
import com.replaymod.render.RenderSettings; import com.replaymod.render.RenderSettings;
import com.replaymod.render.capturer.CaptureData; import com.replaymod.render.capturer.CaptureData;
import com.replaymod.render.capturer.RenderInfo;
import com.replaymod.render.capturer.WorldRenderer; import com.replaymod.render.capturer.WorldRenderer;
import lombok.Getter; import lombok.Getter;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
//#if MC>=10800
import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.GlStateManager;
import net.minecraftforge.fml.common.FMLCommonHandler; 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; import java.io.IOException;
@@ -16,12 +23,16 @@ public class EntityRendererHandler implements WorldRenderer {
@Getter @Getter
protected final RenderSettings settings; protected final RenderSettings settings;
@Getter
private final RenderInfo renderInfo;
public CaptureData data; public CaptureData data;
public boolean omnidirectional; public boolean omnidirectional;
public EntityRendererHandler(RenderSettings settings) { public EntityRendererHandler(RenderSettings settings, RenderInfo renderInfo) {
this.settings = settings; this.settings = settings;
this.renderInfo = renderInfo;
((IEntityRenderer) mc.entityRenderer).replayModRender_setHandler(this); ((IEntityRenderer) mc.entityRenderer).replayModRender_setHandler(this);
} }
@@ -41,7 +52,11 @@ public class EntityRendererHandler implements WorldRenderer {
GlStateManager.enableAlpha(); GlStateManager.enableAlpha();
GlStateManager.alphaFunc(516, 0.5F); GlStateManager.alphaFunc(516, 0.5F);
//#if MC>=10800
mc.entityRenderer.renderWorldPass(2, partialTicks, finishTimeNano); mc.entityRenderer.renderWorldPass(2, partialTicks, finishTimeNano);
//#else
//$$ mc.entityRenderer.renderWorld(partialTicks, finishTimeNano);
//#endif
FMLCommonHandler.instance().onRenderTickEnd(partialTicks); FMLCommonHandler.instance().onRenderTickEnd(partialTicks);
} }

View File

@@ -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<GLStateTracker> 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

View File

@@ -5,38 +5,68 @@ package com.replaymod.render.mixin;
//$$ import net.minecraft.client.Minecraft; //$$ import net.minecraft.client.Minecraft;
//$$ import net.minecraft.client.particle.EffectRenderer; //$$ import net.minecraft.client.particle.EffectRenderer;
//$$ import net.minecraft.client.particle.EntityFX; //$$ import net.minecraft.client.particle.EntityFX;
//$$ import net.minecraft.client.renderer.WorldRenderer;
//$$ import net.minecraft.entity.Entity; //$$ import net.minecraft.entity.Entity;
//$$ import org.spongepowered.asm.mixin.Mixin; //$$ import org.spongepowered.asm.mixin.Mixin;
//$$ import org.spongepowered.asm.mixin.injection.At; //$$ import org.spongepowered.asm.mixin.injection.At;
//$$ import org.spongepowered.asm.mixin.injection.Redirect; //$$ 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) //$$ @Mixin(EffectRenderer.class)
//$$ public abstract class MixinEffectRenderer { //$$ public abstract class MixinEffectRenderer {
//#if MC>=10800
//#if MC>=10809 //#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")) //$$ @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 //#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")) //$$ @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 //#endif
//$$ private void renderNormalParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks, //$$ private void renderNormalParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks,
//$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { //$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
//$$ renderParticle(fx, worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, 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 //#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")) //$$ @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 //#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")) //$$ @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 //#endif
//$$ private void renderLitParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks, //$$ private void renderLitParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks,
//$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { //$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
//$$ renderParticle(fx, worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, 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) { //$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
//$$ EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).replayModRender_getHandler(); //$$ EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).replayModRender_getHandler();
//$$ if (handler != null && handler.omnidirectional) { //$$ if (handler != null && handler.omnidirectional) {
//#if MC<=10710
//$$ Entity view = Minecraft.getMinecraft().renderViewEntity;
//#endif
//$$ // Align all particles towards the camera //$$ // Align all particles towards the camera
//$$ double dx = fx.prevPosX + (fx.posX - fx.prevPosX) * partialTicks - view.posX; //$$ double dx = fx.prevPosX + (fx.posX - fx.prevPosX) * partialTicks - view.posX;
//$$ double dy = fx.prevPosY + (fx.posY - fx.prevPosY) * partialTicks - view.posY; //$$ double dy = fx.prevPosY + (fx.posY - fx.prevPosY) * partialTicks - view.posY;
@@ -54,7 +84,11 @@ package com.replaymod.render.mixin;
//#if MC>=10809 //#if MC>=10809
//$$ fx.renderParticle(worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); //$$ fx.renderParticle(worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
//#else //#else
//#if MC>=10800
//$$ fx.func_180434_a(worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); //$$ fx.func_180434_a(worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
//#else
//$$ fx.renderParticle(tessellator, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
//#endif
//#endif //#endif
//$$ } //$$ }
//$$ } //$$ }

View File

@@ -7,10 +7,10 @@ import com.replaymod.render.hooks.EntityRendererHandler;
import com.replaymod.replay.camera.CameraEntity; import com.replaymod.replay.camera.CameraEntity;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.EntityRenderer; import net.minecraft.client.renderer.EntityRenderer;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.RenderGlobal; import net.minecraft.client.renderer.RenderGlobal;
import net.minecraft.client.settings.GameSettings; import net.minecraft.client.settings.GameSettings;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import org.lwjgl.util.ReadableColor; import org.lwjgl.util.ReadableColor;
@@ -28,6 +28,14 @@ import net.minecraft.util.math.RayTraceResult;
//$$ import net.minecraft.util.MovingObjectPosition; //$$ import net.minecraft.util.MovingObjectPosition;
//#endif //#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) @Mixin(value = EntityRenderer.class)
public abstract class MixinEntityRenderer implements EntityRendererHandler.IEntityRenderer, EntityRendererHandler.GluPerspective { public abstract class MixinEntityRenderer implements EntityRendererHandler.IEntityRenderer, EntityRendererHandler.GluPerspective {
@Shadow @Shadow
@@ -45,6 +53,17 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
return replayModRender_handler; 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) @Inject(method = "setupFog", at = @At("HEAD"), cancellable = true)
private void replayModRender_onSetupFog(int fogDistanceFlag, float partialTicks, CallbackInfo ci) { private void replayModRender_onSetupFog(int fogDistanceFlag, float partialTicks, CallbackInfo ci) {
if (replayModRender_handler == null) return; if (replayModRender_handler == null) return;
@@ -56,7 +75,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
@Inject(method = "orientCamera", at = @At("HEAD")) @Inject(method = "orientCamera", at = @At("HEAD"))
private void replayModRender_resetRotationIfNeeded(float partialTicks, CallbackInfo ci) { private void replayModRender_resetRotationIfNeeded(float partialTicks, CallbackInfo ci) {
if (replayModRender_handler != null) { if (replayModRender_handler != null) {
Entity entity = Minecraft.getMinecraft().getRenderViewEntity(); Entity entity = getRenderViewEntity(Minecraft.getMinecraft());
RenderSettings settings = replayModRender_handler.getSettings(); RenderSettings settings = replayModRender_handler.getSettings();
if (settings.isStabilizeYaw()) { if (settings.isStabilizeYaw()) {
entity.prevRotationYaw = entity.rotationYaw = 0; entity.prevRotationYaw = entity.rotationYaw = 0;
@@ -79,7 +98,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
@Inject(method = "setupCameraTransform", at = @At("HEAD")) @Inject(method = "setupCameraTransform", at = @At("HEAD"))
private void replayModRender_beforeSetupCameraTransform(float partialTicks, int renderPass, CallbackInfo ci) { private void replayModRender_beforeSetupCameraTransform(float partialTicks, int renderPass, CallbackInfo ci) {
if (replayModRender_handler != null) { if (replayModRender_handler != null) {
Entity entity = Minecraft.getMinecraft().getRenderViewEntity(); Entity entity = getRenderViewEntity(Minecraft.getMinecraft());
orgYaw = entity.rotationYaw; orgYaw = entity.rotationYaw;
orgPitch = entity.rotationPitch; orgPitch = entity.rotationPitch;
orgPrevYaw = entity.prevRotationYaw; orgPrevYaw = entity.prevRotationYaw;
@@ -91,7 +110,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
@Inject(method = "setupCameraTransform", at = @At("RETURN")) @Inject(method = "setupCameraTransform", at = @At("RETURN"))
private void replayModRender_afterSetupCameraTransform(float partialTicks, int renderPass, CallbackInfo ci) { private void replayModRender_afterSetupCameraTransform(float partialTicks, int renderPass, CallbackInfo ci) {
if (replayModRender_handler != null) { if (replayModRender_handler != null) {
Entity entity = Minecraft.getMinecraft().getRenderViewEntity(); Entity entity = getRenderViewEntity(Minecraft.getMinecraft());
entity.rotationYaw = orgYaw; entity.rotationYaw = orgYaw;
entity.rotationPitch = orgPitch; entity.rotationPitch = orgPitch;
entity.prevRotationYaw = orgPrevYaw; entity.prevRotationYaw = orgPrevYaw;
@@ -109,7 +128,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
ci.cancel(); ci.cancel();
return; // No spectator hands during 360° view, we wouldn't even know where to put it 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 (currentEntity instanceof EntityPlayer && !(currentEntity instanceof CameraEntity)) {
if (renderPass == 2) { // Need to update render pass if (renderPass == 2) { // Need to update render pass
renderPass = replayModRender_handler.data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE ? 1 : 0; 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")) @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) { private void replayModRender_drawSelectionBox(RenderGlobal instance, EntityPlayer player, RayTraceResult rtr, int alwaysZero, float partialTicks) {
//#else //#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")) //$$ @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) { //$$ private void replayModRender_drawSelectionBox(RenderGlobal instance, EntityPlayer player, MovingObjectPosition rtr, int alwaysZero, float partialTicks) {
//#endif //#endif
if (replayModRender_handler == null) { if (replayModRender_handler == null) {
@@ -137,7 +160,12 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
private int orgRenderDistanceChunks; private int orgRenderDistanceChunks;
//#if MC>=10800
@Inject(method = "renderWorldPass", at = @At(value = "JUMP", ordinal = 0)) @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) { private void replayModRender_beforeRenderSky(CallbackInfo ci) {
if (replayModRender_handler != null && replayModRender_handler.getSettings().getChromaKeyingColor() != null) { if (replayModRender_handler != null && replayModRender_handler.getSettings().getChromaKeyingColor() != null) {
GameSettings settings = Minecraft.getMinecraft().gameSettings; 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")) @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) { 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) { if (replayModRender_handler != null && replayModRender_handler.getSettings().getChromaKeyingColor() != null) {
Minecraft.getMinecraft().gameSettings.renderDistanceChunks = orgRenderDistanceChunks; Minecraft.getMinecraft().gameSettings.renderDistanceChunks = orgRenderDistanceChunks;
ReadableColor color = replayModRender_handler.getSettings().getChromaKeyingColor(); ReadableColor color = replayModRender_handler.getSettings().getChromaKeyingColor();
GlStateManager.clearColor(color.getRed() / 255f, color.getGreen() / 255f, color.getBlue() / 255f, 1); GlStateManager.clearColor(color.getRed() / 255f, color.getGreen() / 255f, color.getBlue() / 255f, 1);
GlStateManager.clear(GL11.GL_COLOR_BUFFER_BIT); GlStateManager.clear(GL11.GL_COLOR_BUFFER_BIT);
} else { } else {
//#if MC>=10800
instance.renderSky(partialTicks, renderPass); instance.renderSky(partialTicks, renderPass);
//#else
//$$ instance.renderSky(partialTicks);
//#endif
} }
} }
@@ -162,7 +199,11 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
* Stereoscopic Renderer * 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)) @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) { private void replayModRender_setupStereoscopicProjection(float partialTicks, int renderPass, CallbackInfo ci) {
if (replayModRender_getHandler() != null) { if (replayModRender_getHandler() != null) {
if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) { 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)) @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) { private void replayModRender_setupStereoscopicModelView(float partialTicks, int renderPass, CallbackInfo ci) {
if (replayModRender_getHandler() != null) { if (replayModRender_getHandler() != null) {
if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) { 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); 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)) @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) { private void replayModRender_gluPerspective$1(float fovY, float aspect, float zNear, float zFar) {
replayModRender_gluPerspective(fovY, aspect, zNear, 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)) @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) { private void replayModRender_gluPerspective$2(float fovY, float aspect, float zNear, float zFar) {
replayModRender_gluPerspective(fovY, aspect, zNear, zFar); replayModRender_gluPerspective(fovY, aspect, zNear, zFar);
} }
//#endif
@Override @Override
public void replayModRender_gluPerspective(float fovY, float aspect, float zNear, float zFar) { public void replayModRender_gluPerspective(float fovY, float aspect, float zNear, float zFar) {

View File

@@ -2,13 +2,22 @@ package com.replaymod.render.mixin;
import com.replaymod.render.hooks.EntityRendererHandler; import com.replaymod.render.hooks.EntityRendererHandler;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.culling.Frustum;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 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) @Mixin(Frustum.class)
//#else
//$$ @Mixin(Frustrum.class)
//#endif
public abstract class MixinFrustum { public abstract class MixinFrustum {
@Inject(method = "isBoxInFrustum", at = @At("HEAD"), cancellable = true) @Inject(method = "isBoxInFrustum", at = @At("HEAD"), cancellable = true)
public void isBoxInFrustum(double minX, double minY, double minZ, double maxX, double maxY, double maxZ, CallbackInfoReturnable<Boolean> ci) { public void isBoxInFrustum(double minX, double minY, double minZ, double maxX, double maxY, double maxZ, CallbackInfoReturnable<Boolean> ci) {

View File

@@ -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

View File

@@ -1,3 +1,4 @@
//#if MC>=10800
package com.replaymod.render.mixin; package com.replaymod.render.mixin;
import com.replaymod.render.hooks.ChunkLoadingRenderGlobal; import com.replaymod.render.hooks.ChunkLoadingRenderGlobal;
@@ -82,3 +83,4 @@ public abstract class MixinRenderGlobal {
} }
} }
} }
//#endif

View File

@@ -30,9 +30,9 @@ public class Pipelines {
RenderSettings settings = renderInfo.getRenderSettings(); RenderSettings settings = renderInfo.getRenderSettings();
FrameCapturer<OpenGlFrame> capturer; FrameCapturer<OpenGlFrame> capturer;
if (PixelBufferObject.SUPPORTED) { if (PixelBufferObject.SUPPORTED) {
capturer = new SimplePboOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo); capturer = new SimplePboOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo);
} else { } else {
capturer = new SimpleOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo); capturer = new SimpleOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo);
} }
return new Pipeline<>(capturer, new OpenGlToRGBProcessor(), consumer); return new Pipeline<>(capturer, new OpenGlToRGBProcessor(), consumer);
} }
@@ -41,9 +41,9 @@ public class Pipelines {
RenderSettings settings = renderInfo.getRenderSettings(); RenderSettings settings = renderInfo.getRenderSettings();
FrameCapturer<StereoscopicOpenGlFrame> capturer; FrameCapturer<StereoscopicOpenGlFrame> capturer;
if (PixelBufferObject.SUPPORTED) { if (PixelBufferObject.SUPPORTED) {
capturer = new StereoscopicPboOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo); capturer = new StereoscopicPboOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo);
} else { } else {
capturer = new StereoscopicOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo); capturer = new StereoscopicOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo);
} }
return new Pipeline<>(capturer, new StereoscopicToRGBProcessor(), consumer); return new Pipeline<>(capturer, new StereoscopicToRGBProcessor(), consumer);
} }
@@ -52,9 +52,9 @@ public class Pipelines {
RenderSettings settings = renderInfo.getRenderSettings(); RenderSettings settings = renderInfo.getRenderSettings();
FrameCapturer<CubicOpenGlFrame> capturer; FrameCapturer<CubicOpenGlFrame> capturer;
if (PixelBufferObject.SUPPORTED) { 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 { } 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); return new Pipeline<>(capturer, new CubicToRGBProcessor(), consumer);
} }
@@ -63,9 +63,9 @@ public class Pipelines {
RenderSettings settings = renderInfo.getRenderSettings(); RenderSettings settings = renderInfo.getRenderSettings();
FrameCapturer<CubicOpenGlFrame> capturer; FrameCapturer<CubicOpenGlFrame> capturer;
if (PixelBufferObject.SUPPORTED) { 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 { } 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); return new Pipeline<>(capturer, new EquirectangularToRGBProcessor(settings.getVideoWidth() / 4), consumer);
} }
@@ -73,7 +73,7 @@ public class Pipelines {
public static Pipeline<ODSOpenGlFrame, RGBFrame> newODSPipeline(RenderInfo renderInfo, FrameConsumer<RGBFrame> consumer) { public static Pipeline<ODSOpenGlFrame, RGBFrame> newODSPipeline(RenderInfo renderInfo, FrameConsumer<RGBFrame> consumer) {
RenderSettings settings = renderInfo.getRenderSettings(); RenderSettings settings = renderInfo.getRenderSettings();
FrameCapturer<ODSOpenGlFrame> capturer = FrameCapturer<ODSOpenGlFrame> 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); return new Pipeline<>(capturer, new ODSToRGBProcessor(settings.getVideoWidth() / 4), consumer);
} }
} }

View File

@@ -12,7 +12,6 @@ import com.replaymod.render.events.ReplayRenderEvent;
import com.replaymod.render.frame.RGBFrame; import com.replaymod.render.frame.RGBFrame;
import com.replaymod.render.gui.GuiRenderingDone; import com.replaymod.render.gui.GuiRenderingDone;
import com.replaymod.render.gui.GuiVideoRenderer; import com.replaymod.render.gui.GuiVideoRenderer;
import com.replaymod.render.hooks.ChunkLoadingRenderGlobal;
import com.replaymod.render.metadata.MetadataInjector; import com.replaymod.render.metadata.MetadataInjector;
import com.replaymod.render.utils.SoundHandler; import com.replaymod.render.utils.SoundHandler;
import com.replaymod.replay.ReplayHandler; import com.replaymod.replay.ReplayHandler;
@@ -35,6 +34,13 @@ import net.minecraft.util.SoundCategory;
//$$ import net.minecraft.client.audio.SoundCategory; //$$ import net.minecraft.client.audio.SoundCategory;
//#endif //#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.io.IOException;
import java.util.Collection; import java.util.Collection;
import java.util.EnumMap; import java.util.EnumMap;
@@ -46,7 +52,6 @@ import java.util.concurrent.FutureTask;
import static com.google.common.collect.Iterables.getLast; import static com.google.common.collect.Iterables.getLast;
import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.core.versions.MCVer.*;
import static com.replaymod.render.ReplayModRender.LOGGER; import static com.replaymod.render.ReplayModRender.LOGGER;
import static net.minecraft.client.renderer.GlStateManager.*;
import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
@@ -69,7 +74,9 @@ public class VideoRenderer implements RenderInfo {
private TimelinePlayer timelinePlayer; private TimelinePlayer timelinePlayer;
private Future<Void> timelinePlayerFuture; private Future<Void> timelinePlayerFuture;
//#if MC>=10800
private ChunkLoadingRenderGlobal chunkLoadingRenderGlobal; private ChunkLoadingRenderGlobal chunkLoadingRenderGlobal;
//#endif
private int framesDone; private int framesDone;
private int totalFrames; private int totalFrames;
@@ -251,7 +258,9 @@ public class VideoRenderer implements RenderInfo {
//$$ gui.toMinecraft().setWorldAndResolution(mc, scaled.getScaledWidth(), scaled.getScaledHeight()); //$$ gui.toMinecraft().setWorldAndResolution(mc, scaled.getScaledWidth(), scaled.getScaledHeight());
//#endif //#endif
//#if MC>=10800
chunkLoadingRenderGlobal = new ChunkLoadingRenderGlobal(mc.renderGlobal); chunkLoadingRenderGlobal = new ChunkLoadingRenderGlobal(mc.renderGlobal);
//#endif
// Set up our own framebuffer to render the GUI to // Set up our own framebuffer to render the GUI to
guiFramebuffer = new Framebuffer(displayWidth, displayHeight, true); guiFramebuffer = new Framebuffer(displayWidth, displayHeight, true);
@@ -277,9 +286,11 @@ public class VideoRenderer implements RenderInfo {
//$$ mc.gameSettings.mapSoundLevels = originalSoundLevels; //$$ mc.gameSettings.mapSoundLevels = originalSoundLevels;
//#endif //#endif
mc.displayGuiScreen(null); mc.displayGuiScreen(null);
//#if MC>=10800
if (chunkLoadingRenderGlobal != null) { if (chunkLoadingRenderGlobal != null) {
chunkLoadingRenderGlobal.uninstall(); chunkLoadingRenderGlobal.uninstall();
} }
//#endif
new SoundHandler().playRenderSuccessSound(); new SoundHandler().playRenderSuccessSound();
@@ -303,11 +314,15 @@ public class VideoRenderer implements RenderInfo {
} }
mc.currentScreen = gui.toMinecraft(); mc.currentScreen = gui.toMinecraft();
//#if MC>=10800
try { try {
mc.runTick(); mc.runTick();
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
//#else
//$$ mc.runTick();
//#endif
} }
public void drawGui() { public void drawGui() {
@@ -328,6 +343,7 @@ public class VideoRenderer implements RenderInfo {
ScaledResolution scaled = newScaledResolution(mc); ScaledResolution scaled = newScaledResolution(mc);
gui.toMinecraft().setWorldAndResolution(mc, scaled.getScaledWidth(), scaled.getScaledHeight()); gui.toMinecraft().setWorldAndResolution(mc, scaled.getScaledWidth(), scaled.getScaledHeight());
//#if MC>=10800
try { try {
gui.toMinecraft().handleInput(); gui.toMinecraft().handleInput();
} catch (IOException e) { } catch (IOException e) {
@@ -335,6 +351,9 @@ public class VideoRenderer implements RenderInfo {
// It isn't actually thrown here, so we'll deal with it the easy way // It isn't actually thrown here, so we'll deal with it the easy way
throw new RuntimeException(e); throw new RuntimeException(e);
} }
//#else
//$$ gui.toMinecraft().handleInput();
//#endif
int mouseX = Mouse.getX() * scaled.getScaledWidth() / mc.displayWidth; int mouseX = Mouse.getX() * scaled.getScaledWidth() / mc.displayWidth;
int mouseY = scaled.getScaledHeight() - Mouse.getY() * scaled.getScaledHeight() / mc.displayHeight - 1; int mouseY = scaled.getScaledHeight() - Mouse.getY() * scaled.getScaledHeight() / mc.displayHeight - 1;
@@ -352,7 +371,11 @@ public class VideoRenderer implements RenderInfo {
if (settings.isHighPerformance()) { if (settings.isHighPerformance()) {
Display.update(); Display.update();
} else { } else {
//#if MC>=10800
mc.updateDisplay(); mc.updateDisplay();
//#else
//$$ mc.resetSize();
//#endif
} }
if (Mouse.isGrabbed()) { if (Mouse.isGrabbed()) {
Mouse.setGrabbed(false); Mouse.setGrabbed(false);

View File

@@ -13,11 +13,20 @@ import net.minecraft.util.ReportedException;
import net.minecraft.util.Timer; import net.minecraft.util.Timer;
import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.ForgeHooksClient;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.FMLCommonHandler;
import org.lwjgl.input.Keyboard; import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse; import org.lwjgl.input.Mouse;
//#if MC>=10800
import net.minecraftforge.fml.common.FMLCommonHandler;
import java.io.IOException; 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 { public class InputReplayTimer extends WrappedTimer {
private final ReplayModReplay mod; private final ReplayModReplay mod;
@@ -33,6 +42,11 @@ public class InputReplayTimer extends WrappedTimer {
public void updateTimer() { public void updateTimer() {
super.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 // 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) // tick speed may vary or there may not be any ticks at all (when the replay is paused)
if (mod.getReplayHandler() != null) { if (mod.getReplayHandler() != null) {
@@ -45,11 +59,15 @@ public class InputReplayTimer extends WrappedTimer {
handleKeyEvent(); handleKeyEvent();
} }
} else { } else {
//#if MC>=10800
try { try {
mc.currentScreen.handleInput(); mc.currentScreen.handleInput();
} catch (IOException e) { // *SIGH* } catch (IOException e) { // *SIGH*
e.printStackTrace(); e.printStackTrace();
} }
//#else
//$$ mc.currentScreen.handleInput();
//#endif
} }
} }
} }
@@ -91,17 +109,22 @@ public class InputReplayTimer extends WrappedTimer {
mc.setIngameFocus(); mc.setIngameFocus();
} }
} else { } else {
//#if MC>=10800
try { try {
mc.currentScreen.handleMouseInput(); mc.currentScreen.handleMouseInput();
} catch (IOException e) { // WHO IS RESPONSIBLE FOR THIS MESS?!? } catch (IOException e) { // WHO IS RESPONSIBLE FOR THIS MESS?!?
e.printStackTrace(); e.printStackTrace();
} }
//#else
//$$ mc.currentScreen.handleMouseInput();
//#endif
} }
FMLCommonHandler.instance().fireMouseInput(); FMLCommonHandler.instance().fireMouseInput();
} }
protected void handleKeyEvent() { 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(); int key = Keyboard.getEventKey() == 0 ? Keyboard.getEventCharacter() + 256 : Keyboard.getEventKey();
boolean pressed = Keyboard.getEventKeyState(); boolean pressed = Keyboard.getEventKeyState();
@@ -131,15 +154,23 @@ public class InputReplayTimer extends WrappedTimer {
if (pressed) { if (pressed) {
// This might be subject to change as vanilla shaders are still kinda unused in 1.8 // 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 (key == Keyboard.KEY_F4 && mc.entityRenderer != null) {
//#if MC>=10800
mc.entityRenderer.switchUseShader(); mc.entityRenderer.switchUseShader();
//#else
//$$ mc.entityRenderer.activateNextShader();
//#endif
} }
if (mc.currentScreen != null) { if (mc.currentScreen != null) {
//#if MC>=10800
try { try {
mc.currentScreen.handleKeyboardInput(); mc.currentScreen.handleKeyboardInput();
} catch (IOException e) { // AND WHO THOUGHT THIS WAS A GREAT IDEA? } catch (IOException e) { // AND WHO THOUGHT THIS WAS A GREAT IDEA?
e.printStackTrace(); e.printStackTrace();
} }
//#else
//$$ mc.currentScreen.handleKeyboardInput();
//#endif
} else { } else {
if (key == Keyboard.KEY_ESCAPE) { if (key == Keyboard.KEY_ESCAPE) {
mc.displayInGameMenu(); mc.displayInGameMenu();
@@ -176,7 +207,11 @@ public class InputReplayTimer extends WrappedTimer {
} }
if (key == 48 && Keyboard.isKeyDown(61)) { if (key == 48 && Keyboard.isKeyDown(61)) {
//#if MC>=10800
mc.getRenderManager().setDebugBoundingBox(!mc.getRenderManager().isDebugBoundingBox()); mc.getRenderManager().setDebugBoundingBox(!mc.getRenderManager().isDebugBoundingBox());
//#else
//$$ RenderManager.debugBoundingBox = !RenderManager.debugBoundingBox;
//#endif
} }
if (key == 25 && Keyboard.isKeyDown(61)) { if (key == 25 && Keyboard.isKeyDown(61)) {
@@ -196,6 +231,7 @@ public class InputReplayTimer extends WrappedTimer {
if (mc.gameSettings.keyBindTogglePerspective.isPressed()) { if (mc.gameSettings.keyBindTogglePerspective.isPressed()) {
mc.gameSettings.thirdPersonView = (mc.gameSettings.thirdPersonView + 1) % 3; mc.gameSettings.thirdPersonView = (mc.gameSettings.thirdPersonView + 1) % 3;
//#if MC>=10800
if (mc.entityRenderer != null) { // Extra check, not in vanilla code if (mc.entityRenderer != null) { // Extra check, not in vanilla code
if (mc.gameSettings.thirdPersonView == 0) { if (mc.gameSettings.thirdPersonView == 0) {
mc.entityRenderer.loadEntityShader(mc.getRenderViewEntity()); mc.entityRenderer.loadEntityShader(mc.getRenderViewEntity());
@@ -203,6 +239,7 @@ public class InputReplayTimer extends WrappedTimer {
mc.entityRenderer.loadEntityShader(null); mc.entityRenderer.loadEntityShader(null);
} }
} }
//#endif
} }
} }
@@ -222,4 +259,8 @@ public class InputReplayTimer extends WrappedTimer {
FMLCommonHandler.instance().fireKeyInput(); FMLCommonHandler.instance().fireKeyInput();
} }
//#if MC<=10710
//$$ public static class RunScheduledTasks extends Event {}
//#endif
} }

View File

@@ -8,10 +8,15 @@ import lombok.AccessLevel;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.util.ScreenShotHelper; import net.minecraft.util.ScreenShotHelper;
import org.apache.commons.io.FileUtils; 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 javax.imageio.ImageIO;
import java.awt.*; import java.awt.*;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;

View File

@@ -1,7 +1,6 @@
package com.replaymod.replay; package com.replaymod.replay;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import com.mojang.authlib.GameProfile;
import com.replaymod.core.utils.Restrictions; import com.replaymod.core.utils.Restrictions;
import com.replaymod.core.utils.WrappedTimer; import com.replaymod.core.utils.WrappedTimer;
import com.replaymod.replay.camera.CameraEntity; 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.entity.EntityOtherPlayerMP;
import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.gui.ScaledResolution;
import net.minecraft.client.network.NetHandlerPlayClient;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.network.EnumPacketDirection;
import net.minecraft.network.NetworkManager; 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 org.lwjgl.opengl.Display;
import java.io.IOException; import java.io.IOException;
import java.util.*; 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.*; 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_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
@@ -150,6 +168,7 @@ public class ReplayHandler {
//$$ mc.ingameGUI.getChatGUI().clearChatMessages(); //$$ mc.ingameGUI.getChatGUI().clearChatMessages();
//#endif //#endif
//#if MC>=10800
NetworkManager networkManager = new NetworkManager(EnumPacketDirection.CLIENTBOUND) { NetworkManager networkManager = new NetworkManager(EnumPacketDirection.CLIENTBOUND) {
@Override @Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable t) { public void exceptionCaught(ChannelHandlerContext ctx, Throwable t) {
@@ -179,6 +198,44 @@ public class ReplayHandler {
//$$ channel.pipeline().addAfter("ReplayModReplay_replaySender", "fml:packet_handler", networkDispatcher); //$$ channel.pipeline().addAfter("ReplayModReplay_replaySender", "fml:packet_handler", networkDispatcher);
//$$ channel.pipeline().fireChannelActive(); //$$ channel.pipeline().fireChannelActive();
//#endif //#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() { public ReplayFile getReplayFile() {
@@ -238,7 +295,11 @@ public class ReplayHandler {
* When the entity is {@code null} or the camera entity, the camera becomes the view entity. * When the entity is {@code null} or the camera entity, the camera becomes the view entity.
* @param e The entity to spectate * @param e The entity to spectate
*/ */
//#if MC>=10800
public void spectateEntity(Entity e) { public void spectateEntity(Entity e) {
//#else
//$$ public void spectateEntity(EntityLivingBase e) {
//#endif
CameraEntity cameraEntity = getCameraEntity(); CameraEntity cameraEntity = getCameraEntity();
if (cameraEntity == null) { if (cameraEntity == null) {
return; // Cannot spectate if we have no camera return; // Cannot spectate if we have no camera
@@ -256,15 +317,15 @@ public class ReplayHandler {
cameraEntity.setCameraController(new SpectatorCameraController(cameraEntity)); cameraEntity.setCameraController(new SpectatorCameraController(cameraEntity));
} }
if (mc.getRenderViewEntity() != e) { if (getRenderViewEntity(mc) != e) {
mc.setRenderViewEntity(e); setRenderViewEntity(mc, e);
cameraEntity.setCameraPosRot(e); cameraEntity.setCameraPosRot(e);
} }
} }
/** /**
* Set the camera as the view entity. * 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() { public void spectateCamera() {
spectateEntity(null); spectateEntity(null);
@@ -275,7 +336,7 @@ public class ReplayHandler {
* @return {@code true} if the camera is the view entity, {@code false} otherwise * @return {@code true} if the camera is the view entity, {@code false} otherwise
*/ */
public boolean isCameraView() { public boolean isCameraView() {
return player(mc) instanceof CameraEntity && player(mc) == mc.getRenderViewEntity(); return player(mc) instanceof CameraEntity && player(mc) == getRenderViewEntity(mc);
} }
/** /**
@@ -376,11 +437,15 @@ public class ReplayHandler {
entity.prevRotationYaw = entity.rotationYaw; entity.prevRotationYaw = entity.rotationYaw;
entity.prevRotationPitch = entity.rotationPitch; entity.prevRotationPitch = entity.rotationPitch;
} }
//#if MC>=10800
try { try {
mc.runTick(); mc.runTick();
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); // This should never be thrown but whatever 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) //finally, updating the camera's position (which is not done by the sync jumping)
moveCameraToTargetPosition(); moveCameraToTargetPosition();

View File

@@ -19,12 +19,20 @@ import com.replaymod.replaystudio.replay.ReplayFile;
import com.replaymod.replaystudio.replay.ZipReplayFile; import com.replaymod.replaystudio.replay.ZipReplayFile;
import com.replaymod.replaystudio.studio.ReplayStudio; import com.replaymod.replaystudio.studio.ReplayStudio;
import net.minecraft.client.Minecraft; 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.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import org.apache.logging.log4j.Logger; //#else
import org.lwjgl.input.Keyboard; //$$ 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 javax.annotation.Nullable;
import java.io.File; import java.io.File;
@@ -36,7 +44,9 @@ import java.util.Optional;
version = "@MOD_VERSION@", version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@", acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*", acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true, clientSideOnly = true,
//#endif
useMetadata = true) useMetadata = true)
public class ReplayModReplay { public class ReplayModReplay {
public static final String MOD_ID = "replaymod-replay"; public static final String MOD_ID = "replaymod-replay";

View File

@@ -31,8 +31,6 @@ import net.minecraft.world.WorldType;
import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.chunk.IChunkProvider;
import net.minecraftforge.common.MinecraftForge; 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.FileUtils;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
@@ -50,6 +48,15 @@ import net.minecraft.util.text.ITextComponent;
//$$ import net.minecraft.util.IChatComponent; //$$ import net.minecraft.util.IChatComponent;
//#endif //#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.io.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@@ -89,6 +96,10 @@ public class ReplaySender extends ChannelDuplexHandler {
SPacketPlayerAbilities.class, SPacketPlayerAbilities.class,
SPacketTitle.class SPacketTitle.class
//#else //#else
//#if MC>=10800
//$$ S43PacketCamera.class,
//$$ S45PacketTitle.class,
//#endif
//$$ S06PacketUpdateHealth.class, //$$ S06PacketUpdateHealth.class,
//$$ S2DPacketOpenWindow.class, //$$ S2DPacketOpenWindow.class,
//$$ S2EPacketCloseWindow.class, //$$ S2EPacketCloseWindow.class,
@@ -97,9 +108,7 @@ public class ReplaySender extends ChannelDuplexHandler {
//$$ S36PacketSignEditorOpen.class, //$$ S36PacketSignEditorOpen.class,
//$$ S37PacketStatistics.class, //$$ S37PacketStatistics.class,
//$$ S1FPacketSetExperience.class, //$$ S1FPacketSetExperience.class,
//$$ S43PacketCamera.class, //$$ S39PacketPlayerAbilities.class
//$$ S39PacketPlayerAbilities.class,
//$$ S45PacketTitle.class
//#endif //#endif
); );
@@ -390,7 +399,11 @@ public class ReplaySender extends ChannelDuplexHandler {
int i = readVarInt(pb); int i = readVarInt(pb);
//#if MC>=10800
Packet p = EnumConnectionState.PLAY.getPacket(EnumPacketDirection.CLIENTBOUND, i); Packet p = EnumConnectionState.PLAY.getPacket(EnumPacketDirection.CLIENTBOUND, i);
//#else
//$$ Packet p = Packet.generatePacket(EnumConnectionState.PLAY.func_150755_b(), i);
//#endif
p.readPacketData(pb); p.readPacketData(pb);
return p; return p;
@@ -409,7 +422,12 @@ public class ReplaySender extends ChannelDuplexHandler {
//$$ if (p instanceof S3FPacketCustomPayload) { //$$ if (p instanceof S3FPacketCustomPayload) {
//$$ S3FPacketCustomPayload packet = (S3FPacketCustomPayload) p; //$$ S3FPacketCustomPayload packet = (S3FPacketCustomPayload) p;
//#endif //#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); final String unknown = replayHandler.getRestrictions().handle(packet);
if (unknown == null) { if (unknown == null) {
return null; return null;
@@ -461,9 +479,15 @@ public class ReplaySender extends ChannelDuplexHandler {
//$$ if (p instanceof S3FPacketCustomPayload) { //$$ if (p instanceof S3FPacketCustomPayload) {
//$$ S3FPacketCustomPayload packet = (S3FPacketCustomPayload) p; //$$ S3FPacketCustomPayload packet = (S3FPacketCustomPayload) p;
//#endif //#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; return null;
} }
//#if MC>=10800
} }
//#if MC>=10904 //#if MC>=10904
@@ -480,6 +504,11 @@ public class ReplaySender extends ChannelDuplexHandler {
//#endif //#endif
//#endif //#endif
if (url.startsWith("replay://")) { 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())); int id = Integer.parseInt(url.substring("replay://".length()));
Map<Integer, String> index = replayFile.getResourcePackIndex(); Map<Integer, String> index = replayFile.getResourcePackIndex();
if (index != null) { if (index != null) {
@@ -503,11 +532,16 @@ public class ReplaySender extends ChannelDuplexHandler {
//#else //#else
//$$ if(p instanceof S01PacketJoinGame) { //$$ if(p instanceof S01PacketJoinGame) {
//$$ S01PacketJoinGame packet = (S01PacketJoinGame) p; //$$ S01PacketJoinGame packet = (S01PacketJoinGame) p;
//#if MC>=10800
//$$ int entId = packet.getEntityId(); //$$ int entId = packet.getEntityId();
//#else
//$$ int entId = packet.func_149197_c();
//#endif
//#endif //#endif
allowMovement = true; allowMovement = true;
actualID = entId; actualID = entId;
entId = -1789435; // Camera entity id should be negative which is an invalid id and can't be used by servers 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(); int dimension = packet.getDimension();
EnumDifficulty difficulty = packet.getDifficulty(); EnumDifficulty difficulty = packet.getDifficulty();
int maxPlayers = packet.getMaxPlayers(); int maxPlayers = packet.getMaxPlayers();
@@ -520,6 +554,15 @@ public class ReplaySender extends ChannelDuplexHandler {
//$$ p = new S01PacketJoinGame(entId, GameType.SPECTATOR, false, dimension, //$$ p = new S01PacketJoinGame(entId, GameType.SPECTATOR, false, dimension,
//$$ difficulty, maxPlayers, worldType, false); //$$ difficulty, maxPlayers, worldType, false);
//#endif //#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 //#if MC>=10904
@@ -535,7 +578,12 @@ public class ReplaySender extends ChannelDuplexHandler {
//$$ respawn.getDifficulty(), respawn.getWorldType(), GameType.SPECTATOR); //$$ respawn.getDifficulty(), respawn.getWorldType(), GameType.SPECTATOR);
//#else //#else
//$$ p = new S07PacketRespawn(respawn.func_149082_c(), //$$ 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
//#endif //#endif
@@ -560,6 +608,7 @@ public class ReplaySender extends ChannelDuplexHandler {
CameraEntity cent = replayHandler.getCameraEntity(); CameraEntity cent = replayHandler.getCameraEntity();
//#if MC>=10800
//#if MC>=10904 //#if MC>=10904
for (SPacketPlayerPosLook.EnumFlags relative : ppl.getFlags()) { for (SPacketPlayerPosLook.EnumFlags relative : ppl.getFlags()) {
if (relative == SPacketPlayerPosLook.EnumFlags.X 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 return null; // At least one of the coordinates is relative, so we don't care
} }
} }
//#endif
if(cent != null) { if(cent != null) {
//#if MC>=10809 //#if MC>=10809
@@ -654,8 +704,10 @@ public class ReplaySender extends ChannelDuplexHandler {
//#if MC>=10904 //#if MC>=10904
ctx.channel().attr(NetworkManager.PROTOCOL_ATTRIBUTE_KEY).set(EnumConnectionState.PLAY); ctx.channel().attr(NetworkManager.PROTOCOL_ATTRIBUTE_KEY).set(EnumConnectionState.PLAY);
//#else //#else
//#if MC>=10800
//$$ ctx.attr(NetworkManager.attrKeyConnectionState).set(EnumConnectionState.PLAY); //$$ ctx.attr(NetworkManager.attrKeyConnectionState).set(EnumConnectionState.PLAY);
//#endif //#endif
//#endif
super.channelActive(ctx); super.channelActive(ctx);
} }

View File

@@ -12,11 +12,11 @@ import lombok.Setter;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.AbstractClientPlayer; import net.minecraft.client.entity.AbstractClientPlayer;
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.client.network.NetHandlerPlayClient;
import net.minecraft.client.settings.KeyBinding; import net.minecraft.client.settings.KeyBinding;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityItemFrame; import net.minecraft.entity.item.EntityItemFrame;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.ResourceLocation; 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.RenderGameOverlayEvent;
import net.minecraftforge.client.event.RenderHandEvent; import net.minecraftforge.client.event.RenderHandEvent;
import net.minecraftforge.common.MinecraftForge; 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 //#if MC>=10904
import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.inventory.EntityEquipmentSlot;
@@ -46,6 +43,19 @@ import net.minecraft.util.text.ITextComponent;
//$$ import net.minecraft.util.MovingObjectPosition; //$$ import net.minecraft.util.MovingObjectPosition;
//#endif //#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.Map;
import java.util.UUID; import java.util.UUID;
import java.util.function.Function; 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. * During a replay the player should be an instance of this class.
* Camera movement is controlled by a separate {@link CameraController}. * 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. * 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) { //$$ public CameraEntity(Minecraft mcIn, World worldIn, NetHandlerPlayClient netHandlerPlayClient, StatisticsManager statisticsManager) {
//$$ super(mcIn, worldIn, netHandlerPlayClient, statisticsManager); //$$ super(mcIn, worldIn, netHandlerPlayClient, statisticsManager);
//#else //#else
//#if MC>=10800
//$$ public CameraEntity(Minecraft mcIn, World worldIn, NetHandlerPlayClient netHandlerPlayClient, StatFileWriter statFileWriter) { //$$ public CameraEntity(Minecraft mcIn, World worldIn, NetHandlerPlayClient netHandlerPlayClient, StatFileWriter statFileWriter) {
//$$ super(mcIn, worldIn, netHandlerPlayClient, 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
//#endif //#endif
FORGE_BUS.register(eventHandler); FORGE_BUS.register(eventHandler);
@@ -151,31 +172,45 @@ public class CameraEntity extends EntityPlayerSP {
* @param to The entity whose position to copy * @param to The entity whose position to copy
*/ */
public void setCameraPosRot(Entity to) { 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; prevPosX = to.prevPosX;
prevPosY = to.prevPosY; prevPosY = to.prevPosY + yOffset;
prevPosZ = to.prevPosZ; prevPosZ = to.prevPosZ;
prevRotationYaw = to.prevRotationYaw; prevRotationYaw = to.prevRotationYaw;
prevRotationPitch = to.prevRotationPitch; prevRotationPitch = to.prevRotationPitch;
posX = to.posX; posX = to.posX;
posY = to.posY; posY = to.posY + yOffset;
posZ = to.posZ; posZ = to.posZ;
rotationYaw = to.rotationYaw; rotationYaw = to.rotationYaw;
rotationPitch = to.rotationPitch; rotationPitch = to.rotationPitch;
lastTickPosX = to.lastTickPosX; lastTickPosX = to.lastTickPosX;
lastTickPosY = to.lastTickPosY; lastTickPosY = to.lastTickPosY + yOffset;
lastTickPosZ = to.lastTickPosZ; lastTickPosZ = to.lastTickPosZ;
updateBoundingBox(); updateBoundingBox();
} }
private void updateBoundingBox() { private void updateBoundingBox() {
//#if MC>=10800
setEntityBoundingBox(new AxisAlignedBB( setEntityBoundingBox(new AxisAlignedBB(
//#else
//$$ this.boundingBox.setBB(AxisAlignedBB.getBoundingBox(
//#endif
posX - width / 2, posY, posZ - width / 2, posX - width / 2, posY, posZ - width / 2,
posX + width / 2, posY + height, posZ + width / 2)); posX + width / 2, posY + height, posZ + width / 2));
} }
@Override @Override
public void onUpdate() { public void onUpdate() {
Entity view = mc.getRenderViewEntity(); //#if MC>=10800
Entity view = getRenderViewEntity(mc);
//#else
//$$ EntityLivingBase view = getRenderViewEntity(mc);
//#endif
if (view != null) { if (view != null) {
// Make sure we're always spectating the right entity // Make sure we're always spectating the right entity
// This is important if the spectated player respawns as their // This is important if the spectated player respawns as their
@@ -191,9 +226,9 @@ public class CameraEntity extends EntityPlayerSP {
} }
view = world(this).getPlayerEntityByUUID(spectating); view = world(this).getPlayerEntityByUUID(spectating);
if (view != null) { if (view != null) {
mc.setRenderViewEntity(view); setRenderViewEntity(mc, view);
} else { } else {
mc.setRenderViewEntity(this); setRenderViewEntity(mc, this);
return; return;
} }
} }
@@ -216,7 +251,7 @@ public class CameraEntity extends EntityPlayerSP {
@Override @Override
public void setRotation(float yaw, float pitch) { 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 // Only update camera rotation when the camera is the view
super.setRotation(yaw, pitch); 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 return falseUnlessSpectating(e -> e.isInsideOfMaterial(materialIn)); // Make sure no overlays are rendered
} }
//#if MC>=10800
@Override @Override
public boolean isInLava() { public boolean isInLava() {
return falseUnlessSpectating(Entity::isInLava); // Make sure no lava overlay is rendered 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 @Override
public boolean isInWater() { public boolean isInWater() {
@@ -248,7 +290,7 @@ public class CameraEntity extends EntityPlayerSP {
} }
private boolean falseUnlessSpectating(Function<Entity, Boolean> property) { private boolean falseUnlessSpectating(Function<Entity, Boolean> property) {
Entity view = mc.getRenderViewEntity(); Entity view = getRenderViewEntity(mc);
if (view != null && view != this) { if (view != null && view != this) {
return property.apply(view); return property.apply(view);
} }
@@ -260,20 +302,24 @@ public class CameraEntity extends EntityPlayerSP {
return false; // We are in full control of ourselves return false; // We are in full control of ourselves
} }
//#if MC>=10800
@Override @Override
protected void createRunningParticles() { protected void createRunningParticles() {
// We do not produce any particles, we are a camera // We do not produce any particles, we are a camera
} }
//#endif
@Override @Override
public boolean canBeCollidedWith() { public boolean canBeCollidedWith() {
return false; // We are a camera, we cannot collide return false; // We are a camera, we cannot collide
} }
//#if MC>=10800
@Override @Override
public boolean isSpectator() { public boolean isSpectator() {
return ReplayModReplay.instance.getReplayHandler().isCameraView(); // Make sure we're treated as spectator return ReplayModReplay.instance.getReplayHandler().isCameraView(); // Make sure we're treated as spectator
} }
//#endif
@Override @Override
public boolean shouldRenderInPass(int pass) { public boolean shouldRenderInPass(int pass) {
@@ -285,7 +331,7 @@ public class CameraEntity extends EntityPlayerSP {
@Override @Override
public boolean isInvisible() { public boolean isInvisible() {
Entity view = mc.getRenderViewEntity(); Entity view = getRenderViewEntity(mc);
if (view != this) { if (view != this) {
return view.isInvisible(); return view.isInvisible();
} }
@@ -294,13 +340,14 @@ public class CameraEntity extends EntityPlayerSP {
@Override @Override
public ResourceLocation getLocationSkin() { public ResourceLocation getLocationSkin() {
Entity view = mc.getRenderViewEntity(); Entity view = getRenderViewEntity(mc);
if (view != this && view instanceof EntityPlayer) { if (view != this && view instanceof EntityPlayer) {
return Utils.getResourceLocationForPlayerUUID(view.getUniqueID()); return Utils.getResourceLocationForPlayerUUID(view.getUniqueID());
} }
return super.getLocationSkin(); return super.getLocationSkin();
} }
//#if MC>=10800
@Override @Override
public String getSkinType() { public String getSkinType() {
Entity view = mc.getRenderViewEntity(); Entity view = mc.getRenderViewEntity();
@@ -309,10 +356,11 @@ public class CameraEntity extends EntityPlayerSP {
} }
return super.getSkinType(); return super.getSkinType();
} }
//#endif
@Override @Override
public float getSwingProgress(float renderPartialTicks) { public float getSwingProgress(float renderPartialTicks) {
Entity view = mc.getRenderViewEntity(); Entity view = getRenderViewEntity(mc);
if (view != this && view instanceof EntityPlayer) { if (view != this && view instanceof EntityPlayer) {
return ((EntityPlayer) view).getSwingProgress(renderPartialTicks); return ((EntityPlayer) view).getSwingProgress(renderPartialTicks);
} }
@@ -403,17 +451,21 @@ public class CameraEntity extends EntityPlayerSP {
if (mc.gameSettings.keyBindAttack.isPressed() || mc.gameSettings.keyBindUseItem.isPressed()) { if (mc.gameSettings.keyBindAttack.isPressed() || mc.gameSettings.keyBindUseItem.isPressed()) {
if (canSpectate(mc.pointedEntity)) { 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 // Make sure we don't exit right away
mc.gameSettings.keyBindSneak.pressTime = 0; mc.gameSettings.keyBindSneak.pressTime = 0;
} }
} }
Map<String, KeyBinding> keyBindings = ReplayMod.instance.getKeyBindingRegistry().getKeyBindings(); Map<String, KeyBinding> 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; 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; roll -= Utils.isCtrlDown() ? 0.2 : 1;
} }
} }
@@ -427,7 +479,11 @@ public class CameraEntity extends EntityPlayerSP {
public boolean canSpectate(Entity e) { public boolean canSpectate(Entity e) {
return e != null && !e.isInvisible() return e != null && !e.isInvisible()
//#if MC>=10800
&& (e instanceof EntityPlayer || e instanceof EntityLiving || e instanceof EntityItemFrame); && (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 //#if MC>=11102
@@ -448,7 +504,14 @@ public class CameraEntity extends EntityPlayerSP {
//$$ } //$$ }
//#endif //#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 @SubscribeEvent
public void onPreClientTick(TickEvent.ClientTickEvent event) { public void onPreClientTick(TickEvent.ClientTickEvent event) {
if (event.phase == TickEvent.Phase.START) { if (event.phase == TickEvent.Phase.START) {
@@ -490,14 +553,14 @@ public class CameraEntity extends EntityPlayerSP {
@SubscribeEvent @SubscribeEvent
public void onRenderHand(RenderHandEvent event) { public void onRenderHand(RenderHandEvent event) {
// Unless we are spectating another player, don't render our hand // 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); event.setCanceled(true);
} }
} }
@SubscribeEvent(priority = EventPriority.LOWEST) @SubscribeEvent(priority = EventPriority.LOWEST)
public void onRenderHandMonitor(RenderHandEvent event) { public void onRenderHandMonitor(RenderHandEvent event) {
Entity view = mc.getRenderViewEntity(); Entity view = getRenderViewEntity(mc);
if (view instanceof EntityPlayer) { if (view instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) view; EntityPlayer player = (EntityPlayer) view;
// When the spectated player has changed, force equip their items to prevent the equip animation // 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 @SubscribeEvent
public void onEntityViewRenderEvent(EntityViewRenderEvent.CameraSetup event) { public void onEntityViewRenderEvent(EntityViewRenderEvent.CameraSetup event) {
if (mc.getRenderViewEntity() == CameraEntity.this) { if (mc.getRenderViewEntity() == CameraEntity.this) {
@@ -535,6 +599,7 @@ public class CameraEntity extends EntityPlayerSP {
//#endif //#endif
} }
} }
//#endif
private boolean heldItemTooltipsWasTrue; private boolean heldItemTooltipsWasTrue;

View File

@@ -35,7 +35,7 @@ public class ClassicCameraController implements CameraController {
boolean forward = false, backward = false, left = false, right = false, up = false, down = false; boolean forward = false, backward = false, left = false, right = false, up = false, down = false;
speedup = false; speedup = false;
for(KeyBinding kb : Minecraft.getMinecraft().gameSettings.keyBindings) { for(KeyBinding kb : Minecraft.getMinecraft().gameSettings.keyBindings) {
if(!kb.isKeyDown()) continue; if(!isKeyDown(kb)) continue;
if(kb.getKeyDescription().equals("key.forward")) { if(kb.getKeyDescription().equals("key.forward")) {
forward = true; forward = true;
speedup = true; speedup = true;

View File

@@ -10,6 +10,8 @@ import org.lwjgl.input.Mouse;
import java.util.Arrays; import java.util.Arrays;
import static com.replaymod.core.versions.MCVer.*;
@RequiredArgsConstructor @RequiredArgsConstructor
public class SpectatorCameraController implements CameraController { public class SpectatorCameraController implements CameraController {
private final CameraEntity camera; 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 // 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 // This is necessary as some rendering code for the hand doesn't respect the view entity
// and always uses mc.thePlayer // and always uses mc.thePlayer
Entity view = mc.getRenderViewEntity(); Entity view = getRenderViewEntity(mc);
if (view != null && view != camera) { 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 it's a player, also 'steal' its inventory so the rendering code knows what item to render
if (view instanceof EntityPlayer) { if (view instanceof EntityPlayer) {
EntityPlayer viewPlayer = (EntityPlayer) view; EntityPlayer viewPlayer = (EntityPlayer) view;

View File

@@ -5,6 +5,8 @@ import net.minecraft.client.settings.GameSettings;
import net.minecraft.client.settings.KeyBinding; import net.minecraft.client.settings.KeyBinding;
import org.lwjgl.util.vector.Vector3f; import org.lwjgl.util.vector.Vector3f;
import static com.replaymod.core.versions.MCVer.*;
/** /**
* Camera controller performing vanilla creative-like camera movements. * Camera controller performing vanilla creative-like camera movements.
*/ */
@@ -39,7 +41,7 @@ public class VanillaCameraController implements CameraController {
if (partialTicksPassed == 0) return; if (partialTicksPassed == 0) return;
Vector3f direction = new Vector3f(0, 0, 0); Vector3f direction = new Vector3f(0, 0, 0);
for (int i = 0; i < 6; i++) { // First, get movement direction depending on keys pressed 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); Vector3f.add(direction, DIRECTIONS[i], direction);
} }
} }

View File

@@ -3,8 +3,14 @@ package com.replaymod.replay.events;
import com.replaymod.replay.camera.CameraEntity; import com.replaymod.replay.camera.CameraEntity;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.Cancelable; import net.minecraftforge.fml.common.eventhandler.Cancelable;
import net.minecraftforge.fml.common.eventhandler.Event; import net.minecraftforge.fml.common.eventhandler.Event;
//#else
//$$ import cpw.mods.fml.common.eventhandler.Cancelable;
//$$ import cpw.mods.fml.common.eventhandler.Event;
//#endif
@Cancelable @Cancelable
@RequiredArgsConstructor @RequiredArgsConstructor

View File

@@ -3,7 +3,12 @@ package com.replaymod.replay.events;
import com.replaymod.replay.ReplayHandler; import com.replaymod.replay.ReplayHandler;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.Event; import net.minecraftforge.fml.common.eventhandler.Event;
//#else
//$$ import cpw.mods.fml.common.eventhandler.Event;
//#endif
@RequiredArgsConstructor @RequiredArgsConstructor
public abstract class ReplayCloseEvent extends Event { public abstract class ReplayCloseEvent extends Event {

View File

@@ -1,7 +1,12 @@
package com.replaymod.replay.events; package com.replaymod.replay.events;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.Cancelable; import net.minecraftforge.fml.common.eventhandler.Cancelable;
import net.minecraftforge.fml.common.eventhandler.Event; 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 { public abstract class ReplayDispatchKeypressesEvent extends Event {

Some files were not shown because too many files have changed in this diff Show More