Compare commits
86 Commits
1.8-2.1.0
...
1.11.2-2.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
00adf7f083 | ||
|
|
7458e46e07 | ||
|
|
ed6e11f106 | ||
|
|
178c6b21a1 | ||
|
|
87335cd243 | ||
|
|
06bebda557 | ||
|
|
430a5044f5 | ||
|
|
e7ce03e85f | ||
|
|
bab1d3463e | ||
|
|
2dce4eb54a | ||
|
|
0ed9a5533e | ||
|
|
c148076a40 | ||
|
|
e11f8f9e9d | ||
|
|
604d33d846 | ||
|
|
1ca91d7ee9 | ||
|
|
5f7e4fd9dd | ||
|
|
e70ef7a601 | ||
|
|
b0a65b1103 | ||
|
|
134c10f39e | ||
|
|
fd7da227a0 | ||
|
|
701e8e8bba | ||
|
|
4ea0da3fe6 | ||
|
|
4f413e34fc | ||
|
|
45cc789add | ||
|
|
24e1f7b9fb | ||
|
|
b1c6098205 | ||
|
|
caf6051ab7 | ||
|
|
b8b4f167ef | ||
|
|
263e080401 | ||
|
|
8fad02cae7 | ||
|
|
13bb0bde13 | ||
|
|
5257a412a5 | ||
|
|
689f897930 | ||
|
|
0aed9c3c17 | ||
|
|
f36ebf1d0a | ||
|
|
08170b38ef | ||
|
|
d56fa9b88f | ||
|
|
7c719e03cc | ||
|
|
5dd31f4cac | ||
|
|
2a47f579a9 | ||
|
|
96b2904e4b | ||
|
|
6c8c779983 | ||
|
|
aa16e42a4f | ||
|
|
ed566732df | ||
|
|
cda8493df1 | ||
|
|
0c36022b47 | ||
|
|
325d041bd9 | ||
|
|
d9d57e283c | ||
|
|
24c58cbbe7 | ||
|
|
3f52336852 | ||
|
|
c6293bcbb0 | ||
|
|
c8126edbb2 | ||
|
|
33cb1405d5 | ||
|
|
b6cf42c3be | ||
|
|
c6dec95a57 | ||
|
|
4fdfa9ec87 | ||
|
|
44d4a250eb | ||
|
|
01acbc6f1f | ||
|
|
503b308043 | ||
|
|
7b491d188d | ||
|
|
fb4140a123 | ||
|
|
905ae75330 | ||
|
|
72e1fe0d6c | ||
|
|
2428c01c9c | ||
|
|
260720d5ba | ||
|
|
372206fdff | ||
|
|
4a1cceaa47 | ||
|
|
58b7c44a33 | ||
|
|
9f7ccb9d07 | ||
|
|
ca2bbca7a4 | ||
|
|
75c0e7b77a | ||
|
|
ce313596db | ||
|
|
b1661e359a | ||
|
|
e20dfa6d7f | ||
|
|
7cc0ee523a | ||
|
|
54790d33f9 | ||
|
|
165861764c | ||
|
|
5014edafe0 | ||
|
|
09f167f10e | ||
|
|
21ac84e990 | ||
|
|
8e6eec879f | ||
|
|
5100f36b2c | ||
|
|
7ef6a6d166 | ||
|
|
446b9be384 | ||
|
|
d1ed67f1a0 | ||
|
|
a80a20c37a |
62
build.gradle
62
build.gradle
@@ -17,8 +17,8 @@ buildscript {
|
||||
}
|
||||
}
|
||||
dependencies {
|
||||
classpath 'net.minecraftforge.gradle:ForgeGradle:2.0-SNAPSHOT'
|
||||
classpath 'org.spongepowered:mixingradle:0.3-SNAPSHOT'
|
||||
classpath 'net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT'
|
||||
classpath 'org.spongepowered:mixingradle:0.4-SNAPSHOT'
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,9 +34,9 @@ archivesBaseName = "replaymod"
|
||||
|
||||
minecraft {
|
||||
coreMod = 'com.replaymod.core.LoadingPlugin'
|
||||
version = '1.8-11.14.4.1563'
|
||||
version = '1.11.2-13.20.0.2216'
|
||||
runDir = "eclipse"
|
||||
mappings = "snapshot_nodoc_20141130"
|
||||
mappings = "snapshot_20161220"
|
||||
replace '@MOD_VERSION@', project.version
|
||||
// Includes intentional whitespace to stop Forge from declaring the mod to be compatible with
|
||||
// a newer srg-compatible MC version (that may be using a different protocol version)
|
||||
@@ -69,7 +69,7 @@ dependencies {
|
||||
|
||||
shade 'org.aspectj:aspectjrt:1.8.2'
|
||||
|
||||
shade 'com.github.replaymod:ReplayStudio:a2168ca'
|
||||
shade 'com.github.replaymod:ReplayStudio:9605121'
|
||||
|
||||
testCompile 'junit:junit:4.11'
|
||||
}
|
||||
@@ -111,6 +111,7 @@ jar {
|
||||
manifest {
|
||||
attributes 'TweakClass': 'org.spongepowered.asm.launch.MixinTweaker',
|
||||
'TweakOrder': '0',
|
||||
'FMLCorePluginContainsFMLMod': 'true',
|
||||
'FMLAT': 'replaymod_at.cfg'
|
||||
}
|
||||
}
|
||||
@@ -179,6 +180,57 @@ setupDecompWorkspace.dependsOn copySrg
|
||||
setupDevWorkspace.dependsOn copySrg
|
||||
project.tasks.idea.dependsOn copySrg
|
||||
|
||||
|
||||
import org.objectweb.asm.*
|
||||
|
||||
import java.util.zip.ZipEntry
|
||||
import java.util.zip.ZipFile
|
||||
import java.util.zip.ZipOutputStream
|
||||
|
||||
import static org.objectweb.asm.Opcodes.ASM5
|
||||
|
||||
// MC binaries were complied with a java version that produces invalid class files under certain circumstances
|
||||
// This causes setupCIWorkspace to be insufficient for compiling.
|
||||
// Related JDK bug: https://bugs.openjdk.java.net/browse/JDK-8066725
|
||||
// As a workaround, to use setupCIWorkspace on Drone, we modify the bin jar in-place and remove all parameter annotations.
|
||||
// WARNING: This piece of code ignores any and all gradle conventions and will probably fail horribly when run outside
|
||||
// of a single-use environment (e.g. Drone). Use setupDecompWorkspace for normal use.
|
||||
tasks.deobfMcMCP.doLast {
|
||||
println "Applying RuntimeInvisibleParameterAnnotations workaround..."
|
||||
File jar = getOutJar()
|
||||
File tmp = new File((File) getTemporaryDir(), "workaround.jar")
|
||||
tmp.withOutputStream {
|
||||
new ZipOutputStream(it).withStream { dst ->
|
||||
new ZipFile(jar).withCloseable { src ->
|
||||
src.entries().each {
|
||||
if (it.name.startsWith("net/minecraft/") && it.name.endsWith(".class")) {
|
||||
def cw = new ClassWriter(0)
|
||||
def cv = new ClassVisitor(ASM5, cw) {
|
||||
@Override
|
||||
MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
|
||||
return new MethodVisitor(ASM5, cv.visitMethod(access, name, desc, signature, exceptions)) {
|
||||
@Override
|
||||
AnnotationVisitor visitParameterAnnotation(int parameter, String pdesc, boolean visible) {
|
||||
return null // Strip all parameter annotations
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
new ClassReader(src.getInputStream(it)).accept(cv, 0)
|
||||
dst.putNextEntry(new ZipEntry(it.name))
|
||||
dst.write(cw.toByteArray())
|
||||
} else {
|
||||
dst.putNextEntry(it)
|
||||
dst.write(src.getInputStream(it).bytes)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
jar.delete()
|
||||
tmp.renameTo(jar)
|
||||
}
|
||||
|
||||
task runIntegrationTest(type: JavaExec, dependsOn: ["makeStart", "jar"]) {
|
||||
main = 'GradleStart'
|
||||
standardOutput = System.out
|
||||
|
||||
@@ -14,8 +14,8 @@ f98b3e07c6b6a32dd6f9f70f5cef4ac9be42a9a6c850ceb8f33767da94706635 /com/github/joh
|
||||
03e3dff7f9b3ac6cd3b87684fd36a2f6996a4b164a2f8fab9c22c01cb7bfb84b /com/github/johni0702/gradle-reproducible-builds-plugin/a524ada/gradle-reproducible-builds-plugin-a524ada.pom
|
||||
75ccc0e24d37ed5b8916e1bcffad1e067c2b1cfa21b635287f968db5c3c1963a /com/github/jponge/lzma-java/1.3/lzma-java-1.3.jar
|
||||
fbcba81b21a8bc3c0761e4798fa05285444b43d681c03c9af49f9b2e1ecb0184 /com/github/jponge/lzma-java/1.3/lzma-java-1.3.pom
|
||||
04d7ceaf1e83006d2d93518884353a7856399669332d1174f2572e3d6ec03cd3 /com/github/replaymod/ReplayStudio/a2168ca/ReplayStudio-a2168ca.jar
|
||||
0703ef825f3e3cd0943f6955fd12da923eb255ed94fe421cbb207b2dcfd61ba4 /com/github/replaymod/ReplayStudio/a2168ca/ReplayStudio-a2168ca.pom
|
||||
c9f435c3c429ee1f13e664614a27baf1d2ae308f4830fbc37fd66c639a877a6f /com/github/replaymod/ReplayStudio/9605121/ReplayStudio-9605121.jar
|
||||
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 /com/github/replaymod/ReplayStudio/9605121/ReplayStudio-9605121.pom
|
||||
c6ebd74cd6108b8c372c95b842725ee5bd6d3303ba26cb00f18bc92f80b47956 /com/github/tony19/named-regexp/0.2.3/named-regexp-0.2.3.jar
|
||||
7cdd89a892927998beab59398ef073232588f6e83e411cf4f0905833bf300487 /com/github/tony19/named-regexp/0.2.3/named-regexp-0.2.3.pom
|
||||
47c625c83a8cf97b8bbdff2acde923ff8fd3174e62aabcfc5d1b86692594ffba /com/google/api-client/google-api-client/1.22.0/google-api-client-1.22.0.jar
|
||||
@@ -30,8 +30,8 @@ d8e9ec26a01cc19c530ab781cc71185acb9f9d576716e3d585a1d4f12f2089c8 /com/google/api
|
||||
4dad29307c34e923ebb6d29e2c265850a0f0b691c7a63384279aa8353eae28b9 /com/google/apis/google-api-services-youtube/v3-rev178-1.22.0/google-api-services-youtube-v3-rev178-1.22.0.pom
|
||||
905721a0eea90a81534abb7ee6ef4ea2e5e645fa1def0a5cd88402df1b46c9ed /com/google/code/findbugs/jsr305/1.3.9/jsr305-1.3.9.jar
|
||||
feab9191311c3d7aeef2b66d6064afc80d3d1d52d980fb07ae43c78c987ba93a /com/google/code/findbugs/jsr305/1.3.9/jsr305-1.3.9.pom
|
||||
1e7f53fa5b8b5c807e986ba335665da03f18d660802d8bf061823089d1bee468 /com/google/code/findbugs/jsr305/2.0.1/jsr305-2.0.1.jar
|
||||
02c12c3c2ae12dd475219ff691c82a4d9ea21f44bc594a181295bf6d43dcfbb0 /com/google/code/findbugs/jsr305/2.0.1/jsr305-2.0.1.pom
|
||||
c885ce34249682bc0236b4a7d56efcc12048e6135a5baf7a9cde8ad8cda13fcd /com/google/code/findbugs/jsr305/3.0.1/jsr305-3.0.1.jar
|
||||
4170a761dc5bfd3981a8e6f7aab9e2acdce82d34fd5aa9bb11e3c090d25314ce /com/google/code/findbugs/jsr305/3.0.1/jsr305-3.0.1.pom
|
||||
8cc1f0813a186079f82d300a43156bdf852a88008f4f1a1fa71e788fb3b9a86d /com/google/code/google-collections/google-collect/snapshot-20080530/google-collect-snapshot-20080530.jar
|
||||
7d131d6a082a33363bdfbf55d2fee2219d9bc8d1c455cc3f7c6403cf2a4496a5 /com/google/code/google-collections/google-collect/snapshot-20080530/google-collect-snapshot-20080530.pom
|
||||
35c94198255e95f6f11501eb4b3d43a5276bfdd142ab7c904722e69bff51f69e /com/google/code/gson/gson/2.1/gson-2.1.jar
|
||||
@@ -40,8 +40,6 @@ c0328cd07ca9e363a5acd00c1cf4afe8cf554bd6d373834981ba05cebec687fb /com/google/cod
|
||||
ae984d5d19894ce6dc4689866eaa12f8fc31409113e60ee3b44853b8ac4fd380 /com/google/code/gson/gson/2.2.4/gson-2.2.4.pom
|
||||
4838f4f29a027522363cef1bcda1b48808880b0de4953fab6db4121ee27b649b /com/googlecode/jarjar/jarjar/1.1/jarjar-1.1.jar
|
||||
be4f53c0bc04da4e3d6c65c8f3243d1ea4135e35c7d7dda88af1c582687263d7 /com/googlecode/jarjar/jarjar/1.1/jarjar-1.1.pom
|
||||
d1296fa8926f71743be61cb4bfdac2ac3deb9ffe1a4948b1f293cb7a1bdb1800 /com/googlecode/javaewah/JavaEWAH/0.5.6/JavaEWAH-0.5.6.jar
|
||||
fa5c2d7edcd57c6e1b402773dc32a180f82c111af44bfc2d483a2c7be1862e8f /com/googlecode/javaewah/JavaEWAH/0.5.6/JavaEWAH-0.5.6.pom
|
||||
ddbbf392f8e61f770a509a49aed5f32ead19768283b4b512c626e09e1ba5cc46 /com/googlecode/mp4parser/isoparser/1.1.7/isoparser-1.1.7.jar
|
||||
6890ebacb23d3ab51a5751a830f5269b7e8fdd19d08b7e055bc739f62b4bd174 /com/googlecode/mp4parser/isoparser/1.1.7/isoparser-1.1.7.pom
|
||||
8c36a80ea613d0b6b8040a17cf837c5bbe3677bc1b06a058a6c174fdb787ebbc /com/google/guava/guava/17.0/guava-17.0.jar
|
||||
@@ -78,16 +76,14 @@ bbc21cab2e0b0c76c9977fdf8b80c311788094d81e6910a2a6e63d80910102c7 /com/gradle/pub
|
||||
89aa507536b0a93d8c9d3087d738255eefffc002cefa255ebdbd6891b8165447 /com/gradle/publish/plugin-publish-plugin/0.9.1/plugin-publish-plugin-0.9.1.pom
|
||||
147592c5eb8e11fc8394125954f877acf25918bae13aa210c2825aefc3030ed8 /com/ibm/icu/icu4j-core-mojang/51.2/icu4j-core-mojang-51.2.jar
|
||||
06b382efe9d60474aa3df7f4851397b3ae0c4f142567f0fc66a8fa2706a665e4 /com/ibm/icu/icu4j-core-mojang/51.2/icu4j-core-mojang-51.2.pom
|
||||
48cd629c3081dff4d8c35e7da4efb3bcc4ed4b35c8a7e8198d5c30e0312bd912 /com/jcraft/jsch/0.1.46/jsch-0.1.46.jar
|
||||
eb60cec1e570efad3d750afd9a86b763dba49e47c3c106a599c05e708260efc4 /com/jcraft/jsch/0.1.46/jsch-0.1.46.pom
|
||||
2c149735a093b6c65a27db760896ad5c5b06e29100bb8969937667784fef4ba0 /com/mojang/authlib/1.5.16/authlib-1.5.16.jar
|
||||
d05175230d79f518b5c4664d24e3d115f5f3888e3806f3b6076cd0b4943e6ca6 /com/mojang/authlib/1.5.16/authlib-1.5.16.pom
|
||||
ce7a9c86ebebf30b89929026f4a0a3c58ce0f4d47937d6dc086ae4fd0c77544a /com/mojang/authlib/1.5.21/authlib-1.5.21.jar
|
||||
d59283c7303b42e416518d8f5c265895295c11690fd8d36079f1a04c6a56b17c /com/mojang/authlib/1.5.21/authlib-1.5.21.pom
|
||||
795f783dc6301d10e356d1f3db9952d71692ed8004ffdd843f0049f813a0d1a5 /com/mojang/authlib/1.5.24/authlib-1.5.24.jar
|
||||
0ff47d5e96e67c629513d5cc743a5180dc935603e5957b11ea05fe021bacd5f9 /com/mojang/authlib/1.5.24/authlib-1.5.24.pom
|
||||
3120fd24c09ab9bc088cb9c1eb2065be86718608450fdbc27b5d371729a619cb /com/mojang/netty/1.6/netty-1.6.jar
|
||||
568cc3fad81e5e389bad0012a07eca5db073e287200c6c9cb02caf3dc489e9f6 /com/mojang/netty/1.6/netty-1.6.pom
|
||||
0ad91190cd480af14954d361d7b9ffc53ab3c5344797e3c9fd90c29bf5d28499 /com/mojang/realms/1.6.1/realms-1.6.1.jar
|
||||
6c724ad415af96416e035a5ae96b113b1df9247d5833fbf73135c66b23263904 /com/mojang/realms/1.6.1/realms-1.6.1.pom
|
||||
a74b4370bc60e368b9c29940d3b6aae334aef3f5cf16b5c2ee5d0b775ef6ea18 /com/mojang/realms/1.10.16/realms-1.10.16.jar
|
||||
23c16b609458580d2f12abba28604264bfc71451374584a673bd52ad3b99c25c /com/mojang/realms/1.10.16/realms-1.10.16.pom
|
||||
e7cd8951956d349b568b7ccfd4f5b2529a8c113e67c32b028f52ffda371259d9 /commons-cli/commons-cli/1.2/commons-cli-1.2.jar
|
||||
18f3e92076e08c2fde48317025098e9f6baaa85f6912eb43f2d7e68d570e4561 /commons-cli/commons-cli/1.2/commons-cli-1.2.pom
|
||||
1bafd2ece2e88db4cdf835a7f8f0de65fab5b1147977a5dcc59b7c1b8c6f5080 /commons-codec/commons-codec/1.3/commons-codec-1.3.jar
|
||||
@@ -127,25 +123,34 @@ c1a2438a4d35f8586c71d96c44a7e2f133ec924597147a246f8c501acca6acb5 /com/paulscode/
|
||||
9f9920b48ae5f1045fe966f08164d6b4e0a727cf17f8e4813ae5c0f2daecffbc /com/typesafe/akka/akka-actor_2.11/2.3.3/akka-actor_2.11-2.3.3.pom
|
||||
c160fbd78f51a0c2375a794e435ce2112524a6871f64d0331895e9e26ee8b9ee /com/typesafe/config/1.2.1/config-1.2.1.jar
|
||||
62361ef10448869fff8c05150bd0449b423e3ff4498f2a4bab825b3c7685aa3c /com/typesafe/config/1.2.1/config-1.2.1.pom
|
||||
68f43fed6611873d19f6dcf2d6739e1f2ddbed3cdd39e6a9f72ec1caee459f59 /de/oceanlabs/mcp/mcp/1.8/mcp-1.8-srg.zip
|
||||
cf2630841a5ef712b4be22a814f1b83964850b0de4dc78f6131b66280beb3249 /de/oceanlabs/mcp/mcp_snapshot_nodoc/20141130-1.8/mcp_snapshot_nodoc-20141130-1.8.zip
|
||||
be95745a7052c11e232fe1b307e5e75444d8408b4d4127c32660e07fea338511 /de/oceanlabs/mcp/mcp/1.11.2/mcp-1.11.2-srg.zip
|
||||
755416d68281e0c6998fc743929f36e14563510467d1c749d4bf66ba5bf82b19 /de/oceanlabs/mcp/mcp_snapshot/20161220-1.11/mcp_snapshot-20161220-1.11.zip
|
||||
22c45060f350fcaa94e503f4a420cf8237c26c0fcdb4ada4aa98389b75c7b231 /de/oceanlabs/mcp/RetroGuard/3.6.6/RetroGuard-3.6.6.jar
|
||||
d6f165bb39aaa20ee14fdcbbdb0b8fffae38067087f333ec6e0acd3f6666b2ad /de/oceanlabs/mcp/RetroGuard/3.6.6/RetroGuard-3.6.6.pom
|
||||
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
|
||||
8064a2f9d222704882928e6ff104decc071ab6b7b07dce8efb90100d1e624e30 /io/netty/netty-parent/4.0.15.Final/netty-parent-4.0.15.Final.pom
|
||||
* /de/oceanlabs/mcp/versions.json
|
||||
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
|
||||
f7f1bd6f1e1df0b300730f1551b7222f13871e40ba5a464978bd3eed94e2212d /io/netty/netty-parent/4.0.23.Final/netty-parent-4.0.23.Final.pom
|
||||
b4533f3b4029e480288d85187fc9ee6789f3d362c6633d8e9b092ec455ad2f28 /it/unimi/dsi/fastutil/7.0.12_mojang/fastutil-7.0.12_mojang.jar
|
||||
2b3db089f1f78a49a628d9015cca6a95e87421fa04262553cd2c4c79d66d04a7 /it/unimi/dsi/fastutil/7.0.12_mojang/fastutil-7.0.12_mojang.pom
|
||||
09adf7955baa6bddf57a4bdbf9a91cf690261314969b59a18085ece1e05eccf9 /java3d/vecmath/1.5.2/vecmath-1.5.2.jar
|
||||
a4aee4668f1b127c95c9afe1b922f4c5a0b1ad879ba811077cb7d0e048dce231 /java3d/vecmath/1.5.2/vecmath-1.5.2.pom
|
||||
a6d2c9c0ddff7702662073b69c6dc4ec83011d22e4eb2dada28aa2d66ee47f97 /jline/jline/2.13/jline-2.13.jar
|
||||
ba62d78eb858e241a604cdf739594cd312f0572756ea7aba4544c746d7152c43 /jline/jline/2.13/jline-2.13.pom
|
||||
90a8e1603eeca48e7e879f3afbc9560715322985f39a274f6f6070b43f9d06fe /junit/junit/4.11/junit-4.11.jar
|
||||
18ad8b0ae9e65a9195d04e25427dfe8b58175abcdae875a5a406aee38bddfb26 /junit/junit/4.11/junit-4.11.pom
|
||||
dc67378cf428c06408e7959e83bdc1518dd22ccd313e7c28a986612d65c276c7 /log4j/log4j/1.2.12/log4j-1.2.12.jar
|
||||
cb54dedc5d8c4510148dfa792701cbac1a84c383a84f48f5a32e6d7e460bbb72 /log4j/log4j/1.2.12/log4j-1.2.12.pom
|
||||
0c3085cb93c3ef95d731c274b6f2dd195aa0405fe9328d69cab7f5e899d5e124 /lzma/lzma/0.0.1/lzma-0.0.1.jar
|
||||
a096bc9f7579cec07483874151578720eeb3189c546c19cff56a6203df17b50e /lzma/lzma/0.0.1/lzma-0.0.1.pom
|
||||
ccccd0a92f76fbb24279691daad9b67f85d80471a37e59e0da76d7754982dfe8 /mc/game/1.8/client/d722504db9de2b47f46cc592b8528446272ae648/client.jar
|
||||
40e23f3823d6f0e3cbadc491cedb55b8ba53f8ab516b68182ddd1536babeb291 /mc/game/1.8/server/a028f00e678ee5c6aef0e29656dca091b5df11c7/server.jar
|
||||
745fdfbba409679b8347f3172109ff186ff743edfed1a9c5bf37443c05fdd480 /mc/game/d74a4b45e8877084e1bcc8121012845f28def238/1.8.json
|
||||
* /mc/game/version_manifest.json
|
||||
be3fff4f2cc005a1310a96389efdeb983d2bcb4b8e747c402acd616ae73d0ba2 /mc/game/1.11.2/client/db5aa600f0b0bf508aaf579509b345c4e34087be/client.jar
|
||||
dec47d36b429fd05076b90b1f42c2a25138bc39204aa51b9674ef2a98d64d88a /mc/game/1.11.2/server/f00c294a1576e03fddcac777c3cf4c7d404c4ba4/server.jar
|
||||
fc6387a60a18b8d649590324a4d16ea489eea7a10e5633a4ae406f73ac868505 /mc/game/12f260fc1976f6dd688a211f1a906f956344abdd/1.11.2.json
|
||||
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
|
||||
ea89d5090c8303ba4e9a0056e6d8a20429f3e021411e950bfd9eba3b6e6cf15c /net/java/dev/jna/platform/3.4.0/platform-3.4.0.jar
|
||||
8f0c14f62912c089d81386015e78cf212f9e96f675b3bc0e519c1e2d92aa8950 /net/java/dev/jna/platform/3.4.0/platform-3.4.0.pom
|
||||
79b5a4f5829e1a49a415711f7fb8eb5b9ad22defa72929fda2da96ec30d3f018 /net/java/jinput/jinput/2.0.5/jinput-2.0.5.jar
|
||||
3199d547c1275e806e0c7be19e90dcb00d9561ec3b31fb2e780e12d7d8785810 /net/java/jinput/jinput/2.0.5/jinput-2.0.5.pom
|
||||
1ab4d194277816b6105253d224c8c69f1b6d720690efe7c85f3ce884f0ea273d /net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-linux.jar
|
||||
@@ -156,9 +161,9 @@ c3334ff39cf0ab3b54925619101054c90098b7c733b1e7834c7b75e4c41e84a5 /net/java/jutil
|
||||
af09ead4eb241473e7ec4d152a91a722ea09a717a202e20e4b385eac3217b7d6 /net/java/jutils/jutils/1.0.0/jutils-1.0.0.pom
|
||||
b47c5d5810643426a3147ddb2195ef2ab67c80b167e7c2ac64a5d0dee8c030dd /net/md-5/SpecialSource/1.7.4/SpecialSource-1.7.4.jar
|
||||
5f374f8ae7afff8dbc23aff14e59c5bd585c230afe9a8dcaa7b928e8cb16a27e /net/md-5/SpecialSource/1.7.4/SpecialSource-1.7.4.pom
|
||||
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
|
||||
* /net/minecraftforge/forge/json
|
||||
b55cbfab15e7258d6d1640f655d5fcaf0e28222c81120b9d9be6b7853db34ccc /net/minecraftforge/forge/1.11.2-13.20.0.2216/forge-1.11.2-13.20.0.2216.pom
|
||||
43734366d24d801abecd5b2dee8bfbb120d81622d0614838ef07e7f602beea27 /net/minecraftforge/forge/1.11.2-13.20.0.2216/forge-1.11.2-13.20.0.2216-userdev.jar
|
||||
e74b65b8948446982a506a96176dd8baf4688237ba4903f56ca6f667b6c7ee42 /net/minecraft/launchwrapper/1.11/launchwrapper-1.11.jar
|
||||
616c4971035d1e6ab4809e16daabb02aa308c1dc001c06dd547c7d3b2e916999 /net/minecraft/launchwrapper/1.11/launchwrapper-1.11.pom
|
||||
57f402b626d16cc2705bf2a37add7adbb074f0ca3b3102fa6e23aa303dae682f /net/minecraft/launchwrapper/1.12/launchwrapper-1.12.jar
|
||||
@@ -337,12 +342,9 @@ cb7c954965e6b2946c2f7be78c1e089b530e0444b1fefc2d8079a5681362bfa1 /org/eclipse/eq
|
||||
d7cd093fdad45c7cc979f44f7166f259607b41cf44a8afe77561594cef4c39d3 /org/eclipse/equinox/registry/maven-metadata.xml
|
||||
9cddda75f4a1b4469e73f44e7b61a3e897d0f657df4797f9106ffe88c4eeade0 /org/eclipse/jdt/core/compiler/ecj/4.6.1/ecj-4.6.1.jar
|
||||
536c45e8804de01321c478cfb994377f81f1e32897636616fa21b877fd137c6f /org/eclipse/jdt/core/compiler/ecj/4.6.1/ecj-4.6.1.pom
|
||||
5a91ef99dc827e77c8dae1481bd5a92a0ce877304f2b25151ba4e0834e8a917d /org/eclipse/jdt/org.eclipse.jdt.core/3.10.0.v20131029-1755/org.eclipse.jdt.core-3.10.0.v20131029-1755.jar
|
||||
5591ec1f9826a0506b33cb2a7bceceaf4058f667c0d5e8fd1a348c36540d9dcb /org/eclipse/jdt/org.eclipse.jdt.core/3.10.0.v20131029-1755/org.eclipse.jdt.core-3.10.0.v20131029-1755.pom
|
||||
2082ffb0bb8f276ca164a6363e394f902163a81b7df44ede13aed33d84fdf27e /org/eclipse/jdt/org.eclipse.jdt.core/3.12.0.v20160315-2126/org.eclipse.jdt.core-3.12.0.v20160315-2126.jar
|
||||
ec467beffac7ffa86b5687a0935b8d3540e8795c9bc0c0d326a1c24cb9be7fe8 /org/eclipse/jdt/org.eclipse.jdt.core/3.12.0.v20160315-2126/org.eclipse.jdt.core-3.12.0.v20160315-2126.pom
|
||||
d6aba7a1569952e082630de6907f460f476c20d97032cb9f7e4f3e14ddb928e7 /org/eclipse/jetty/jetty-parent/14/jetty-parent-14.pom
|
||||
cf65a484e0626d6b79cc40daa820459d893ba6945cbed119859be4db0a07c1fa /org/eclipse/jgit/org.eclipse.jgit/3.2.0.201312181205-r/org.eclipse.jgit-3.2.0.201312181205-r.jar
|
||||
bfe5eb76e637e740e7769f6e081c1c2815f0272f76b93b9bad0b6e686f5a9030 /org/eclipse/jgit/org.eclipse.jgit/3.2.0.201312181205-r/org.eclipse.jgit-3.2.0.201312181205-r.pom
|
||||
0a6f74d2b3a411b785e305ae9678cac377aa2352815a085e4b980d5ba4323f29 /org/eclipse/jgit/org.eclipse.jgit-parent/3.2.0.201312181205-r/org.eclipse.jgit-parent-3.2.0.201312181205-r.pom
|
||||
fa1d59411d4d2667d8f15638af7c0ac44539234c0982c27a2b65ba06c32a0b3e /org/eclipse/osgi/3.10.0-v20140606-1445/osgi-3.10.0-v20140606-1445.jar
|
||||
1e10819cdb1fe55d44ac94d37f3b1030275199979a73d04b7b53e2d6000d5d2e /org/eclipse/osgi/3.10.0-v20140606-1445/osgi-3.10.0-v20140606-1445.pom
|
||||
bddf4d130cb65fdfc1df7df1febde313fc2ff1ac83c8574ff97befd6c515cc30 /org/eclipse/osgi/3.9.1-v20130814-1242/osgi-3.9.1-v20130814-1242.pom
|
||||
@@ -352,6 +354,10 @@ bddf4d130cb65fdfc1df7df1febde313fc2ff1ac83c8574ff97befd6c515cc30 /org/eclipse/os
|
||||
88b506fa09a810b19517a2d45cb8f5eaa76c22b18abfbdcf36cd07aebfd56cb0 /org/eclipse/update/configurator/3.2.100-v20070615/configurator-3.2.100-v20070615.jar
|
||||
4645380254baefd0056e15cc9af6a273fb7d014b8be4ff395a5a61bfe8f4a89c /org/eclipse/update/configurator/3.2.100-v20070615/configurator-3.2.100-v20070615.pom
|
||||
3c731988480eae3024b27d648aa0408a1cdc065fc523cf41a049fb97148fd30a /org/eclipse/update/configurator/maven-metadata.xml
|
||||
b1f003f28c3ce1753ea0da22a6f0289197a2c369e7056b32e170af7904eff2c1 /org/fusesource/fusesource-pom/1.8/fusesource-pom-1.8.pom
|
||||
9e82163ed2fc6257fe627132ce554726e796edee4e5efe9d9e523aee217d60b8 /org/fusesource/jansi/jansi/1.11/jansi-1.11.jar
|
||||
b0975adc7450698033f3de4792dd6eba72a980c2b56d8e8d36d381385b37a5c9 /org/fusesource/jansi/jansi/1.11/jansi-1.11.pom
|
||||
8ba9c49b55f979cf4e04d4871092eb50e834b388fca03a2274ccadff12cc9ce8 /org/fusesource/jansi/jansi-project/1.11/jansi-project-1.11.pom
|
||||
66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9 /org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar
|
||||
fde386a7905173a1b103de6ab820727584b50d0e32282e2797787c20a64ffa93 /org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.pom
|
||||
6d535f94efb663bdb682c9f27a50335394688009642ba7a9677504bc1be4129b /org/hamcrest/hamcrest-parent/1.3/hamcrest-parent-1.3.pom
|
||||
@@ -362,13 +368,20 @@ ebac276b5ad62e9d312fb6ce663d55fdebaba9badc918166e7d60b1ffd1bd475 /org/jdom/jdom2
|
||||
e21488c2fe8db4b23a00c3cfdeab3b600e84c1647e08fb7bee442f5fc1f83990 /org/jvnet/localizer/localizer-parent/1.12/localizer-parent-1.12.pom
|
||||
c118f8d84313980f79e1e7f7ae4b14b10c2f20c77ea4a1c29f6f0b02bc139077 /org/lwjgl/lwjgl/lwjgl/2.9.1/lwjgl-2.9.1.jar
|
||||
1adb09c3cf35e0f55d5ecd91e4364100364d8a8031cdfa64ae61eaa64f0d79d4 /org/lwjgl/lwjgl/lwjgl/2.9.1/lwjgl-2.9.1.pom
|
||||
833e721817f70d1445eec13d8ce5a86e12af70efac5014356302e2bbc68b3fe2 /org/lwjgl/lwjgl/lwjgl/2.9.4-nightly-20150209/lwjgl-2.9.4-nightly-20150209.jar
|
||||
65fb24fa8ee4a7efc554b15cfb447753c39e414ff00e9944d347e6f1176f0438 /org/lwjgl/lwjgl/lwjgl/2.9.4-nightly-20150209/lwjgl-2.9.4-nightly-20150209.pom
|
||||
a50aaa5a89304c23a9257295cbe803e6130526a4dfaea1784076adbacacfd68e /org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-linux.jar
|
||||
e14afffd87719ba12034dd989d40a75540902a6286629fab1330b51c255ab792 /org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-osx.jar
|
||||
ade8deedceb0b60c630f3e78a7b052b7f8f02ff53d91849d1985d3146bf95590 /org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-windows.jar
|
||||
82eb11d59b06700b9ff3db4e0476de1cf86501ba7cd00bb279f40a7c23ad662b /org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1.pom
|
||||
32d7e73005a2dc0ccc3c62470c435b351f6501de8e8718e26960534754570a77 /org/lwjgl/lwjgl/lwjgl_util/2.9.1/lwjgl_util-2.9.1.jar
|
||||
10eab9f1aa97eef450d6c8eca8f459dcdcb9b1d3efbf54eb3dcde33b7aaea1dc /org/lwjgl/lwjgl/lwjgl_util/2.9.1/lwjgl_util-2.9.1.pom
|
||||
d312147c3999b868fd649887f45203a4195bc10fc563cee4c4f8d22761421f94 /org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209-natives-linux.jar
|
||||
8831b2bd5a53dc343fd6fbed3c18f28ab33d3f28dbe62ebd4a3af81f25c0a5ab /org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209-natives-osx.jar
|
||||
f2e1f2c6bd7511a7504f389b8b716f5d8dc2fdc71e29c89b52644314cf0a228e /org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209-natives-windows.jar
|
||||
11eeed66c2d56892f3e2046121438153e516dd95d368bcf93c0714f9f2bfdd6f /org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209.pom
|
||||
034456b132a336b72757325bb7aaf99e075681ee5650d2bea21717bd485de42f /org/lwjgl/lwjgl/lwjgl_util/2.9.4-nightly-20150209/lwjgl_util-2.9.4-nightly-20150209.jar
|
||||
cb7239de51893ee5abe90c2bc550422cb336140c0866e9d1c899399eeb8a3ba2 /org/lwjgl/lwjgl/lwjgl_util/2.9.4-nightly-20150209/lwjgl_util-2.9.4-nightly-20150209.pom
|
||||
9cf1643b0d805db942498cebf941d1c43df0a1322137291c258aec6109200858 /org/lwjgl/lwjgl/parent/2.9.1/parent-2.9.1.pom
|
||||
9b3282d2065e070f5966c8b324bc8ffaa4a3d53c7d39ef7e0a3458b525bc167e /org/lwjgl/lwjgl/parent/2.9.4-nightly-20150209/parent-2.9.4-nightly-20150209.pom
|
||||
21091d3a9c1349f640fdc421504a604c040ed89087ecc12afbe32353326ed4e5 /org/mortbay/jetty/jetty/6.1.26/jetty-6.1.26.jar
|
||||
8169c421acc4931f9eb80b818b13a4553a8582e02d08dfc12a51e4f23b2726c6 /org/mortbay/jetty/jetty/6.1.26/jetty-6.1.26.pom
|
||||
b24e31635c0e6c401ff84e28905b96d1a760144c15f1deae1a22d5b3356e1667 /org/mortbay/jetty/jetty-parent/10/jetty-parent-10.pom
|
||||
@@ -398,6 +411,7 @@ cbfacd5dd812db16dc910994007fe58d9402a25507f81a1c2218e15c2c1bedfa /org/ow2/asm/as
|
||||
347a7a9400f9964e87c91d3980e48eebdc8d024bc3b36f7f22189c662853a51c /org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3.jar
|
||||
65819ca7c5a218ff49f8ebe72f3b39219c81f137d017acc1aec15b1054cf5236 /org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3.pom
|
||||
51215c67d2c068d8b7d2f6f80f51372a098075deccc448d4bdd7b987ba8328fb /org/ow2/ow2/1.3/ow2-1.3.pom
|
||||
3ca225ce3917eac8bf4b7d2186845df4e70dcdede356dca8537b6d78a535c91e /org/projectlombok/lombok/1.16.4/lombok-1.16.4.jar
|
||||
fcb8d5745f776567f1cce332282750b1653568324621ecef03288c8a25919d0e /org/projectlombok/lombok/1.16.4/lombok-1.16.4.pom
|
||||
e0a471be03e1e6b02bf019480cec7a3ac9801702bf7bf62f15d077ad4df8dd5d /org/projectlombok/lombok/1.16.6/lombok-1.16.6.jar
|
||||
32ac0a2363ccc0c5086b62cfc05e28a355b74e155efef6b426f5498a0dfc9e4c /org/projectlombok/lombok/1.16.6/lombok-1.16.6.pom
|
||||
@@ -435,7 +449,6 @@ c14fb9c32b59cc03251f609416db7c0cff01f811edcccb4f6a865d6e7046bd0b /org/sonatype/f
|
||||
1838d132479005b4b7459b798e9d9915515090c288082fdcd86db0b10983a24c /org/sonatype/forge/forge-parent/4/forge-parent-4.pom
|
||||
e56188aa8ce51278006aa90bc7e0f304a81e2f1219f462e7d21f262535cd2795 /org/sonatype/forge/forge-parent/5/forge-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
|
||||
fb40265f982548212ff82e362e59732b2187ec6f0d80182885c14ef1f982827a /org/sonatype/oss/oss-parent/9/oss-parent-9.pom
|
||||
5a15fdba22669e0fdd06e10dcce6320879e1f7398fbc910cd0677b50672a78c4 /org/sonatype/plexus/plexus-cipher/1.4/plexus-cipher-1.4.jar
|
||||
@@ -462,17 +475,9 @@ aef1fd28efd25bd778aa3d3770c6f9e606ca2354149e985f1d63fc7c6a366bd2 /org/sonatype/s
|
||||
683c012c6bf5e1e31b232b3755c027ccd829692a09c8216652b414b09d4ae623 /org/sonatype/spice/spice-parent/10/spice-parent-10.pom
|
||||
21a19b26dbe5c38ddb5114cf4eadbf5ccb411bc6b128fdd5949b1ccb12f3683e /org/sonatype/spice/spice-parent/12/spice-parent-12.pom
|
||||
258f43b5e805687302a5bb400856b972a573ec42a44f949641354a84b9243758 /org/sonatype/spice/spice-parent/16/spice-parent-16.pom
|
||||
27901e5d4d60d3502571d5e6358fc89e3fcf874138b69d495d139bcc3e169404 /oshi-project/oshi-core/1.1/oshi-core-1.1.jar
|
||||
e7e154dd64e5bd87e6ae2652ab52ab88eb53d05606466faee382d11f59d0ab71 /oshi-project/oshi-core/1.1/oshi-core-1.1.pom
|
||||
d1968436fc216c901fb9b82c7e878b50fd1d30091676da95b2edd3a9c0ccf92e /stax/stax-api/1.0.1/stax-api-1.0.1.jar
|
||||
87b13ae136a2bb9299271a0dfe8c351f76661b654ed8fde035c2cabb198cf259 /stax/stax-api/1.0.1/stax-api-1.0.1.pom
|
||||
ad68a86cfd0255a2bc0525ce11ec49640caea7e34ff91eb89c3193dcccd77f05 /trove/trove/1.0.2/trove-1.0.2.jar
|
||||
83f2682bd3ded1fe417b7e98e7ac86510cd747378eae7e3a5d1d35c7c7f0d2ea /trove/trove/1.0.2/trove-1.0.2.pom
|
||||
3b90f9f7ad968b9588482e3a09b6e7d0d81c6cf7c214c5cecd8120e3ee509ae9 /tv/twitch/twitch/6.5/twitch-6.5.jar
|
||||
56820ae80518871ff0af04dbfa54e311f6fa54de922d201f71bd2d3f210e94ba /tv/twitch/twitch/6.5/twitch-6.5.pom
|
||||
0825d6081eef7e57434cd15525d6c1e7bc5d590e08eaea5b7516820031978af9 /tv/twitch/twitch-external-platform/4.5/twitch-external-platform-4.5-natives-windows-32.jar
|
||||
6428eb438f53afc563d58c7f2a563ca9fcaae80db3520af744de5e5db1c9df6a /tv/twitch/twitch-external-platform/4.5/twitch-external-platform-4.5-natives-windows-64.jar
|
||||
5ac03ac36144e4aeeb57b8ccc968b1ed75ae4b9ed4b094f47cb2b7b64c23a67d /tv/twitch/twitch-external-platform/4.5/twitch-external-platform-4.5.pom
|
||||
4005b7d20bc7e8c37cb0fd94bb7c44b5a6373846f3cb59e7a0095f6ebdf3e4f3 /tv/twitch/twitch-platform/6.5/twitch-platform-6.5-natives-osx.jar
|
||||
8315b4943f4e1356c34b213d4f309784d5e36cbded1fb37c49efcc7d22c909cb /tv/twitch/twitch-platform/6.5/twitch-platform-6.5-natives-windows-32.jar
|
||||
75337e7362e489a6f8c9712aeced9e131e82a3ce851cafbd4d03fda284cc7116 /tv/twitch/twitch-platform/6.5/twitch-platform-6.5-natives-windows-64.jar
|
||||
3b5636dae28488379b110bd87a769497af8227518c273e62110cfd638f9fdcb6 /tv/twitch/twitch-platform/6.5/twitch-platform-6.5.pom
|
||||
* /versions.json
|
||||
|
||||
@@ -1,84 +0,0 @@
|
||||
From 5d778fec168a72d41df672ad38ee5f01973916ce Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Herzig <me@johni0702.de>
|
||||
Date: Sat, 2 Sep 2017 15:40:15 +0200
|
||||
Subject: [PATCH] Fix compilation with newer gradle versions
|
||||
|
||||
---
|
||||
src/main/java/net/minecraftforge/gradle/tasks/CreateStartTask.java | 1 -
|
||||
src/main/java/net/minecraftforge/gradle/user/TaskRecompileMc.java | 1 -
|
||||
src/main/java/net/minecraftforge/gradle/user/UserBasePlugin.java | 1 -
|
||||
.../java/net/minecraftforge/gradle/util/SourceDirSetSupplier.java | 4 ++--
|
||||
src/main/java/net/minecraftforge/gradle/util/json/JsonFactory.java | 1 -
|
||||
5 files changed, 2 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/src/main/java/net/minecraftforge/gradle/tasks/CreateStartTask.java b/src/main/java/net/minecraftforge/gradle/tasks/CreateStartTask.java
|
||||
index 1de9ac3..8d0a5a5 100644
|
||||
--- a/src/main/java/net/minecraftforge/gradle/tasks/CreateStartTask.java
|
||||
+++ b/src/main/java/net/minecraftforge/gradle/tasks/CreateStartTask.java
|
||||
@@ -128,7 +128,6 @@ public class CreateStartTask extends CachedTask
|
||||
LoggingManager log = getLogging();
|
||||
LogLevel startLevel = getProject().getGradle().getStartParameter().getLogLevel();
|
||||
if (startLevel.compareTo(LogLevel.LIFECYCLE) >= 0) {
|
||||
- log.setLevel(LogLevel.ERROR);
|
||||
}
|
||||
// INVOKE!
|
||||
this.getAnt().invokeMethod("javac", ImmutableMap.builder()
|
||||
diff --git a/src/main/java/net/minecraftforge/gradle/user/TaskRecompileMc.java b/src/main/java/net/minecraftforge/gradle/user/TaskRecompileMc.java
|
||||
index 224292c..f61618c 100644
|
||||
--- a/src/main/java/net/minecraftforge/gradle/user/TaskRecompileMc.java
|
||||
+++ b/src/main/java/net/minecraftforge/gradle/user/TaskRecompileMc.java
|
||||
@@ -86,7 +86,6 @@ public class TaskRecompileMc extends CachedTask
|
||||
LoggingManager log = getLogging();
|
||||
LogLevel startLevel = getProject().getGradle().getStartParameter().getLogLevel();
|
||||
if (startLevel.compareTo(LogLevel.LIFECYCLE) >= 0) {
|
||||
- log.setLevel(LogLevel.ERROR);
|
||||
}
|
||||
|
||||
// recompile
|
||||
diff --git a/src/main/java/net/minecraftforge/gradle/user/UserBasePlugin.java b/src/main/java/net/minecraftforge/gradle/user/UserBasePlugin.java
|
||||
index 98391fc..9408a07 100644
|
||||
--- a/src/main/java/net/minecraftforge/gradle/user/UserBasePlugin.java
|
||||
+++ b/src/main/java/net/minecraftforge/gradle/user/UserBasePlugin.java
|
||||
@@ -37,7 +37,6 @@ import javax.xml.transform.TransformerFactory;
|
||||
import javax.xml.transform.dom.DOMSource;
|
||||
import javax.xml.transform.stream.StreamResult;
|
||||
|
||||
-import com.beust.jcommander.internal.Lists;
|
||||
import org.gradle.api.Action;
|
||||
import org.gradle.api.DefaultTask;
|
||||
import org.gradle.api.NamedDomainObjectContainer;
|
||||
diff --git a/src/main/java/net/minecraftforge/gradle/util/SourceDirSetSupplier.java b/src/main/java/net/minecraftforge/gradle/util/SourceDirSetSupplier.java
|
||||
index 4e9dbe5..4f3744e 100644
|
||||
--- a/src/main/java/net/minecraftforge/gradle/util/SourceDirSetSupplier.java
|
||||
+++ b/src/main/java/net/minecraftforge/gradle/util/SourceDirSetSupplier.java
|
||||
@@ -19,13 +19,13 @@
|
||||
*/
|
||||
package net.minecraftforge.gradle.util;
|
||||
|
||||
-import com.beust.jcommander.internal.Lists;
|
||||
+import com.google.common.collect.Lists;
|
||||
+import com.google.common.collect.Maps;
|
||||
import net.minecraftforge.srg2source.util.io.InputSupplier;
|
||||
import net.minecraftforge.srg2source.util.io.OutputSupplier;
|
||||
import org.gradle.api.file.FileVisitDetails;
|
||||
import org.gradle.api.file.FileVisitor;
|
||||
import org.gradle.api.file.SourceDirectorySet;
|
||||
-import org.testng.collections.Maps;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.List;
|
||||
diff --git a/src/main/java/net/minecraftforge/gradle/util/json/JsonFactory.java b/src/main/java/net/minecraftforge/gradle/util/json/JsonFactory.java
|
||||
index b75f653..fa61537 100644
|
||||
--- a/src/main/java/net/minecraftforge/gradle/util/json/JsonFactory.java
|
||||
+++ b/src/main/java/net/minecraftforge/gradle/util/json/JsonFactory.java
|
||||
@@ -26,7 +26,6 @@ import java.io.IOException;
|
||||
import java.util.*;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
-import com.beust.jcommander.internal.Lists;
|
||||
import com.google.common.base.Strings;
|
||||
import com.google.common.reflect.TypeToken;
|
||||
import com.google.gson.Gson;
|
||||
--
|
||||
2.9.5
|
||||
|
||||
@@ -13,7 +13,7 @@ index df369f1..e3e50c0 100644
|
||||
--- a/src/main/java/net/minecraftforge/gradle/common/BasePlugin.java
|
||||
+++ b/src/main/java/net/minecraftforge/gradle/common/BasePlugin.java
|
||||
@@ -350,6 +350,13 @@ public abstract class BasePlugin<K extends BaseExtension> implements Plugin<Proj
|
||||
// not required.. but you probably wanan implement this
|
||||
deps.add(CONFIG_FFI_DEPS, deps.localGroovy());
|
||||
}
|
||||
|
||||
+ private static String http(String url) {
|
||||
@@ -61,15 +61,15 @@ index b42b1c2..a0753e0 100644
|
||||
|
||||
|
||||
// urls
|
||||
- public static final String URL_MC_MANIFEST = "https://launchermeta.mojang.com/mc/game/version_manifest.json";
|
||||
+ public static final String URL_MC_MANIFEST = "http://launchermeta.mojang.com/mc/game/version_manifest.json";
|
||||
public static final String URL_FF = "http://files.minecraftforge.net/fernflower-fix-1.0.zip";
|
||||
public static final String URL_ASSETS = "http://resources.download.minecraft.net";
|
||||
- public static final String URL_LIBRARY = "https://libraries.minecraft.net/";
|
||||
+ public static final String URL_LIBRARY = "http://libraries.minecraft.net/";
|
||||
public static final String URL_FORGE_MAVEN = "http://files.minecraftforge.net/maven";
|
||||
public static final String URL_MCP_JSON = "http://export.mcpbot.bspk.rs/versions.json";
|
||||
|
||||
- public static final String URL_MC_MANIFEST = "https://launchermeta.mojang.com/mc/game/version_manifest.json";
|
||||
+ public static final String URL_MC_MANIFEST = "http://launchermeta.mojang.com/mc/game/version_manifest.json";
|
||||
public static final String URL_FF = "http://files.minecraftforge.net/fernflower-fix-1.0.zip";
|
||||
public static final String URL_ASSETS = "http://resources.download.minecraft.net";
|
||||
- public static final String URL_LIBRARY = "https://libraries.minecraft.net/"; // Mojang's Cloudflare front end
|
||||
+ public static final String URL_LIBRARY = "http://libraries.minecraft.net/"; // Mojang's Cloudflare front end
|
||||
//public static final String URL_LIBRARY = "https://minecraft-libraries.s3.amazonaws.com/"; // Mojang's AWS server, as Cloudflare is having issues, TODO: Switch back to above when their servers are fixed.
|
||||
public static final String URL_FORGE_MAVEN = "http://files.minecraftforge.net/maven";
|
||||
public static final List<String> URLS_MCP_JSON = Arrays.asList(
|
||||
--
|
||||
2.5.5
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ index bfadecd..774a015 100644
|
||||
// mcp stuff
|
||||
shade 'de.oceanlabs.mcp:RetroGuard:3.6.6'
|
||||
- shade 'de.oceanlabs.mcp:mcinjector:3.4-SNAPSHOT'
|
||||
- shade 'net.minecraftforge.srg2source:Srg2Source:3.3-SNAPSHOT'
|
||||
- shade 'net.minecraftforge.srg2source:Srg2Source:4.0-SNAPSHOT'
|
||||
+ shade 'reprod:mcinjector:0'
|
||||
+ shade 'reprod:srg2source:0'
|
||||
|
||||
|
||||
@@ -32,8 +32,8 @@ index ee24828..42d0607 100755
|
||||
+ maven { url 'gradle/reprod/deps/repo' }
|
||||
}
|
||||
dependencies {
|
||||
- classpath 'net.minecraftforge.gradle:ForgeGradle:2.0-SNAPSHOT'
|
||||
- classpath 'org.spongepowered:mixingradle:0.3-SNAPSHOT'
|
||||
- classpath 'net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT'
|
||||
- classpath 'org.spongepowered:mixingradle:0.4-SNAPSHOT'
|
||||
+ classpath 'reprod:forgegradle:0'
|
||||
+ classpath 'reprod:mixingradle:0'
|
||||
}
|
||||
|
||||
@@ -108,11 +108,11 @@ setup_dep "fernflower" "https://github.com/fesh0r/fernflower.git" "adbf29f8ce902
|
||||
# Required for forgegradle
|
||||
setup_dep "forgeflower" "https://github.com/MinecraftForge/FernFlowerLegacy.git" "114aebe82cf40075c5c4f916c409b8aebf8096d5" "build/libs/fernflower-2.0-SNAPSHOT.jar" "c8b4a4a13a1158008aed46da2c805184078324718697f14a67f1778168579956" "fbda3f30d54624fe4c59a69e145b644d8642afc0dd4eb0d732ccdaa0ebd5d8a3"
|
||||
setup_dep "mcinjector" "https://github.com/ModCoderPack/MCInjector.git" "7258466461baf7dc4f313b06b0d589407e4e1fba" "build/libs/mcinjector-3.4-SNAPSHOT.jar" "98b685ea0d3ae9fad8b8a7e7b885512f7fe0b61becf27d9c74b91a626d107efc" "3c08655c11e6509bfc62ff87d0770cefa0ecbd8dccece9e083c9b7b89779a8c5"
|
||||
setup_dep "srg2source" "https://github.com/MinecraftForge/Srg2Source.git" "5f11e2933f722000dbf742ffdd0d9c5ee8044bbb" "build/libs/Srg2Source-3.3-SNAPSHOT.jar" "9aa601ade2c33ce52fe09894efd4c1bb69c68a238c2dd260605881863083362e" "cbfdd113cd054b80ce3a1e5636d254fea4f59a82af9874ae9f3786cb1901920d"
|
||||
setup_dep "srg2source" "https://github.com/MinecraftForge/Srg2Source.git" "ea4ea624672e8b75fb2a78f0fb9105db13d5a4a6" "build/libs/Srg2Source-4.0-SNAPSHOT.jar" "727445a7b946535217be658726c537acf1921f0a9e2ac0ea717dff9b36dc529f" "4ebd7b738f368ee5c25a1028a167257e7012cef7c72c8b5b06149286992c631e"
|
||||
|
||||
# Required for RM
|
||||
setup_dep "mixingradle" "https://github.com/SpongePowered/MixinGradle.git" "52217aa8ca221dcd0b9fb657b037e663db808f38" "build/libs/mixingradle-0.4-SNAPSHOT.jar" "8b3508867128a5d564631635dff898a36f9aca8db54b7bb3af6f4924e3f4bead" "42cbf81136d4e26c06d3234427665b50d18768cc1f210512204ca1d5e3a42b5c"
|
||||
setup_dep "forgegradle" "https://github.com/MinecraftForge/ForgeGradle.git" "17806f45d20d0b55bff70a616eaeb939bd6a543c" "build/libs/ForgeGradle-2.1-SNAPSHOT.jar" "dc3da35074bbb1c55e68f7863a8fc8660803da3192aa8d0a7e33280424d3c8d0" "4c670a05fbd9aeaa581ae8ba7597df1d1def7b04160e1c6b076ed6778dd45e58"
|
||||
setup_dep "forgegradle" "https://github.com/MinecraftForge/ForgeGradle.git" "d13a6c892f51937567b3d01d85bea4f3d128e71d" "build/libs/ForgeGradle-2.2-SNAPSHOT.jar" "355a8bd6f49f3d11c40d58da9bb388e05b634ddfac43ab222bf2326aa40f0be4" "45966ee785c42e34c36be3e73046aca1a581a919fb02a9028970d19d35488b18"
|
||||
setup_dep "mixin" "https://github.com/SpongePowered/Mixin.git" "404f5da0b6b18980b4e44c7f1cfeddcd47fe4aa6" "build/libs/mixin-0.7.5-SNAPSHOT.jar" "7d181a5e7c317c00c07da14e7770e4356b0f201414cd2a836e987be9fa133d43" "11000383a5051f25a70c2bff3a3167b6859ae4f9838a0ab45560e9f9c9d9def7"
|
||||
|
||||
rm -rf tmp
|
||||
|
||||
2
jGui
2
jGui
Submodule jGui updated: 59ef539033...1063a35a9d
@@ -50,10 +50,8 @@ public abstract class AbstractTask implements Task {
|
||||
public ListenableFuture<Void> execute() {
|
||||
future = SettableFuture.create();
|
||||
|
||||
FMLCommonHandler.instance().bus().register(this);
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
addCallback(future, success -> {
|
||||
FMLCommonHandler.instance().bus().unregister(this);
|
||||
MinecraftForge.EVENT_BUS.unregister(this);
|
||||
}, error -> {});
|
||||
|
||||
@@ -92,7 +90,7 @@ public abstract class AbstractTask implements Task {
|
||||
public void onGuiOpen(TickEvent.RenderTickEvent event) {
|
||||
if (event.phase != TickEvent.Phase.START) return;
|
||||
if (currentScreen != mc.currentScreen) {
|
||||
FMLCommonHandler.instance().bus().unregister(this);
|
||||
MinecraftForge.EVENT_BUS.unregister(this);
|
||||
onClosed.run();
|
||||
} else {
|
||||
if (framesPassed < timeout) {
|
||||
@@ -106,7 +104,7 @@ public abstract class AbstractTask implements Task {
|
||||
}
|
||||
}
|
||||
}
|
||||
FMLCommonHandler.instance().bus().register(new EventHandler());
|
||||
MinecraftForge.EVENT_BUS.register(new EventHandler());
|
||||
}
|
||||
|
||||
public void expectPopupClosed(Runnable onClosed) {
|
||||
@@ -130,7 +128,7 @@ public abstract class AbstractTask implements Task {
|
||||
public void onGuiOpen(TickEvent.RenderTickEvent event) {
|
||||
if (event.phase != TickEvent.Phase.START) return;
|
||||
if (getPopup(mc.currentScreen) != popup) {
|
||||
FMLCommonHandler.instance().bus().unregister(this);
|
||||
MinecraftForge.EVENT_BUS.unregister(this);
|
||||
onClosed.run();
|
||||
} else {
|
||||
if (framesPassed < timeout) {
|
||||
@@ -143,7 +141,7 @@ public abstract class AbstractTask implements Task {
|
||||
}
|
||||
}
|
||||
}
|
||||
FMLCommonHandler.instance().bus().register(new EventHandler());
|
||||
MinecraftForge.EVENT_BUS.register(new EventHandler());
|
||||
}
|
||||
|
||||
private AbstractGuiPopup getPopup(net.minecraft.client.gui.GuiScreen minecraft) {
|
||||
@@ -181,7 +179,7 @@ public abstract class AbstractTask implements Task {
|
||||
return;
|
||||
}
|
||||
|
||||
FMLCommonHandler.instance().bus().unregister(this);
|
||||
MinecraftForge.EVENT_BUS.unregister(this);
|
||||
|
||||
Object foundGui = null;
|
||||
if (AbstractGuiScreen.class.isAssignableFrom(guiClass)) {
|
||||
@@ -219,7 +217,7 @@ public abstract class AbstractTask implements Task {
|
||||
future.setException(new UnexpectedGuiException(foundGui == null ? currentScreen : foundGui));
|
||||
}
|
||||
}
|
||||
FMLCommonHandler.instance().bus().register(new EventHandler());
|
||||
MinecraftForge.EVENT_BUS.register(new EventHandler());
|
||||
}
|
||||
|
||||
private void clickNow(int x, int y) {
|
||||
|
||||
@@ -3,7 +3,7 @@ package com.replaymod.recording;
|
||||
import com.replaymod.core.AbstractTask;
|
||||
import net.minecraft.client.gui.GuiCreateWorld;
|
||||
import net.minecraft.client.gui.GuiMainMenu;
|
||||
import net.minecraft.client.gui.GuiSelectWorld;
|
||||
import net.minecraft.client.gui.GuiWorldSelection;
|
||||
import net.minecraftforge.client.event.RenderGameOverlayEvent;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
@@ -13,7 +13,7 @@ public class CreateSPWorld extends AbstractTask {
|
||||
protected void init() {
|
||||
expectGui(GuiMainMenu.class, mainMenu -> {
|
||||
click("Singleplayer");
|
||||
expectGui(GuiSelectWorld.class, selectWorld -> {
|
||||
expectGui(GuiWorldSelection.class, selectWorld -> {
|
||||
click("Create New World");
|
||||
expectGui(GuiCreateWorld.class, createWorld -> {
|
||||
click("Create New World");
|
||||
|
||||
@@ -34,7 +34,7 @@ public class SpectatePlayer extends AbstractTask {
|
||||
future.setException(new TimeoutException("Camera hasn't stopped spectating."));
|
||||
return;
|
||||
}
|
||||
if (mc.getRenderViewEntity() == mc.thePlayer) {
|
||||
if (mc.getRenderViewEntity() == mc.player) {
|
||||
future.set(null);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ import com.replaymod.compat.bettersprinting.DisableBetterSprinting;
|
||||
import com.replaymod.compat.optifine.DisableFastRender;
|
||||
import com.replaymod.compat.oranges17animations.HideInvisibleEntities;
|
||||
import com.replaymod.compat.shaders.ShaderBeginRender;
|
||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
|
||||
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
|
||||
@@ -29,7 +29,7 @@ public class ReplayModCompat {
|
||||
|
||||
@Mod.EventHandler
|
||||
public void init(FMLInitializationEvent event) {
|
||||
EventBus bus = FMLCommonHandler.instance().bus();
|
||||
EventBus bus = MinecraftForge.EVENT_BUS;
|
||||
bus.register(new ShaderBeginRender());
|
||||
bus.register(new DisableFastRender());
|
||||
bus.register(new HideInvisibleEntities());
|
||||
|
||||
@@ -2,12 +2,16 @@ package com.replaymod.compat.bettersprinting;
|
||||
|
||||
import com.replaymod.replay.ReplayModReplay;
|
||||
import com.replaymod.replay.events.ReplayChatMessageEvent;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.multiplayer.PlayerControllerMP;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.util.BlockPos;
|
||||
import net.minecraft.world.IWorldAccess;
|
||||
import net.minecraft.util.SoundCategory;
|
||||
import net.minecraft.util.SoundEvent;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.IWorldEventListener;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.client.event.GuiOpenEvent;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.fml.common.Loader;
|
||||
@@ -18,6 +22,7 @@ import net.minecraftforge.fml.common.versioning.DefaultArtifactVersion;
|
||||
import net.minecraftforge.fml.common.versioning.Restriction;
|
||||
import net.minecraftforge.fml.common.versioning.VersionRange;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.Collections;
|
||||
|
||||
import static com.replaymod.compat.ReplayModCompat.LOGGER;
|
||||
@@ -51,17 +56,17 @@ public class DisableBetterSprinting {
|
||||
|
||||
@SubscribeEvent(priority = EventPriority.HIGH)
|
||||
public void beforeGuiOpenEvent(GuiOpenEvent event) {
|
||||
if (ReplayModReplay.instance.getReplayHandler() != null && mc.theWorld != null) {
|
||||
if (ReplayModReplay.instance.getReplayHandler() != null && mc.world != null) {
|
||||
// During replay, get ready to revert BetterSprinting's overwritten playerController
|
||||
originalController = mc.playerController;
|
||||
mc.theWorld.addWorldAccess(worldAccessHook);
|
||||
mc.world.addEventListener(worldAccessHook);
|
||||
}
|
||||
}
|
||||
|
||||
@SubscribeEvent(priority = EventPriority.LOW)
|
||||
public void afterGuiOpenEvent(GuiOpenEvent event) {
|
||||
if (ReplayModReplay.instance.getReplayHandler() != null && mc.theWorld != null) {
|
||||
mc.theWorld.removeWorldAccess(worldAccessHook);
|
||||
if (ReplayModReplay.instance.getReplayHandler() != null && mc.world != null) {
|
||||
mc.world.addEventListener(worldAccessHook);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,7 +82,7 @@ public class DisableBetterSprinting {
|
||||
}
|
||||
}
|
||||
|
||||
private class BetterSprintingWorldAccess implements IWorldAccess {
|
||||
private class BetterSprintingWorldAccess implements IWorldEventListener {
|
||||
@Override
|
||||
public void onEntityRemoved(Entity entityIn) {
|
||||
if (mc.playerController != null && mc.playerController.getClass().getName().equals(CONTROLLER_OVERRIDE_CLASS_NAME)) {
|
||||
@@ -88,16 +93,16 @@ public class DisableBetterSprinting {
|
||||
}
|
||||
}
|
||||
|
||||
@Override public void markBlockForUpdate(BlockPos pos) {}
|
||||
@Override public void notifyBlockUpdate(World worldIn, BlockPos pos, IBlockState oldState, IBlockState newState, int flags) {}
|
||||
@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 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 playSoundToAllNearExcept(@Nullable EntityPlayer player, SoundEvent soundIn, SoundCategory category, double x, double y, double z, float volume, float pitch) {}
|
||||
@Override public void playRecord(SoundEvent soundIn, 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_190570_1_, boolean p_190570_2_, boolean p_190570_3_, double p_190570_4_, double p_190570_6_, double p_190570_8_, double p_190570_10_, double p_190570_12_, double p_190570_14_, int... p_190570_16_) {}
|
||||
@Override public void onEntityAdded(Entity entityIn) {}
|
||||
@Override public void playRecord(String recordName, BlockPos blockPosIn) {}
|
||||
@Override public void broadcastSound(int p_180440_1_, BlockPos p_180440_2_, int p_180440_3_) {}
|
||||
@Override public void playAusSFX(EntityPlayer p_180439_1_, int p_180439_2_, BlockPos blockPosIn, int p_180439_4_) {}
|
||||
@Override public void playEvent(EntityPlayer player, int type, BlockPos blockPosIn, int data) {}
|
||||
@Override public void sendBlockBreakProgress(int breakerId, BlockPos pos, int progress) {}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@ public abstract class MixinMinecraft {
|
||||
&& ReplayModReplay.instance.getReplayHandler() != null) {
|
||||
for (StackTraceElement elem : Thread.currentThread().getStackTrace()) {
|
||||
if ("mapwriter.util.Utils".equals(elem.getClassName()) && "getWorldName".equals(elem.getMethodName())) {
|
||||
ci.setReturnValue(new ServerData(null, "replay"));
|
||||
ci.setReturnValue(new ServerData(null, "replay", false));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ public class HideInvisibleEntities {
|
||||
@SubscribeEvent(priority = EventPriority.HIGH)
|
||||
public void preRenderLiving(RenderLivingEvent.Pre event) {
|
||||
if (modLoaded) {
|
||||
if (mc.thePlayer instanceof CameraEntity && event.entity.isInvisible()) {
|
||||
if (mc.player instanceof CameraEntity && event.getEntity().isInvisible()) {
|
||||
event.setCanceled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,6 @@ import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.Callable;
|
||||
|
||||
public class KeyBindingRegistry {
|
||||
private Map<String, KeyBinding> keyBindings = new HashMap<String, KeyBinding>();
|
||||
@@ -86,7 +85,7 @@ public class KeyBindingRegistry {
|
||||
CrashReport crashReport = CrashReport.makeCrashReport(cause, "Handling Key Binding");
|
||||
CrashReportCategory category = crashReport.makeCategory("Key Binding");
|
||||
category.addCrashSection("Key Binding", keyBinding);
|
||||
category.addCrashSectionCallable("Handler", runnable::toString);
|
||||
category.setDetail("Handler", runnable::toString);
|
||||
throw new ReportedException(crashReport);
|
||||
}
|
||||
}
|
||||
@@ -101,12 +100,7 @@ public class KeyBindingRegistry {
|
||||
CrashReport crashReport = CrashReport.makeCrashReport(cause, "Handling Raw Key Binding");
|
||||
CrashReportCategory category = crashReport.makeCategory("Key Binding");
|
||||
category.addCrashSection("Key Code", keyCode);
|
||||
category.addCrashSectionCallable("Handler", new Callable() {
|
||||
@Override
|
||||
public Object call() throws Exception {
|
||||
return runnable;
|
||||
}
|
||||
});
|
||||
category.setDetail("Handler", runnable::toString);
|
||||
throw new ReportedException(crashReport);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ public class LoadingPlugin implements IFMLLoadingPlugin {
|
||||
if (file.isFile()) {
|
||||
// This forces forge to reexamine the jar file for FML mods
|
||||
// Should eventually be handled by Mixin itself, maybe?
|
||||
CoreModManager.getLoadedCoremods().remove(file.getName());
|
||||
CoreModManager.getIgnoredMods().remove(file.getName());
|
||||
}
|
||||
} catch (URISyntaxException e) {
|
||||
e.printStackTrace();
|
||||
|
||||
@@ -6,7 +6,6 @@ import com.replaymod.core.gui.GuiReplaySettings;
|
||||
import com.replaymod.core.gui.RestoreReplayGui;
|
||||
import com.replaymod.core.handler.MainMenuHandler;
|
||||
import com.replaymod.core.utils.OpenGLUtils;
|
||||
import com.replaymod.render.utils.SoundHandler;
|
||||
import com.replaymod.replaystudio.util.I18n;
|
||||
import de.johni0702.minecraft.gui.container.GuiScreen;
|
||||
import lombok.Getter;
|
||||
@@ -14,10 +13,11 @@ import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.settings.GameSettings;
|
||||
import net.minecraft.crash.CrashReport;
|
||||
import net.minecraft.crash.CrashReportCategory;
|
||||
import net.minecraft.util.*;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.text.*;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.common.config.Configuration;
|
||||
import net.minecraftforge.fml.client.FMLClientHandler;
|
||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||
import net.minecraftforge.fml.common.Loader;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
import net.minecraftforge.fml.common.Mod.EventHandler;
|
||||
@@ -34,7 +34,6 @@ import org.apache.commons.io.FileUtils;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.Queue;
|
||||
|
||||
@Mod(modid = ReplayMod.MOD_ID,
|
||||
useMetadata = true,
|
||||
@@ -73,8 +72,6 @@ public class ReplayMod {
|
||||
|
||||
@Deprecated
|
||||
public static Configuration config;
|
||||
@Deprecated
|
||||
public static SoundHandler soundHandler = new SoundHandler();
|
||||
|
||||
private final KeyBindingRegistry keyBindingRegistry = new KeyBindingRegistry();
|
||||
private final SettingsRegistry settingsRegistry = new SettingsRegistry();
|
||||
@@ -117,7 +114,7 @@ public class ReplayMod {
|
||||
|
||||
new MainMenuHandler().register();
|
||||
|
||||
FMLCommonHandler.instance().bus().register(keyBindingRegistry);
|
||||
MinecraftForge.EVENT_BUS.register(keyBindingRegistry);
|
||||
|
||||
getKeyBindingRegistry().registerKeyBinding("replaymod.input.settings", 0, () -> {
|
||||
new GuiReplaySettings(null, settingsRegistry).display();
|
||||
@@ -131,150 +128,7 @@ public class ReplayMod {
|
||||
if(!FMLClientHandler.instance().hasOptifine())
|
||||
GameSettings.Options.RENDER_DISTANCE.setValueMax(64f);
|
||||
|
||||
if (System.getProperty("replaymod.render.file") != null) {
|
||||
final File file = new File(System.getProperty("replaymod.render.file"));
|
||||
if (!file.exists()) {
|
||||
throw new IOException("File \"" + file.getPath() + "\" not found.");
|
||||
}
|
||||
|
||||
final String path = System.getProperty("replaymod.render.path");
|
||||
String type = System.getProperty("replaymod.render.type");
|
||||
String bitrate = System.getProperty("replaymod.render.bitrate");
|
||||
String fps = System.getProperty("replaymod.render.fps");
|
||||
String waitForChunks = System.getProperty("replaymod.render.waitforchunks");
|
||||
String linearMovement = System.getProperty("replaymod.render.linearmovement");
|
||||
String skyColor = System.getProperty("replaymod.render.skycolor");
|
||||
String width = System.getProperty("replaymod.render.width");
|
||||
String height = System.getProperty("replaymod.render.height");
|
||||
String exportCommand = System.getProperty("replaymod.render.exportcommand");
|
||||
String exportCommandArgs = System.getProperty("replaymod.render.exportcommandargs");
|
||||
/*
|
||||
final RenderOptions options = new RenderOptions();
|
||||
if (bitrate != null) {
|
||||
options.setBitrate(bitrate);
|
||||
}
|
||||
if (fps != null) {
|
||||
options.setFps(Integer.parseInt(fps));
|
||||
}
|
||||
if (waitForChunks != null) {
|
||||
options.setWaitForChunks(Boolean.parseBoolean(waitForChunks));
|
||||
}
|
||||
if (linearMovement != null) {
|
||||
options.setLinearMovement(Boolean.parseBoolean(linearMovement));
|
||||
}
|
||||
if (skyColor != null) {
|
||||
if (skyColor.startsWith("0x")) {
|
||||
options.setSkyColor(Integer.parseInt(skyColor.substring(2), 16));
|
||||
} else {
|
||||
options.setSkyColor(Integer.parseInt(skyColor));
|
||||
}
|
||||
}
|
||||
if (width != null) {
|
||||
options.setWidth(Integer.parseInt(width));
|
||||
}
|
||||
if (height != null) {
|
||||
options.setHeight(Integer.parseInt(height));
|
||||
}
|
||||
|
||||
if (exportCommand != null) {
|
||||
options.setExportCommand(exportCommand);
|
||||
}
|
||||
if (exportCommandArgs != null) {
|
||||
options.setExportCommandArgs(exportCommandArgs);
|
||||
} else {
|
||||
options.setExportCommandArgs(EncodingPreset.MP4DEFAULT.getCommandLineArgs());
|
||||
}
|
||||
|
||||
options.setOutputFile(new File(String.valueOf(System.currentTimeMillis())));
|
||||
|
||||
Pipelines.Preset pipelinePreset = Pipelines.Preset.DEFAULT;
|
||||
if (type != null) {
|
||||
String[] parts = type.split(":");
|
||||
type = parts[0].toUpperCase();
|
||||
if ("NORMAL".equals(type) || "DEFAULT".equals(type)) {
|
||||
pipelinePreset = Pipelines.Preset.DEFAULT;
|
||||
} else if ("STEREO".equals(type) || "STEREOSCOPIC".equals(type)) {
|
||||
pipelinePreset = Pipelines.Preset.STEREOSCOPIC;
|
||||
} else if ("CUBIC".equals(type)) {
|
||||
if (parts.length < 2) {
|
||||
throw new IllegalArgumentException("Cubic renderer requires boolean for whether it's stable.");
|
||||
}
|
||||
pipelinePreset = Pipelines.Preset.CUBIC;
|
||||
} else if ("EQUIRECTANGULAR".equals(type)) {
|
||||
if (parts.length < 2) {
|
||||
throw new IllegalArgumentException("Equirectangular renderer requires boolean for whether it's stable.");
|
||||
}
|
||||
pipelinePreset = Pipelines.Preset.EQUIRECTANGULAR;
|
||||
} else if ("ODS".equals(type)) {
|
||||
if (parts.length < 2) {
|
||||
throw new IllegalArgumentException("ODS renderer requires boolean for whether it's stable.");
|
||||
}
|
||||
pipelinePreset = Pipelines.Preset.ODS;
|
||||
} else {
|
||||
throw new IllegalArgumentException("Unknown type: " + parts[0]);
|
||||
}
|
||||
}
|
||||
options.setMode(pipelinePreset);
|
||||
*/
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
Queue<ListenableFutureTask> tasks = mc.scheduledTasks;
|
||||
synchronized (mc.scheduledTasks) {
|
||||
tasks.add(ListenableFutureTask.create(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
String renderDistance = System.getProperty("replaymod.render.mc.renderdistance");
|
||||
String clouds = System.getProperty("replaymod.render.mc.clouds");
|
||||
if (renderDistance != null) {
|
||||
mc.gameSettings.renderDistanceChunks = Integer.parseInt(renderDistance);
|
||||
}
|
||||
if (clouds != null) {
|
||||
mc.gameSettings.clouds = Boolean.parseBoolean(clouds);
|
||||
}
|
||||
|
||||
System.out.println("Loading replay...");
|
||||
// TODO
|
||||
// try {
|
||||
// ReplayHandler.startReplay(file, false);
|
||||
// } catch (Throwable t) {
|
||||
// t.printStackTrace();
|
||||
// FMLCommonHandler.instance().exitJava(1, false);
|
||||
// }
|
||||
//
|
||||
// int index = 0;
|
||||
// if (path != null) {
|
||||
// for (KeyframeSet set : ReplayHandler.getKeyframeRepository()) {
|
||||
// if (set.getName().equals(path)) {
|
||||
// break;
|
||||
// }
|
||||
// index++;
|
||||
// }
|
||||
// if (index >= ReplayHandler.getKeyframeRepository().length) {
|
||||
// throw new IllegalArgumentException("No path named \"" + path + "\".");
|
||||
// }
|
||||
// } else if (ReplayHandler.getKeyframeRepository().length == 0) {
|
||||
// throw new IllegalArgumentException("Replay file has no paths defined.");
|
||||
// }
|
||||
// ReplayHandler.useKeyframePresetFromRepository(index);
|
||||
//
|
||||
// System.out.println("Rendering started...");
|
||||
// try {
|
||||
// ReplayProcess.startReplayProcess(options, true);
|
||||
// } catch (Throwable t) {
|
||||
// t.printStackTrace();
|
||||
// FMLCommonHandler.instance().exitJava(1, false);
|
||||
// }
|
||||
// if (mc.hasCrashed) {
|
||||
// System.out.println(mc.crashReporter.getCompleteReport());
|
||||
// }
|
||||
// System.out.println("Rendering done. Shutting down...");
|
||||
// mc.shutdown();
|
||||
}
|
||||
}, null));
|
||||
}
|
||||
|
||||
testIfMoeshAndExitMinecraft();
|
||||
}
|
||||
testIfMoeshAndExitMinecraft();
|
||||
|
||||
runLater(() -> {
|
||||
// Cleanup deleted corrupted replays
|
||||
@@ -319,7 +173,7 @@ public class ReplayMod {
|
||||
|
||||
public void runLater(Runnable runnable) {
|
||||
if (mc.isCallingFromMinecraftThread() && inRunLater) {
|
||||
EventBus bus = FMLCommonHandler.instance().bus();
|
||||
EventBus bus = MinecraftForge.EVENT_BUS;
|
||||
bus.register(new Object() {
|
||||
@SubscribeEvent
|
||||
public void onRenderTick(TickEvent.RenderTickEvent event) {
|
||||
@@ -331,10 +185,8 @@ public class ReplayMod {
|
||||
});
|
||||
return;
|
||||
}
|
||||
@SuppressWarnings("unchecked")
|
||||
Queue<ListenableFutureTask> tasks = mc.scheduledTasks;
|
||||
synchronized (mc.scheduledTasks) {
|
||||
tasks.add(ListenableFutureTask.create(() -> {
|
||||
mc.scheduledTasks.add(ListenableFutureTask.create(() -> {
|
||||
inRunLater = true;
|
||||
try {
|
||||
runnable.run();
|
||||
@@ -370,13 +222,13 @@ public class ReplayMod {
|
||||
private void printToChat(boolean warning, String message, Object... args) {
|
||||
if (getSettingsRegistry().get(Setting.NOTIFICATIONS)) {
|
||||
// Some nostalgia: "§8[§6Replay Mod§8]§r Your message goes here"
|
||||
ChatStyle coloredDarkGray = new ChatStyle().setColor(EnumChatFormatting.DARK_GRAY);
|
||||
ChatStyle coloredGold = new ChatStyle().setColor(EnumChatFormatting.GOLD);
|
||||
IChatComponent text = new ChatComponentText("[").setChatStyle(coloredDarkGray)
|
||||
.appendSibling(new ChatComponentTranslation("replaymod.title").setChatStyle(coloredGold))
|
||||
.appendSibling(new ChatComponentText("] "))
|
||||
.appendSibling(new ChatComponentTranslation(message, args).setChatStyle(new ChatStyle()
|
||||
.setColor(warning ? EnumChatFormatting.RED : EnumChatFormatting.DARK_GREEN)));
|
||||
Style coloredDarkGray = new Style().setColor(TextFormatting.DARK_GRAY);
|
||||
Style coloredGold = new Style().setColor(TextFormatting.GOLD);
|
||||
ITextComponent text = new TextComponentString("[").setStyle(coloredDarkGray)
|
||||
.appendSibling(new TextComponentTranslation("replaymod.title").setStyle(coloredGold))
|
||||
.appendSibling(new TextComponentString("] "))
|
||||
.appendSibling(new TextComponentTranslation(message, args).setStyle(new Style()
|
||||
.setColor(warning ? TextFormatting.RED : TextFormatting.DARK_GREEN)));
|
||||
// Send message to chat GUI
|
||||
// The ingame GUI is initialized at startup, therefore this is possible before the client is connected
|
||||
mc.ingameGUI.getChatGUI().printChatMessage(text);
|
||||
|
||||
@@ -2,8 +2,8 @@ package com.replaymod.core;
|
||||
|
||||
import com.replaymod.core.events.SettingsChangedEvent;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.common.config.Configuration;
|
||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Modifier;
|
||||
@@ -83,7 +83,7 @@ public class SettingsRegistry {
|
||||
throw new IllegalArgumentException("Default type " + key.getDefault().getClass() + " not supported.");
|
||||
}
|
||||
settings.put(key, value);
|
||||
FMLCommonHandler.instance().bus().post(new SettingsChangedEvent(this, key));
|
||||
MinecraftForge.EVENT_BUS.post(new SettingsChangedEvent(this, key));
|
||||
}
|
||||
|
||||
public void save() {
|
||||
|
||||
@@ -6,8 +6,6 @@ import net.minecraftforge.client.event.GuiScreenEvent;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Moves certain buttons on the main menu upwards so we can inject our own.
|
||||
*/
|
||||
@@ -18,14 +16,12 @@ public class MainMenuHandler {
|
||||
|
||||
@SubscribeEvent
|
||||
public void onInit(GuiScreenEvent.InitGuiEvent.Post event) {
|
||||
if (event.gui instanceof GuiMainMenu) {
|
||||
@SuppressWarnings("unchecked")
|
||||
List<GuiButton> buttonList = event.buttonList;
|
||||
for (GuiButton button : buttonList) {
|
||||
if (event.getGui() instanceof GuiMainMenu) {
|
||||
for (GuiButton button : event.getButtonList()) {
|
||||
// Buttons that aren't in a rectangle directly above our space don't need moving
|
||||
if (button.xPosition + button.width < event.gui.width / 2 - 100
|
||||
|| button.xPosition > event.gui.width / 2 + 100
|
||||
|| button.yPosition > event.gui.height / 4 + 10 + 4 * 24) continue;
|
||||
if (button.xPosition + button.width < event.getGui().width / 2 - 100
|
||||
|| button.xPosition > event.getGui().width / 2 + 100
|
||||
|| button.yPosition > event.getGui().height / 4 + 10 + 4 * 24) continue;
|
||||
// Move button up to make space for two rows of buttons
|
||||
// and then move back down by 10 to compensate for the space to the exit button that was already there
|
||||
button.yPosition -= 2 * 24 - 10;
|
||||
|
||||
@@ -2,7 +2,8 @@ package com.replaymod.core.utils;
|
||||
|
||||
import net.minecraft.client.renderer.GlStateManager;
|
||||
import net.minecraft.client.renderer.Tessellator;
|
||||
import net.minecraft.client.renderer.WorldRenderer;
|
||||
import net.minecraft.client.renderer.VertexBuffer;
|
||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
||||
import org.lwjgl.BufferUtils;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
@@ -34,14 +35,14 @@ public class OpenGLUtils {
|
||||
float f5 = 1.0F / textureHeight;
|
||||
|
||||
Tessellator tessellator = Tessellator.getInstance();
|
||||
WorldRenderer worldrenderer = tessellator.getWorldRenderer();
|
||||
VertexBuffer vertexBuffer = tessellator.getBuffer();
|
||||
GlStateManager.translate(x+(width/2), y+(width/2), 0);
|
||||
GlStateManager.rotate(rotation, 0, 0, 1);
|
||||
worldrenderer.startDrawingQuads();
|
||||
worldrenderer.addVertexWithUV(-width / 2, height / 2, 0.0D, (double) (u * f4), (double) ((v + (float) height) * f5));
|
||||
worldrenderer.addVertexWithUV(width/2, height/2, 0.0D, (double)((u + (float)width) * f4), (double)((v + (float)height) * f5));
|
||||
worldrenderer.addVertexWithUV(width/2, -height/2, 0.0D, (double)((u + (float)width) * f4), (double)(v * f5));
|
||||
worldrenderer.addVertexWithUV(-width/2, -height/2, 0.0D, (double)(u * f4), (double)(v * f5));
|
||||
vertexBuffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX);
|
||||
vertexBuffer.pos(-width / 2, height / 2, 0.0D).tex((double) (u * f4), (double) ((v + (float) height) * f5)).endVertex();
|
||||
vertexBuffer.pos(width/2, height/2, 0.0D).tex((double)((u + (float)width) * f4), (double)((v + (float)height) * f5)).endVertex();
|
||||
vertexBuffer.pos(width/2, -height/2, 0.0D).tex((double)((u + (float)width) * f4), (double)(v * f5)).endVertex();
|
||||
vertexBuffer.pos(-width/2, -height/2, 0.0D).tex((double)(u * f4), (double)(v * f5)).endVertex();
|
||||
tessellator.draw();
|
||||
|
||||
GlStateManager.popMatrix();
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.replaymod.core.utils;
|
||||
|
||||
import net.minecraft.network.PacketBuffer;
|
||||
import net.minecraft.network.play.server.S3FPacketCustomPayload;
|
||||
import net.minecraft.network.play.server.SPacketCustomPayload;
|
||||
|
||||
/**
|
||||
* Restrictions set by the server,
|
||||
@@ -14,10 +14,10 @@ public class Restrictions {
|
||||
private boolean onlyFirstPerson;
|
||||
private boolean onlyRecordingPlayer;
|
||||
|
||||
public String handle(S3FPacketCustomPayload packet) {
|
||||
public String handle(SPacketCustomPayload packet) {
|
||||
PacketBuffer buffer = packet.getBufferData();
|
||||
while (buffer.isReadable()) {
|
||||
String name = buffer.readStringFromBuffer(64);
|
||||
String name = buffer.readString(64);
|
||||
boolean active = buffer.readBoolean();
|
||||
// if ("no_xray".equals(name)) {
|
||||
// noXray = active;
|
||||
|
||||
@@ -160,7 +160,7 @@ public class Utils {
|
||||
}
|
||||
|
||||
public static ResourceLocation getResourceLocationForPlayerUUID(UUID uuid) {
|
||||
NetworkPlayerInfo info = getMinecraft().getNetHandler().getPlayerInfo(uuid);
|
||||
NetworkPlayerInfo info = getMinecraft().getConnection().getPlayerInfo(uuid);
|
||||
ResourceLocation skinLocation;
|
||||
if (info != null && info.hasLocationSkin()) {
|
||||
skinLocation = info.getLocationSkin();
|
||||
|
||||
@@ -27,7 +27,7 @@ public class WrappedTimer extends Timer {
|
||||
to.elapsedPartialTicks = from.elapsedPartialTicks;
|
||||
to.lastSyncSysClock = from.lastSyncSysClock;
|
||||
to.lastSyncHRClock = from.lastSyncHRClock;
|
||||
to.field_74285_i = from.field_74285_i;
|
||||
to.counter = from.counter;
|
||||
to.timeSyncAdjustment = from.timeSyncAdjustment;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,11 +8,8 @@ import net.minecraft.client.gui.GuiMainMenu;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
import net.minecraftforge.client.event.GuiScreenEvent;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class GuiHandler {
|
||||
private static final int BUTTON_REPLAY_EDITOR = 17890237;
|
||||
|
||||
@@ -23,31 +20,28 @@ public class GuiHandler {
|
||||
}
|
||||
|
||||
public void register() {
|
||||
FMLCommonHandler.instance().bus().register(this);
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void injectIntoMainMenu(GuiScreenEvent.InitGuiEvent event) {
|
||||
if (!(event.gui instanceof GuiMainMenu)) {
|
||||
if (!(event.getGui() instanceof GuiMainMenu)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
List<GuiButton> buttonList = event.buttonList;
|
||||
GuiButton button = new GuiButton(BUTTON_REPLAY_EDITOR, event.gui.width / 2 + 2,
|
||||
event.gui.height / 4 + 10 + 3 * 24, I18n.format("replaymod.gui.replayeditor"));
|
||||
GuiButton button = new GuiButton(BUTTON_REPLAY_EDITOR, event.getGui().width / 2 + 2,
|
||||
event.getGui().height / 4 + 10 + 3 * 24, I18n.format("replaymod.gui.replayeditor"));
|
||||
button.width = button.width / 2 - 2;
|
||||
buttonList.add(button);
|
||||
event.getButtonList().add(button);
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onButton(GuiScreenEvent.ActionPerformedEvent.Pre event) {
|
||||
if(!event.button.enabled) return;
|
||||
if(!event.getButton().enabled) return;
|
||||
|
||||
if (event.gui instanceof GuiMainMenu) {
|
||||
if (event.button.id == BUTTON_REPLAY_EDITOR) {
|
||||
new GuiReplayEditor(GuiScreen.wrap(event.gui), mod.getCore()).display();
|
||||
if (event.getGui() instanceof GuiMainMenu) {
|
||||
if (event.getButton().id == BUTTON_REPLAY_EDITOR) {
|
||||
new GuiReplayEditor(GuiScreen.wrap(event.getGui()), mod.getCore()).display();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ import de.johni0702.minecraft.gui.element.GuiImage;
|
||||
import de.johni0702.minecraft.gui.element.IGuiImage;
|
||||
import de.johni0702.minecraft.gui.layout.HorizontalLayout;
|
||||
import net.minecraft.client.settings.GameSettings;
|
||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import net.minecraftforge.fml.common.gameevent.TickEvent;
|
||||
import org.lwjgl.input.Keyboard;
|
||||
@@ -40,7 +40,7 @@ public class FullBrightness implements Extra {
|
||||
}
|
||||
});
|
||||
|
||||
FMLCommonHandler.instance().bus().register(this);
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
|
||||
@@ -17,7 +17,7 @@ import de.johni0702.minecraft.gui.layout.GridLayout;
|
||||
import de.johni0702.minecraft.gui.layout.HorizontalLayout;
|
||||
import de.johni0702.minecraft.gui.layout.LayoutData;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import org.lwjgl.input.Keyboard;
|
||||
import org.lwjgl.util.Dimension;
|
||||
@@ -35,7 +35,7 @@ public class HotkeyButtons implements Extra {
|
||||
public void register(ReplayMod mod) throws Exception {
|
||||
this.mod = mod;
|
||||
|
||||
FMLCommonHandler.instance().bus().register(this);
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
|
||||
@@ -5,7 +5,7 @@ import com.replaymod.core.ReplayMod;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.resources.IResourcePack;
|
||||
import net.minecraft.client.resources.data.IMetadataSection;
|
||||
import net.minecraft.client.resources.data.IMetadataSerializer;
|
||||
import net.minecraft.client.resources.data.MetadataSerializer;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
|
||||
@@ -99,12 +99,12 @@ public class LocalizationExtra implements Extra {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set getResourceDomains() {
|
||||
public Set<String> getResourceDomains() {
|
||||
return ImmutableSet.of("replaymod");
|
||||
}
|
||||
|
||||
@Override
|
||||
public IMetadataSection getPackMetadata(IMetadataSerializer p_135058_1_, String p_135058_2_) throws IOException {
|
||||
public <T extends IMetadataSection> T getPackMetadata(MetadataSerializer metadataSerializer, String metadataSectionName) throws IOException {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -13,7 +13,6 @@ import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraftforge.client.event.RenderHandEvent;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import org.lwjgl.input.Keyboard;
|
||||
|
||||
@@ -35,7 +34,7 @@ public class PlayerOverview implements Extra {
|
||||
public void run() {
|
||||
if (module.getReplayHandler() != null) {
|
||||
@SuppressWarnings("unchecked")
|
||||
List<EntityPlayer> players = mod.getMinecraft().theWorld.getPlayers(EntityPlayer.class, new Predicate() {
|
||||
List<EntityPlayer> players = mod.getMinecraft().world.getPlayers(EntityPlayer.class, new Predicate() {
|
||||
@Override
|
||||
public boolean apply(Object input) {
|
||||
return !(input instanceof CameraEntity); // Exclude the camera entity
|
||||
@@ -56,7 +55,6 @@ public class PlayerOverview implements Extra {
|
||||
}
|
||||
});
|
||||
|
||||
FMLCommonHandler.instance().bus().register(this);
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,8 @@ import de.johni0702.minecraft.gui.utils.Colors;
|
||||
import net.minecraft.client.audio.PositionedSoundRecord;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.player.EnumPlayerModelParts;
|
||||
import net.minecraft.potion.Potion;
|
||||
import net.minecraft.init.MobEffects;
|
||||
import net.minecraft.init.SoundEvents;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import org.lwjgl.util.Dimension;
|
||||
import org.lwjgl.util.ReadableDimension;
|
||||
@@ -46,14 +47,14 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable {
|
||||
public final GuiCheckbox checkAll = new GuiCheckbox(contentPanel){
|
||||
@Override
|
||||
public void onClick() {
|
||||
getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create(BUTTON_SOUND, 1.0F));
|
||||
getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(SoundEvents.UI_BUTTON_CLICK, 1.0F));
|
||||
playersScrollable.forEach(IGuiCheckbox.class).setChecked(true);
|
||||
}
|
||||
}.setLabel("").setChecked(true).setTooltip(new GuiTooltip().setI18nText("replaymod.gui.playeroverview.showall"));
|
||||
public final GuiCheckbox uncheckAll = new GuiCheckbox(contentPanel){
|
||||
@Override
|
||||
public void onClick() {
|
||||
getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create(BUTTON_SOUND, 1.0F));
|
||||
getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(SoundEvents.UI_BUTTON_CLICK, 1.0F));
|
||||
playersScrollable.forEach(IGuiCheckbox.class).setChecked(false);
|
||||
}
|
||||
}.setLabel("").setChecked(false).setTooltip(new GuiTooltip().setI18nText("replaymod.gui.playeroverview.hideall"));
|
||||
@@ -96,7 +97,7 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable {
|
||||
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) {
|
||||
renderer.bindTexture(texture);
|
||||
renderer.drawTexturedRect(0, 0, 8, 8, 16, 16, 8, 8, 64, 64);
|
||||
if (p.func_175148_a(EnumPlayerModelParts.HAT)) {
|
||||
if (p.isWearing(EnumPlayerModelParts.HAT)) {
|
||||
renderer.drawTexturedRect(0, 0, 40, 8, size.getWidth(), size.getHeight(), 8, 8, 64, 64);
|
||||
}
|
||||
}
|
||||
@@ -145,7 +146,7 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable {
|
||||
}
|
||||
|
||||
private static boolean isSpectator(EntityPlayer e) {
|
||||
return e.isInvisible() && e.getActivePotionEffect(Potion.invisibility) == null;
|
||||
return e.isInvisible() && e.getActivePotionEffect(MobEffects.INVISIBILITY) == null;
|
||||
}
|
||||
|
||||
private static final class PlayerComparator implements Comparator<EntityPlayer> {
|
||||
|
||||
@@ -17,8 +17,8 @@ public class YoutubeUpload implements Extra {
|
||||
|
||||
@SubscribeEvent
|
||||
public void onGuiOpen(GuiScreenEvent.InitGuiEvent.Post event) {
|
||||
if (GuiScreen.from(event.gui) instanceof GuiRenderingDone) {
|
||||
GuiRenderingDone gui = (GuiRenderingDone) GuiScreen.from(event.gui);
|
||||
if (GuiScreen.from(event.getGui()) instanceof GuiRenderingDone) {
|
||||
GuiRenderingDone gui = (GuiRenderingDone) GuiScreen.from(event.getGui());
|
||||
// Check if there already is a youtube button
|
||||
if (gui.actionsPanel.getChildren().stream().anyMatch(it -> it instanceof YoutubeButton)) {
|
||||
return; // Button already added
|
||||
|
||||
@@ -12,8 +12,8 @@ import com.replaymod.replaystudio.replay.ReplayFile;
|
||||
import com.replaymod.replaystudio.replay.ZipReplayFile;
|
||||
import com.replaymod.replaystudio.studio.ReplayStudio;
|
||||
import de.johni0702.minecraft.gui.container.GuiScreen;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.common.config.Configuration;
|
||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
|
||||
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
|
||||
@@ -76,7 +76,7 @@ public class ReplayModOnline {
|
||||
}
|
||||
|
||||
new GuiHandler(this).register();
|
||||
FMLCommonHandler.instance().bus().register(this);
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
}
|
||||
|
||||
@Mod.EventHandler
|
||||
|
||||
@@ -2,7 +2,11 @@ package com.replaymod.online.api.replay.holders;
|
||||
|
||||
public enum MinecraftVersion {
|
||||
|
||||
MC_1_8("Minecraft 1.8", "1.8");
|
||||
MC_1_8("Minecraft 1.8", "1.8"),
|
||||
MC_1_9_4("Minecraft 1.9.4", "1.9.4"),
|
||||
MC_1_10_2("Minecraft 1.10.2", "1.10.2"),
|
||||
MC_1_11("Minecraft 1.11", "1.11"),
|
||||
MC_1_11_2("Minecraft 1.11.2", "1.11.2");
|
||||
|
||||
private String niceName, apiName;
|
||||
|
||||
|
||||
@@ -14,11 +14,9 @@ import net.minecraft.client.gui.GuiMainMenu;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
import net.minecraftforge.client.event.GuiScreenEvent;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
|
||||
public class GuiHandler {
|
||||
private static final int BUTTON_REPLAY_CENTER = 17890236;
|
||||
@@ -30,26 +28,23 @@ public class GuiHandler {
|
||||
}
|
||||
|
||||
public void register() {
|
||||
FMLCommonHandler.instance().bus().register(this);
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void injectIntoMainMenu(GuiScreenEvent.InitGuiEvent event) {
|
||||
if (!(event.gui instanceof GuiMainMenu)) {
|
||||
if (!(event.getGui() instanceof GuiMainMenu)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
List<GuiButton> buttonList = event.buttonList;
|
||||
GuiButton button = new GuiButton(BUTTON_REPLAY_CENTER, event.gui.width / 2 - 100,
|
||||
event.gui.height / 4 + 10 + 4 * 24, I18n.format("replaymod.gui.replaycenter"));
|
||||
buttonList.add(button);
|
||||
GuiButton button = new GuiButton(BUTTON_REPLAY_CENTER, event.getGui().width / 2 - 100,
|
||||
event.getGui().height / 4 + 10 + 4 * 24, I18n.format("replaymod.gui.replaycenter"));
|
||||
event.getButtonList().add(button);
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void injectIntoReplayViewer(GuiScreenEvent.InitGuiEvent.Post event) {
|
||||
AbstractGuiScreen guiScreen = GuiScreen.from(event.gui);
|
||||
AbstractGuiScreen guiScreen = GuiScreen.from(event.getGui());
|
||||
if (!(guiScreen instanceof GuiReplayViewer)) {
|
||||
return;
|
||||
}
|
||||
@@ -75,15 +70,15 @@ public class GuiHandler {
|
||||
|
||||
@SubscribeEvent
|
||||
public void onButton(GuiScreenEvent.ActionPerformedEvent.Pre event) {
|
||||
if(!event.button.enabled) return;
|
||||
if(!event.getButton().enabled) return;
|
||||
|
||||
if (event.gui instanceof GuiMainMenu) {
|
||||
if (event.button.id == BUTTON_REPLAY_CENTER) {
|
||||
if (event.getGui() instanceof GuiMainMenu) {
|
||||
if (event.getButton().id == BUTTON_REPLAY_CENTER) {
|
||||
GuiReplayCenter replayCenter = new GuiReplayCenter(mod);
|
||||
if (mod.isLoggedIn()) {
|
||||
replayCenter.display();
|
||||
} else {
|
||||
new GuiLoginPrompt(mod.getApiClient(), GuiScreen.wrap(event.gui), replayCenter, true).display();
|
||||
new GuiLoginPrompt(mod.getApiClient(), GuiScreen.wrap(event.getGui()), replayCenter, true).display();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ import com.replaymod.replaystudio.pathing.path.Keyframe;
|
||||
import com.replaymod.replaystudio.pathing.path.Path;
|
||||
import com.replaymod.replaystudio.pathing.path.Timeline;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
@@ -65,7 +65,7 @@ public abstract class AbstractTimelinePlayer {
|
||||
}
|
||||
|
||||
replayHandler.getReplaySender().setSyncModeAndWait();
|
||||
FMLCommonHandler.instance().bus().register(this);
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
lastTime = 0;
|
||||
mc.timer = new ReplayTimer(mc.timer);
|
||||
mc.timer.timerSpeed = 1;
|
||||
@@ -87,7 +87,7 @@ public abstract class AbstractTimelinePlayer {
|
||||
mc.timer = ((ReplayTimer) mc.timer).getWrapped();
|
||||
replayHandler.getReplaySender().setReplaySpeed(0);
|
||||
replayHandler.getReplaySender().setAsyncMode(true);
|
||||
FMLCommonHandler.instance().bus().unregister(this);
|
||||
MinecraftForge.EVENT_BUS.unregister(this);
|
||||
return;
|
||||
}
|
||||
long time = getTimePassed();
|
||||
|
||||
@@ -2,7 +2,7 @@ package com.replaymod.pathing.player;
|
||||
|
||||
import com.replaymod.core.utils.WrappedTimer;
|
||||
import net.minecraft.util.Timer;
|
||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.fml.common.eventhandler.Event;
|
||||
|
||||
/**
|
||||
@@ -20,7 +20,7 @@ public class ReplayTimer extends WrappedTimer {
|
||||
copy(this, state); // Save our current state
|
||||
super.updateTimer(); // Update current state
|
||||
copy(state, this); // Restore our old state
|
||||
FMLCommonHandler.instance().bus().post(new UpdatedEvent());
|
||||
MinecraftForge.EVENT_BUS.post(new UpdatedEvent());
|
||||
}
|
||||
|
||||
public Timer getWrapped() {
|
||||
|
||||
@@ -7,8 +7,8 @@ import com.replaymod.recording.handler.GuiHandler;
|
||||
import com.replaymod.recording.packet.PacketListener;
|
||||
import io.netty.channel.ChannelDuplexHandler;
|
||||
import io.netty.channel.ChannelHandler;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraft.network.NetworkManager;
|
||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
|
||||
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
|
||||
@@ -56,7 +56,7 @@ public class ReplayModRecording {
|
||||
|
||||
@Mod.EventHandler
|
||||
public void init(FMLInitializationEvent event) {
|
||||
EventBus bus = FMLCommonHandler.instance().bus();
|
||||
EventBus bus = MinecraftForge.EVENT_BUS;
|
||||
bus.register(connectionEventHandler = new ConnectionEventHandler(logger, core));
|
||||
|
||||
new GuiHandler(core).register();
|
||||
|
||||
@@ -40,7 +40,7 @@ public class GuiRecordingOverlay {
|
||||
*/
|
||||
@SubscribeEvent
|
||||
public void renderRecordingIndicator(RenderGameOverlayEvent.Post event) {
|
||||
if (event.type != RenderGameOverlayEvent.ElementType.ALL) return;
|
||||
if (event.getType() != RenderGameOverlayEvent.ElementType.ALL) return;
|
||||
if (settingsRegistry.get(Setting.INDICATOR)) {
|
||||
FontRenderer fontRenderer = mc.fontRendererObj;
|
||||
fontRenderer.drawString(I18n.format("replaymod.gui.recording").toUpperCase(), 30, 18 - (fontRenderer.FONT_HEIGHT / 2), 0xffffffff);
|
||||
|
||||
@@ -67,6 +67,9 @@ public class ConnectionEventHandler {
|
||||
worldName = mc.getIntegratedServer().getWorldName();
|
||||
} else if (Minecraft.getMinecraft().getCurrentServerData() != null) {
|
||||
worldName = Minecraft.getMinecraft().getCurrentServerData().serverIP;
|
||||
} else if (Minecraft.getMinecraft().isConnectedToRealms()) {
|
||||
// we can't access the server name without tapping too deep in the Realms Library
|
||||
worldName = "A Realms Server";
|
||||
} else {
|
||||
logger.info("Recording not started as the world is neither local nor remote (probably a replay).");
|
||||
return;
|
||||
|
||||
@@ -8,7 +8,7 @@ import de.johni0702.minecraft.gui.container.VanillaGuiScreen;
|
||||
import de.johni0702.minecraft.gui.element.GuiCheckbox;
|
||||
import de.johni0702.minecraft.gui.layout.CustomLayout;
|
||||
import net.minecraft.client.gui.GuiMultiplayer;
|
||||
import net.minecraft.client.gui.GuiSelectWorld;
|
||||
import net.minecraft.client.gui.GuiWorldSelection;
|
||||
import net.minecraftforge.client.event.GuiScreenEvent;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
@@ -27,9 +27,9 @@ public class GuiHandler {
|
||||
|
||||
@SubscribeEvent
|
||||
public void onGuiInit(GuiScreenEvent.InitGuiEvent.Post event) {
|
||||
if (event.gui instanceof GuiSelectWorld || event.gui instanceof GuiMultiplayer) {
|
||||
if (event.getGui() instanceof GuiWorldSelection || event.getGui() instanceof GuiMultiplayer) {
|
||||
SettingsRegistry settingsRegistry = mod.getSettingsRegistry();
|
||||
boolean sp = event.gui instanceof GuiSelectWorld;
|
||||
boolean sp = event.getGui() instanceof GuiWorldSelection;
|
||||
Setting<Boolean> setting = sp ? Setting.RECORD_SINGLEPLAYER : Setting.RECORD_SERVER;
|
||||
|
||||
GuiCheckbox recordingCheckbox = new GuiCheckbox()
|
||||
@@ -40,7 +40,7 @@ public class GuiHandler {
|
||||
settingsRegistry.save();
|
||||
});
|
||||
|
||||
VanillaGuiScreen.setup(event.gui).setLayout(new CustomLayout<GuiScreen>() {
|
||||
VanillaGuiScreen.setup(event.getGui()).setLayout(new CustomLayout<GuiScreen>() {
|
||||
@Override
|
||||
protected void layout(GuiScreen container, int width, int height) {
|
||||
//size(recordingCheckbox, 200, 20);
|
||||
|
||||
@@ -1,24 +1,22 @@
|
||||
package com.replaymod.recording.handler;
|
||||
|
||||
import com.replaymod.recording.packet.PacketListener;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.entity.EntityLiving;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.inventory.EntityEquipmentSlot;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.network.Packet;
|
||||
import net.minecraft.network.PacketBuffer;
|
||||
import net.minecraft.network.datasync.EntityDataManager;
|
||||
import net.minecraft.network.play.server.*;
|
||||
import net.minecraft.network.play.server.S14PacketEntity.S17PacketEntityLookMove;
|
||||
import net.minecraft.server.integrated.IntegratedServer;
|
||||
import net.minecraft.util.BlockPos;
|
||||
import net.minecraft.util.MathHelper;
|
||||
import net.minecraft.util.EnumHand;
|
||||
import net.minecraft.util.SoundCategory;
|
||||
import net.minecraft.util.SoundEvent;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.event.entity.minecart.MinecartInteractEvent;
|
||||
import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent;
|
||||
import net.minecraftforge.event.entity.player.PlayerUseItemEvent;
|
||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import net.minecraftforge.fml.common.gameevent.PlayerEvent.ItemPickupEvent;
|
||||
import net.minecraftforge.fml.common.gameevent.TickEvent;
|
||||
@@ -32,24 +30,24 @@ public class RecordingEventHandler {
|
||||
private final PacketListener packetListener;
|
||||
|
||||
private Double lastX, lastY, lastZ;
|
||||
private ItemStack[] playerItems = new ItemStack[5];
|
||||
private ItemStack[] playerItems = new ItemStack[6];
|
||||
private int ticksSinceLastCorrection;
|
||||
private boolean wasSleeping;
|
||||
private int lastRiding = -1;
|
||||
private Integer rotationYawHeadBefore;
|
||||
private boolean wasHandActive;
|
||||
private EnumHand lastActiveHand;
|
||||
|
||||
public RecordingEventHandler(PacketListener packetListener) {
|
||||
this.packetListener = packetListener;
|
||||
}
|
||||
|
||||
public void register() {
|
||||
FMLCommonHandler.instance().bus().register(this);
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
((RecordingEventSender) mc.renderGlobal).setRecordingEventHandler(this);
|
||||
}
|
||||
|
||||
public void unregister() {
|
||||
FMLCommonHandler.instance().bus().unregister(this);
|
||||
MinecraftForge.EVENT_BUS.unregister(this);
|
||||
RecordingEventSender recordingEventSender = ((RecordingEventSender) mc.renderGlobal);
|
||||
if (recordingEventSender.getRecordingEventHandler() == this) {
|
||||
@@ -59,7 +57,7 @@ public class RecordingEventHandler {
|
||||
|
||||
public void onPlayerJoin() {
|
||||
try {
|
||||
packetListener.save(spawnPlayer(mc.thePlayer));
|
||||
packetListener.save(new SPacketSpawnPlayer(mc.player));
|
||||
} catch(Exception e1) {
|
||||
e1.printStackTrace();
|
||||
}
|
||||
@@ -67,46 +65,35 @@ public class RecordingEventHandler {
|
||||
|
||||
public void onPlayerRespawn() {
|
||||
try {
|
||||
packetListener.save(spawnPlayer(mc.thePlayer));
|
||||
packetListener.save(new SPacketSpawnPlayer(mc.player));
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private S0CPacketSpawnPlayer spawnPlayer(EntityPlayer player) {
|
||||
public void onClientSound(SoundEvent sound, SoundCategory category,
|
||||
double x, double y, double z, float volume, float pitch) {
|
||||
try {
|
||||
S0CPacketSpawnPlayer packet = new S0CPacketSpawnPlayer();
|
||||
|
||||
ByteBuf bb = Unpooled.buffer();
|
||||
PacketBuffer pb = new PacketBuffer(bb);
|
||||
|
||||
pb.writeVarIntToBuffer(player.getEntityId());
|
||||
pb.writeUuid(EntityPlayer.getUUID(player.getGameProfile()));
|
||||
|
||||
pb.writeInt(MathHelper.floor_double(player.posX * 32.0D));
|
||||
pb.writeInt(MathHelper.floor_double(player.posY * 32.0D));
|
||||
pb.writeInt(MathHelper.floor_double(player.posZ * 32.0D));
|
||||
pb.writeByte((byte) ((int) (player.rotationYaw * 256.0F / 360.0F)));
|
||||
pb.writeByte((byte) ((int) (player.rotationPitch * 256.0F / 360.0F)));
|
||||
|
||||
ItemStack itemstack = player.inventory.getCurrentItem();
|
||||
pb.writeShort(itemstack == null ? 0 : Item.getIdFromItem(itemstack.getItem()));
|
||||
|
||||
player.getDataWatcher().writeTo(pb);
|
||||
|
||||
packet.readPacketData(pb);
|
||||
|
||||
return packet;
|
||||
// Send to all other players in ServerWorldEventHandler#playSoundToAllNearExcept
|
||||
packetListener.save(new SPacketSoundEffect(sound, category, x, y, z, volume, pitch));
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void onClientEffect(int type, BlockPos pos, int data) {
|
||||
try {
|
||||
// Send to all other players in ServerWorldEventHandler#playEvent
|
||||
packetListener.save(new SPacketEffect(type, pos, data, false));
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onPlayerTick(PlayerTickEvent e) {
|
||||
try {
|
||||
if(e.player != mc.thePlayer) return;
|
||||
if(e.player != mc.player) return;
|
||||
|
||||
boolean force = false;
|
||||
if(lastX == null || lastY == null || lastZ == null) {
|
||||
@@ -131,19 +118,14 @@ public class RecordingEventHandler {
|
||||
lastZ = e.player.posZ;
|
||||
|
||||
Packet packet;
|
||||
if(force || Math.abs(dx) > 4.0 || Math.abs(dy) > 4.0 || Math.abs(dz) > 4.0) {
|
||||
int x = MathHelper.floor_double(e.player.posX * 32.0D);
|
||||
int y = MathHelper.floor_double(e.player.posY * 32.0D);
|
||||
int z = MathHelper.floor_double(e.player.posZ * 32.0D);
|
||||
byte yaw = (byte) ((int) (e.player.rotationYaw * 256.0F / 360.0F));
|
||||
byte pitch = (byte) ((int) (e.player.rotationPitch * 256.0F / 360.0F));
|
||||
packet = new S18PacketEntityTeleport(e.player.getEntityId(), x, y, z, yaw, pitch, e.player.onGround);
|
||||
if (force || Math.abs(dx) > 8.0 || Math.abs(dy) > 8.0 || Math.abs(dz) > 8.0) {
|
||||
packet = new SPacketEntityTeleport(e.player);
|
||||
} else {
|
||||
byte newYaw = (byte) ((int) (e.player.rotationYaw * 256.0F / 360.0F));
|
||||
byte newPitch = (byte) ((int) (e.player.rotationPitch * 256.0F / 360.0F));
|
||||
|
||||
packet = new S17PacketEntityLookMove(e.player.getEntityId(),
|
||||
(byte) Math.round(dx * 32), (byte) Math.round(dy * 32), (byte) Math.round(dz * 32),
|
||||
packet = new SPacketEntity.S17PacketEntityLookMove(e.player.getEntityId(),
|
||||
(short) Math.round(dx * 4096), (short) Math.round(dy * 4096), (short) Math.round(dz * 4096),
|
||||
newYaw, newPitch, e.player.onGround);
|
||||
}
|
||||
|
||||
@@ -153,37 +135,16 @@ public class RecordingEventHandler {
|
||||
int rotationYawHead = ((int)(e.player.rotationYawHead * 256.0F / 360.0F));
|
||||
|
||||
if(!Objects.equals(rotationYawHead, rotationYawHeadBefore)) {
|
||||
S19PacketEntityHeadLook head = new S19PacketEntityHeadLook();
|
||||
ByteBuf bb1 = Unpooled.buffer();
|
||||
PacketBuffer pb1 = new PacketBuffer(bb1);
|
||||
|
||||
pb1.writeVarIntToBuffer(e.player.getEntityId());
|
||||
pb1.writeByte(rotationYawHead);
|
||||
|
||||
head.readPacketData(pb1);
|
||||
|
||||
packetListener.save(head);
|
||||
|
||||
packetListener.save(new SPacketEntityHeadLook(e.player, (byte) rotationYawHead));
|
||||
rotationYawHeadBefore = rotationYawHead;
|
||||
}
|
||||
|
||||
S12PacketEntityVelocity vel = new S12PacketEntityVelocity(e.player.getEntityId(), e.player.motionX, e.player.motionY, e.player.motionZ);
|
||||
packetListener.save(vel);
|
||||
packetListener.save(new SPacketEntityVelocity(e.player.getEntityId(), e.player.motionX, e.player.motionY, e.player.motionZ));
|
||||
|
||||
//Animation Packets
|
||||
//Swing Animation
|
||||
if(e.player.swingProgressInt == 1) {
|
||||
S0BPacketAnimation pac = new S0BPacketAnimation();
|
||||
|
||||
ByteBuf bb = Unpooled.buffer();
|
||||
PacketBuffer pb = new PacketBuffer(bb);
|
||||
|
||||
pb.writeVarIntToBuffer(e.player.getEntityId());
|
||||
pb.writeByte(0);
|
||||
|
||||
pac.readPacketData(pb);
|
||||
|
||||
packetListener.save(pac);
|
||||
if (e.player.isSwingInProgress && e.player.swingProgressInt == -1) {
|
||||
packetListener.save(new SPacketAnimation(e.player, e.player.swingingHand == EnumHand.MAIN_HAND ? 0 : 3));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -207,77 +168,64 @@ public class RecordingEventHandler {
|
||||
*/
|
||||
|
||||
//Inventory Handling
|
||||
if(playerItems[0] != mc.thePlayer.getHeldItem()) {
|
||||
playerItems[0] = mc.thePlayer.getHeldItem();
|
||||
S04PacketEntityEquipment pee = new S04PacketEntityEquipment(e.player.getEntityId(), 0, playerItems[0]);
|
||||
packetListener.save(pee);
|
||||
if (playerItems[0] != mc.player.getHeldItem(EnumHand.MAIN_HAND)) {
|
||||
playerItems[0] = mc.player.getHeldItem(EnumHand.MAIN_HAND);
|
||||
packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.MAINHAND, playerItems[0]));
|
||||
}
|
||||
|
||||
if(playerItems[1] != mc.thePlayer.inventory.armorInventory[0]) {
|
||||
playerItems[1] = mc.thePlayer.inventory.armorInventory[0];
|
||||
S04PacketEntityEquipment pee = new S04PacketEntityEquipment(e.player.getEntityId(), 1, playerItems[1]);
|
||||
packetListener.save(pee);
|
||||
if (playerItems[1] != mc.player.getHeldItem(EnumHand.OFF_HAND)) {
|
||||
playerItems[1] = mc.player.getHeldItem(EnumHand.OFF_HAND);
|
||||
packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.OFFHAND, playerItems[1]));
|
||||
}
|
||||
|
||||
if(playerItems[2] != mc.thePlayer.inventory.armorInventory[1]) {
|
||||
playerItems[2] = mc.thePlayer.inventory.armorInventory[1];
|
||||
S04PacketEntityEquipment pee = new S04PacketEntityEquipment(e.player.getEntityId(), 2, playerItems[2]);
|
||||
packetListener.save(pee);
|
||||
if (playerItems[2] != mc.player.getItemStackFromSlot(EntityEquipmentSlot.FEET)) {
|
||||
playerItems[2] = mc.player.getItemStackFromSlot(EntityEquipmentSlot.FEET);
|
||||
packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.FEET, playerItems[2]));
|
||||
}
|
||||
|
||||
if(playerItems[3] != mc.thePlayer.inventory.armorInventory[2]) {
|
||||
playerItems[3] = mc.thePlayer.inventory.armorInventory[2];
|
||||
S04PacketEntityEquipment pee = new S04PacketEntityEquipment(e.player.getEntityId(), 3, playerItems[3]);
|
||||
packetListener.save(pee);
|
||||
if (playerItems[3] != mc.player.getItemStackFromSlot(EntityEquipmentSlot.LEGS)) {
|
||||
playerItems[3] = mc.player.getItemStackFromSlot(EntityEquipmentSlot.LEGS);
|
||||
packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.LEGS, playerItems[3]));
|
||||
}
|
||||
|
||||
if(playerItems[4] != mc.thePlayer.inventory.armorInventory[3]) {
|
||||
playerItems[4] = mc.thePlayer.inventory.armorInventory[3];
|
||||
S04PacketEntityEquipment pee = new S04PacketEntityEquipment(e.player.getEntityId(), 4, playerItems[4]);
|
||||
packetListener.save(pee);
|
||||
if (playerItems[4] != mc.player.getItemStackFromSlot(EntityEquipmentSlot.CHEST)) {
|
||||
playerItems[4] = mc.player.getItemStackFromSlot(EntityEquipmentSlot.CHEST);
|
||||
packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.CHEST, playerItems[4]));
|
||||
}
|
||||
|
||||
if (playerItems[5] != mc.player.getItemStackFromSlot(EntityEquipmentSlot.HEAD)) {
|
||||
playerItems[5] = mc.player.getItemStackFromSlot(EntityEquipmentSlot.HEAD);
|
||||
packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.HEAD, playerItems[5]));
|
||||
}
|
||||
|
||||
//Leaving Ride
|
||||
|
||||
if((!mc.thePlayer.isRiding() && lastRiding != -1) ||
|
||||
(mc.thePlayer.isRiding() && lastRiding != mc.thePlayer.ridingEntity.getEntityId())) {
|
||||
if(!mc.thePlayer.isRiding()) {
|
||||
if((!mc.player.isRiding() && lastRiding != -1) ||
|
||||
(mc.player.isRiding() && lastRiding != mc.player.getRidingEntity().getEntityId())) {
|
||||
if(!mc.player.isRiding()) {
|
||||
lastRiding = -1;
|
||||
} else {
|
||||
lastRiding = mc.thePlayer.ridingEntity.getEntityId();
|
||||
lastRiding = mc.player.getRidingEntity().getEntityId();
|
||||
}
|
||||
|
||||
S1BPacketEntityAttach pea = new S1BPacketEntityAttach();
|
||||
|
||||
ByteBuf buf = Unpooled.buffer();
|
||||
PacketBuffer pbuf = new PacketBuffer(buf);
|
||||
|
||||
pbuf.writeInt(e.player.getEntityId());
|
||||
pbuf.writeInt(lastRiding);
|
||||
pbuf.writeBoolean(false);
|
||||
|
||||
pea.readPacketData(pbuf);
|
||||
|
||||
packetListener.save(pea);
|
||||
packetListener.save(new SPacketEntityAttach(e.player, e.player.getRidingEntity()));
|
||||
}
|
||||
|
||||
//Sleeping
|
||||
if(!mc.thePlayer.isPlayerSleeping() && wasSleeping) {
|
||||
S0BPacketAnimation pac = new S0BPacketAnimation();
|
||||
|
||||
ByteBuf bb = Unpooled.buffer();
|
||||
PacketBuffer pb = new PacketBuffer(bb);
|
||||
|
||||
pb.writeVarIntToBuffer(e.player.getEntityId());
|
||||
pb.writeByte(2);
|
||||
|
||||
pac.readPacketData(pb);
|
||||
|
||||
packetListener.save(pac);
|
||||
|
||||
if(!mc.player.isPlayerSleeping() && wasSleeping) {
|
||||
packetListener.save(new SPacketAnimation(e.player, 2));
|
||||
wasSleeping = false;
|
||||
}
|
||||
|
||||
// Active hand (e.g. eating, drinking, blocking)
|
||||
if (mc.player.isHandActive() ^ wasHandActive || mc.player.getActiveHand() != lastActiveHand) {
|
||||
wasHandActive = mc.player.isHandActive();
|
||||
lastActiveHand = mc.player.getActiveHand();
|
||||
EntityDataManager dataManager = new EntityDataManager(null);
|
||||
int state = (wasHandActive ? 1 : 0) | (lastActiveHand == EnumHand.OFF_HAND ? 2 : 0);
|
||||
dataManager.register(EntityLiving.HAND_STATES, (byte) state);
|
||||
packetListener.save(new SPacketEntityMetadata(mc.player.getEntityId(), dataManager, true));
|
||||
}
|
||||
|
||||
} catch(Exception e1) {
|
||||
e1.printStackTrace();
|
||||
}
|
||||
@@ -286,27 +234,8 @@ public class RecordingEventHandler {
|
||||
@SubscribeEvent
|
||||
public void onPickupItem(ItemPickupEvent event) {
|
||||
try {
|
||||
packetListener.save(new S0DPacketCollectItem(event.pickedUp.getEntityId(), event.player.getEntityId()));
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onStartEating(PlayerUseItemEvent.Start event) {
|
||||
try {
|
||||
if(!event.entityPlayer.isEating()) return;
|
||||
S0BPacketAnimation packet = new S0BPacketAnimation();
|
||||
|
||||
ByteBuf bb = Unpooled.buffer();
|
||||
PacketBuffer pb = new PacketBuffer(bb);
|
||||
|
||||
pb.writeVarIntToBuffer(event.entityPlayer.getEntityId());
|
||||
pb.writeByte(3);
|
||||
|
||||
packet.readPacketData(pb);
|
||||
|
||||
packetListener.save(packet);
|
||||
packetListener.save(new SPacketCollectItem(event.pickedUp.getEntityId(), event.player.getEntityId(),
|
||||
event.pickedUp.getEntityItem().getMaxStackSize()));
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@@ -315,21 +244,11 @@ public class RecordingEventHandler {
|
||||
@SubscribeEvent
|
||||
public void onSleep(PlayerSleepInBedEvent event) {
|
||||
try {
|
||||
if(event.entityPlayer != mc.thePlayer) {
|
||||
if (event.getEntityPlayer() != mc.player) {
|
||||
return;
|
||||
}
|
||||
|
||||
S0APacketUseBed pub = new S0APacketUseBed();
|
||||
|
||||
ByteBuf buf = Unpooled.buffer();
|
||||
PacketBuffer pbuf = new PacketBuffer(buf);
|
||||
|
||||
pbuf.writeVarIntToBuffer(event.entityPlayer.getEntityId());
|
||||
pbuf.writeBlockPos(event.pos);
|
||||
|
||||
pub.readPacketData(pbuf);
|
||||
|
||||
packetListener.save(pub);
|
||||
packetListener.save(new SPacketUseBed(event.getEntityPlayer(), event.getPos()));
|
||||
|
||||
wasSleeping = true;
|
||||
|
||||
@@ -341,33 +260,22 @@ public class RecordingEventHandler {
|
||||
@SubscribeEvent
|
||||
public void enterMinecart(MinecartInteractEvent event) {
|
||||
try {
|
||||
if(event.player != mc.thePlayer) {
|
||||
if(event.getEntity() != mc.player) {
|
||||
return;
|
||||
}
|
||||
|
||||
S1BPacketEntityAttach pea = new S1BPacketEntityAttach();
|
||||
packetListener.save(new SPacketEntityAttach(event.getPlayer(), event.getMinecart()));
|
||||
|
||||
ByteBuf buf = Unpooled.buffer();
|
||||
PacketBuffer pbuf = new PacketBuffer(buf);
|
||||
|
||||
pbuf.writeInt(event.player.getEntityId());
|
||||
pbuf.writeInt(event.minecart.getEntityId());
|
||||
pbuf.writeBoolean(false);
|
||||
|
||||
pea.readPacketData(pbuf);
|
||||
|
||||
packetListener.save(pea);
|
||||
|
||||
lastRiding = event.minecart.getEntityId();
|
||||
lastRiding = event.getMinecart().getEntityId();
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void onBlockBreakAnim(int breakerId, BlockPos pos, int progress) {
|
||||
EntityPlayer thePlayer = mc.thePlayer;
|
||||
EntityPlayer thePlayer = mc.player;
|
||||
if (thePlayer != null && breakerId == thePlayer.getEntityId()) {
|
||||
packetListener.save(new S25PacketBlockBreakAnim(breakerId, pos, progress));
|
||||
packetListener.save(new SPacketBlockBreakAnim(breakerId, pos, progress));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,15 +4,14 @@ import com.replaymod.recording.handler.RecordingEventHandler;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.network.NetHandlerPlayClient;
|
||||
import net.minecraft.client.network.NetworkPlayerInfo;
|
||||
import net.minecraft.network.play.server.S07PacketRespawn;
|
||||
import net.minecraft.network.play.server.S38PacketPlayerListItem;
|
||||
import net.minecraft.network.play.server.SPacketPlayerListItem;
|
||||
import net.minecraft.network.play.server.SPacketRespawn;
|
||||
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.List;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
@@ -37,18 +36,16 @@ public abstract class MixinNetHandlerPlayClient {
|
||||
* @param ci Callback info
|
||||
*/
|
||||
@Inject(method = "handlePlayerListItem", at=@At("HEAD"))
|
||||
public void recordOwnJoin(S38PacketPlayerListItem packet, CallbackInfo ci) {
|
||||
if (gameController.thePlayer == null) return;
|
||||
public void recordOwnJoin(SPacketPlayerListItem packet, CallbackInfo ci) {
|
||||
if (gameController.player == null) return;
|
||||
|
||||
RecordingEventHandler handler = getRecordingEventHandler();
|
||||
if (handler != null && packet.func_179768_b() == S38PacketPlayerListItem.Action.ADD_PLAYER) {
|
||||
@SuppressWarnings("unchecked")
|
||||
List<S38PacketPlayerListItem.AddPlayerData> dataList = packet.func_179767_a();
|
||||
for (S38PacketPlayerListItem.AddPlayerData data : dataList) {
|
||||
if (data.func_179962_a() == null || data.func_179962_a().getId() == null) continue;
|
||||
if (handler != null && packet.getAction() == SPacketPlayerListItem.Action.ADD_PLAYER) {
|
||||
for (SPacketPlayerListItem.AddPlayerData data : packet.getEntries()) {
|
||||
if (data.getProfile() == null || data.getProfile().getId() == null) continue;
|
||||
// Only add spawn packet for our own player and only if he isn't known yet
|
||||
if (data.func_179962_a().getId().equals(Minecraft.getMinecraft().thePlayer.getGameProfile().getId())
|
||||
&& !playerInfoMap.containsKey(data.func_179962_a().getId())) {
|
||||
if (data.getProfile().getId().equals(Minecraft.getMinecraft().player.getGameProfile().getId())
|
||||
&& !playerInfoMap.containsKey(data.getProfile().getId())) {
|
||||
handler.onPlayerJoin();
|
||||
}
|
||||
}
|
||||
@@ -58,12 +55,12 @@ public abstract class MixinNetHandlerPlayClient {
|
||||
/**
|
||||
* Record the own player entity respawning.
|
||||
* We cannot use the {@link net.minecraftforge.event.entity.EntityJoinWorldEvent} because that would also include
|
||||
* the first spawn which is already handled by {@link #recordOwnJoin(S38PacketPlayerListItem, CallbackInfo)}.
|
||||
* the first spawn which is already handled by {@link #recordOwnJoin(SPacketPlayerListItem, CallbackInfo)}.
|
||||
* @param packet The packet
|
||||
* @param ci Callback info
|
||||
*/
|
||||
@Inject(method = "handleRespawn", at=@At("RETURN"))
|
||||
public void recordOwnRespawn(S07PacketRespawn packet, CallbackInfo ci) {
|
||||
public void recordOwnRespawn(SPacketRespawn packet, CallbackInfo ci) {
|
||||
RecordingEventHandler handler = getRecordingEventHandler();
|
||||
if (handler != null) {
|
||||
handler.onPlayerRespawn();
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
package com.replaymod.recording.mixin;
|
||||
|
||||
import com.replaymod.recording.handler.RecordingEventHandler;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.multiplayer.PlayerControllerMP;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
|
||||
@Mixin(PlayerControllerMP.class)
|
||||
public abstract class MixinPlayerControllerMP implements RecordingEventHandler.RecordingEventSender {
|
||||
|
||||
@Shadow
|
||||
private Minecraft mc;
|
||||
|
||||
// Redirects the call to playEvent without the initial player argument to the method with that argument
|
||||
// The new method will then play it and (if applicable) record it. (See MixinWorldClient)
|
||||
// This is necessary for the block break event (particles and sound) to be recorded. Otherwise it looks like the
|
||||
// event was emitted because of a packet (player will be null) and not as it actually was (by the player).
|
||||
@Redirect(method = "onPlayerDestroyBlock", at = @At(value = "INVOKE",
|
||||
target = "Lnet/minecraft/world/World;playEvent(ILnet/minecraft/util/math/BlockPos;I)V"))
|
||||
public void replayModRecording_playEvent_fixed(World world, int type, BlockPos pos, int data) {
|
||||
world.playEvent(mc.player, type, pos, data);
|
||||
}
|
||||
}
|
||||
@@ -2,7 +2,7 @@ package com.replaymod.recording.mixin;
|
||||
|
||||
import com.replaymod.recording.handler.RecordingEventHandler;
|
||||
import net.minecraft.client.renderer.RenderGlobal;
|
||||
import net.minecraft.util.BlockPos;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
package com.replaymod.recording.mixin;
|
||||
|
||||
import com.replaymod.recording.handler.RecordingEventHandler;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.multiplayer.WorldClient;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.profiler.Profiler;
|
||||
import net.minecraft.util.SoundCategory;
|
||||
import net.minecraft.util.SoundEvent;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.WorldProvider;
|
||||
import net.minecraft.world.storage.ISaveHandler;
|
||||
import net.minecraft.world.storage.WorldInfo;
|
||||
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;
|
||||
|
||||
@Mixin(WorldClient.class)
|
||||
public abstract class MixinWorldClient extends World implements RecordingEventHandler.RecordingEventSender {
|
||||
@Shadow
|
||||
private Minecraft mc;
|
||||
|
||||
protected MixinWorldClient(ISaveHandler saveHandlerIn, WorldInfo info, WorldProvider providerIn, Profiler profilerIn, boolean client) {
|
||||
super(saveHandlerIn, info, providerIn, profilerIn, client);
|
||||
}
|
||||
|
||||
private RecordingEventHandler replayModRecording_getRecordingEventHandler() {
|
||||
return ((RecordingEventHandler.RecordingEventSender) mc.renderGlobal).getRecordingEventHandler();
|
||||
}
|
||||
|
||||
// Sounds that are emitted by thePlayer no longer take the long way over the server
|
||||
// but are instead played directly by the client. The server only sends these sounds to
|
||||
// other clients so we have to record them manually.
|
||||
// E.g. Block place sounds
|
||||
@Inject(method = "playSound(Lnet/minecraft/entity/player/EntityPlayer;DDDLnet/minecraft/util/SoundEvent;Lnet/minecraft/util/SoundCategory;FF)V",
|
||||
at = @At("HEAD"))
|
||||
public void replayModRecording_recordClientSound(EntityPlayer player, double x, double y, double z, SoundEvent sound, SoundCategory category,
|
||||
float volume, float pitch, CallbackInfo ci) {
|
||||
if (player == mc.player) {
|
||||
RecordingEventHandler handler = replayModRecording_getRecordingEventHandler();
|
||||
if (handler != null) {
|
||||
handler.onClientSound(sound, category, x, y, z, volume, pitch);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Same goes for level events (also called effects). E.g. door open, block break, etc.
|
||||
// These are handled in the World class, so we override the method in WorldClient and add our special handling.
|
||||
@Override
|
||||
public void playEvent(EntityPlayer player, int type, BlockPos pos, int data) {
|
||||
if (player == mc.player) {
|
||||
// We caused this event, the server won't send it to us
|
||||
RecordingEventHandler handler = replayModRecording_getRecordingEventHandler();
|
||||
if (handler != null) {
|
||||
handler.onClientEffect(type, pos, data);
|
||||
}
|
||||
}
|
||||
super.playEvent(player, type, pos, data);
|
||||
}
|
||||
}
|
||||
@@ -9,21 +9,29 @@ import io.netty.buffer.Unpooled;
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.channel.ChannelInboundHandlerAdapter;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.entity.DataWatcher;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.network.EnumConnectionState;
|
||||
import net.minecraft.network.EnumPacketDirection;
|
||||
import net.minecraft.network.Packet;
|
||||
import net.minecraft.network.PacketBuffer;
|
||||
import net.minecraft.network.play.server.*;
|
||||
import net.minecraft.util.ChatComponentText;
|
||||
import net.minecraft.network.datasync.EntityDataManager;
|
||||
import net.minecraft.network.play.server.SPacketCollectItem;
|
||||
import net.minecraft.network.play.server.SPacketCustomPayload;
|
||||
import net.minecraft.network.play.server.SPacketDisconnect;
|
||||
import net.minecraft.network.play.server.SPacketResourcePackSend;
|
||||
import net.minecraft.network.play.server.SPacketSpawnMob;
|
||||
import net.minecraft.network.play.server.SPacketSpawnPlayer;
|
||||
import net.minecraft.util.text.TextComponentString;
|
||||
import net.minecraftforge.fml.common.network.internal.FMLProxyPacket;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
@@ -84,16 +92,13 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
|
||||
|
||||
public void save(Packet packet) {
|
||||
try {
|
||||
if(packet instanceof S0CPacketSpawnPlayer) {
|
||||
UUID uuid = ((S0CPacketSpawnPlayer) packet).func_179819_c();
|
||||
if(packet instanceof SPacketSpawnPlayer) {
|
||||
UUID uuid = ((SPacketSpawnPlayer) packet).getUniqueId();
|
||||
Set<String> uuids = new HashSet<>(Arrays.asList(metaData.getPlayers()));
|
||||
uuids.add(uuid.toString());
|
||||
metaData.setPlayers(uuids.toArray(new String[uuids.size()]));
|
||||
saveMetaData();
|
||||
}
|
||||
if (packet instanceof S46PacketSetCompressionLevel) {
|
||||
return; // Replay data is never compressed on the packet level
|
||||
}
|
||||
|
||||
byte[] bytes = getPacketData(packet);
|
||||
long now = System.currentTimeMillis();
|
||||
@@ -154,16 +159,16 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
|
||||
try {
|
||||
Packet packet = (Packet) msg;
|
||||
|
||||
if(packet instanceof S0DPacketCollectItem) {
|
||||
if(mc.thePlayer != null ||
|
||||
((S0DPacketCollectItem) packet).func_149353_d() == mc.thePlayer.getEntityId()) {
|
||||
if(packet instanceof SPacketCollectItem) {
|
||||
if(mc.player != null ||
|
||||
((SPacketCollectItem) packet).getEntityID() == mc.player.getEntityId()) {
|
||||
super.channelRead(ctx, msg);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (packet instanceof S48PacketResourcePackSend) {
|
||||
save(resourcePackRecorder.handleResourcePack((S48PacketResourcePackSend) packet));
|
||||
if (packet instanceof SPacketResourcePackSend) {
|
||||
save(resourcePackRecorder.handleResourcePack((SPacketResourcePackSend) packet));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -176,10 +181,10 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
|
||||
|
||||
save(packet);
|
||||
|
||||
if (packet instanceof S3FPacketCustomPayload) {
|
||||
S3FPacketCustomPayload p = (S3FPacketCustomPayload) packet;
|
||||
if (packet instanceof SPacketCustomPayload) {
|
||||
SPacketCustomPayload p = (SPacketCustomPayload) packet;
|
||||
if (Restrictions.PLUGIN_CHANNEL.equals(p.getChannelName())) {
|
||||
packet = new S40PacketDisconnect(new ChatComponentText("Please update to view this replay."));
|
||||
packet = new SPacketDisconnect(new TextComponentString("Please update to view this replay."));
|
||||
save(packet);
|
||||
}
|
||||
}
|
||||
@@ -192,27 +197,31 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
|
||||
super.channelRead(ctx, msg);
|
||||
}
|
||||
|
||||
private <T> void DataManager_set(EntityDataManager dataManager, EntityDataManager.DataEntry<T> entry) {
|
||||
dataManager.register(entry.getKey(), entry.getValue());
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private byte[] getPacketData(Packet packet) throws IOException {
|
||||
if(packet instanceof S0FPacketSpawnMob) {
|
||||
S0FPacketSpawnMob p = (S0FPacketSpawnMob) packet;
|
||||
if (p.field_149043_l == null) {
|
||||
p.field_149043_l = new DataWatcher(null);
|
||||
if(p.func_149027_c() != null) {
|
||||
for(DataWatcher.WatchableObject wo : (List<DataWatcher.WatchableObject>) p.func_149027_c()) {
|
||||
p.field_149043_l.addObject(wo.getDataValueId(), wo.getObject());
|
||||
if (packet instanceof SPacketSpawnMob) {
|
||||
SPacketSpawnMob p = (SPacketSpawnMob) packet;
|
||||
if (p.dataManager == null) {
|
||||
p.dataManager = new EntityDataManager(null);
|
||||
if (p.getDataManagerEntries() != null) {
|
||||
for (EntityDataManager.DataEntry<?> entry : p.getDataManagerEntries()) {
|
||||
DataManager_set(p.dataManager, entry);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(packet instanceof S0CPacketSpawnPlayer) {
|
||||
S0CPacketSpawnPlayer p = (S0CPacketSpawnPlayer) packet;
|
||||
if (p.field_148960_i == null) {
|
||||
p.field_148960_i = new DataWatcher(null);
|
||||
if(p.func_148944_c() != null) {
|
||||
for(DataWatcher.WatchableObject wo : (List<DataWatcher.WatchableObject>) p.func_148944_c()) {
|
||||
p.field_148960_i.addObject(wo.getDataValueId(), wo.getObject());
|
||||
if (packet instanceof SPacketSpawnPlayer) {
|
||||
SPacketSpawnPlayer p = (SPacketSpawnPlayer) packet;
|
||||
if (p.watcher == null) {
|
||||
p.watcher = new EntityDataManager(null);
|
||||
if (p.getDataManagerEntries() != null) {
|
||||
for (EntityDataManager.DataEntry<?> entry : p.getDataManagerEntries()) {
|
||||
DataManager_set(p.watcher, entry);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -224,7 +233,7 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
|
||||
}
|
||||
ByteBuf byteBuf = Unpooled.buffer();
|
||||
PacketBuffer packetBuffer = new PacketBuffer(byteBuf);
|
||||
packetBuffer.writeVarIntToBuffer(packetId);
|
||||
packetBuffer.writeVarInt(packetId);
|
||||
packet.writePacketData(packetBuffer);
|
||||
|
||||
byteBuf.readerIndex(0);
|
||||
|
||||
@@ -9,15 +9,14 @@ import com.replaymod.replaystudio.replay.ReplayFile;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.GuiScreenWorking;
|
||||
import net.minecraft.client.gui.GuiYesNo;
|
||||
import net.minecraft.client.gui.GuiYesNoCallback;
|
||||
import net.minecraft.client.multiplayer.ServerData;
|
||||
import net.minecraft.client.multiplayer.ServerList;
|
||||
import net.minecraft.client.network.NetHandlerPlayClient;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
import net.minecraft.client.resources.ResourcePackRepository;
|
||||
import net.minecraft.network.NetworkManager;
|
||||
import net.minecraft.network.play.client.C19PacketResourcePackStatus;
|
||||
import net.minecraft.network.play.server.S48PacketResourcePackSend;
|
||||
import net.minecraft.network.play.client.CPacketResourcePackStatus;
|
||||
import net.minecraft.network.play.server.SPacketResourcePackSend;
|
||||
import net.minecraft.util.HttpUtil;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
@@ -75,12 +74,12 @@ public class ResourcePackRecorder {
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized S48PacketResourcePackSend handleResourcePack(S48PacketResourcePackSend packet) {
|
||||
public synchronized SPacketResourcePackSend handleResourcePack(SPacketResourcePackSend packet) {
|
||||
final int requestId = nextRequestId++;
|
||||
final NetHandlerPlayClient netHandler = mc.getNetHandler();
|
||||
final NetHandlerPlayClient netHandler = mc.getConnection();
|
||||
final NetworkManager netManager = netHandler.getNetworkManager();
|
||||
final String url = packet.func_179783_a();
|
||||
final String hash = packet.func_179784_b();
|
||||
final String url = packet.getURL();
|
||||
final String hash = packet.getHash();
|
||||
|
||||
if (url.startsWith("level://")) {
|
||||
String levelName = url.substring("level://".length());
|
||||
@@ -88,65 +87,60 @@ public class ResourcePackRecorder {
|
||||
final File levelDir = new File(savesDir, levelName);
|
||||
|
||||
if (levelDir.isFile()) {
|
||||
netManager.sendPacket(new C19PacketResourcePackStatus(hash, C19PacketResourcePackStatus.Action.ACCEPTED));
|
||||
Futures.addCallback(mc.getResourcePackRepository().func_177319_a(levelDir), new FutureCallback() {
|
||||
netManager.sendPacket(new CPacketResourcePackStatus(CPacketResourcePackStatus.Action.ACCEPTED));
|
||||
Futures.addCallback(mc.getResourcePackRepository().setResourcePackInstance(levelDir), new FutureCallback<Object>() {
|
||||
@Override
|
||||
public void onSuccess(Object result) {
|
||||
recordResourcePack(levelDir, requestId);
|
||||
netManager.sendPacket(new C19PacketResourcePackStatus(hash, C19PacketResourcePackStatus.Action.SUCCESSFULLY_LOADED));
|
||||
netManager.sendPacket(new CPacketResourcePackStatus(CPacketResourcePackStatus.Action.SUCCESSFULLY_LOADED));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(@Nonnull Throwable throwable) {
|
||||
netManager.sendPacket(new C19PacketResourcePackStatus(hash, C19PacketResourcePackStatus.Action.FAILED_DOWNLOAD));
|
||||
netManager.sendPacket(new CPacketResourcePackStatus(CPacketResourcePackStatus.Action.FAILED_DOWNLOAD));
|
||||
}
|
||||
});
|
||||
} else {
|
||||
netManager.sendPacket(new C19PacketResourcePackStatus(hash, C19PacketResourcePackStatus.Action.FAILED_DOWNLOAD));
|
||||
netManager.sendPacket(new CPacketResourcePackStatus(CPacketResourcePackStatus.Action.FAILED_DOWNLOAD));
|
||||
}
|
||||
} else {
|
||||
final ServerData serverData = mc.getCurrentServerData();
|
||||
if (serverData != null && serverData.getResourceMode() == ServerData.ServerResourceMode.ENABLED) {
|
||||
netManager.sendPacket(new C19PacketResourcePackStatus(hash, C19PacketResourcePackStatus.Action.ACCEPTED));
|
||||
netManager.sendPacket(new CPacketResourcePackStatus(CPacketResourcePackStatus.Action.ACCEPTED));
|
||||
downloadResourcePackFuture(requestId, url, hash);
|
||||
} else if (serverData != null && serverData.getResourceMode() != ServerData.ServerResourceMode.PROMPT) {
|
||||
netManager.sendPacket(new C19PacketResourcePackStatus(hash, C19PacketResourcePackStatus.Action.DECLINED));
|
||||
netManager.sendPacket(new CPacketResourcePackStatus(CPacketResourcePackStatus.Action.DECLINED));
|
||||
} else {
|
||||
// Lambdas MUST NOT be used with methods that need re-obfuscation in FG prior to 2.2 (will result in AbstractMethodError)
|
||||
//noinspection Convert2Lambda
|
||||
mc.addScheduledTask(() -> mc.displayGuiScreen(new GuiYesNo(new GuiYesNoCallback() {
|
||||
@Override
|
||||
public void confirmClicked(boolean result, int id) {
|
||||
if (serverData != null) {
|
||||
serverData.setResourceMode(result ? ServerData.ServerResourceMode.ENABLED : ServerData.ServerResourceMode.DISABLED);
|
||||
}
|
||||
if (result) {
|
||||
netManager.sendPacket(new C19PacketResourcePackStatus(hash, C19PacketResourcePackStatus.Action.ACCEPTED));
|
||||
ResourcePackRecorder.this.downloadResourcePackFuture(requestId, url, hash);
|
||||
} else {
|
||||
netManager.sendPacket(new C19PacketResourcePackStatus(hash, C19PacketResourcePackStatus.Action.DECLINED));
|
||||
}
|
||||
|
||||
ServerList.func_147414_b(serverData);
|
||||
mc.displayGuiScreen(null);
|
||||
mc.addScheduledTask(() -> mc.displayGuiScreen(new GuiYesNo((result, id) -> {
|
||||
if (serverData != null) {
|
||||
serverData.setResourceMode(result ? ServerData.ServerResourceMode.ENABLED : ServerData.ServerResourceMode.DISABLED);
|
||||
}
|
||||
if (result) {
|
||||
netManager.sendPacket(new CPacketResourcePackStatus(CPacketResourcePackStatus.Action.ACCEPTED));
|
||||
downloadResourcePackFuture(requestId, url, hash);
|
||||
} else {
|
||||
netManager.sendPacket(new CPacketResourcePackStatus(CPacketResourcePackStatus.Action.DECLINED));
|
||||
}
|
||||
|
||||
ServerList.saveSingleServer(serverData);
|
||||
mc.displayGuiScreen(null);
|
||||
}, I18n.format("multiplayer.texturePrompt.line1"), I18n.format("multiplayer.texturePrompt.line2"), 0)));
|
||||
}
|
||||
}
|
||||
|
||||
return new S48PacketResourcePackSend("replay://" + requestId, "");
|
||||
return new SPacketResourcePackSend("replay://" + requestId, "");
|
||||
}
|
||||
|
||||
private void downloadResourcePackFuture(int requestId, String url, final String hash) {
|
||||
Futures.addCallback(downloadResourcePack(requestId, url, hash), new FutureCallback() {
|
||||
@Override
|
||||
public void onSuccess(Object result) {
|
||||
mc.getNetHandler().addToSendQueue(new C19PacketResourcePackStatus(hash, C19PacketResourcePackStatus.Action.SUCCESSFULLY_LOADED));
|
||||
mc.getConnection().sendPacket(new CPacketResourcePackStatus(CPacketResourcePackStatus.Action.SUCCESSFULLY_LOADED));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(@Nonnull Throwable throwable) {
|
||||
mc.getNetHandler().addToSendQueue(new C19PacketResourcePackStatus(hash, C19PacketResourcePackStatus.Action.FAILED_DOWNLOAD));
|
||||
mc.getConnection().sendPacket(new CPacketResourcePackStatus(CPacketResourcePackStatus.Action.FAILED_DOWNLOAD));
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -171,16 +165,16 @@ public class ResourcePackRecorder {
|
||||
}
|
||||
|
||||
final File file = new File(repo.dirServerResourcepacks, fileName);
|
||||
repo.field_177321_h.lock();
|
||||
repo.lock.lock();
|
||||
try {
|
||||
repo.func_148529_f();
|
||||
repo.clearResourcePack();
|
||||
|
||||
if (file.exists() && hash.length() == 40) {
|
||||
try {
|
||||
String fileHash = Hashing.sha1().hashBytes(Files.toByteArray(file)).toString();
|
||||
if (fileHash.equals(hash)) {
|
||||
recordResourcePack(file, requestId);
|
||||
return repo.func_177319_a(file);
|
||||
return repo.setResourcePackInstance(file);
|
||||
}
|
||||
|
||||
logger.warn("File " + file + " had wrong hash (expected " + hash + ", found " + fileHash + "). Deleting it.");
|
||||
@@ -196,13 +190,13 @@ public class ResourcePackRecorder {
|
||||
|
||||
Futures.getUnchecked(mc.addScheduledTask(() -> mc.displayGuiScreen(guiScreen)));
|
||||
|
||||
Map sessionInfo = Minecraft.getSessionInfo();
|
||||
repo.field_177322_i = HttpUtil.func_180192_a(file, url, sessionInfo, 50 * 1024 * 1024, guiScreen, mc.getProxy());
|
||||
Futures.addCallback(repo.field_177322_i, new FutureCallback() {
|
||||
Map<String, String> sessionInfo = ResourcePackRepository.getDownloadHeaders();
|
||||
repo.downloadingPacks = HttpUtil.downloadResourcePack(file, url, sessionInfo, 50 * 1024 * 1024, guiScreen, mc.getProxy());
|
||||
Futures.addCallback(repo.downloadingPacks, new FutureCallback<Object>() {
|
||||
@Override
|
||||
public void onSuccess(Object value) {
|
||||
recordResourcePack(file, requestId);
|
||||
repo.func_177319_a(file);
|
||||
repo.setResourcePackInstance(file);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -210,9 +204,9 @@ public class ResourcePackRecorder {
|
||||
throwable.printStackTrace();
|
||||
}
|
||||
});
|
||||
return repo.field_177322_i;
|
||||
return repo.downloadingPacks;
|
||||
} finally {
|
||||
repo.field_177321_h.unlock();
|
||||
repo.lock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ import com.replaymod.render.utils.RenderJob;
|
||||
import com.replaymod.replay.events.ReplayCloseEvent;
|
||||
import net.minecraft.crash.CrashReport;
|
||||
import net.minecraft.util.ReportedException;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.common.config.Configuration;
|
||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
@@ -47,7 +47,7 @@ public class ReplayModRender {
|
||||
core = ReplayMod.instance;
|
||||
configuration = new Configuration(event.getSuggestedConfigurationFile());
|
||||
|
||||
FMLCommonHandler.instance().bus().register(this);
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
|
||||
core.getSettingsRegistry().register(Setting.class);
|
||||
}
|
||||
|
||||
@@ -75,9 +75,9 @@ public class ODSFrameCapturer implements FrameCapturer<ODSOpenGlFrame> {
|
||||
linkState(1, "lightMapEnabled");
|
||||
linkState(2, "hurtTextureEnabled");
|
||||
final Program.Uniform uniform = shaderProgram.getUniformVariable("fogEnabled");
|
||||
previousFogState = GlStateManager.fogState.field_179049_a;
|
||||
previousFogState = GlStateManager.fogState.fog;
|
||||
uniform.set(previousFogState.currentState);
|
||||
GlStateManager.fogState.field_179049_a = new BooleanState(previousFogState.capability) {
|
||||
GlStateManager.fogState.fog = new BooleanState(previousFogState.capability) {
|
||||
@Override
|
||||
public void setState(boolean state) {
|
||||
super.setState(state);
|
||||
@@ -135,7 +135,7 @@ public class ODSFrameCapturer implements FrameCapturer<ODSOpenGlFrame> {
|
||||
for (int i = 0; i < 3; i++) {
|
||||
GlStateManager.textureState[i].texture2DState = previousStates[i];
|
||||
}
|
||||
GlStateManager.fogState.field_179049_a = previousFogState;
|
||||
GlStateManager.fogState.fog = previousFogState;
|
||||
}
|
||||
|
||||
private class CubicStereoFrameCapturer extends CubicPboOpenGlFrameCapturer {
|
||||
|
||||
@@ -10,13 +10,13 @@ import net.minecraft.client.renderer.chunk.RenderChunk;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Iterator;
|
||||
import java.util.concurrent.BlockingQueue;
|
||||
import java.util.concurrent.PriorityBlockingQueue;
|
||||
|
||||
public class ChunkLoadingRenderGlobal {
|
||||
|
||||
private final RenderGlobal hooked;
|
||||
private final ChunkRenderDispatcher renderDispatcher;
|
||||
private final JailingQueue<?> workerJailingQueue;
|
||||
private final JailingQueue<ChunkCompileTaskGenerator> workerJailingQueue;
|
||||
private final CustomChunkRenderWorker renderWorker;
|
||||
private int frame;
|
||||
|
||||
@@ -27,10 +27,10 @@ public class ChunkLoadingRenderGlobal {
|
||||
this.renderWorker = new CustomChunkRenderWorker(renderDispatcher, new RegionRenderCacheBuilder());
|
||||
|
||||
int workerThreads = renderDispatcher.listThreadedWorkers.size();
|
||||
BlockingQueue<Object> queueChunkUpdates = renderDispatcher.queueChunkUpdates;
|
||||
PriorityBlockingQueue<ChunkCompileTaskGenerator> queueChunkUpdates = renderDispatcher.queueChunkUpdates;
|
||||
workerJailingQueue = new JailingQueue<>(queueChunkUpdates);
|
||||
renderDispatcher.queueChunkUpdates = workerJailingQueue;
|
||||
ChunkCompileTaskGenerator element = new ChunkCompileTaskGenerator(null, null);
|
||||
ChunkCompileTaskGenerator element = new ChunkCompileTaskGenerator(null, null, 0);
|
||||
element.finish();
|
||||
for (int i = 0; i < workerThreads; i++) {
|
||||
queueChunkUpdates.add(element);
|
||||
@@ -51,7 +51,6 @@ public class ChunkLoadingRenderGlobal {
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void updateChunks() {
|
||||
while (renderDispatcher.runChunkUploads(0)) {
|
||||
hooked.displayListEntitiesDirty = true;
|
||||
@@ -59,7 +58,7 @@ public class ChunkLoadingRenderGlobal {
|
||||
|
||||
while (!renderDispatcher.queueChunkUpdates.isEmpty()) {
|
||||
try {
|
||||
renderWorker.processTask((ChunkCompileTaskGenerator) renderDispatcher.queueChunkUpdates.poll());
|
||||
renderWorker.processTask(renderDispatcher.queueChunkUpdates.poll());
|
||||
} catch (InterruptedException ignored) { }
|
||||
}
|
||||
|
||||
@@ -69,7 +68,7 @@ public class ChunkLoadingRenderGlobal {
|
||||
|
||||
renderDispatcher.updateChunkNow(renderchunk);
|
||||
|
||||
renderchunk.setNeedsUpdate(false);
|
||||
renderchunk.clearNeedsUpdate();
|
||||
iterator.remove();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
package com.replaymod.render.mixin;
|
||||
|
||||
import com.replaymod.render.hooks.EntityRendererHandler;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.particle.EffectRenderer;
|
||||
import net.minecraft.client.particle.EntityFX;
|
||||
import net.minecraft.client.renderer.WorldRenderer;
|
||||
import net.minecraft.entity.Entity;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
|
||||
@Mixin(EffectRenderer.class)
|
||||
public abstract class MixinEffectRenderer {
|
||||
@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"))
|
||||
private void renderNormalParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks,
|
||||
float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
|
||||
renderParticle(fx, worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
|
||||
}
|
||||
|
||||
@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"))
|
||||
private void renderLitParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks,
|
||||
float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
|
||||
renderParticle(fx, worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
|
||||
}
|
||||
|
||||
private void renderParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks,
|
||||
float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
|
||||
EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).replayModRender_getHandler();
|
||||
if (handler != null && handler.omnidirectional) {
|
||||
// Align all particles towards the camera
|
||||
double dx = fx.prevPosX + (fx.posX - fx.prevPosX) * partialTicks - view.posX;
|
||||
double dy = fx.prevPosY + (fx.posY - fx.prevPosY) * partialTicks - view.posY;
|
||||
double dz = fx.prevPosZ + (fx.posZ - fx.prevPosZ) * partialTicks - view.posZ;
|
||||
double pitch = -Math.atan2(dy, Math.sqrt(dx * dx + dz * dz));
|
||||
double yaw = -Math.atan2(dx, dz);
|
||||
|
||||
rotX = (float) Math.cos(yaw);
|
||||
rotZ = (float) Math.sin(yaw);
|
||||
rotXZ = (float) Math.cos(pitch);
|
||||
|
||||
rotYZ = (float) (-rotZ * Math.sin(pitch));
|
||||
rotXY = (float) (rotX * Math.sin(pitch));
|
||||
}
|
||||
fx.func_180434_a(worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,7 @@ import net.minecraft.client.renderer.RenderGlobal;
|
||||
import net.minecraft.client.settings.GameSettings;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.util.MovingObjectPosition;
|
||||
import net.minecraft.util.math.RayTraceResult;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
import org.lwjgl.util.ReadableColor;
|
||||
import org.lwjgl.util.glu.Project;
|
||||
@@ -118,10 +118,10 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
|
||||
@Shadow
|
||||
public abstract void renderHand(float partialTicks, int renderPass);
|
||||
|
||||
@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"))
|
||||
private void replayModRender_drawSelectionBox(RenderGlobal instance, EntityPlayer player, MovingObjectPosition mop, int alwaysZero, float partialTicks) {
|
||||
@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) {
|
||||
if (replayModRender_handler == null) {
|
||||
instance.drawSelectionBox(player, mop, alwaysZero, partialTicks);
|
||||
instance.drawSelectionBox(player, rtr, alwaysZero, partialTicks);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
package com.replaymod.render.mixin;
|
||||
|
||||
import com.replaymod.render.hooks.EntityRendererHandler;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.particle.Particle;
|
||||
import net.minecraft.client.particle.ParticleManager;
|
||||
import net.minecraft.client.renderer.VertexBuffer;
|
||||
import net.minecraft.entity.Entity;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
|
||||
@Mixin(ParticleManager.class)
|
||||
public abstract class MixinParticleManager {
|
||||
@Redirect(method = "renderParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/Particle;renderParticle(Lnet/minecraft/client/renderer/VertexBuffer;Lnet/minecraft/entity/Entity;FFFFFF)V"))
|
||||
private void renderNormalParticle(Particle particle, VertexBuffer vertexBuffer, Entity view, float partialTicks,
|
||||
float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
|
||||
renderParticle(particle, vertexBuffer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
|
||||
}
|
||||
|
||||
@Redirect(method = "renderLitParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/Particle;renderParticle(Lnet/minecraft/client/renderer/VertexBuffer;Lnet/minecraft/entity/Entity;FFFFFF)V"))
|
||||
private void renderLitParticle(Particle particle, VertexBuffer vertexBuffer, Entity view, float partialTicks,
|
||||
float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
|
||||
renderParticle(particle, vertexBuffer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
|
||||
}
|
||||
|
||||
private void renderParticle(Particle particle, VertexBuffer vertexBuffer, Entity view, float partialTicks,
|
||||
float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
|
||||
EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).replayModRender_getHandler();
|
||||
if (handler != null && handler.omnidirectional) {
|
||||
// Align all particles towards the camera
|
||||
double dx = particle.prevPosX + (particle.posX - particle.prevPosX) * partialTicks - view.posX;
|
||||
double dy = particle.prevPosY + (particle.posY - particle.prevPosY) * partialTicks - view.posY;
|
||||
double dz = particle.prevPosZ + (particle.posZ - particle.prevPosZ) * partialTicks - view.posZ;
|
||||
double pitch = -Math.atan2(dy, Math.sqrt(dx * dx + dz * dz));
|
||||
double yaw = -Math.atan2(dx, dz);
|
||||
|
||||
rotX = (float) Math.cos(yaw);
|
||||
rotZ = (float) Math.sin(yaw);
|
||||
rotXZ = (float) Math.cos(pitch);
|
||||
|
||||
rotYZ = (float) (-rotZ * Math.sin(pitch));
|
||||
rotXY = (float) (rotX * Math.sin(pitch));
|
||||
}
|
||||
particle.renderParticle(vertexBuffer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
|
||||
}
|
||||
}
|
||||
@@ -7,15 +7,14 @@ import net.minecraft.entity.Entity;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
@Mixin(Render.class)
|
||||
public abstract class MixinRender {
|
||||
@Inject(method = "canRenderName", at = @At("HEAD"), cancellable = true)
|
||||
private void replayModRender_areAllNamesHidden(Entity entity, CallbackInfoReturnable<Boolean> ci) {
|
||||
@Inject(method = "renderLivingLabel", at = @At("HEAD"), cancellable = true)
|
||||
private void replayModRender_areAllNamesHidden(Entity entityIn, String str, double x, double y, double z, int maxDistance, CallbackInfo ci) {
|
||||
EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).replayModRender_getHandler();
|
||||
if (handler != null && !handler.getSettings().isRenderNameTags()) {
|
||||
ci.setReturnValue(false);
|
||||
ci.cancel();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,16 +3,13 @@ package com.replaymod.render.mixin;
|
||||
import com.replaymod.render.hooks.ChunkLoadingRenderGlobal;
|
||||
import net.minecraft.client.renderer.RenderGlobal;
|
||||
import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher;
|
||||
import net.minecraft.client.renderer.chunk.RenderChunk;
|
||||
import net.minecraft.client.renderer.culling.ICamera;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.util.BlockPos;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
|
||||
@Mixin(RenderGlobal.class)
|
||||
public abstract class MixinRenderGlobal {
|
||||
@@ -47,13 +44,6 @@ public abstract class MixinRenderGlobal {
|
||||
}
|
||||
}
|
||||
|
||||
@Inject(method = "isPositionInRenderChunk", at = @At("HEAD"), cancellable = true)
|
||||
public void replayModRender_isPositionInRenderChunk(BlockPos pos, RenderChunk chunk, CallbackInfoReturnable<Boolean> ci) {
|
||||
if (replayModRender_hook != null) {
|
||||
ci.setReturnValue(true);
|
||||
}
|
||||
}
|
||||
|
||||
@Inject(method = "updateChunks", at = @At("HEAD"), cancellable = true)
|
||||
public void replayModRender_updateChunks(long finishTimeNano, CallbackInfo ci) {
|
||||
if (replayModRender_hook != null) {
|
||||
|
||||
@@ -8,7 +8,7 @@ import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
@Mixin(RenderManager.class)
|
||||
public abstract class MixinRenderManager {
|
||||
@@ -19,7 +19,7 @@ public abstract class MixinRenderManager {
|
||||
private float playerViewY;
|
||||
|
||||
@Inject(method = "doRenderEntity", at = @At("HEAD"))
|
||||
private void replayModRender_reorientForCubicRendering(Entity entity, double dx, double dy, double dz, float iDoNotKnow, float partialTicks, boolean iDoNotCare, CallbackInfoReturnable ci) {
|
||||
private void replayModRender_reorientForCubicRendering(Entity entity, double dx, double dy, double dz, float iDoNotKnow, float partialTicks, boolean iDoNotCare, CallbackInfo ci) {
|
||||
EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).replayModRender_getHandler();
|
||||
if (handler != null && handler.omnidirectional) {
|
||||
double pitch = -Math.atan2(dy, Math.sqrt(dx * dx + dz * dz));
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
package com.replaymod.render.mixin;
|
||||
|
||||
import com.replaymod.render.hooks.EntityRendererHandler;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.entity.RendererLivingEntity;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
|
||||
@Mixin(RendererLivingEntity.class)
|
||||
public abstract class MixinRendererLivingEntity {
|
||||
@Inject(method = "canRenderName", at = @At("HEAD"), cancellable = true)
|
||||
private void replayModRender_areAllNamesHidden(EntityLivingBase entity, CallbackInfoReturnable<Boolean> ci) {
|
||||
EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).replayModRender_getHandler();
|
||||
if (handler != null && !handler.getSettings().isRenderNameTags()) {
|
||||
ci.setReturnValue(false); //this calls the cancel method
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
package com.replaymod.render.rendering;
|
||||
|
||||
import com.replaymod.core.ReplayMod;
|
||||
import com.replaymod.pathing.player.AbstractTimelinePlayer;
|
||||
import com.replaymod.pathing.player.ReplayTimer;
|
||||
import com.replaymod.pathing.properties.TimestampProperty;
|
||||
@@ -14,17 +13,18 @@ import com.replaymod.render.gui.GuiRenderingDone;
|
||||
import com.replaymod.render.gui.GuiVideoRenderer;
|
||||
import com.replaymod.render.hooks.ChunkLoadingRenderGlobal;
|
||||
import com.replaymod.render.metadata.MetadataInjector;
|
||||
import com.replaymod.render.utils.SoundHandler;
|
||||
import com.replaymod.replay.ReplayHandler;
|
||||
import com.replaymod.replaystudio.pathing.path.Keyframe;
|
||||
import com.replaymod.replaystudio.pathing.path.Path;
|
||||
import com.replaymod.replaystudio.pathing.path.Timeline;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.audio.SoundCategory;
|
||||
import net.minecraft.client.gui.ScaledResolution;
|
||||
import net.minecraft.client.renderer.OpenGlHelper;
|
||||
import net.minecraft.client.shader.Framebuffer;
|
||||
import net.minecraft.util.SoundCategory;
|
||||
import net.minecraft.util.Timer;
|
||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import org.lwjgl.input.Mouse;
|
||||
import org.lwjgl.opengl.Display;
|
||||
import org.lwjgl.util.Dimension;
|
||||
@@ -55,7 +55,7 @@ public class VideoRenderer implements RenderInfo {
|
||||
private int fps;
|
||||
private boolean mouseWasGrabbed;
|
||||
private boolean debugInfoWasShown;
|
||||
private Map originalSoundLevels;
|
||||
private Map<SoundCategory, Float> originalSoundLevels;
|
||||
|
||||
private TimelinePlayer timelinePlayer;
|
||||
private Future<Void> timelinePlayerFuture;
|
||||
@@ -92,7 +92,7 @@ public class VideoRenderer implements RenderInfo {
|
||||
* @return {@code true} if rendering was successful, {@code false} if the user aborted rendering (or the window was closed)
|
||||
*/
|
||||
public boolean renderVideo() throws Throwable {
|
||||
FMLCommonHandler.instance().bus().post(new ReplayRenderEvent.Pre(this));
|
||||
MinecraftForge.EVENT_BUS.post(new ReplayRenderEvent.Pre(this));
|
||||
|
||||
setup();
|
||||
|
||||
@@ -138,7 +138,7 @@ public class VideoRenderer implements RenderInfo {
|
||||
|
||||
finish();
|
||||
|
||||
FMLCommonHandler.instance().bus().post(new ReplayRenderEvent.Post(this));
|
||||
MinecraftForge.EVENT_BUS.post(new ReplayRenderEvent.Post(this));
|
||||
|
||||
if (failureCause != null) {
|
||||
throw failureCause;
|
||||
@@ -202,9 +202,9 @@ public class VideoRenderer implements RenderInfo {
|
||||
for (SoundCategory category : SoundCategory.values()) {
|
||||
mutedSounds.put(category, 0f);
|
||||
}
|
||||
originalSoundLevels = mc.gameSettings.mapSoundLevels;
|
||||
mutedSounds.put(SoundCategory.MASTER, (Float) originalSoundLevels.get(SoundCategory.MASTER));
|
||||
mc.gameSettings.mapSoundLevels = mutedSounds;
|
||||
originalSoundLevels = mc.gameSettings.soundLevels;
|
||||
mutedSounds.put(SoundCategory.MASTER, originalSoundLevels.get(SoundCategory.MASTER));
|
||||
mc.gameSettings.soundLevels = mutedSounds;
|
||||
|
||||
fps = settings.getFramesPerSecond();
|
||||
|
||||
@@ -225,9 +225,6 @@ public class VideoRenderer implements RenderInfo {
|
||||
|
||||
updateDisplaySize();
|
||||
|
||||
ScaledResolution scaled = new ScaledResolution(mc, displayWidth, displayHeight);
|
||||
gui.toMinecraft().setWorldAndResolution(mc, scaled.getScaledWidth(), scaled.getScaledHeight());
|
||||
|
||||
chunkLoadingRenderGlobal = new ChunkLoadingRenderGlobal(mc.renderGlobal);
|
||||
|
||||
// Set up our own framebuffer to render the GUI to
|
||||
@@ -248,13 +245,13 @@ public class VideoRenderer implements RenderInfo {
|
||||
if (mouseWasGrabbed) {
|
||||
mc.mouseHelper.grabMouseCursor();
|
||||
}
|
||||
mc.gameSettings.mapSoundLevels = originalSoundLevels;
|
||||
mc.gameSettings.soundLevels = originalSoundLevels;
|
||||
mc.displayGuiScreen(null);
|
||||
if (chunkLoadingRenderGlobal != null) {
|
||||
chunkLoadingRenderGlobal.uninstall();
|
||||
}
|
||||
|
||||
ReplayMod.soundHandler.playRenderSuccessSound();
|
||||
new SoundHandler().playRenderSuccessSound();
|
||||
|
||||
try {
|
||||
if (!hasFailed()) {
|
||||
@@ -298,7 +295,7 @@ public class VideoRenderer implements RenderInfo {
|
||||
|
||||
mc.entityRenderer.setupOverlayRendering();
|
||||
|
||||
ScaledResolution scaled = new ScaledResolution(mc, mc.displayWidth, mc.displayHeight);
|
||||
ScaledResolution scaled = new ScaledResolution(mc);
|
||||
gui.toMinecraft().setWorldAndResolution(mc, scaled.getScaledWidth(), scaled.getScaledHeight());
|
||||
|
||||
try {
|
||||
|
||||
@@ -2,15 +2,18 @@ package com.replaymod.render.utils;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.BlockingQueue;
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.PriorityBlockingQueue;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class JailingQueue<T> extends AbstractQueue<T> implements BlockingQueue<T> {
|
||||
private final BlockingQueue<T> delegate;
|
||||
public class JailingQueue<T> extends PriorityBlockingQueue<T> {
|
||||
private final PriorityBlockingQueue<T> delegate;
|
||||
private final Set<Thread> jailed = new HashSet<Thread>();
|
||||
|
||||
public JailingQueue(BlockingQueue<T> delegate) {
|
||||
public JailingQueue(PriorityBlockingQueue<T> delegate) {
|
||||
this.delegate = delegate;
|
||||
}
|
||||
|
||||
@@ -59,13 +62,13 @@ public class JailingQueue<T> extends AbstractQueue<T> implements BlockingQueue<T
|
||||
}
|
||||
|
||||
@Override
|
||||
public void put(T t) throws InterruptedException {
|
||||
public void put(T t) {
|
||||
tryAccess();
|
||||
delegate.put(t);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean offer(T t, long timeout, TimeUnit unit) throws InterruptedException {
|
||||
public boolean offer(T t, long timeout, TimeUnit unit) {
|
||||
tryAccess();
|
||||
return delegate.offer(t, timeout, unit);
|
||||
}
|
||||
|
||||
@@ -147,10 +147,11 @@ public class InputReplayTimer extends WrappedTimer {
|
||||
|
||||
// Following are a ton of vanilla keyboard shortcuts, some are removed as they're useless in the
|
||||
// replay viewer as of now
|
||||
// TODO Update maybe add new key bindings
|
||||
// TODO: Translate magic values to Keyboard.KEY_ constants
|
||||
|
||||
if (key == 32 && Keyboard.isKeyDown(61) && mc.ingameGUI != null) {
|
||||
mc.ingameGUI.getChatGUI().clearChatMessages();
|
||||
mc.ingameGUI.getChatGUI().clearChatMessages(false);
|
||||
}
|
||||
|
||||
if (key == 31 && Keyboard.isKeyDown(61)) {
|
||||
|
||||
@@ -16,8 +16,6 @@ import javax.imageio.ImageIO;
|
||||
import java.awt.*;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.File;
|
||||
import java.util.Queue;
|
||||
import java.util.concurrent.FutureTask;
|
||||
|
||||
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
@Getter
|
||||
@@ -45,7 +43,7 @@ public class NoGuiScreenshot {
|
||||
mc.getFramebuffer().bindFramebuffer(true);
|
||||
GlStateManager.enableTexture2D();
|
||||
|
||||
mc.entityRenderer.updateCameraAndRender(mc.timer.renderPartialTicks);
|
||||
mc.entityRenderer.updateCameraAndRender(mc.timer.renderPartialTicks, System.nanoTime());
|
||||
|
||||
mc.getFramebuffer().unbindFramebuffer();
|
||||
GlStateManager.popMatrix();
|
||||
@@ -101,9 +99,7 @@ public class NoGuiScreenshot {
|
||||
// of the game loop. We cannot use the addScheduledTask method as it'll run the task if called
|
||||
// from the minecraft thread which is exactly what we want to avoid.
|
||||
synchronized (mc.scheduledTasks) {
|
||||
@SuppressWarnings("unchecked")
|
||||
Queue<FutureTask> queue = mc.scheduledTasks;
|
||||
queue.add(ListenableFutureTask.create(runnable, null));
|
||||
mc.scheduledTasks.add(ListenableFutureTask.create(runnable, null));
|
||||
}
|
||||
return future;
|
||||
}
|
||||
|
||||
@@ -23,8 +23,8 @@ import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.network.EnumPacketDirection;
|
||||
import net.minecraft.network.NetworkManager;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.fml.client.FMLClientHandler;
|
||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||
import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher;
|
||||
import org.lwjgl.opengl.Display;
|
||||
|
||||
@@ -76,7 +76,7 @@ public class ReplayHandler {
|
||||
Preconditions.checkState(mc.isCallingFromMinecraftThread(), "Must be called from Minecraft thread.");
|
||||
this.replayFile = replayFile;
|
||||
|
||||
FMLCommonHandler.instance().bus().post(new ReplayOpenEvent.Pre(this));
|
||||
MinecraftForge.EVENT_BUS.post(new ReplayOpenEvent.Pre(this));
|
||||
|
||||
markers = new ArrayList<>(replayFile.getMarkers().or(Collections.emptySet()));
|
||||
|
||||
@@ -87,7 +87,7 @@ public class ReplayHandler {
|
||||
overlay = new GuiReplayOverlay(this);
|
||||
overlay.setVisible(true);
|
||||
|
||||
FMLCommonHandler.instance().bus().post(new ReplayOpenEvent.Post(this));
|
||||
MinecraftForge.EVENT_BUS.post(new ReplayOpenEvent.Post(this));
|
||||
}
|
||||
|
||||
void restartedReplay() {
|
||||
@@ -101,7 +101,7 @@ public class ReplayHandler {
|
||||
public void endReplay() throws IOException {
|
||||
Preconditions.checkState(mc.isCallingFromMinecraftThread(), "Must be called from Minecraft thread.");
|
||||
|
||||
FMLCommonHandler.instance().bus().post(new ReplayCloseEvent.Pre(this));
|
||||
MinecraftForge.EVENT_BUS.post(new ReplayCloseEvent.Pre(this));
|
||||
|
||||
replaySender.terminateReplay();
|
||||
|
||||
@@ -110,12 +110,12 @@ public class ReplayHandler {
|
||||
|
||||
channel.close().awaitUninterruptibly();
|
||||
|
||||
if (mc.thePlayer instanceof CameraEntity) {
|
||||
mc.thePlayer.setDead();
|
||||
if (mc.player instanceof CameraEntity) {
|
||||
mc.player.setDead();
|
||||
}
|
||||
|
||||
if (mc.theWorld != null) {
|
||||
mc.theWorld.sendQuittingDisconnectingPacket();
|
||||
if (mc.world != null) {
|
||||
mc.world.sendQuittingDisconnectingPacket();
|
||||
mc.loadWorld(null);
|
||||
}
|
||||
|
||||
@@ -126,11 +126,11 @@ public class ReplayHandler {
|
||||
|
||||
mc.displayGuiScreen(null);
|
||||
|
||||
FMLCommonHandler.instance().bus().post(new ReplayCloseEvent.Post(this));
|
||||
MinecraftForge.EVENT_BUS.post(new ReplayCloseEvent.Post(this));
|
||||
}
|
||||
|
||||
private void setup() {
|
||||
mc.ingameGUI.getChatGUI().clearChatMessages();
|
||||
mc.ingameGUI.getChatGUI().clearChatMessages(true);
|
||||
|
||||
NetworkManager networkManager = new NetworkManager(EnumPacketDirection.CLIENTBOUND) {
|
||||
@Override
|
||||
@@ -246,7 +246,7 @@ public class ReplayHandler {
|
||||
* @return {@code true} if the camera is the view entity, {@code false} otherwise
|
||||
*/
|
||||
public boolean isCameraView() {
|
||||
return mc.thePlayer instanceof CameraEntity && mc.thePlayer == mc.getRenderViewEntity();
|
||||
return mc.player instanceof CameraEntity && mc.player == mc.getRenderViewEntity();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -254,7 +254,7 @@ public class ReplayHandler {
|
||||
* @return The camera entity or {@code null} if it does not yet exist
|
||||
*/
|
||||
public CameraEntity getCameraEntity() {
|
||||
return mc.thePlayer instanceof CameraEntity ? (CameraEntity) mc.thePlayer : null;
|
||||
return mc.player instanceof CameraEntity ? (CameraEntity) mc.player : null;
|
||||
}
|
||||
|
||||
public UUID getSpectatedUUID() {
|
||||
@@ -316,7 +316,7 @@ public class ReplayHandler {
|
||||
mc.getFramebuffer().bindFramebuffer(true);
|
||||
mc.entityRenderer.setupOverlayRendering();
|
||||
|
||||
ScaledResolution resolution = new ScaledResolution(mc, mc.displayWidth, mc.displayHeight);
|
||||
ScaledResolution resolution = new ScaledResolution(mc);
|
||||
guiScreen.setWorldAndResolution(mc, resolution.getScaledWidth(), resolution.getScaledHeight());
|
||||
guiScreen.drawScreen(0, 0, 0);
|
||||
|
||||
@@ -333,10 +333,8 @@ public class ReplayHandler {
|
||||
replaySender.setAsyncMode(true);
|
||||
replaySender.setReplaySpeed(0);
|
||||
|
||||
mc.getNetHandler().getNetworkManager().processReceivedPackets();
|
||||
@SuppressWarnings("unchecked")
|
||||
List<Entity> entities = (List<Entity>) mc.theWorld.loadedEntityList;
|
||||
for (Entity entity : entities) {
|
||||
mc.getConnection().getNetworkManager().processReceivedPackets();
|
||||
for (Entity entity : mc.world.loadedEntityList) {
|
||||
if (entity instanceof EntityOtherPlayerMP) {
|
||||
EntityOtherPlayerMP e = (EntityOtherPlayerMP) entity;
|
||||
e.setPosition(e.otherPlayerMPX, e.otherPlayerMPY, e.otherPlayerMPZ);
|
||||
|
||||
@@ -17,28 +17,32 @@ import io.netty.channel.ChannelHandler.Sharable;
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.channel.ChannelPromise;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.entity.EntityOtherPlayerMP;
|
||||
import net.minecraft.client.gui.GuiDownloadTerrain;
|
||||
import net.minecraft.client.gui.GuiErrorScreen;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.network.*;
|
||||
import net.minecraft.network.play.server.*;
|
||||
import net.minecraft.util.ClassInheritanceMultiMap;
|
||||
import net.minecraft.util.IChatComponent;
|
||||
import net.minecraft.util.MathHelper;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.util.text.ITextComponent;
|
||||
import net.minecraft.world.EnumDifficulty;
|
||||
import net.minecraft.world.GameType;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.WorldSettings.GameType;
|
||||
import net.minecraft.world.WorldType;
|
||||
import net.minecraft.world.chunk.Chunk;
|
||||
import net.minecraft.world.chunk.IChunkProvider;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import net.minecraftforge.fml.common.gameevent.TickEvent;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -49,30 +53,22 @@ import java.util.Map;
|
||||
*/
|
||||
@Sharable
|
||||
public class ReplaySender extends ChannelDuplexHandler {
|
||||
|
||||
/**
|
||||
* Previously packets for the client player were inserted using one fixed entity id (this one).
|
||||
* This is no longer the case however to provide backwards compatibility, we have to convert
|
||||
* these old packets to use the normal entity id.
|
||||
* Need to punch someone? -> CrushedPixel
|
||||
*/
|
||||
public static final int LEGACY_ENTITY_ID = Integer.MIN_VALUE + 9001;
|
||||
|
||||
/**
|
||||
* These packets are ignored completely during replay.
|
||||
*/
|
||||
private static final List<Class> BAD_PACKETS = Arrays.<Class>asList(
|
||||
S06PacketUpdateHealth.class,
|
||||
S2DPacketOpenWindow.class,
|
||||
S2EPacketCloseWindow.class,
|
||||
S2FPacketSetSlot.class,
|
||||
S30PacketWindowItems.class,
|
||||
S36PacketSignEditorOpen.class,
|
||||
S37PacketStatistics.class,
|
||||
S1FPacketSetExperience.class,
|
||||
S43PacketCamera.class,
|
||||
S39PacketPlayerAbilities.class,
|
||||
S45PacketTitle.class);
|
||||
// TODO Update possibly more?
|
||||
SPacketUpdateHealth.class,
|
||||
SPacketOpenWindow.class,
|
||||
SPacketCloseWindow.class,
|
||||
SPacketSetSlot.class,
|
||||
SPacketWindowItems.class,
|
||||
SPacketSignEditorOpen.class,
|
||||
SPacketStatistics.class,
|
||||
SPacketSetExperience.class,
|
||||
SPacketCamera.class,
|
||||
SPacketPlayerAbilities.class,
|
||||
SPacketTitle.class);
|
||||
|
||||
private static int TP_DISTANCE_LIMIT = 128;
|
||||
|
||||
@@ -181,6 +177,8 @@ public class ReplaySender extends ChannelDuplexHandler {
|
||||
this.asyncMode = asyncMode;
|
||||
this.replayLength = file.getMetaData().getDuration();
|
||||
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
|
||||
if (asyncMode) {
|
||||
new Thread(asyncSender, "replaymod-async-sender").start();
|
||||
}
|
||||
@@ -249,6 +247,7 @@ public class ReplaySender extends ChannelDuplexHandler {
|
||||
*/
|
||||
public void terminateReplay() {
|
||||
terminate = true;
|
||||
MinecraftForge.EVENT_BUS.unregister(this);
|
||||
try {
|
||||
channelInactive(ctx);
|
||||
ctx.channel().pipeline().close();
|
||||
@@ -258,6 +257,25 @@ public class ReplaySender extends ChannelDuplexHandler {
|
||||
}
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onWorldTick(TickEvent.ClientTickEvent event) {
|
||||
// Unfortunately the WorldTickEvent doesn't seem to be emitted on the CLIENT side
|
||||
if (event.phase != TickEvent.Phase.START) return;
|
||||
|
||||
// Spawning a player into an empty chunk (which we might do with the recording player)
|
||||
// prevents it from being moved by teleport packets (it essentially gets stuck) because
|
||||
// Entity#addedToChunk is not set and it is therefore not updated every tick.
|
||||
// To counteract this, we need to manually update it's position if it hasn't been added
|
||||
// to any chunk yet.
|
||||
if (mc.world != null) {
|
||||
for (EntityPlayer playerEntity : mc.world.playerEntities) {
|
||||
if (!playerEntity.addedToChunk && playerEntity instanceof EntityOtherPlayerMP) {
|
||||
playerEntity.onLivingUpdate();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void channelRead(ChannelHandlerContext ctx, Object msg)
|
||||
throws Exception {
|
||||
@@ -284,22 +302,22 @@ public class ReplaySender extends ChannelDuplexHandler {
|
||||
// If we do not give minecraft time to tick, there will be dead entity artifacts left in the world
|
||||
// Therefore we have to remove all loaded, dead entities manually if we are in sync mode.
|
||||
// We do this after every SpawnX packet and after the destroy entities packet.
|
||||
if (!asyncMode && mc.theWorld != null) {
|
||||
if (p instanceof S0CPacketSpawnPlayer
|
||||
|| p instanceof S0EPacketSpawnObject
|
||||
|| p instanceof S0FPacketSpawnMob
|
||||
|| p instanceof S2CPacketSpawnGlobalEntity
|
||||
|| p instanceof S10PacketSpawnPainting
|
||||
|| p instanceof S11PacketSpawnExperienceOrb
|
||||
|| p instanceof S13PacketDestroyEntities) {
|
||||
World world = mc.theWorld;
|
||||
if (!asyncMode && mc.world != null) {
|
||||
if (p instanceof SPacketSpawnPlayer
|
||||
|| p instanceof SPacketSpawnObject
|
||||
|| p instanceof SPacketSpawnMob
|
||||
|| p instanceof SPacketSpawnGlobalEntity
|
||||
|| p instanceof SPacketSpawnPainting
|
||||
|| p instanceof SPacketSpawnExperienceOrb
|
||||
|| p instanceof SPacketDestroyEntities) {
|
||||
World world = mc.world;
|
||||
for (int i = 0; i < world.loadedEntityList.size(); ++i) {
|
||||
Entity entity = (Entity) world.loadedEntityList.get(i);
|
||||
Entity entity = world.loadedEntityList.get(i);
|
||||
if (entity.isDead) {
|
||||
int chunkX = entity.chunkCoordX;
|
||||
int chunkY = entity.chunkCoordZ;
|
||||
|
||||
if (entity.addedToChunk && world.getChunkProvider().chunkExists(chunkX, chunkY)) {
|
||||
if (entity.addedToChunk && world.getChunkProvider().getLoadedChunk(chunkX, chunkY) != null) {
|
||||
world.getChunkFromChunkCoords(chunkX, chunkY).removeEntity(entity);
|
||||
}
|
||||
|
||||
@@ -323,7 +341,7 @@ public class ReplaySender extends ChannelDuplexHandler {
|
||||
ByteBuf bb = Unpooled.wrappedBuffer(bytes);
|
||||
PacketBuffer pb = new PacketBuffer(bb);
|
||||
|
||||
int i = pb.readVarIntFromBuffer();
|
||||
int i = pb.readVarInt();
|
||||
|
||||
Packet p = EnumConnectionState.PLAY.getPacket(EnumPacketDirection.CLIENTBOUND, i);
|
||||
p.readPacketData(pb);
|
||||
@@ -337,8 +355,8 @@ public class ReplaySender extends ChannelDuplexHandler {
|
||||
* @return The processed packet or {@code null} if no packet shall be sent
|
||||
*/
|
||||
protected Packet processPacket(Packet p) throws Exception {
|
||||
if (p instanceof S3FPacketCustomPayload) {
|
||||
S3FPacketCustomPayload packet = (S3FPacketCustomPayload) p;
|
||||
if (p instanceof SPacketCustomPayload) {
|
||||
SPacketCustomPayload packet = (SPacketCustomPayload) p;
|
||||
if (Restrictions.PLUGIN_CHANNEL.equals(packet.getChannelName())) {
|
||||
final String unknown = replayHandler.getRestrictions().handle(packet);
|
||||
if (unknown == null) {
|
||||
@@ -364,8 +382,8 @@ public class ReplaySender extends ChannelDuplexHandler {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (p instanceof S40PacketDisconnect) {
|
||||
IChatComponent reason = ((S40PacketDisconnect) p).func_149165_c();
|
||||
if (p instanceof SPacketDisconnect) {
|
||||
ITextComponent reason = ((SPacketDisconnect) p).getReason();
|
||||
if ("Please update to view this replay.".equals(reason.getUnformattedText())) {
|
||||
// This version of the mod supports replay restrictions so we are allowed
|
||||
// to remove this packet.
|
||||
@@ -375,18 +393,16 @@ public class ReplaySender extends ChannelDuplexHandler {
|
||||
|
||||
if(BAD_PACKETS.contains(p.getClass())) return null;
|
||||
|
||||
if (p instanceof S3FPacketCustomPayload) {
|
||||
S3FPacketCustomPayload packet = (S3FPacketCustomPayload) p;
|
||||
if (p instanceof SPacketCustomPayload) {
|
||||
SPacketCustomPayload packet = (SPacketCustomPayload) p;
|
||||
if ("MC|BOpen".equals(packet.getChannelName())) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
convertLegacyEntityIds(p);
|
||||
|
||||
if(p instanceof S48PacketResourcePackSend) {
|
||||
S48PacketResourcePackSend packet = (S48PacketResourcePackSend) p;
|
||||
String url = packet.func_179783_a();
|
||||
if(p instanceof SPacketResourcePackSend) {
|
||||
SPacketResourcePackSend packet = (SPacketResourcePackSend) p;
|
||||
String url = packet.getURL();
|
||||
if (url.startsWith("replay://")) {
|
||||
int id = Integer.parseInt(url.substring("replay://".length()));
|
||||
Map<Integer, String> index = replayFile.getResourcePackIndex();
|
||||
@@ -397,17 +413,17 @@ public class ReplaySender extends ChannelDuplexHandler {
|
||||
if (!file.exists()) {
|
||||
IOUtils.copy(replayFile.getResourcePack(hash).get(), new FileOutputStream(file));
|
||||
}
|
||||
mc.getResourcePackRepository().func_177319_a(file);
|
||||
mc.getResourcePackRepository().setResourcePackInstance(file);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
if(p instanceof S01PacketJoinGame) {
|
||||
S01PacketJoinGame packet = (S01PacketJoinGame) p;
|
||||
if(p instanceof SPacketJoinGame) {
|
||||
SPacketJoinGame packet = (SPacketJoinGame) p;
|
||||
allowMovement = true;
|
||||
int entId = packet.getEntityId();
|
||||
int entId = packet.getPlayerId();
|
||||
actualID = entId;
|
||||
entId = -1789435; // Camera entity id should be negative which is an invalid id and can't be used by servers
|
||||
int dimension = packet.getDimension();
|
||||
@@ -415,21 +431,21 @@ public class ReplaySender extends ChannelDuplexHandler {
|
||||
int maxPlayers = packet.getMaxPlayers();
|
||||
WorldType worldType = packet.getWorldType();
|
||||
|
||||
p = new S01PacketJoinGame(entId, GameType.SPECTATOR, false, dimension,
|
||||
p = new SPacketJoinGame(entId, GameType.SPECTATOR, false, dimension,
|
||||
difficulty, maxPlayers, worldType, false);
|
||||
}
|
||||
|
||||
if(p instanceof S07PacketRespawn) {
|
||||
S07PacketRespawn respawn = (S07PacketRespawn) p;
|
||||
p = new S07PacketRespawn(respawn.func_149082_c(),
|
||||
respawn.func_149081_d(), respawn.func_149080_f(), GameType.SPECTATOR);
|
||||
if(p instanceof SPacketRespawn) {
|
||||
SPacketRespawn respawn = (SPacketRespawn) p;
|
||||
p = new SPacketRespawn(respawn.getDimensionID(),
|
||||
respawn.getDifficulty(), respawn.getWorldType(), GameType.SPECTATOR);
|
||||
|
||||
allowMovement = true;
|
||||
}
|
||||
|
||||
if(p instanceof S08PacketPlayerPosLook) {
|
||||
if(p instanceof SPacketPlayerPosLook) {
|
||||
if(!hasWorldLoaded) hasWorldLoaded = true;
|
||||
final S08PacketPlayerPosLook ppl = (S08PacketPlayerPosLook) p;
|
||||
final SPacketPlayerPosLook ppl = (SPacketPlayerPosLook) p;
|
||||
|
||||
if (mc.currentScreen instanceof GuiDownloadTerrain) {
|
||||
// Close the world loading screen manually in case we swallow the packet
|
||||
@@ -440,17 +456,17 @@ public class ReplaySender extends ChannelDuplexHandler {
|
||||
|
||||
CameraEntity cent = replayHandler.getCameraEntity();
|
||||
|
||||
for (Object relative : ppl.func_179834_f()) {
|
||||
if (relative == S08PacketPlayerPosLook.EnumFlags.X
|
||||
|| relative == S08PacketPlayerPosLook.EnumFlags.Y
|
||||
|| relative == S08PacketPlayerPosLook.EnumFlags.Z) {
|
||||
for (SPacketPlayerPosLook.EnumFlags relative : ppl.getFlags()) {
|
||||
if (relative == SPacketPlayerPosLook.EnumFlags.X
|
||||
|| relative == SPacketPlayerPosLook.EnumFlags.Y
|
||||
|| relative == SPacketPlayerPosLook.EnumFlags.Z) {
|
||||
return null; // At least one of the coordinates is relative, so we don't care
|
||||
}
|
||||
}
|
||||
|
||||
if(cent != null) {
|
||||
if(!allowMovement && !((Math.abs(cent.posX - ppl.func_148932_c()) > TP_DISTANCE_LIMIT) ||
|
||||
(Math.abs(cent.posZ - ppl.func_148933_e()) > TP_DISTANCE_LIMIT))) {
|
||||
if(!allowMovement && !((Math.abs(cent.posX - ppl.getX()) > TP_DISTANCE_LIMIT) ||
|
||||
(Math.abs(cent.posZ - ppl.getZ()) > TP_DISTANCE_LIMIT))) {
|
||||
return null;
|
||||
} else {
|
||||
allowMovement = false;
|
||||
@@ -461,20 +477,20 @@ public class ReplaySender extends ChannelDuplexHandler {
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public void run() {
|
||||
if (mc.theWorld == null || !mc.isCallingFromMinecraftThread()) {
|
||||
if (mc.world == null || !mc.isCallingFromMinecraftThread()) {
|
||||
ReplayMod.instance.runLater(this);
|
||||
return;
|
||||
}
|
||||
|
||||
CameraEntity cent = replayHandler.getCameraEntity();
|
||||
cent.setCameraPosition(ppl.func_148932_c(), ppl.func_148928_d(), ppl.func_148933_e());
|
||||
cent.setCameraPosition(ppl.getX(), ppl.getY(), ppl.getZ());
|
||||
}
|
||||
}.run();
|
||||
}
|
||||
|
||||
if(p instanceof S2BPacketChangeGameState) {
|
||||
S2BPacketChangeGameState pg = (S2BPacketChangeGameState)p;
|
||||
int reason = pg.func_149138_c();
|
||||
if(p instanceof SPacketChangeGameState) {
|
||||
SPacketChangeGameState pg = (SPacketChangeGameState)p;
|
||||
int reason = pg.getGameState();
|
||||
|
||||
// only allow the following packets:
|
||||
// 1 - End raining
|
||||
@@ -488,7 +504,7 @@ public class ReplaySender extends ChannelDuplexHandler {
|
||||
}
|
||||
}
|
||||
|
||||
if (p instanceof S02PacketChat) {
|
||||
if (p instanceof SPacketChat) {
|
||||
if (!ReplayModReplay.instance.getCore().getSettingsRegistry().get(Setting.SHOW_CHAT)) {
|
||||
return null;
|
||||
}
|
||||
@@ -501,7 +517,7 @@ public class ReplaySender extends ChannelDuplexHandler {
|
||||
@SuppressWarnings("unchecked")
|
||||
public void channelActive(ChannelHandlerContext ctx) throws Exception {
|
||||
this.ctx = ctx;
|
||||
ctx.attr(NetworkManager.attrKeyConnectionState).set(EnumConnectionState.PLAY);
|
||||
ctx.attr(NetworkManager.PROTOCOL_ATTRIBUTE_KEY).set(EnumConnectionState.PLAY);
|
||||
super.channelActive(ctx);
|
||||
}
|
||||
|
||||
@@ -719,11 +735,11 @@ public class ReplaySender extends ChannelDuplexHandler {
|
||||
protected Packet processPacketAsync(Packet p) {
|
||||
//If hurrying, ignore some packets, except for short durations
|
||||
if(desiredTimeStamp - lastTimeStamp > 1000) {
|
||||
if(p instanceof S2APacketParticles) return null;
|
||||
if(p instanceof SPacketParticles) return null;
|
||||
|
||||
if(p instanceof S0EPacketSpawnObject) {
|
||||
S0EPacketSpawnObject pso = (S0EPacketSpawnObject)p;
|
||||
int type = pso.func_148993_l();
|
||||
if(p instanceof SPacketSpawnObject) {
|
||||
SPacketSpawnObject pso = (SPacketSpawnObject)p;
|
||||
int type = pso.getType();
|
||||
if(type == 76) { // Firework rocket
|
||||
return null;
|
||||
}
|
||||
@@ -809,48 +825,45 @@ public class ReplaySender extends ChannelDuplexHandler {
|
||||
}
|
||||
|
||||
protected Packet processPacketSync(Packet p) {
|
||||
if (p instanceof S21PacketChunkData) {
|
||||
S21PacketChunkData packet = (S21PacketChunkData) p;
|
||||
if (packet.func_149276_g() == 0) {
|
||||
// If the chunk is getting unloaded, we will have to forcefully update the position of all entities
|
||||
// within. Otherwise, if there wasn't a game tick recently, there may be entities that have moved
|
||||
// out of the chunk by now but are still registered in it. If we do not update those, they will get
|
||||
// unloaded even though they shouldn't.
|
||||
// To make things worse, it seems like players were never supposed to be unloaded this way because
|
||||
// they will remain glitched in the World#playerEntities list.
|
||||
World world = mc.theWorld;
|
||||
IChunkProvider chunkProvider = world.getChunkProvider();
|
||||
// Get the chunk that will be unloaded
|
||||
Chunk chunk = chunkProvider.provideChunk(packet.func_149273_e(), packet.func_149271_f());
|
||||
if (!chunk.isEmpty()) {
|
||||
List<Entity> entitiesInChunk = new ArrayList<>();
|
||||
// Gather all entities in that chunk
|
||||
for (ClassInheritanceMultiMap entityList : chunk.getEntityLists()) {
|
||||
@SuppressWarnings("unchecked")
|
||||
Collection<Entity> typedEntityList = entityList;
|
||||
entitiesInChunk.addAll(typedEntityList);
|
||||
if (p instanceof SPacketUnloadChunk) {
|
||||
SPacketUnloadChunk packet = (SPacketUnloadChunk) p;
|
||||
// If the chunk is getting unloaded, we will have to forcefully update the position of all entities
|
||||
// within. Otherwise, if there wasn't a game tick recently, there may be entities that have moved
|
||||
// out of the chunk by now but are still registered in it. If we do not update those, they will get
|
||||
// unloaded even though they shouldn't.
|
||||
// To make things worse, it seems like players were never supposed to be unloaded this way because
|
||||
// they will remain glitched in the World#playerEntities list.
|
||||
World world = mc.world;
|
||||
IChunkProvider chunkProvider = world.getChunkProvider();
|
||||
// Get the chunk that will be unloaded
|
||||
Chunk chunk = chunkProvider.provideChunk(packet.getX(), packet.getZ());
|
||||
if (!chunk.isEmpty()) {
|
||||
List<Entity> entitiesInChunk = new ArrayList<>();
|
||||
// Gather all entities in that chunk
|
||||
for (ClassInheritanceMultiMap<Entity> entityList : chunk.getEntityLists()) {
|
||||
entitiesInChunk.addAll(entityList);
|
||||
}
|
||||
for (Entity entity : entitiesInChunk) {
|
||||
// Skip interpolation of position updates coming from server
|
||||
// (See: newX in EntityLivingBase or otherPlayerMPX in EntityOtherPlayerMP)
|
||||
// Needs to be called at least 4 times thanks to
|
||||
// EntityOtherPlayerMP#otherPlayerMPPosRotationIncrements (max vanilla value is 3)
|
||||
for (int i = 0; i < 4; i++) {
|
||||
entity.onUpdate();
|
||||
}
|
||||
for (Entity entity : entitiesInChunk) {
|
||||
// Skip interpolation of position updates coming from server
|
||||
// (See: newX in EntityLivingBase or otherPlayerMPX in EntityOtherPlayerMP)
|
||||
// Needs to be called at least 4 times thanks to
|
||||
// EntityOtherPlayerMP#otherPlayerMPPosRotationIncrements (max vanilla value is 3)
|
||||
for (int i = 0; i < 4; i++) {
|
||||
entity.onUpdate();
|
||||
}
|
||||
|
||||
// Check whether the entity has left the chunk
|
||||
int chunkX = MathHelper.floor_double(entity.posX / 16);
|
||||
int chunkZ = MathHelper.floor_double(entity.posZ / 16);
|
||||
if (entity.chunkCoordX != chunkX || entity.chunkCoordZ != chunkZ) {
|
||||
// Entity has left the chunk
|
||||
chunk.removeEntityAtIndex(entity, entity.chunkCoordY);
|
||||
if (chunkProvider.chunkExists(chunkX, chunkZ)) {
|
||||
chunkProvider.provideChunk(chunkX, chunkZ).addEntity(entity);
|
||||
} else {
|
||||
// Entity has left all loaded chunks
|
||||
entity.addedToChunk = false;
|
||||
}
|
||||
// Check whether the entity has left the chunk
|
||||
int chunkX = MathHelper.floor(entity.posX / 16);
|
||||
int chunkZ = MathHelper.floor(entity.posZ / 16);
|
||||
if (entity.chunkCoordX != chunkX || entity.chunkCoordZ != chunkZ) {
|
||||
// Entity has left the chunk
|
||||
chunk.removeEntityAtIndex(entity, entity.chunkCoordY);
|
||||
Chunk newChunk = chunkProvider.getLoadedChunk(chunkX, chunkZ);
|
||||
if (newChunk != null) {
|
||||
newChunk.addEntity(entity);
|
||||
} else {
|
||||
// Entity has left all loaded chunks
|
||||
entity.addedToChunk = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -859,68 +872,6 @@ public class ReplaySender extends ChannelDuplexHandler {
|
||||
return p; // During synchronous playback everything is sent normally
|
||||
}
|
||||
|
||||
/**
|
||||
* This is necessary to convert packets from old replays to new replays.
|
||||
* @param packet The packet to be transformed.
|
||||
* @see #LEGACY_ENTITY_ID
|
||||
*/
|
||||
private void convertLegacyEntityIds(Packet packet) {
|
||||
if (packet instanceof S0CPacketSpawnPlayer) {
|
||||
S0CPacketSpawnPlayer p = (S0CPacketSpawnPlayer) packet;
|
||||
if (p.field_148957_a == LEGACY_ENTITY_ID) {
|
||||
p.field_148957_a = actualID;
|
||||
}
|
||||
} else if (packet instanceof S18PacketEntityTeleport) {
|
||||
S18PacketEntityTeleport p = (S18PacketEntityTeleport) packet;
|
||||
if (p.field_149458_a == LEGACY_ENTITY_ID) {
|
||||
p.field_149458_a = actualID;
|
||||
}
|
||||
} else if (packet instanceof S14PacketEntity.S17PacketEntityLookMove) {
|
||||
S14PacketEntity.S17PacketEntityLookMove p = (S14PacketEntity.S17PacketEntityLookMove) packet;
|
||||
if (p.field_149074_a == LEGACY_ENTITY_ID) {
|
||||
p.field_149074_a = actualID;
|
||||
}
|
||||
} else if (packet instanceof S19PacketEntityHeadLook) {
|
||||
S19PacketEntityHeadLook p = (S19PacketEntityHeadLook) packet;
|
||||
if (p.field_149384_a == LEGACY_ENTITY_ID) {
|
||||
p.field_149384_a = actualID;
|
||||
}
|
||||
} else if (packet instanceof S12PacketEntityVelocity) {
|
||||
S12PacketEntityVelocity p = (S12PacketEntityVelocity) packet;
|
||||
if (p.field_149417_a == LEGACY_ENTITY_ID) {
|
||||
p.field_149417_a = actualID;
|
||||
}
|
||||
} else if (packet instanceof S0BPacketAnimation) {
|
||||
S0BPacketAnimation p = (S0BPacketAnimation) packet;
|
||||
if (p.entityId == LEGACY_ENTITY_ID) {
|
||||
p.entityId = actualID;
|
||||
}
|
||||
} else if (packet instanceof S04PacketEntityEquipment) {
|
||||
S04PacketEntityEquipment p = (S04PacketEntityEquipment) packet;
|
||||
if (p.field_149394_a == LEGACY_ENTITY_ID) {
|
||||
p.field_149394_a = actualID;
|
||||
}
|
||||
} else if (packet instanceof S1BPacketEntityAttach) {
|
||||
S1BPacketEntityAttach p = (S1BPacketEntityAttach) packet;
|
||||
if (p.field_149408_a == LEGACY_ENTITY_ID) {
|
||||
p.field_149408_a = actualID;
|
||||
}
|
||||
if (p.field_149406_b == LEGACY_ENTITY_ID) {
|
||||
p.field_149406_b = actualID;
|
||||
}
|
||||
} else if (packet instanceof S0DPacketCollectItem) {
|
||||
S0DPacketCollectItem p = (S0DPacketCollectItem) packet;
|
||||
if (p.field_149356_b == LEGACY_ENTITY_ID) {
|
||||
p.field_149356_b = actualID;
|
||||
}
|
||||
} else if (packet instanceof S13PacketDestroyEntities) {
|
||||
S13PacketDestroyEntities p = (S13PacketDestroyEntities) packet;
|
||||
if (p.field_149100_a.length == 1 && p.field_149100_a[0] == LEGACY_ENTITY_ID) {
|
||||
p.field_149100_a[0] = actualID;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static final class PacketData {
|
||||
private static final ByteBuf byteBuf = Unpooled.buffer();
|
||||
private static final ByteBufOutputStream byteBufOut = new ByteBufOutputStream(byteBuf);
|
||||
|
||||
@@ -19,17 +19,18 @@ import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.EntityLiving;
|
||||
import net.minecraft.entity.item.EntityItemFrame;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.stats.StatFileWriter;
|
||||
import net.minecraft.util.AxisAlignedBB;
|
||||
import net.minecraft.util.IChatComponent;
|
||||
import net.minecraft.util.MovingObjectPosition;
|
||||
import net.minecraft.inventory.EntityEquipmentSlot;
|
||||
import net.minecraft.stats.StatisticsManager;
|
||||
import net.minecraft.util.EnumHand;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.RayTraceResult;
|
||||
import net.minecraft.util.text.ITextComponent;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.client.event.EntityViewRenderEvent;
|
||||
import net.minecraftforge.client.event.RenderGameOverlayEvent;
|
||||
import net.minecraftforge.client.event.RenderHandEvent;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||
import net.minecraftforge.fml.common.eventhandler.EventPriority;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import net.minecraftforge.fml.common.gameevent.TickEvent;
|
||||
@@ -40,7 +41,7 @@ import java.util.function.Function;
|
||||
|
||||
/**
|
||||
* The camera entity used as the main player entity during replay viewing.
|
||||
* During a replay {@link Minecraft#thePlayer} should be an instance of this class.
|
||||
* During a replay {@link Minecraft#player} should be an instance of this class.
|
||||
* Camera movement is controlled by a separate {@link CameraController}.
|
||||
*/
|
||||
public class CameraEntity extends EntityPlayerSP {
|
||||
@@ -67,9 +68,8 @@ public class CameraEntity extends EntityPlayerSP {
|
||||
*/
|
||||
private final EventHandler eventHandler = new EventHandler();
|
||||
|
||||
public CameraEntity(Minecraft mcIn, World worldIn, NetHandlerPlayClient netHandlerPlayClient, StatFileWriter statFileWriter) {
|
||||
super(mcIn, worldIn, netHandlerPlayClient, statFileWriter);
|
||||
FMLCommonHandler.instance().bus().register(eventHandler);
|
||||
public CameraEntity(Minecraft mcIn, World worldIn, NetHandlerPlayClient netHandlerPlayClient, StatisticsManager statisticsManager) {
|
||||
super(mcIn, worldIn, netHandlerPlayClient, statisticsManager);
|
||||
MinecraftForge.EVENT_BUS.register(eventHandler);
|
||||
if (ReplayModReplay.instance.getReplayHandler().getSpectatedUUID() == null) {
|
||||
cameraController = ReplayModReplay.instance.createCameraController(this);
|
||||
@@ -158,14 +158,14 @@ public class CameraEntity extends EntityPlayerSP {
|
||||
// entity is recreated and we have to spectate a new entity
|
||||
UUID spectating = ReplayModReplay.instance.getReplayHandler().getSpectatedUUID();
|
||||
if (spectating != null && (view.getUniqueID() != spectating
|
||||
|| view.worldObj != worldObj)
|
||||
|| worldObj.getEntityByID(view.getEntityId()) != view) {
|
||||
|| view.world != world)
|
||||
|| world.getEntityByID(view.getEntityId()) != view) {
|
||||
if (spectating == null) {
|
||||
// Entity (non-player) died, stop spectating
|
||||
ReplayModReplay.instance.getReplayHandler().spectateEntity(this);
|
||||
return;
|
||||
}
|
||||
view = worldObj.getPlayerEntityByUUID(spectating);
|
||||
view = world.getPlayerEntityByUUID(spectating);
|
||||
if (view != null) {
|
||||
mc.setRenderViewEntity(view);
|
||||
} else {
|
||||
@@ -184,17 +184,17 @@ public class CameraEntity extends EntityPlayerSP {
|
||||
@Override
|
||||
public void preparePlayerToSpawn() {
|
||||
// Make sure our world is up-to-date in case of world changes
|
||||
if (mc.theWorld != null) {
|
||||
worldObj = mc.theWorld;
|
||||
if (mc.world != null) {
|
||||
world = mc.world;
|
||||
}
|
||||
super.preparePlayerToSpawn();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setAngles(float yaw, float pitch) {
|
||||
public void setRotation(float yaw, float pitch) {
|
||||
if (mc.getRenderViewEntity() == this) {
|
||||
// Only update camera rotation when the camera is the view
|
||||
super.setAngles(yaw, pitch);
|
||||
super.setRotation(yaw, pitch);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -296,12 +296,49 @@ public class CameraEntity extends EntityPlayerSP {
|
||||
}
|
||||
|
||||
@Override
|
||||
public MovingObjectPosition rayTrace(double p_174822_1_, float p_174822_3_) {
|
||||
MovingObjectPosition pos = super.rayTrace(p_174822_1_, 1f);
|
||||
public float getCooldownPeriod() {
|
||||
Entity view = mc.getRenderViewEntity();
|
||||
if (view != this && view instanceof EntityPlayer) {
|
||||
return ((EntityPlayer) view).getCooldownPeriod();
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getCooledAttackStrength(float adjustTicks) {
|
||||
Entity view = mc.getRenderViewEntity();
|
||||
if (view != this && view instanceof EntityPlayer) {
|
||||
return ((EntityPlayer) view).getCooledAttackStrength(adjustTicks);
|
||||
}
|
||||
// Default to 1 as to not render the cooldown indicator (renders for < 1)
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumHand getActiveHand() {
|
||||
Entity view = mc.getRenderViewEntity();
|
||||
if (view != this && view instanceof EntityPlayer) {
|
||||
return ((EntityPlayer) view).getActiveHand();
|
||||
}
|
||||
return super.getActiveHand();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isHandActive() {
|
||||
Entity view = mc.getRenderViewEntity();
|
||||
if (view != this && view instanceof EntityPlayer) {
|
||||
return ((EntityPlayer) view).isHandActive();
|
||||
}
|
||||
return super.isHandActive();
|
||||
}
|
||||
|
||||
@Override
|
||||
public RayTraceResult rayTrace(double p_174822_1_, float p_174822_3_) {
|
||||
RayTraceResult pos = super.rayTrace(p_174822_1_, 1f);
|
||||
|
||||
// Make sure we can never look at blocks (-> no outline)
|
||||
if(pos != null && pos.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) {
|
||||
pos.typeOfHit = MovingObjectPosition.MovingObjectType.MISS;
|
||||
if(pos != null && pos.typeOfHit == RayTraceResult.Type.BLOCK) {
|
||||
pos.typeOfHit = RayTraceResult.Type.MISS;
|
||||
}
|
||||
|
||||
return pos;
|
||||
@@ -316,7 +353,6 @@ public class CameraEntity extends EntityPlayerSP {
|
||||
@Override
|
||||
public void setDead() {
|
||||
super.setDead();
|
||||
FMLCommonHandler.instance().bus().unregister(eventHandler);
|
||||
MinecraftForge.EVENT_BUS.unregister(eventHandler);
|
||||
}
|
||||
|
||||
@@ -356,9 +392,9 @@ public class CameraEntity extends EntityPlayerSP {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addChatMessage(IChatComponent message) {
|
||||
public void sendMessage(ITextComponent message) {
|
||||
if (MinecraftForge.EVENT_BUS.post(new ReplayChatMessageEvent(this))) return;
|
||||
super.addChatMessage(message);
|
||||
super.sendMessage(message);
|
||||
}
|
||||
|
||||
private class EventHandler {
|
||||
@@ -380,9 +416,13 @@ public class CameraEntity extends EntityPlayerSP {
|
||||
@SubscribeEvent
|
||||
public void preCrosshairRender(RenderGameOverlayEvent.Pre event) {
|
||||
// The crosshair should only render if targeted entity can actually be spectated
|
||||
if (event.type == RenderGameOverlayEvent.ElementType.CROSSHAIRS) {
|
||||
if (event.getType() == RenderGameOverlayEvent.ElementType.CROSSHAIRS) {
|
||||
event.setCanceled(!canSpectate(mc.pointedEntity));
|
||||
}
|
||||
// Hotbar should never be rendered
|
||||
if (event.getType() == RenderGameOverlayEvent.ElementType.HOTBAR) {
|
||||
event.setCanceled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
@@ -413,13 +453,16 @@ public class CameraEntity extends EntityPlayerSP {
|
||||
if (lastHandRendered != player) {
|
||||
lastHandRendered = player;
|
||||
|
||||
mc.entityRenderer.itemRenderer.prevEquippedProgress = 1;
|
||||
mc.entityRenderer.itemRenderer.equippedProgress = 1;
|
||||
mc.entityRenderer.itemRenderer.itemToRender = player.inventory.getCurrentItem();
|
||||
mc.entityRenderer.itemRenderer.equippedItemSlot = player.inventory.currentItem;
|
||||
mc.entityRenderer.itemRenderer.prevEquippedProgressMainHand = 1;
|
||||
mc.entityRenderer.itemRenderer.prevEquippedProgressOffHand = 1;
|
||||
mc.entityRenderer.itemRenderer.equippedProgressMainHand = 1;
|
||||
mc.entityRenderer.itemRenderer.equippedProgressOffHand = 1;
|
||||
mc.entityRenderer.itemRenderer.itemStackMainHand = player.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND);
|
||||
mc.entityRenderer.itemRenderer.itemStackOffHand = player.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND);
|
||||
|
||||
mc.thePlayer.renderArmYaw = mc.thePlayer.prevRenderArmYaw = player.rotationYaw;
|
||||
mc.thePlayer.renderArmPitch = mc.thePlayer.prevRenderArmPitch = player.rotationPitch;
|
||||
|
||||
mc.player.renderArmYaw = mc.player.prevRenderArmYaw = player.rotationYaw;
|
||||
mc.player.renderArmPitch = mc.player.prevRenderArmPitch = player.rotationPitch;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -427,7 +470,7 @@ public class CameraEntity extends EntityPlayerSP {
|
||||
@SubscribeEvent
|
||||
public void onEntityViewRenderEvent(EntityViewRenderEvent.CameraSetup event) {
|
||||
if (mc.getRenderViewEntity() == CameraEntity.this) {
|
||||
event.roll = roll;
|
||||
event.setRoll(roll);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -435,7 +478,7 @@ public class CameraEntity extends EntityPlayerSP {
|
||||
|
||||
@SubscribeEvent
|
||||
public void preRenderGameOverlay(RenderGameOverlayEvent.Pre event) {
|
||||
switch (event.type) {
|
||||
switch (event.getType()) {
|
||||
case ALL:
|
||||
heldItemTooltipsWasTrue = mc.gameSettings.heldItemTooltips;
|
||||
mc.gameSettings.heldItemTooltips = false;
|
||||
@@ -448,12 +491,15 @@ public class CameraEntity extends EntityPlayerSP {
|
||||
case EXPERIENCE:
|
||||
case HEALTHMOUNT:
|
||||
case JUMPBAR:
|
||||
case POTION_ICONS:
|
||||
event.setCanceled(true);
|
||||
break;
|
||||
case HELMET:
|
||||
case PORTAL:
|
||||
case CROSSHAIRS:
|
||||
case BOSSHEALTH:
|
||||
case BOSSINFO:
|
||||
case SUBTITLES:
|
||||
case TEXT:
|
||||
case CHAT:
|
||||
case PLAYER_LIST:
|
||||
@@ -464,7 +510,7 @@ public class CameraEntity extends EntityPlayerSP {
|
||||
|
||||
@SubscribeEvent
|
||||
public void postRenderGameOverlay(RenderGameOverlayEvent.Post event) {
|
||||
if (event.type != RenderGameOverlayEvent.ElementType.ALL) return;
|
||||
if (event.getType() != RenderGameOverlayEvent.ElementType.ALL) return;
|
||||
mc.gameSettings.heldItemTooltips = heldItemTooltipsWasTrue;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,8 +2,8 @@ package com.replaymod.replay.camera;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.settings.KeyBinding;
|
||||
import net.minecraft.util.MathHelper;
|
||||
import net.minecraft.util.Vec3;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import org.lwjgl.Sys;
|
||||
|
||||
// TODO: Marius is responsible for this. Please, someone clean it up.
|
||||
@@ -18,8 +18,8 @@ public class ClassicCameraController implements CameraController {
|
||||
private double THRESHOLD = MAX_SPEED / 20;
|
||||
private double DECAY = MAX_SPEED/3;
|
||||
|
||||
private Vec3 direction;
|
||||
private Vec3 dirBefore;
|
||||
private Vec3d direction;
|
||||
private Vec3d dirBefore;
|
||||
private double motion;
|
||||
private long lastCall = Sys.getTime();
|
||||
|
||||
@@ -129,7 +129,7 @@ public class ClassicCameraController implements CameraController {
|
||||
return;
|
||||
}
|
||||
|
||||
Vec3 movement = direction.normalize();
|
||||
Vec3d movement = direction.normalize();
|
||||
double factor = motion * (frac / 1000D);
|
||||
|
||||
camera.moveCamera(movement.xCoord * factor, movement.yCoord * factor, movement.zCoord * factor);
|
||||
@@ -158,7 +158,7 @@ public class ClassicCameraController implements CameraController {
|
||||
break;
|
||||
}
|
||||
|
||||
Vec3 dbf = direction;
|
||||
Vec3d dbf = direction;
|
||||
|
||||
if(dirBefore != null) {
|
||||
direction = dirBefore.normalize().add(direction);
|
||||
@@ -169,12 +169,12 @@ public class ClassicCameraController implements CameraController {
|
||||
updateMovement();
|
||||
}
|
||||
|
||||
private Vec3 getVectorForRotation(float pitch, float yaw) {
|
||||
private Vec3d getVectorForRotation(float pitch, float yaw) {
|
||||
float f2 = MathHelper.cos(-yaw * 0.017453292F - (float) Math.PI);
|
||||
float f3 = MathHelper.sin(-yaw * 0.017453292F - (float)Math.PI);
|
||||
float f4 = -MathHelper.cos(-pitch * 0.017453292F);
|
||||
float f5 = MathHelper.sin(-pitch * 0.017453292F);
|
||||
return new Vec3((double)(f3 * f4), (double)f5, (double)(f2 * f4));
|
||||
return new Vec3d((double)(f3 * f4), (double)f5, (double)(f2 * f4));
|
||||
}
|
||||
|
||||
public enum MoveDirection {
|
||||
|
||||
@@ -41,8 +41,9 @@ public class SpectatorCameraController implements CameraController {
|
||||
if (view instanceof EntityPlayer) {
|
||||
EntityPlayer viewPlayer = (EntityPlayer) view;
|
||||
camera.inventory = viewPlayer.inventory;
|
||||
camera.itemInUse = viewPlayer.itemInUse;
|
||||
camera.itemInUseCount = viewPlayer.itemInUseCount;
|
||||
camera.itemStackMainHand = viewPlayer.itemStackMainHand;
|
||||
camera.swingingHand = viewPlayer.swingingHand;
|
||||
camera.activeItemStackUseCount = viewPlayer.activeItemStackUseCount;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,14 +2,14 @@ package com.replaymod.replay.gui.overlay;
|
||||
|
||||
import com.replaymod.core.ReplayMod;
|
||||
import com.replaymod.replay.ReplayHandler;
|
||||
import com.replaymod.replaystudio.data.Marker;
|
||||
import com.replaymod.replaystudio.util.Location;
|
||||
import de.johni0702.minecraft.gui.GuiRenderer;
|
||||
import de.johni0702.minecraft.gui.RenderInfo;
|
||||
import de.johni0702.minecraft.gui.element.advanced.AbstractGuiTimeline;
|
||||
import de.johni0702.minecraft.gui.function.Draggable;
|
||||
import com.replaymod.replaystudio.data.Marker;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
import net.minecraft.util.MathHelper;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import org.lwjgl.util.Point;
|
||||
import org.lwjgl.util.ReadableDimension;
|
||||
import org.lwjgl.util.ReadablePoint;
|
||||
@@ -58,7 +58,7 @@ public class GuiMarkerTimeline extends AbstractGuiTimeline<GuiMarkerTimeline> im
|
||||
|
||||
protected void drawMarker(GuiRenderer renderer, ReadableDimension size, Marker marker) {
|
||||
int visibleLength = (int) (getLength() * getZoom());
|
||||
int markerPos = MathHelper.clamp_int(marker.getTime(), getOffset(), getOffset() + visibleLength);
|
||||
int markerPos = MathHelper.clamp(marker.getTime(), getOffset(), getOffset() + visibleLength);
|
||||
double positionInVisible = markerPos - getOffset();
|
||||
double fractionOfVisible = positionInVisible / visibleLength;
|
||||
int markerX = (int) (BORDER_LEFT + fractionOfVisible * (size.getWidth() - BORDER_LEFT - BORDER_RIGHT));
|
||||
@@ -99,7 +99,7 @@ public class GuiMarkerTimeline extends AbstractGuiTimeline<GuiMarkerTimeline> im
|
||||
int visibleLength = (int) (getLength() * getZoom());
|
||||
int contentWidth = lastSize.getWidth() - BORDER_LEFT - BORDER_RIGHT;
|
||||
for (Marker marker : replayHandler.getMarkers()) {
|
||||
int markerPos = MathHelper.clamp_int(marker.getTime(), getOffset(), getOffset() + visibleLength);
|
||||
int markerPos = MathHelper.clamp(marker.getTime(), getOffset(), getOffset() + visibleLength);
|
||||
double positionInVisible = markerPos - getOffset();
|
||||
double fractionOfVisible = positionInVisible / visibleLength;
|
||||
int markerX = (int) (BORDER_LEFT + fractionOfVisible * contentWidth);
|
||||
|
||||
@@ -16,7 +16,7 @@ import de.johni0702.minecraft.gui.layout.CustomLayout;
|
||||
import de.johni0702.minecraft.gui.layout.HorizontalLayout;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
import net.minecraft.client.settings.GameSettings;
|
||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import net.minecraftforge.fml.common.gameevent.InputEvent;
|
||||
import org.lwjgl.input.Keyboard;
|
||||
@@ -138,9 +138,9 @@ public class GuiReplayOverlay extends AbstractGuiOverlay<GuiReplayOverlay> {
|
||||
public void setVisible(boolean visible) {
|
||||
if (isVisible() != visible) {
|
||||
if (visible) {
|
||||
FMLCommonHandler.instance().bus().register(this);
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
} else {
|
||||
FMLCommonHandler.instance().bus().unregister(this);
|
||||
MinecraftForge.EVENT_BUS.unregister(this);
|
||||
}
|
||||
}
|
||||
super.setVisible(visible);
|
||||
|
||||
@@ -9,7 +9,6 @@ import net.minecraft.client.gui.GuiMainMenu;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
import net.minecraftforge.client.event.GuiScreenEvent;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
|
||||
import java.io.IOException;
|
||||
@@ -36,13 +35,12 @@ public class GuiHandler {
|
||||
}
|
||||
|
||||
public void register() {
|
||||
FMLCommonHandler.instance().bus().register(this);
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void injectIntoIngameMenu(GuiScreenEvent.InitGuiEvent.Post event) {
|
||||
if (!(event.gui instanceof GuiIngameMenu)) {
|
||||
if (!(event.getGui() instanceof GuiIngameMenu)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -51,8 +49,7 @@ public class GuiHandler {
|
||||
mod.getReplayHandler().getReplaySender().setReplaySpeed(0);
|
||||
|
||||
GuiButton achievements = null, stats = null, openToLan = null;
|
||||
@SuppressWarnings("unchecked")
|
||||
List<GuiButton> buttonList = event.buttonList;
|
||||
List<GuiButton> buttonList = event.getButtonList();
|
||||
for(GuiButton b : new ArrayList<>(buttonList)) {
|
||||
switch (b.id) {
|
||||
// Replace "Exit Server" button with "Exit Replay" button
|
||||
@@ -100,7 +97,7 @@ public class GuiHandler {
|
||||
|
||||
@SubscribeEvent
|
||||
public void injectIntoMainMenu(GuiScreenEvent.InitGuiEvent event) {
|
||||
if (!(event.gui instanceof GuiMainMenu)) {
|
||||
if (!(event.getGui() instanceof GuiMainMenu)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -118,27 +115,25 @@ public class GuiHandler {
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
List<GuiButton> buttonList = event.buttonList;
|
||||
GuiButton button = new GuiButton(BUTTON_REPLAY_VIEWER, event.gui.width / 2 - 100,
|
||||
event.gui.height / 4 + 10 + 3 * 24, I18n.format("replaymod.gui.replayviewer"));
|
||||
GuiButton button = new GuiButton(BUTTON_REPLAY_VIEWER, event.getGui().width / 2 - 100,
|
||||
event.getGui().height / 4 + 10 + 3 * 24, I18n.format("replaymod.gui.replayviewer"));
|
||||
button.width = button.width / 2 - 2;
|
||||
buttonList.add(button);
|
||||
event.getButtonList().add(button);
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onButton(GuiScreenEvent.ActionPerformedEvent.Pre event) {
|
||||
if(!event.button.enabled) return;
|
||||
if(!event.getButton().enabled) return;
|
||||
|
||||
if (event.gui instanceof GuiMainMenu) {
|
||||
if (event.button.id == BUTTON_REPLAY_VIEWER) {
|
||||
if (event.getGui() instanceof GuiMainMenu) {
|
||||
if (event.getButton().id == BUTTON_REPLAY_VIEWER) {
|
||||
new GuiReplayViewer(mod).display();
|
||||
}
|
||||
}
|
||||
|
||||
if (event.gui instanceof GuiIngameMenu && mod.getReplayHandler() != null) {
|
||||
if (event.button.id == BUTTON_EXIT_REPLAY) {
|
||||
event.button.enabled = false;
|
||||
if (event.getGui() instanceof GuiIngameMenu && mod.getReplayHandler() != null) {
|
||||
if (event.getButton().id == BUTTON_EXIT_REPLAY) {
|
||||
event.getButton().enabled = false;
|
||||
mc.displayGuiScreen(new GuiMainMenu());
|
||||
try {
|
||||
mod.getReplayHandler().endReplay();
|
||||
|
||||
@@ -12,12 +12,12 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
@Mixin(GuiSpectator.class)
|
||||
public abstract class MixinGuiSpectator {
|
||||
@Shadow
|
||||
private Minecraft field_175268_g;
|
||||
private Minecraft mc;
|
||||
|
||||
@Inject(method = "func_175260_a", at = @At("HEAD"), cancellable = true)
|
||||
@Inject(method = "onHotbarSelected", at = @At("HEAD"), cancellable = true)
|
||||
public void isInReplay(int i, CallbackInfo ci) {
|
||||
// Prevent spectator gui from opening while in a replay
|
||||
if (field_175268_g.thePlayer instanceof CameraEntity) {
|
||||
if (mc.player instanceof CameraEntity) {
|
||||
ci.cancel();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
package com.replaymod.replay.mixin;
|
||||
|
||||
import net.minecraft.client.particle.Particle;
|
||||
import net.minecraft.client.particle.ParticleManager;
|
||||
import net.minecraft.world.World;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
import java.util.Queue;
|
||||
|
||||
@Mixin(ParticleManager.class)
|
||||
public abstract class MixinParticleManager {
|
||||
@Shadow
|
||||
private Queue<Particle> queueEntityFX;
|
||||
|
||||
/**
|
||||
* This method additionally clears the queue of particles to be added when the world is changed.
|
||||
* Otherwise particles from the previous world might show up in this one if they were spawned after
|
||||
* the last tick in the previous world.
|
||||
*
|
||||
* @param world The new world
|
||||
* @param ci Callback info
|
||||
*/
|
||||
@Inject(method = "clearEffects", at = @At("HEAD"))
|
||||
public void replayModReplay_clearParticleQueue(World world, CallbackInfo ci) {
|
||||
queueEntityFX.clear();
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,12 @@
|
||||
package com.replaymod.replay.mixin;
|
||||
|
||||
import com.replaymod.replay.camera.CameraEntity;
|
||||
import com.replaymod.replay.ReplayModReplay;
|
||||
import com.replaymod.replay.camera.CameraEntity;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.entity.EntityPlayerSP;
|
||||
import net.minecraft.client.multiplayer.PlayerControllerMP;
|
||||
import net.minecraft.client.network.NetHandlerPlayClient;
|
||||
import net.minecraft.stats.StatFileWriter;
|
||||
import net.minecraft.stats.StatisticsManager;
|
||||
import net.minecraft.world.World;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
@@ -21,20 +21,20 @@ public abstract class MixinPlayerControllerMP {
|
||||
private Minecraft mc;
|
||||
|
||||
@Shadow
|
||||
private NetHandlerPlayClient netClientHandler;
|
||||
private NetHandlerPlayClient connection;
|
||||
|
||||
@Inject(method = "func_178892_a", at=@At("HEAD"), cancellable = true)
|
||||
private void replayModReplay_createReplayCamera(World worldIn, StatFileWriter statFileWriter, CallbackInfoReturnable<EntityPlayerSP> ci) {
|
||||
@Inject(method = "createClientPlayer", at=@At("HEAD"), cancellable = true)
|
||||
private void replayModReplay_createReplayCamera(World worldIn, StatisticsManager statisticsManager, CallbackInfoReturnable<EntityPlayerSP> ci) {
|
||||
if (ReplayModReplay.instance.getReplayHandler() != null) {
|
||||
ci.setReturnValue(new CameraEntity(mc, worldIn, netClientHandler, statFileWriter));
|
||||
ci.setReturnValue(new CameraEntity(mc, worldIn, connection, statisticsManager));
|
||||
ci.cancel();
|
||||
}
|
||||
}
|
||||
|
||||
@Inject(method = "isSpectator", at=@At("HEAD"), cancellable = true)
|
||||
private void replayModReplay_isSpectator(CallbackInfoReturnable<Boolean> ci) {
|
||||
if (mc.thePlayer instanceof CameraEntity) { // this check should in theory not be required
|
||||
ci.setReturnValue(mc.thePlayer.isSpectator());
|
||||
if (mc.player instanceof CameraEntity) { // this check should in theory not be required
|
||||
ci.setReturnValue(mc.player.isSpectator());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ public abstract class MixinRenderArrow extends Render {
|
||||
super(renderManager);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public boolean shouldRender(Entity entity, ICamera camera, double camX, double camY, double camZ) {
|
||||
// Force arrows to always render, otherwise they stop rendering when you get close to them
|
||||
|
||||
@@ -3,7 +3,7 @@ package com.replaymod.replay.mixin;
|
||||
import com.replaymod.replay.ReplayHandler;
|
||||
import com.replaymod.replay.ReplayModReplay;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.entity.RenderItem;
|
||||
import net.minecraft.client.renderer.RenderItem;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
|
||||
@@ -2,7 +2,7 @@ package com.replaymod.replay.mixin;
|
||||
|
||||
import com.replaymod.replay.camera.CameraEntity;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.entity.RendererLivingEntity;
|
||||
import net.minecraft.client.renderer.entity.RenderLivingBase;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
@@ -11,11 +11,11 @@ import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
|
||||
@Mixin(RendererLivingEntity.class)
|
||||
public abstract class MixinRendererLivingEntity {
|
||||
@Mixin(RenderLivingBase.class)
|
||||
public abstract class MixinRenderLivingBase {
|
||||
@Inject(method = "canRenderName", at = @At("HEAD"), cancellable = true)
|
||||
private void replayModReplay_canRenderInvisibleName(EntityLivingBase entity, CallbackInfoReturnable<Boolean> ci) {
|
||||
EntityPlayer thePlayer = Minecraft.getMinecraft().thePlayer;
|
||||
EntityPlayer thePlayer = Minecraft.getMinecraft().player;
|
||||
if (thePlayer instanceof CameraEntity && entity.isInvisible()) {
|
||||
ci.setReturnValue(false);
|
||||
}
|
||||
@@ -10,7 +10,7 @@ import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
|
||||
@Mixin(TileEntityEndPortalRenderer.class)
|
||||
public class MixinTileEntityEndPortalRenderer {
|
||||
@Redirect(method = "func_180544_a", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J"))
|
||||
@Redirect(method = "renderTileEntityAt", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J"))
|
||||
private long replayModReplay_getEnchantmentTime() {
|
||||
ReplayHandler replayHandler = ReplayModReplay.instance.getReplayHandler();
|
||||
if (replayHandler != null) {
|
||||
|
||||
@@ -5,8 +5,8 @@ import net.minecraft.client.renderer.RenderGlobal;
|
||||
import net.minecraft.client.renderer.ViewFrustum;
|
||||
import net.minecraft.client.renderer.chunk.IRenderChunkFactory;
|
||||
import net.minecraft.client.renderer.chunk.RenderChunk;
|
||||
import net.minecraft.util.BlockPos;
|
||||
import net.minecraft.util.MathHelper;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.world.World;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
@@ -31,7 +31,7 @@ public abstract class MixinViewFrustum {
|
||||
}
|
||||
|
||||
/**
|
||||
* Instead of calling {@link RenderChunk#setPosition(BlockPos)} we recreate the render chunk
|
||||
* Instead of calling {@link RenderChunk#setPosition(int, int, int)} we recreate the render chunk
|
||||
* which seems to solve the problem that chunks are invisible when you leave an area and return
|
||||
* to it.
|
||||
* Any better fixes are welcome.
|
||||
@@ -43,22 +43,23 @@ public abstract class MixinViewFrustum {
|
||||
return;
|
||||
}
|
||||
|
||||
int i = MathHelper.floor_double(viewEntityX) - 8;
|
||||
int j = MathHelper.floor_double(viewEntityZ) - 8;
|
||||
int i = MathHelper.floor(viewEntityX) - 8;
|
||||
int j = MathHelper.floor(viewEntityZ) - 8;
|
||||
int k = this.countChunksX * 16;
|
||||
|
||||
for (int l = 0; l < this.countChunksX; ++l) {
|
||||
int i1 = this.func_178157_a(i, k, l);
|
||||
int i1 = this.getBaseCoordinate(i, k, l);
|
||||
for (int j1 = 0; j1 < this.countChunksZ; ++j1) {
|
||||
int k1 = this.func_178157_a(j, k, j1);
|
||||
int k1 = this.getBaseCoordinate(j, k, j1);
|
||||
for (int l1 = 0; l1 < this.countChunksY; ++l1) {
|
||||
int i2 = l1 * 16;
|
||||
RenderChunk renderchunk = this.renderChunks[(j1 * this.countChunksY + l1) * this.countChunksX + l];
|
||||
BlockPos blockpos = new BlockPos(i1, i2, k1);
|
||||
if (!blockpos.equals(renderchunk.getPosition())) {
|
||||
// Recreate render chunk instead of setting its position
|
||||
renderChunks[(j1 * this.countChunksY + l1) * this.countChunksX + l] =
|
||||
renderChunkFactory.makeRenderChunk(world, renderGlobal, blockpos, 0);
|
||||
(renderChunks[(j1 * this.countChunksY + l1) * this.countChunksX + l] =
|
||||
renderChunkFactory.create(world, renderGlobal, 0)
|
||||
).setPosition(blockpos.getX(), blockpos.getY(), blockpos.getZ());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -66,5 +67,5 @@ public abstract class MixinViewFrustum {
|
||||
ci.cancel();
|
||||
}
|
||||
|
||||
@Shadow abstract int func_178157_a(int p_178157_1_, int p_178157_2_, int p_178157_3_);
|
||||
@Shadow abstract int getBaseCoordinate(int p_178157_1_, int p_178157_2_, int p_178157_3_);
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ import com.replaymod.simplepathing.SPTimeline.SPPath;
|
||||
import com.replaymod.simplepathing.gui.GuiPathing;
|
||||
import com.replaymod.simplepathing.preview.PathPreview;
|
||||
import lombok.Getter;
|
||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
@@ -43,7 +43,7 @@ public class ReplayModSimplePathing {
|
||||
|
||||
core.getSettingsRegistry().register(Setting.class);
|
||||
|
||||
FMLCommonHandler.instance().bus().register(this);
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
|
||||
PathPreview pathPreview = new PathPreview(this);
|
||||
pathPreview.register();
|
||||
|
||||
@@ -658,7 +658,7 @@ public class SPTimeline implements PathingRegistry {
|
||||
} catch (IOException e) {
|
||||
CrashReport crash = CrashReport.makeCrashReport(e, "Serializing interpolator");
|
||||
CrashReportCategory category = crash.makeCategory("Serializing interpolator");
|
||||
category.addCrashSectionCallable("Interpolator", interpolator::toString);
|
||||
category.setDetail("Interpolator", interpolator::toString);
|
||||
throw new ReportedException(crash);
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ import com.replaymod.replay.events.ReplayCloseEvent;
|
||||
import com.replaymod.replay.events.ReplayOpenEvent;
|
||||
import com.replaymod.simplepathing.ReplayModSimplePathing;
|
||||
import com.replaymod.simplepathing.Setting;
|
||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import org.lwjgl.input.Keyboard;
|
||||
|
||||
@@ -23,7 +23,7 @@ public class PathPreview {
|
||||
}
|
||||
|
||||
public void register() {
|
||||
FMLCommonHandler.instance().bus().register(this);
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
|
||||
ReplayMod core = mod.getCore();
|
||||
mod.getCore().getKeyBindingRegistry().registerKeyBinding("replaymod.input.pathpreview", Keyboard.KEY_H, () -> {
|
||||
|
||||
@@ -17,7 +17,8 @@ import com.replaymod.simplepathing.gui.GuiPathing;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.GlStateManager;
|
||||
import net.minecraft.client.renderer.Tessellator;
|
||||
import net.minecraft.client.renderer.WorldRenderer;
|
||||
import net.minecraft.client.renderer.VertexBuffer;
|
||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraftforge.client.event.RenderWorldLastEvent;
|
||||
@@ -203,26 +204,35 @@ public class PathPreviewRenderer {
|
||||
if (distanceSquared(view, pos2) > renderDistanceSquared) return;
|
||||
|
||||
Tessellator tessellator = Tessellator.getInstance();
|
||||
WorldRenderer renderer = tessellator.getWorldRenderer();
|
||||
renderer.setTranslation(-view.getLeft(), -view.getMiddle(), -view.getRight());
|
||||
VertexBuffer vertexBuffer = tessellator.getBuffer();
|
||||
vertexBuffer.setTranslation(-view.getLeft(), -view.getMiddle(), -view.getRight());
|
||||
|
||||
renderer.startDrawing(GL11.GL_LINES);
|
||||
renderer.setColorRGBA_I(color, 255);
|
||||
vertexBuffer.begin(GL11.GL_LINES, DefaultVertexFormats.POSITION_COLOR);
|
||||
|
||||
renderer.addVertex(pos1.getLeft(), pos1.getMiddle(), pos1.getRight());
|
||||
renderer.addVertex(pos2.getLeft(), pos2.getMiddle(), pos2.getRight());
|
||||
vertexBuffer.pos(pos1.getLeft(), pos1.getMiddle(), pos1.getRight()).color(
|
||||
color >> 16 & 0xff,
|
||||
color >> 8 & 0xff,
|
||||
color & 0xff,
|
||||
255
|
||||
).endVertex();
|
||||
vertexBuffer.pos(pos2.getLeft(), pos2.getMiddle(), pos2.getRight()).color(
|
||||
color >> 16 & 0xff,
|
||||
color >> 8 & 0xff,
|
||||
color & 0xff,
|
||||
255
|
||||
).endVertex();
|
||||
|
||||
GL11.glLineWidth(3);
|
||||
tessellator.draw();
|
||||
renderer.setTranslation(0, 0, 0);
|
||||
vertexBuffer.setTranslation(0, 0, 0);
|
||||
}
|
||||
|
||||
private void drawPoint(Triple<Double, Double, Double> view,
|
||||
Triple<Double, Double, Double> pos,
|
||||
Keyframe keyframe) {
|
||||
Tessellator tessellator = Tessellator.getInstance();
|
||||
WorldRenderer renderer = tessellator.getWorldRenderer();
|
||||
renderer.setTranslation(0, 0, 0);
|
||||
VertexBuffer vertexBuffer = tessellator.getBuffer();
|
||||
vertexBuffer.setTranslation(0, 0, 0);
|
||||
|
||||
mc.renderEngine.bindTexture(TEXTURE);
|
||||
|
||||
@@ -243,12 +253,12 @@ public class PathPreviewRenderer {
|
||||
float maxX = 0.5f;
|
||||
float maxY = 0.5f;
|
||||
|
||||
renderer.startDrawingQuads();
|
||||
vertexBuffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX);
|
||||
|
||||
renderer.addVertexWithUV(minX, minY, 0, posX + size, posY + size);
|
||||
renderer.addVertexWithUV(minX, maxY, 0, posX + size, posY);
|
||||
renderer.addVertexWithUV(maxX, maxY, 0, posX, posY);
|
||||
renderer.addVertexWithUV(maxX, minY, 0, posX, posY + size);
|
||||
vertexBuffer.pos(minX, minY, 0).tex(posX + size, posY + size).endVertex();
|
||||
vertexBuffer.pos(minX, maxY, 0).tex(posX + size, posY).endVertex();
|
||||
vertexBuffer.pos(maxX, maxY, 0).tex(posX, posY).endVertex();
|
||||
vertexBuffer.pos(maxX, minY, 0).tex(posX, posY + size).endVertex();
|
||||
|
||||
GL11.glPushMatrix();
|
||||
|
||||
@@ -270,8 +280,8 @@ public class PathPreviewRenderer {
|
||||
Triple<Double, Double, Double> pos,
|
||||
Triple<Float, Float, Float> rot) {
|
||||
Tessellator tessellator = Tessellator.getInstance();
|
||||
WorldRenderer renderer = tessellator.getWorldRenderer();
|
||||
renderer.setTranslation(0, 0, 0);
|
||||
VertexBuffer vertexBuffer = tessellator.getBuffer();
|
||||
vertexBuffer.setTranslation(0, 0, 0);
|
||||
|
||||
mc.renderEngine.bindTexture(CAMERA_HEAD);
|
||||
|
||||
@@ -289,12 +299,10 @@ public class PathPreviewRenderer {
|
||||
|
||||
//draw the position line
|
||||
GL11.glDisable(GL11.GL_TEXTURE_2D);
|
||||
renderer.startDrawing(GL11.GL_LINES);
|
||||
vertexBuffer.begin(GL11.GL_LINES, DefaultVertexFormats.POSITION_COLOR);
|
||||
|
||||
renderer.setColorRGBA_I(0x00ff00, 170);
|
||||
|
||||
renderer.addVertex(0, 0, 0);
|
||||
renderer.addVertex(0, 0, 2);
|
||||
vertexBuffer.pos(0, 0, 0).color(0, 255, 0, 170).endVertex();
|
||||
vertexBuffer.pos(0, 0, 2).color(0, 255, 0, 170).endVertex();
|
||||
|
||||
tessellator.draw();
|
||||
|
||||
@@ -305,45 +313,43 @@ public class PathPreviewRenderer {
|
||||
|
||||
double r = -cubeSize/2;
|
||||
|
||||
renderer.startDrawingQuads();
|
||||
|
||||
renderer.setColorRGBA_I(0xffffff, 200);
|
||||
vertexBuffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX_COLOR);
|
||||
|
||||
//back
|
||||
renderer.addVertexWithUV(r, r + cubeSize, r, 3 * 8 / 64f, 8 / 64f);
|
||||
renderer.addVertexWithUV(r + cubeSize, r + cubeSize, r, 4*8/64f, 8/64f);
|
||||
renderer.addVertexWithUV(r + cubeSize, r, r, 4*8/64f, 2*8/64f);
|
||||
renderer.addVertexWithUV(r, r, r, 3*8/64f, 2*8/64f);
|
||||
vertexBuffer.pos(r, r + cubeSize, r).tex(3 * 8 / 64f, 8 / 64f).color(255, 255, 255, 200).endVertex();
|
||||
vertexBuffer.pos(r + cubeSize, r + cubeSize, r).tex(4*8/64f, 8/64f).color(255, 255, 255, 200).endVertex();
|
||||
vertexBuffer.pos(r + cubeSize, r, r).tex(4*8/64f, 2*8/64f).color(255, 255, 255, 200).endVertex();
|
||||
vertexBuffer.pos(r, r, r).tex(3*8/64f, 2*8/64f).color(255, 255, 255, 200).endVertex();
|
||||
|
||||
//front
|
||||
renderer.addVertexWithUV(r + cubeSize, r, r + cubeSize, 2 * 8 / 64f, 2*8/64f);
|
||||
renderer.addVertexWithUV(r + cubeSize, r + cubeSize, r + cubeSize, 2 * 8 / 64f, 8/64f);
|
||||
renderer.addVertexWithUV(r, r + cubeSize, r + cubeSize, 8 / 64f, 8 / 64f);
|
||||
renderer.addVertexWithUV(r, r, r + cubeSize, 8 / 64f, 2*8/64f);
|
||||
vertexBuffer.pos(r + cubeSize, r, r + cubeSize).tex(2 * 8 / 64f, 2*8/64f).color(255, 255, 255, 200).endVertex();
|
||||
vertexBuffer.pos(r + cubeSize, r + cubeSize, r + cubeSize).tex(2 * 8 / 64f, 8/64f).color(255, 255, 255, 200).endVertex();
|
||||
vertexBuffer.pos(r, r + cubeSize, r + cubeSize).tex(8 / 64f, 8 / 64f).color(255, 255, 255, 200).endVertex();
|
||||
vertexBuffer.pos(r, r, r + cubeSize).tex(8 / 64f, 2*8/64f).color(255, 255, 255, 200).endVertex();
|
||||
|
||||
//left
|
||||
renderer.addVertexWithUV(r + cubeSize, r + cubeSize, r, 0, 8/64f);
|
||||
renderer.addVertexWithUV(r + cubeSize, r + cubeSize, r + cubeSize, 8/64f, 8/64f);
|
||||
renderer.addVertexWithUV(r + cubeSize, r, r + cubeSize, 8/64f, 2*8/64f);
|
||||
renderer.addVertexWithUV(r+cubeSize, r, r, 0, 2*8/64f);
|
||||
vertexBuffer.pos(r + cubeSize, r + cubeSize, r).tex(0, 8/64f).color(255, 255, 255, 200).endVertex();
|
||||
vertexBuffer.pos(r + cubeSize, r + cubeSize, r + cubeSize).tex(8/64f, 8/64f).color(255, 255, 255, 200).endVertex();
|
||||
vertexBuffer.pos(r + cubeSize, r, r + cubeSize).tex(8/64f, 2*8/64f).color(255, 255, 255, 200).endVertex();
|
||||
vertexBuffer.pos(r+cubeSize, r, r).tex(0, 2*8/64f).color(255, 255, 255, 200).endVertex();
|
||||
|
||||
//right
|
||||
renderer.addVertexWithUV(r, r + cubeSize, r + cubeSize, 2*8/64f, 8/64f);
|
||||
renderer.addVertexWithUV(r, r + cubeSize, r, 3*8/64f, 8/64f);
|
||||
renderer.addVertexWithUV(r, r, r, 3*8/64f, 2*8/64f);
|
||||
renderer.addVertexWithUV(r, r, r + cubeSize, 2 * 8 / 64f, 2 * 8 / 64f);
|
||||
vertexBuffer.pos(r, r + cubeSize, r + cubeSize).tex(2*8/64f, 8/64f).color(255, 255, 255, 200).endVertex();
|
||||
vertexBuffer.pos(r, r + cubeSize, r).tex(3*8/64f, 8/64f).color(255, 255, 255, 200).endVertex();
|
||||
vertexBuffer.pos(r, r, r).tex(3*8/64f, 2*8/64f).color(255, 255, 255, 200).endVertex();
|
||||
vertexBuffer.pos(r, r, r + cubeSize).tex(2 * 8 / 64f, 2 * 8 / 64f).color(255, 255, 255, 200).endVertex();
|
||||
|
||||
//bottom
|
||||
renderer.addVertexWithUV(r + cubeSize, r, r, 3*8/64f, 0);
|
||||
renderer.addVertexWithUV(r + cubeSize, r, r + cubeSize, 3*8/64f, 8/64f);
|
||||
renderer.addVertexWithUV(r, r, r + cubeSize, 2*8/64f, 8/64f);
|
||||
renderer.addVertexWithUV(r, r, r, 2 * 8 / 64f, 0);
|
||||
vertexBuffer.pos(r + cubeSize, r, r).tex(3*8/64f, 0).color(255, 255, 255, 200).endVertex();
|
||||
vertexBuffer.pos(r + cubeSize, r, r + cubeSize).tex(3*8/64f, 8/64f).color(255, 255, 255, 200).endVertex();
|
||||
vertexBuffer.pos(r, r, r + cubeSize).tex(2*8/64f, 8/64f).color(255, 255, 255, 200).endVertex();
|
||||
vertexBuffer.pos(r, r, r).tex(2 * 8 / 64f, 0).color(255, 255, 255, 200).endVertex();
|
||||
|
||||
//top
|
||||
renderer.addVertexWithUV(r, r + cubeSize, r, 8/64f, 0);
|
||||
renderer.addVertexWithUV(r, r + cubeSize, r + cubeSize, 8/64f, 8/64f);
|
||||
renderer.addVertexWithUV(r + cubeSize, r + cubeSize, r + cubeSize, 2*8/64f, 8/64f);
|
||||
renderer.addVertexWithUV(r + cubeSize, r + cubeSize, r, 2 * 8 / 64f, 0);
|
||||
vertexBuffer.pos(r, r + cubeSize, r).tex(8/64f, 0).color(255, 255, 255, 200).endVertex();
|
||||
vertexBuffer.pos(r, r + cubeSize, r + cubeSize).tex(8/64f, 8/64f).color(255, 255, 255, 200).endVertex();
|
||||
vertexBuffer.pos(r + cubeSize, r + cubeSize, r + cubeSize).tex(2*8/64f, 8/64f).color(255, 255, 255, 200).endVertex();
|
||||
vertexBuffer.pos(r + cubeSize, r + cubeSize, r).tex(2 * 8 / 64f, 0).color(255, 255, 255, 200).endVertex();
|
||||
|
||||
tessellator.draw();
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# To apply changes in this file run: ./gradlew clean setupDecompWorkspace idea
|
||||
|
||||
# Minecraft
|
||||
public net.minecraft.client.Minecraft field_71428_T # timer
|
||||
public-f net.minecraft.client.Minecraft field_71428_T # timer
|
||||
public net.minecraft.client.Minecraft field_83002_am # debugCrashKeyPressTime
|
||||
public net.minecraft.client.Minecraft field_71467_ac # rightClickDelayTimer
|
||||
public net.minecraft.client.Minecraft field_71423_H # systemTime
|
||||
@@ -21,23 +21,23 @@ public net.minecraft.client.Minecraft func_147112_ai()V # middleClickMouse
|
||||
public net.minecraft.client.Minecraft func_147115_a(Z)V # sendClickBlockToController
|
||||
|
||||
# Packets
|
||||
public net.minecraft.network.play.server.S0FPacketSpawnMob field_149043_l # dataWatcher
|
||||
public net.minecraft.network.play.server.SPacketSpawnMob field_149043_l # dataManager
|
||||
public net.minecraft.network.play.server.SPacketSpawnPlayer field_148960_i # watcher
|
||||
#public net.minecraft.network.play.server.S38PacketPlayerListItem field_179964_d # profile
|
||||
public net.minecraft.network.play.server.S1DPacketEntityEffect field_149434_a # entityId
|
||||
public net.minecraft.network.play.server.S1CPacketEntityMetadata field_149379_a # entityId
|
||||
public net.minecraft.network.play.server.S1CPacketEntityMetadata field_149378_b # list
|
||||
public net.minecraft.network.play.server.S0BPacketAnimation field_148981_a # entityId
|
||||
public net.minecraft.network.play.server.S02PacketChat field_179842_b # position
|
||||
public net.minecraft.network.play.server.S19PacketEntityStatus field_149164_a # entityId
|
||||
public net.minecraft.network.play.server.S0CPacketSpawnPlayer *
|
||||
public net.minecraft.network.play.server.S18PacketEntityTeleport *
|
||||
public net.minecraft.network.play.server.S14PacketEntity *
|
||||
public net.minecraft.network.play.server.S19PacketEntityHeadLook *
|
||||
public net.minecraft.network.play.server.S12PacketEntityVelocity *
|
||||
public net.minecraft.network.play.server.S04PacketEntityEquipment *
|
||||
public net.minecraft.network.play.server.S1BPacketEntityAttach *
|
||||
public net.minecraft.network.play.server.S0DPacketCollectItem *
|
||||
public net.minecraft.network.play.server.S13PacketDestroyEntities *
|
||||
# public net.minecraft.network.play.server.S1DPacketEntityEffect field_149434_a # entityId
|
||||
# public net.minecraft.network.play.server.S1CPacketEntityMetadata field_149379_a # entityId
|
||||
# public net.minecraft.network.play.server.S1CPacketEntityMetadata field_149378_b # list
|
||||
# public net.minecraft.network.play.server.S0BPacketAnimation field_148981_a # entityId
|
||||
# public net.minecraft.network.play.server.S02PacketChat field_179842_b # position
|
||||
# public net.minecraft.network.play.server.S19PacketEntityStatus field_149164_a # entityId
|
||||
# public net.minecraft.network.play.server.S18PacketEntityTeleport *
|
||||
# public net.minecraft.network.play.server.S14PacketEntity *
|
||||
# public net.minecraft.network.play.server.S19PacketEntityHeadLook *
|
||||
# public net.minecraft.network.play.server.S12PacketEntityVelocity *
|
||||
# public net.minecraft.network.play.server.S04PacketEntityEquipment *
|
||||
# public net.minecraft.network.play.server.S1BPacketEntityAttach *
|
||||
# public net.minecraft.network.play.server.S0DPacketCollectItem *
|
||||
# public net.minecraft.network.play.server.S13PacketDestroyEntities *
|
||||
|
||||
# GuiTextField
|
||||
public net.minecraft.client.gui.GuiTextField field_146216_j # text
|
||||
@@ -61,7 +61,7 @@ public net.minecraft.client.renderer.RenderGlobal field_175009_l # chunksToUpdat
|
||||
public net.minecraft.client.renderer.RenderGlobal field_72755_R # renderInfos
|
||||
public net.minecraft.client.renderer.RenderGlobal field_175009_l # chunksToUpdate
|
||||
public net.minecraft.client.renderer.RenderGlobal field_72740_G # renderEntitiesStartupCounter
|
||||
public net.minecraft.client.renderer.RenderGlobal func_174983_a(Lnet.minecraft.util.BlockPos;Lnet.minecraft.client.renderer.chunk.RenderChunk;)Z # isPositionInRenderChunk
|
||||
# public net.minecraft.client.renderer.RenderGlobal func_174983_a(Lnet.minecraft.util.BlockPos;Lnet.minecraft.client.renderer.chunk.RenderChunk;)Z # isPositionInRenderChunk
|
||||
|
||||
public net.minecraft.client.renderer.RenderGlobal$ContainerLocalRenderInformation
|
||||
#public net.minecraft.client.renderer.RenderGlobal$ContainerLocalRenderInformation field_178553_a # renderChunk
|
||||
@@ -88,17 +88,17 @@ public net.minecraft.entity.player.EntityPlayer *
|
||||
public net.minecraft.client.entity.EntityOtherPlayerMP *
|
||||
|
||||
# EffectRenderer
|
||||
public net.minecraft.client.particle.EffectRenderer field_110737_b # particleTextures
|
||||
public net.minecraft.client.particle.EffectRenderer field_78876_b # fxLayers
|
||||
# public net.minecraft.client.particle.EffectRenderer field_110737_b # particleTextures
|
||||
# public net.minecraft.client.particle.EffectRenderer field_78876_b # fxLayers
|
||||
|
||||
# IntegratedServer
|
||||
public net.minecraft.server.integrated.IntegratedServer field_71348_o # isGamePaused
|
||||
|
||||
# GameSettings
|
||||
public net.minecraft.client.settings.GameSettings field_151446_aD # mapSoundLevels
|
||||
public-f net.minecraft.client.settings.GameSettings field_186714_aM # soundLevels
|
||||
|
||||
# Frustum
|
||||
public net.minecraft.client.renderer.culling.Frustum field_78552_a # clippingHelper
|
||||
public-f net.minecraft.client.renderer.culling.Frustum field_78552_a # clippingHelper
|
||||
|
||||
# CrashReportCategory
|
||||
public net.minecraft.crash.CrashReportCategory field_85077_c # children
|
||||
@@ -117,6 +117,13 @@ public net.minecraft.client.renderer.GlStateManager$FogState
|
||||
public net.minecraft.client.renderer.GlStateManager$BooleanState
|
||||
public net.minecraft.client.renderer.GlStateManager$BooleanState *
|
||||
|
||||
# EntityLivingBase
|
||||
public net.minecraft.entity.EntityLivingBase field_184621_as # HAND_STATES
|
||||
public net.minecraft.entity.EntityLivingBase field_184628_bn # activeItemStackUseCount
|
||||
|
||||
# EntityLivingBase
|
||||
public net.minecraft.client.particle.Particle *
|
||||
|
||||
# ScreenShotHelper
|
||||
public net.minecraft.util.ScreenShotHelper func_74290_a(Ljava/io/File;)Ljava/io/File; # getTimestampedPNGFileForDirectory
|
||||
|
||||
|
||||
@@ -7,7 +7,9 @@
|
||||
"MixinNetHandlerLoginClient",
|
||||
"MixinNetHandlerPlayClient",
|
||||
"MixinNetworkDispatcher",
|
||||
"MixinRenderGlobal"
|
||||
"MixinPlayerControllerMP",
|
||||
"MixinRenderGlobal",
|
||||
"MixinWorldClient"
|
||||
],
|
||||
"compatibilityLevel": "JAVA_8",
|
||||
"minVersion": "0.6.11",
|
||||
|
||||
@@ -4,11 +4,10 @@
|
||||
"mixins": [],
|
||||
"server": [],
|
||||
"client": [
|
||||
"MixinEffectRenderer",
|
||||
"MixinEntityRenderer",
|
||||
"MixinFrustum",
|
||||
"MixinParticleManager",
|
||||
"MixinRender",
|
||||
"MixinRendererLivingEntity",
|
||||
"MixinRenderGlobal",
|
||||
"MixinRenderManager"
|
||||
],
|
||||
|
||||
@@ -5,10 +5,11 @@
|
||||
"server": [],
|
||||
"client": [
|
||||
"MixinGuiSpectator",
|
||||
"MixinParticleManager",
|
||||
"MixinPlayerControllerMP",
|
||||
"MixinRenderArrow",
|
||||
"MixinRendererLivingEntity",
|
||||
"MixinRenderItem",
|
||||
"MixinRenderLivingBase",
|
||||
"MixinRenderManager",
|
||||
"MixinTileEntityEndPortalRenderer",
|
||||
"MixinViewFrustum",
|
||||
|
||||
Reference in New Issue
Block a user